19eefe2a2SStefan Roese /*
29eefe2a2SStefan Roese * This file is part of UBIFS.
39eefe2a2SStefan Roese *
49eefe2a2SStefan Roese * Copyright (C) 2006-2008 Nokia Corporation.
59eefe2a2SStefan Roese *
6ff94bc40SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+
79eefe2a2SStefan Roese *
89eefe2a2SStefan Roese * Author: Adrian Hunter
99eefe2a2SStefan Roese */
109eefe2a2SStefan Roese
11ff94bc40SHeiko Schocher #include <linux/err.h>
129eefe2a2SStefan Roese #include "ubifs.h"
139eefe2a2SStefan Roese
149eefe2a2SStefan Roese /*
159eefe2a2SStefan Roese * An orphan is an inode number whose inode node has been committed to the index
169eefe2a2SStefan Roese * with a link count of zero. That happens when an open file is deleted
179eefe2a2SStefan Roese * (unlinked) and then a commit is run. In the normal course of events the inode
189eefe2a2SStefan Roese * would be deleted when the file is closed. However in the case of an unclean
199eefe2a2SStefan Roese * unmount, orphans need to be accounted for. After an unclean unmount, the
209eefe2a2SStefan Roese * orphans' inodes must be deleted which means either scanning the entire index
219eefe2a2SStefan Roese * looking for them, or keeping a list on flash somewhere. This unit implements
229eefe2a2SStefan Roese * the latter approach.
239eefe2a2SStefan Roese *
249eefe2a2SStefan Roese * The orphan area is a fixed number of LEBs situated between the LPT area and
259eefe2a2SStefan Roese * the main area. The number of orphan area LEBs is specified when the file
269eefe2a2SStefan Roese * system is created. The minimum number is 1. The size of the orphan area
279eefe2a2SStefan Roese * should be so that it can hold the maximum number of orphans that are expected
289eefe2a2SStefan Roese * to ever exist at one time.
299eefe2a2SStefan Roese *
309eefe2a2SStefan Roese * The number of orphans that can fit in a LEB is:
319eefe2a2SStefan Roese *
329eefe2a2SStefan Roese * (c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64)
339eefe2a2SStefan Roese *
349eefe2a2SStefan Roese * For example: a 15872 byte LEB can fit 1980 orphans so 1 LEB may be enough.
359eefe2a2SStefan Roese *
369eefe2a2SStefan Roese * Orphans are accumulated in a rb-tree. When an inode's link count drops to
379eefe2a2SStefan Roese * zero, the inode number is added to the rb-tree. It is removed from the tree
389eefe2a2SStefan Roese * when the inode is deleted. Any new orphans that are in the orphan tree when
399eefe2a2SStefan Roese * the commit is run, are written to the orphan area in 1 or more orphan nodes.
409eefe2a2SStefan Roese * If the orphan area is full, it is consolidated to make space. There is
419eefe2a2SStefan Roese * always enough space because validation prevents the user from creating more
429eefe2a2SStefan Roese * than the maximum number of orphans allowed.
439eefe2a2SStefan Roese */
449eefe2a2SStefan Roese
45ff94bc40SHeiko Schocher static int dbg_check_orphans(struct ubifs_info *c);
46ff94bc40SHeiko Schocher
47ff94bc40SHeiko Schocher /**
48ff94bc40SHeiko Schocher * ubifs_add_orphan - add an orphan.
49ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
50ff94bc40SHeiko Schocher * @inum: orphan inode number
51ff94bc40SHeiko Schocher *
52ff94bc40SHeiko Schocher * Add an orphan. This function is called when an inodes link count drops to
53ff94bc40SHeiko Schocher * zero.
54ff94bc40SHeiko Schocher */
ubifs_add_orphan(struct ubifs_info * c,ino_t inum)55ff94bc40SHeiko Schocher int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)
56ff94bc40SHeiko Schocher {
57ff94bc40SHeiko Schocher struct ubifs_orphan *orphan, *o;
58ff94bc40SHeiko Schocher struct rb_node **p, *parent = NULL;
59ff94bc40SHeiko Schocher
60ff94bc40SHeiko Schocher orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_NOFS);
61ff94bc40SHeiko Schocher if (!orphan)
62ff94bc40SHeiko Schocher return -ENOMEM;
63ff94bc40SHeiko Schocher orphan->inum = inum;
64ff94bc40SHeiko Schocher orphan->new = 1;
65ff94bc40SHeiko Schocher
66ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
67ff94bc40SHeiko Schocher if (c->tot_orphans >= c->max_orphans) {
68ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
69ff94bc40SHeiko Schocher kfree(orphan);
70ff94bc40SHeiko Schocher return -ENFILE;
71ff94bc40SHeiko Schocher }
72ff94bc40SHeiko Schocher p = &c->orph_tree.rb_node;
73ff94bc40SHeiko Schocher while (*p) {
74ff94bc40SHeiko Schocher parent = *p;
75ff94bc40SHeiko Schocher o = rb_entry(parent, struct ubifs_orphan, rb);
76ff94bc40SHeiko Schocher if (inum < o->inum)
77ff94bc40SHeiko Schocher p = &(*p)->rb_left;
78ff94bc40SHeiko Schocher else if (inum > o->inum)
79ff94bc40SHeiko Schocher p = &(*p)->rb_right;
80ff94bc40SHeiko Schocher else {
81*0195a7bbSHeiko Schocher ubifs_err(c, "orphaned twice");
82ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
83ff94bc40SHeiko Schocher kfree(orphan);
84ff94bc40SHeiko Schocher return 0;
85ff94bc40SHeiko Schocher }
86ff94bc40SHeiko Schocher }
87ff94bc40SHeiko Schocher c->tot_orphans += 1;
88ff94bc40SHeiko Schocher c->new_orphans += 1;
89ff94bc40SHeiko Schocher rb_link_node(&orphan->rb, parent, p);
90ff94bc40SHeiko Schocher rb_insert_color(&orphan->rb, &c->orph_tree);
91ff94bc40SHeiko Schocher list_add_tail(&orphan->list, &c->orph_list);
92ff94bc40SHeiko Schocher list_add_tail(&orphan->new_list, &c->orph_new);
93ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
94ff94bc40SHeiko Schocher dbg_gen("ino %lu", (unsigned long)inum);
95ff94bc40SHeiko Schocher return 0;
96ff94bc40SHeiko Schocher }
97ff94bc40SHeiko Schocher
98ff94bc40SHeiko Schocher /**
99ff94bc40SHeiko Schocher * ubifs_delete_orphan - delete an orphan.
100ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
101ff94bc40SHeiko Schocher * @inum: orphan inode number
102ff94bc40SHeiko Schocher *
103ff94bc40SHeiko Schocher * Delete an orphan. This function is called when an inode is deleted.
104ff94bc40SHeiko Schocher */
ubifs_delete_orphan(struct ubifs_info * c,ino_t inum)105ff94bc40SHeiko Schocher void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum)
106ff94bc40SHeiko Schocher {
107ff94bc40SHeiko Schocher struct ubifs_orphan *o;
108ff94bc40SHeiko Schocher struct rb_node *p;
109ff94bc40SHeiko Schocher
110ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
111ff94bc40SHeiko Schocher p = c->orph_tree.rb_node;
112ff94bc40SHeiko Schocher while (p) {
113ff94bc40SHeiko Schocher o = rb_entry(p, struct ubifs_orphan, rb);
114ff94bc40SHeiko Schocher if (inum < o->inum)
115ff94bc40SHeiko Schocher p = p->rb_left;
116ff94bc40SHeiko Schocher else if (inum > o->inum)
117ff94bc40SHeiko Schocher p = p->rb_right;
118ff94bc40SHeiko Schocher else {
119ff94bc40SHeiko Schocher if (o->del) {
120ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
121ff94bc40SHeiko Schocher dbg_gen("deleted twice ino %lu",
122ff94bc40SHeiko Schocher (unsigned long)inum);
123ff94bc40SHeiko Schocher return;
124ff94bc40SHeiko Schocher }
125ff94bc40SHeiko Schocher if (o->cmt) {
126ff94bc40SHeiko Schocher o->del = 1;
127ff94bc40SHeiko Schocher o->dnext = c->orph_dnext;
128ff94bc40SHeiko Schocher c->orph_dnext = o;
129ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
130ff94bc40SHeiko Schocher dbg_gen("delete later ino %lu",
131ff94bc40SHeiko Schocher (unsigned long)inum);
132ff94bc40SHeiko Schocher return;
133ff94bc40SHeiko Schocher }
134ff94bc40SHeiko Schocher rb_erase(p, &c->orph_tree);
135ff94bc40SHeiko Schocher list_del(&o->list);
136ff94bc40SHeiko Schocher c->tot_orphans -= 1;
137ff94bc40SHeiko Schocher if (o->new) {
138ff94bc40SHeiko Schocher list_del(&o->new_list);
139ff94bc40SHeiko Schocher c->new_orphans -= 1;
140ff94bc40SHeiko Schocher }
141ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
142ff94bc40SHeiko Schocher kfree(o);
143ff94bc40SHeiko Schocher dbg_gen("inum %lu", (unsigned long)inum);
144ff94bc40SHeiko Schocher return;
145ff94bc40SHeiko Schocher }
146ff94bc40SHeiko Schocher }
147ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
148*0195a7bbSHeiko Schocher ubifs_err(c, "missing orphan ino %lu", (unsigned long)inum);
149ff94bc40SHeiko Schocher dump_stack();
150ff94bc40SHeiko Schocher }
151ff94bc40SHeiko Schocher
152ff94bc40SHeiko Schocher /**
153ff94bc40SHeiko Schocher * ubifs_orphan_start_commit - start commit of orphans.
154ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
155ff94bc40SHeiko Schocher *
156ff94bc40SHeiko Schocher * Start commit of orphans.
157ff94bc40SHeiko Schocher */
ubifs_orphan_start_commit(struct ubifs_info * c)158ff94bc40SHeiko Schocher int ubifs_orphan_start_commit(struct ubifs_info *c)
159ff94bc40SHeiko Schocher {
160ff94bc40SHeiko Schocher struct ubifs_orphan *orphan, **last;
161ff94bc40SHeiko Schocher
162ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
163ff94bc40SHeiko Schocher last = &c->orph_cnext;
164ff94bc40SHeiko Schocher list_for_each_entry(orphan, &c->orph_new, new_list) {
165ff94bc40SHeiko Schocher ubifs_assert(orphan->new);
166ff94bc40SHeiko Schocher ubifs_assert(!orphan->cmt);
167ff94bc40SHeiko Schocher orphan->new = 0;
168ff94bc40SHeiko Schocher orphan->cmt = 1;
169ff94bc40SHeiko Schocher *last = orphan;
170ff94bc40SHeiko Schocher last = &orphan->cnext;
171ff94bc40SHeiko Schocher }
172ff94bc40SHeiko Schocher *last = NULL;
173ff94bc40SHeiko Schocher c->cmt_orphans = c->new_orphans;
174ff94bc40SHeiko Schocher c->new_orphans = 0;
175ff94bc40SHeiko Schocher dbg_cmt("%d orphans to commit", c->cmt_orphans);
176ff94bc40SHeiko Schocher INIT_LIST_HEAD(&c->orph_new);
177ff94bc40SHeiko Schocher if (c->tot_orphans == 0)
178ff94bc40SHeiko Schocher c->no_orphs = 1;
179ff94bc40SHeiko Schocher else
180ff94bc40SHeiko Schocher c->no_orphs = 0;
181ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
182ff94bc40SHeiko Schocher return 0;
183ff94bc40SHeiko Schocher }
184ff94bc40SHeiko Schocher
185ff94bc40SHeiko Schocher /**
186ff94bc40SHeiko Schocher * avail_orphs - calculate available space.
187ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
188ff94bc40SHeiko Schocher *
189ff94bc40SHeiko Schocher * This function returns the number of orphans that can be written in the
190ff94bc40SHeiko Schocher * available space.
191ff94bc40SHeiko Schocher */
avail_orphs(struct ubifs_info * c)192ff94bc40SHeiko Schocher static int avail_orphs(struct ubifs_info *c)
193ff94bc40SHeiko Schocher {
194ff94bc40SHeiko Schocher int avail_lebs, avail, gap;
195ff94bc40SHeiko Schocher
196ff94bc40SHeiko Schocher avail_lebs = c->orph_lebs - (c->ohead_lnum - c->orph_first) - 1;
197ff94bc40SHeiko Schocher avail = avail_lebs *
198ff94bc40SHeiko Schocher ((c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64));
199ff94bc40SHeiko Schocher gap = c->leb_size - c->ohead_offs;
200ff94bc40SHeiko Schocher if (gap >= UBIFS_ORPH_NODE_SZ + sizeof(__le64))
201ff94bc40SHeiko Schocher avail += (gap - UBIFS_ORPH_NODE_SZ) / sizeof(__le64);
202ff94bc40SHeiko Schocher return avail;
203ff94bc40SHeiko Schocher }
204ff94bc40SHeiko Schocher
2059eefe2a2SStefan Roese /**
2069eefe2a2SStefan Roese * tot_avail_orphs - calculate total space.
2079eefe2a2SStefan Roese * @c: UBIFS file-system description object
2089eefe2a2SStefan Roese *
2099eefe2a2SStefan Roese * This function returns the number of orphans that can be written in half
2109eefe2a2SStefan Roese * the total space. That leaves half the space for adding new orphans.
2119eefe2a2SStefan Roese */
tot_avail_orphs(struct ubifs_info * c)2129eefe2a2SStefan Roese static int tot_avail_orphs(struct ubifs_info *c)
2139eefe2a2SStefan Roese {
2149eefe2a2SStefan Roese int avail_lebs, avail;
2159eefe2a2SStefan Roese
2169eefe2a2SStefan Roese avail_lebs = c->orph_lebs;
2179eefe2a2SStefan Roese avail = avail_lebs *
2189eefe2a2SStefan Roese ((c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64));
2199eefe2a2SStefan Roese return avail / 2;
2209eefe2a2SStefan Roese }
2219eefe2a2SStefan Roese
2229eefe2a2SStefan Roese /**
223ff94bc40SHeiko Schocher * do_write_orph_node - write a node to the orphan head.
224ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
225ff94bc40SHeiko Schocher * @len: length of node
226ff94bc40SHeiko Schocher * @atomic: write atomically
227ff94bc40SHeiko Schocher *
228ff94bc40SHeiko Schocher * This function writes a node to the orphan head from the orphan buffer. If
229ff94bc40SHeiko Schocher * %atomic is not zero, then the write is done atomically. On success, %0 is
230ff94bc40SHeiko Schocher * returned, otherwise a negative error code is returned.
231ff94bc40SHeiko Schocher */
do_write_orph_node(struct ubifs_info * c,int len,int atomic)232ff94bc40SHeiko Schocher static int do_write_orph_node(struct ubifs_info *c, int len, int atomic)
233ff94bc40SHeiko Schocher {
234ff94bc40SHeiko Schocher int err = 0;
235ff94bc40SHeiko Schocher
236ff94bc40SHeiko Schocher if (atomic) {
237ff94bc40SHeiko Schocher ubifs_assert(c->ohead_offs == 0);
238ff94bc40SHeiko Schocher ubifs_prepare_node(c, c->orph_buf, len, 1);
239ff94bc40SHeiko Schocher len = ALIGN(len, c->min_io_size);
240ff94bc40SHeiko Schocher err = ubifs_leb_change(c, c->ohead_lnum, c->orph_buf, len);
241ff94bc40SHeiko Schocher } else {
242ff94bc40SHeiko Schocher if (c->ohead_offs == 0) {
243ff94bc40SHeiko Schocher /* Ensure LEB has been unmapped */
244ff94bc40SHeiko Schocher err = ubifs_leb_unmap(c, c->ohead_lnum);
245ff94bc40SHeiko Schocher if (err)
246ff94bc40SHeiko Schocher return err;
247ff94bc40SHeiko Schocher }
248ff94bc40SHeiko Schocher err = ubifs_write_node(c, c->orph_buf, len, c->ohead_lnum,
249ff94bc40SHeiko Schocher c->ohead_offs);
250ff94bc40SHeiko Schocher }
251ff94bc40SHeiko Schocher return err;
252ff94bc40SHeiko Schocher }
253ff94bc40SHeiko Schocher
254ff94bc40SHeiko Schocher /**
255ff94bc40SHeiko Schocher * write_orph_node - write an orphan node.
256ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
257ff94bc40SHeiko Schocher * @atomic: write atomically
258ff94bc40SHeiko Schocher *
259ff94bc40SHeiko Schocher * This function builds an orphan node from the cnext list and writes it to the
260ff94bc40SHeiko Schocher * orphan head. On success, %0 is returned, otherwise a negative error code
261ff94bc40SHeiko Schocher * is returned.
262ff94bc40SHeiko Schocher */
write_orph_node(struct ubifs_info * c,int atomic)263ff94bc40SHeiko Schocher static int write_orph_node(struct ubifs_info *c, int atomic)
264ff94bc40SHeiko Schocher {
265ff94bc40SHeiko Schocher struct ubifs_orphan *orphan, *cnext;
266ff94bc40SHeiko Schocher struct ubifs_orph_node *orph;
267ff94bc40SHeiko Schocher int gap, err, len, cnt, i;
268ff94bc40SHeiko Schocher
269ff94bc40SHeiko Schocher ubifs_assert(c->cmt_orphans > 0);
270ff94bc40SHeiko Schocher gap = c->leb_size - c->ohead_offs;
271ff94bc40SHeiko Schocher if (gap < UBIFS_ORPH_NODE_SZ + sizeof(__le64)) {
272ff94bc40SHeiko Schocher c->ohead_lnum += 1;
273ff94bc40SHeiko Schocher c->ohead_offs = 0;
274ff94bc40SHeiko Schocher gap = c->leb_size;
275ff94bc40SHeiko Schocher if (c->ohead_lnum > c->orph_last) {
276ff94bc40SHeiko Schocher /*
277ff94bc40SHeiko Schocher * We limit the number of orphans so that this should
278ff94bc40SHeiko Schocher * never happen.
279ff94bc40SHeiko Schocher */
280*0195a7bbSHeiko Schocher ubifs_err(c, "out of space in orphan area");
281ff94bc40SHeiko Schocher return -EINVAL;
282ff94bc40SHeiko Schocher }
283ff94bc40SHeiko Schocher }
284ff94bc40SHeiko Schocher cnt = (gap - UBIFS_ORPH_NODE_SZ) / sizeof(__le64);
285ff94bc40SHeiko Schocher if (cnt > c->cmt_orphans)
286ff94bc40SHeiko Schocher cnt = c->cmt_orphans;
287ff94bc40SHeiko Schocher len = UBIFS_ORPH_NODE_SZ + cnt * sizeof(__le64);
288ff94bc40SHeiko Schocher ubifs_assert(c->orph_buf);
289ff94bc40SHeiko Schocher orph = c->orph_buf;
290ff94bc40SHeiko Schocher orph->ch.node_type = UBIFS_ORPH_NODE;
291ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
292ff94bc40SHeiko Schocher cnext = c->orph_cnext;
293ff94bc40SHeiko Schocher for (i = 0; i < cnt; i++) {
294ff94bc40SHeiko Schocher orphan = cnext;
295ff94bc40SHeiko Schocher ubifs_assert(orphan->cmt);
296ff94bc40SHeiko Schocher orph->inos[i] = cpu_to_le64(orphan->inum);
297ff94bc40SHeiko Schocher orphan->cmt = 0;
298ff94bc40SHeiko Schocher cnext = orphan->cnext;
299ff94bc40SHeiko Schocher orphan->cnext = NULL;
300ff94bc40SHeiko Schocher }
301ff94bc40SHeiko Schocher c->orph_cnext = cnext;
302ff94bc40SHeiko Schocher c->cmt_orphans -= cnt;
303ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
304ff94bc40SHeiko Schocher if (c->cmt_orphans)
305ff94bc40SHeiko Schocher orph->cmt_no = cpu_to_le64(c->cmt_no);
306ff94bc40SHeiko Schocher else
307ff94bc40SHeiko Schocher /* Mark the last node of the commit */
308ff94bc40SHeiko Schocher orph->cmt_no = cpu_to_le64((c->cmt_no) | (1ULL << 63));
309ff94bc40SHeiko Schocher ubifs_assert(c->ohead_offs + len <= c->leb_size);
310ff94bc40SHeiko Schocher ubifs_assert(c->ohead_lnum >= c->orph_first);
311ff94bc40SHeiko Schocher ubifs_assert(c->ohead_lnum <= c->orph_last);
312ff94bc40SHeiko Schocher err = do_write_orph_node(c, len, atomic);
313ff94bc40SHeiko Schocher c->ohead_offs += ALIGN(len, c->min_io_size);
314ff94bc40SHeiko Schocher c->ohead_offs = ALIGN(c->ohead_offs, 8);
315ff94bc40SHeiko Schocher return err;
316ff94bc40SHeiko Schocher }
317ff94bc40SHeiko Schocher
318ff94bc40SHeiko Schocher /**
319ff94bc40SHeiko Schocher * write_orph_nodes - write orphan nodes until there are no more to commit.
320ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
321ff94bc40SHeiko Schocher * @atomic: write atomically
322ff94bc40SHeiko Schocher *
323ff94bc40SHeiko Schocher * This function writes orphan nodes for all the orphans to commit. On success,
324ff94bc40SHeiko Schocher * %0 is returned, otherwise a negative error code is returned.
325ff94bc40SHeiko Schocher */
write_orph_nodes(struct ubifs_info * c,int atomic)326ff94bc40SHeiko Schocher static int write_orph_nodes(struct ubifs_info *c, int atomic)
327ff94bc40SHeiko Schocher {
328ff94bc40SHeiko Schocher int err;
329ff94bc40SHeiko Schocher
330ff94bc40SHeiko Schocher while (c->cmt_orphans > 0) {
331ff94bc40SHeiko Schocher err = write_orph_node(c, atomic);
332ff94bc40SHeiko Schocher if (err)
333ff94bc40SHeiko Schocher return err;
334ff94bc40SHeiko Schocher }
335ff94bc40SHeiko Schocher if (atomic) {
336ff94bc40SHeiko Schocher int lnum;
337ff94bc40SHeiko Schocher
338ff94bc40SHeiko Schocher /* Unmap any unused LEBs after consolidation */
339ff94bc40SHeiko Schocher for (lnum = c->ohead_lnum + 1; lnum <= c->orph_last; lnum++) {
340ff94bc40SHeiko Schocher err = ubifs_leb_unmap(c, lnum);
341ff94bc40SHeiko Schocher if (err)
342ff94bc40SHeiko Schocher return err;
343ff94bc40SHeiko Schocher }
344ff94bc40SHeiko Schocher }
345ff94bc40SHeiko Schocher return 0;
346ff94bc40SHeiko Schocher }
347ff94bc40SHeiko Schocher
348ff94bc40SHeiko Schocher /**
349ff94bc40SHeiko Schocher * consolidate - consolidate the orphan area.
350ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
351ff94bc40SHeiko Schocher *
352ff94bc40SHeiko Schocher * This function enables consolidation by putting all the orphans into the list
353ff94bc40SHeiko Schocher * to commit. The list is in the order that the orphans were added, and the
354ff94bc40SHeiko Schocher * LEBs are written atomically in order, so at no time can orphans be lost by
355ff94bc40SHeiko Schocher * an unclean unmount.
356ff94bc40SHeiko Schocher *
357ff94bc40SHeiko Schocher * This function returns %0 on success and a negative error code on failure.
358ff94bc40SHeiko Schocher */
consolidate(struct ubifs_info * c)359ff94bc40SHeiko Schocher static int consolidate(struct ubifs_info *c)
360ff94bc40SHeiko Schocher {
361ff94bc40SHeiko Schocher int tot_avail = tot_avail_orphs(c), err = 0;
362ff94bc40SHeiko Schocher
363ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
364ff94bc40SHeiko Schocher dbg_cmt("there is space for %d orphans and there are %d",
365ff94bc40SHeiko Schocher tot_avail, c->tot_orphans);
366ff94bc40SHeiko Schocher if (c->tot_orphans - c->new_orphans <= tot_avail) {
367ff94bc40SHeiko Schocher struct ubifs_orphan *orphan, **last;
368ff94bc40SHeiko Schocher int cnt = 0;
369ff94bc40SHeiko Schocher
370ff94bc40SHeiko Schocher /* Change the cnext list to include all non-new orphans */
371ff94bc40SHeiko Schocher last = &c->orph_cnext;
372ff94bc40SHeiko Schocher list_for_each_entry(orphan, &c->orph_list, list) {
373ff94bc40SHeiko Schocher if (orphan->new)
374ff94bc40SHeiko Schocher continue;
375ff94bc40SHeiko Schocher orphan->cmt = 1;
376ff94bc40SHeiko Schocher *last = orphan;
377ff94bc40SHeiko Schocher last = &orphan->cnext;
378ff94bc40SHeiko Schocher cnt += 1;
379ff94bc40SHeiko Schocher }
380ff94bc40SHeiko Schocher *last = NULL;
381ff94bc40SHeiko Schocher ubifs_assert(cnt == c->tot_orphans - c->new_orphans);
382ff94bc40SHeiko Schocher c->cmt_orphans = cnt;
383ff94bc40SHeiko Schocher c->ohead_lnum = c->orph_first;
384ff94bc40SHeiko Schocher c->ohead_offs = 0;
385ff94bc40SHeiko Schocher } else {
386ff94bc40SHeiko Schocher /*
387ff94bc40SHeiko Schocher * We limit the number of orphans so that this should
388ff94bc40SHeiko Schocher * never happen.
389ff94bc40SHeiko Schocher */
390*0195a7bbSHeiko Schocher ubifs_err(c, "out of space in orphan area");
391ff94bc40SHeiko Schocher err = -EINVAL;
392ff94bc40SHeiko Schocher }
393ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
394ff94bc40SHeiko Schocher return err;
395ff94bc40SHeiko Schocher }
396ff94bc40SHeiko Schocher
397ff94bc40SHeiko Schocher /**
398ff94bc40SHeiko Schocher * commit_orphans - commit orphans.
399ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
400ff94bc40SHeiko Schocher *
401ff94bc40SHeiko Schocher * This function commits orphans to flash. On success, %0 is returned,
402ff94bc40SHeiko Schocher * otherwise a negative error code is returned.
403ff94bc40SHeiko Schocher */
commit_orphans(struct ubifs_info * c)404ff94bc40SHeiko Schocher static int commit_orphans(struct ubifs_info *c)
405ff94bc40SHeiko Schocher {
406ff94bc40SHeiko Schocher int avail, atomic = 0, err;
407ff94bc40SHeiko Schocher
408ff94bc40SHeiko Schocher ubifs_assert(c->cmt_orphans > 0);
409ff94bc40SHeiko Schocher avail = avail_orphs(c);
410ff94bc40SHeiko Schocher if (avail < c->cmt_orphans) {
411ff94bc40SHeiko Schocher /* Not enough space to write new orphans, so consolidate */
412ff94bc40SHeiko Schocher err = consolidate(c);
413ff94bc40SHeiko Schocher if (err)
414ff94bc40SHeiko Schocher return err;
415ff94bc40SHeiko Schocher atomic = 1;
416ff94bc40SHeiko Schocher }
417ff94bc40SHeiko Schocher err = write_orph_nodes(c, atomic);
418ff94bc40SHeiko Schocher return err;
419ff94bc40SHeiko Schocher }
420ff94bc40SHeiko Schocher
421ff94bc40SHeiko Schocher /**
422ff94bc40SHeiko Schocher * erase_deleted - erase the orphans marked for deletion.
423ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
424ff94bc40SHeiko Schocher *
425ff94bc40SHeiko Schocher * During commit, the orphans being committed cannot be deleted, so they are
426ff94bc40SHeiko Schocher * marked for deletion and deleted by this function. Also, the recovery
427ff94bc40SHeiko Schocher * adds killed orphans to the deletion list, and therefore they are deleted
428ff94bc40SHeiko Schocher * here too.
429ff94bc40SHeiko Schocher */
erase_deleted(struct ubifs_info * c)430ff94bc40SHeiko Schocher static void erase_deleted(struct ubifs_info *c)
431ff94bc40SHeiko Schocher {
432ff94bc40SHeiko Schocher struct ubifs_orphan *orphan, *dnext;
433ff94bc40SHeiko Schocher
434ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
435ff94bc40SHeiko Schocher dnext = c->orph_dnext;
436ff94bc40SHeiko Schocher while (dnext) {
437ff94bc40SHeiko Schocher orphan = dnext;
438ff94bc40SHeiko Schocher dnext = orphan->dnext;
439ff94bc40SHeiko Schocher ubifs_assert(!orphan->new);
440ff94bc40SHeiko Schocher ubifs_assert(orphan->del);
441ff94bc40SHeiko Schocher rb_erase(&orphan->rb, &c->orph_tree);
442ff94bc40SHeiko Schocher list_del(&orphan->list);
443ff94bc40SHeiko Schocher c->tot_orphans -= 1;
444ff94bc40SHeiko Schocher dbg_gen("deleting orphan ino %lu", (unsigned long)orphan->inum);
445ff94bc40SHeiko Schocher kfree(orphan);
446ff94bc40SHeiko Schocher }
447ff94bc40SHeiko Schocher c->orph_dnext = NULL;
448ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
449ff94bc40SHeiko Schocher }
450ff94bc40SHeiko Schocher
451ff94bc40SHeiko Schocher /**
452ff94bc40SHeiko Schocher * ubifs_orphan_end_commit - end commit of orphans.
453ff94bc40SHeiko Schocher * @c: UBIFS file-system description object
454ff94bc40SHeiko Schocher *
455ff94bc40SHeiko Schocher * End commit of orphans.
456ff94bc40SHeiko Schocher */
ubifs_orphan_end_commit(struct ubifs_info * c)457ff94bc40SHeiko Schocher int ubifs_orphan_end_commit(struct ubifs_info *c)
458ff94bc40SHeiko Schocher {
459ff94bc40SHeiko Schocher int err;
460ff94bc40SHeiko Schocher
461ff94bc40SHeiko Schocher if (c->cmt_orphans != 0) {
462ff94bc40SHeiko Schocher err = commit_orphans(c);
463ff94bc40SHeiko Schocher if (err)
464ff94bc40SHeiko Schocher return err;
465ff94bc40SHeiko Schocher }
466ff94bc40SHeiko Schocher erase_deleted(c);
467ff94bc40SHeiko Schocher err = dbg_check_orphans(c);
468ff94bc40SHeiko Schocher return err;
469ff94bc40SHeiko Schocher }
470ff94bc40SHeiko Schocher
471ff94bc40SHeiko Schocher /**
4729eefe2a2SStefan Roese * ubifs_clear_orphans - erase all LEBs used for orphans.
4739eefe2a2SStefan Roese * @c: UBIFS file-system description object
4749eefe2a2SStefan Roese *
4759eefe2a2SStefan Roese * If recovery is not required, then the orphans from the previous session
4769eefe2a2SStefan Roese * are not needed. This function locates the LEBs used to record
4779eefe2a2SStefan Roese * orphans, and un-maps them.
4789eefe2a2SStefan Roese */
ubifs_clear_orphans(struct ubifs_info * c)4799eefe2a2SStefan Roese int ubifs_clear_orphans(struct ubifs_info *c)
4809eefe2a2SStefan Roese {
4819eefe2a2SStefan Roese int lnum, err;
4829eefe2a2SStefan Roese
4839eefe2a2SStefan Roese for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
4849eefe2a2SStefan Roese err = ubifs_leb_unmap(c, lnum);
4859eefe2a2SStefan Roese if (err)
4869eefe2a2SStefan Roese return err;
4879eefe2a2SStefan Roese }
4889eefe2a2SStefan Roese c->ohead_lnum = c->orph_first;
4899eefe2a2SStefan Roese c->ohead_offs = 0;
4909eefe2a2SStefan Roese return 0;
4919eefe2a2SStefan Roese }
4929eefe2a2SStefan Roese
4939eefe2a2SStefan Roese /**
4949eefe2a2SStefan Roese * insert_dead_orphan - insert an orphan.
4959eefe2a2SStefan Roese * @c: UBIFS file-system description object
4969eefe2a2SStefan Roese * @inum: orphan inode number
4979eefe2a2SStefan Roese *
4989eefe2a2SStefan Roese * This function is a helper to the 'do_kill_orphans()' function. The orphan
4999eefe2a2SStefan Roese * must be kept until the next commit, so it is added to the rb-tree and the
5009eefe2a2SStefan Roese * deletion list.
5019eefe2a2SStefan Roese */
insert_dead_orphan(struct ubifs_info * c,ino_t inum)5029eefe2a2SStefan Roese static int insert_dead_orphan(struct ubifs_info *c, ino_t inum)
5039eefe2a2SStefan Roese {
5049eefe2a2SStefan Roese struct ubifs_orphan *orphan, *o;
5059eefe2a2SStefan Roese struct rb_node **p, *parent = NULL;
5069eefe2a2SStefan Roese
5079eefe2a2SStefan Roese orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_KERNEL);
5089eefe2a2SStefan Roese if (!orphan)
5099eefe2a2SStefan Roese return -ENOMEM;
5109eefe2a2SStefan Roese orphan->inum = inum;
5119eefe2a2SStefan Roese
5129eefe2a2SStefan Roese p = &c->orph_tree.rb_node;
5139eefe2a2SStefan Roese while (*p) {
5149eefe2a2SStefan Roese parent = *p;
5159eefe2a2SStefan Roese o = rb_entry(parent, struct ubifs_orphan, rb);
5169eefe2a2SStefan Roese if (inum < o->inum)
5179eefe2a2SStefan Roese p = &(*p)->rb_left;
5189eefe2a2SStefan Roese else if (inum > o->inum)
5199eefe2a2SStefan Roese p = &(*p)->rb_right;
5209eefe2a2SStefan Roese else {
5219eefe2a2SStefan Roese /* Already added - no problem */
5229eefe2a2SStefan Roese kfree(orphan);
5239eefe2a2SStefan Roese return 0;
5249eefe2a2SStefan Roese }
5259eefe2a2SStefan Roese }
5269eefe2a2SStefan Roese c->tot_orphans += 1;
5279eefe2a2SStefan Roese rb_link_node(&orphan->rb, parent, p);
5289eefe2a2SStefan Roese rb_insert_color(&orphan->rb, &c->orph_tree);
5299eefe2a2SStefan Roese list_add_tail(&orphan->list, &c->orph_list);
530ff94bc40SHeiko Schocher orphan->del = 1;
5319eefe2a2SStefan Roese orphan->dnext = c->orph_dnext;
5329eefe2a2SStefan Roese c->orph_dnext = orphan;
5339eefe2a2SStefan Roese dbg_mnt("ino %lu, new %d, tot %d", (unsigned long)inum,
5349eefe2a2SStefan Roese c->new_orphans, c->tot_orphans);
5359eefe2a2SStefan Roese return 0;
5369eefe2a2SStefan Roese }
5379eefe2a2SStefan Roese
5389eefe2a2SStefan Roese /**
5399eefe2a2SStefan Roese * do_kill_orphans - remove orphan inodes from the index.
5409eefe2a2SStefan Roese * @c: UBIFS file-system description object
5419eefe2a2SStefan Roese * @sleb: scanned LEB
5429eefe2a2SStefan Roese * @last_cmt_no: cmt_no of last orphan node read is passed and returned here
5439eefe2a2SStefan Roese * @outofdate: whether the LEB is out of date is returned here
5449eefe2a2SStefan Roese * @last_flagged: whether the end orphan node is encountered
5459eefe2a2SStefan Roese *
5469eefe2a2SStefan Roese * This function is a helper to the 'kill_orphans()' function. It goes through
5479eefe2a2SStefan Roese * every orphan node in a LEB and for every inode number recorded, removes
5489eefe2a2SStefan Roese * all keys for that inode from the TNC.
5499eefe2a2SStefan Roese */
do_kill_orphans(struct ubifs_info * c,struct ubifs_scan_leb * sleb,unsigned long long * last_cmt_no,int * outofdate,int * last_flagged)5509eefe2a2SStefan Roese static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
5519eefe2a2SStefan Roese unsigned long long *last_cmt_no, int *outofdate,
5529eefe2a2SStefan Roese int *last_flagged)
5539eefe2a2SStefan Roese {
5549eefe2a2SStefan Roese struct ubifs_scan_node *snod;
5559eefe2a2SStefan Roese struct ubifs_orph_node *orph;
5569eefe2a2SStefan Roese unsigned long long cmt_no;
5579eefe2a2SStefan Roese ino_t inum;
5589eefe2a2SStefan Roese int i, n, err, first = 1;
5599eefe2a2SStefan Roese
5609eefe2a2SStefan Roese list_for_each_entry(snod, &sleb->nodes, list) {
5619eefe2a2SStefan Roese if (snod->type != UBIFS_ORPH_NODE) {
562*0195a7bbSHeiko Schocher ubifs_err(c, "invalid node type %d in orphan area at %d:%d",
563ff94bc40SHeiko Schocher snod->type, sleb->lnum, snod->offs);
564ff94bc40SHeiko Schocher ubifs_dump_node(c, snod->node);
5659eefe2a2SStefan Roese return -EINVAL;
5669eefe2a2SStefan Roese }
5679eefe2a2SStefan Roese
5689eefe2a2SStefan Roese orph = snod->node;
5699eefe2a2SStefan Roese
5709eefe2a2SStefan Roese /* Check commit number */
5719eefe2a2SStefan Roese cmt_no = le64_to_cpu(orph->cmt_no) & LLONG_MAX;
5729eefe2a2SStefan Roese /*
5739eefe2a2SStefan Roese * The commit number on the master node may be less, because
5749eefe2a2SStefan Roese * of a failed commit. If there are several failed commits in a
5759eefe2a2SStefan Roese * row, the commit number written on orphan nodes will continue
5769eefe2a2SStefan Roese * to increase (because the commit number is adjusted here) even
5779eefe2a2SStefan Roese * though the commit number on the master node stays the same
5789eefe2a2SStefan Roese * because the master node has not been re-written.
5799eefe2a2SStefan Roese */
5809eefe2a2SStefan Roese if (cmt_no > c->cmt_no)
5819eefe2a2SStefan Roese c->cmt_no = cmt_no;
5829eefe2a2SStefan Roese if (cmt_no < *last_cmt_no && *last_flagged) {
5839eefe2a2SStefan Roese /*
5849eefe2a2SStefan Roese * The last orphan node had a higher commit number and
5859eefe2a2SStefan Roese * was flagged as the last written for that commit
5869eefe2a2SStefan Roese * number. That makes this orphan node, out of date.
5879eefe2a2SStefan Roese */
5889eefe2a2SStefan Roese if (!first) {
589*0195a7bbSHeiko Schocher ubifs_err(c, "out of order commit number %llu in orphan node at %d:%d",
5909eefe2a2SStefan Roese cmt_no, sleb->lnum, snod->offs);
591ff94bc40SHeiko Schocher ubifs_dump_node(c, snod->node);
5929eefe2a2SStefan Roese return -EINVAL;
5939eefe2a2SStefan Roese }
5949eefe2a2SStefan Roese dbg_rcvry("out of date LEB %d", sleb->lnum);
5959eefe2a2SStefan Roese *outofdate = 1;
5969eefe2a2SStefan Roese return 0;
5979eefe2a2SStefan Roese }
5989eefe2a2SStefan Roese
5999eefe2a2SStefan Roese if (first)
6009eefe2a2SStefan Roese first = 0;
6019eefe2a2SStefan Roese
6029eefe2a2SStefan Roese n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
6039eefe2a2SStefan Roese for (i = 0; i < n; i++) {
6049eefe2a2SStefan Roese inum = le64_to_cpu(orph->inos[i]);
6059eefe2a2SStefan Roese dbg_rcvry("deleting orphaned inode %lu",
6069eefe2a2SStefan Roese (unsigned long)inum);
6079eefe2a2SStefan Roese err = ubifs_tnc_remove_ino(c, inum);
6089eefe2a2SStefan Roese if (err)
6099eefe2a2SStefan Roese return err;
6109eefe2a2SStefan Roese err = insert_dead_orphan(c, inum);
6119eefe2a2SStefan Roese if (err)
6129eefe2a2SStefan Roese return err;
6139eefe2a2SStefan Roese }
6149eefe2a2SStefan Roese
6159eefe2a2SStefan Roese *last_cmt_no = cmt_no;
6169eefe2a2SStefan Roese if (le64_to_cpu(orph->cmt_no) & (1ULL << 63)) {
6179eefe2a2SStefan Roese dbg_rcvry("last orph node for commit %llu at %d:%d",
6189eefe2a2SStefan Roese cmt_no, sleb->lnum, snod->offs);
6199eefe2a2SStefan Roese *last_flagged = 1;
6209eefe2a2SStefan Roese } else
6219eefe2a2SStefan Roese *last_flagged = 0;
6229eefe2a2SStefan Roese }
6239eefe2a2SStefan Roese
6249eefe2a2SStefan Roese return 0;
6259eefe2a2SStefan Roese }
6269eefe2a2SStefan Roese
6279eefe2a2SStefan Roese /**
6289eefe2a2SStefan Roese * kill_orphans - remove all orphan inodes from the index.
6299eefe2a2SStefan Roese * @c: UBIFS file-system description object
6309eefe2a2SStefan Roese *
6319eefe2a2SStefan Roese * If recovery is required, then orphan inodes recorded during the previous
6329eefe2a2SStefan Roese * session (which ended with an unclean unmount) must be deleted from the index.
6339eefe2a2SStefan Roese * This is done by updating the TNC, but since the index is not updated until
6349eefe2a2SStefan Roese * the next commit, the LEBs where the orphan information is recorded are not
6359eefe2a2SStefan Roese * erased until the next commit.
6369eefe2a2SStefan Roese */
kill_orphans(struct ubifs_info * c)6379eefe2a2SStefan Roese static int kill_orphans(struct ubifs_info *c)
6389eefe2a2SStefan Roese {
6399eefe2a2SStefan Roese unsigned long long last_cmt_no = 0;
6409eefe2a2SStefan Roese int lnum, err = 0, outofdate = 0, last_flagged = 0;
6419eefe2a2SStefan Roese
6429eefe2a2SStefan Roese c->ohead_lnum = c->orph_first;
6439eefe2a2SStefan Roese c->ohead_offs = 0;
6449eefe2a2SStefan Roese /* Check no-orphans flag and skip this if no orphans */
6459eefe2a2SStefan Roese if (c->no_orphs) {
6469eefe2a2SStefan Roese dbg_rcvry("no orphans");
6479eefe2a2SStefan Roese return 0;
6489eefe2a2SStefan Roese }
6499eefe2a2SStefan Roese /*
6509eefe2a2SStefan Roese * Orph nodes always start at c->orph_first and are written to each
6519eefe2a2SStefan Roese * successive LEB in turn. Generally unused LEBs will have been unmapped
6529eefe2a2SStefan Roese * but may contain out of date orphan nodes if the unmap didn't go
6539eefe2a2SStefan Roese * through. In addition, the last orphan node written for each commit is
6549eefe2a2SStefan Roese * marked (top bit of orph->cmt_no is set to 1). It is possible that
6559eefe2a2SStefan Roese * there are orphan nodes from the next commit (i.e. the commit did not
6569eefe2a2SStefan Roese * complete successfully). In that case, no orphans will have been lost
6579eefe2a2SStefan Roese * due to the way that orphans are written, and any orphans added will
6589eefe2a2SStefan Roese * be valid orphans anyway and so can be deleted.
6599eefe2a2SStefan Roese */
6609eefe2a2SStefan Roese for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
6619eefe2a2SStefan Roese struct ubifs_scan_leb *sleb;
6629eefe2a2SStefan Roese
6639eefe2a2SStefan Roese dbg_rcvry("LEB %d", lnum);
664ff94bc40SHeiko Schocher sleb = ubifs_scan(c, lnum, 0, c->sbuf, 1);
6659eefe2a2SStefan Roese if (IS_ERR(sleb)) {
666ff94bc40SHeiko Schocher if (PTR_ERR(sleb) == -EUCLEAN)
667ff94bc40SHeiko Schocher sleb = ubifs_recover_leb(c, lnum, 0,
668ff94bc40SHeiko Schocher c->sbuf, -1);
6699eefe2a2SStefan Roese if (IS_ERR(sleb)) {
6709eefe2a2SStefan Roese err = PTR_ERR(sleb);
6719eefe2a2SStefan Roese break;
6729eefe2a2SStefan Roese }
6739eefe2a2SStefan Roese }
6749eefe2a2SStefan Roese err = do_kill_orphans(c, sleb, &last_cmt_no, &outofdate,
6759eefe2a2SStefan Roese &last_flagged);
6769eefe2a2SStefan Roese if (err || outofdate) {
6779eefe2a2SStefan Roese ubifs_scan_destroy(sleb);
6789eefe2a2SStefan Roese break;
6799eefe2a2SStefan Roese }
6809eefe2a2SStefan Roese if (sleb->endpt) {
6819eefe2a2SStefan Roese c->ohead_lnum = lnum;
6829eefe2a2SStefan Roese c->ohead_offs = sleb->endpt;
6839eefe2a2SStefan Roese }
6849eefe2a2SStefan Roese ubifs_scan_destroy(sleb);
6859eefe2a2SStefan Roese }
6869eefe2a2SStefan Roese return err;
6879eefe2a2SStefan Roese }
6889eefe2a2SStefan Roese
6899eefe2a2SStefan Roese /**
6909eefe2a2SStefan Roese * ubifs_mount_orphans - delete orphan inodes and erase LEBs that recorded them.
6919eefe2a2SStefan Roese * @c: UBIFS file-system description object
6929eefe2a2SStefan Roese * @unclean: indicates recovery from unclean unmount
6939eefe2a2SStefan Roese * @read_only: indicates read only mount
6949eefe2a2SStefan Roese *
6959eefe2a2SStefan Roese * This function is called when mounting to erase orphans from the previous
6969eefe2a2SStefan Roese * session. If UBIFS was not unmounted cleanly, then the inodes recorded as
6979eefe2a2SStefan Roese * orphans are deleted.
6989eefe2a2SStefan Roese */
ubifs_mount_orphans(struct ubifs_info * c,int unclean,int read_only)6999eefe2a2SStefan Roese int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only)
7009eefe2a2SStefan Roese {
7019eefe2a2SStefan Roese int err = 0;
7029eefe2a2SStefan Roese
7039eefe2a2SStefan Roese c->max_orphans = tot_avail_orphs(c);
7049eefe2a2SStefan Roese
7059eefe2a2SStefan Roese if (!read_only) {
7069eefe2a2SStefan Roese c->orph_buf = vmalloc(c->leb_size);
7079eefe2a2SStefan Roese if (!c->orph_buf)
7089eefe2a2SStefan Roese return -ENOMEM;
7099eefe2a2SStefan Roese }
7109eefe2a2SStefan Roese
7119eefe2a2SStefan Roese if (unclean)
7129eefe2a2SStefan Roese err = kill_orphans(c);
7139eefe2a2SStefan Roese else if (!read_only)
7149eefe2a2SStefan Roese err = ubifs_clear_orphans(c);
7159eefe2a2SStefan Roese
7169eefe2a2SStefan Roese return err;
7179eefe2a2SStefan Roese }
718ff94bc40SHeiko Schocher
719ff94bc40SHeiko Schocher /*
720ff94bc40SHeiko Schocher * Everything below is related to debugging.
721ff94bc40SHeiko Schocher */
722ff94bc40SHeiko Schocher
723ff94bc40SHeiko Schocher struct check_orphan {
724ff94bc40SHeiko Schocher struct rb_node rb;
725ff94bc40SHeiko Schocher ino_t inum;
726ff94bc40SHeiko Schocher };
727ff94bc40SHeiko Schocher
728ff94bc40SHeiko Schocher struct check_info {
729ff94bc40SHeiko Schocher unsigned long last_ino;
730ff94bc40SHeiko Schocher unsigned long tot_inos;
731ff94bc40SHeiko Schocher unsigned long missing;
732ff94bc40SHeiko Schocher unsigned long long leaf_cnt;
733ff94bc40SHeiko Schocher struct ubifs_ino_node *node;
734ff94bc40SHeiko Schocher struct rb_root root;
735ff94bc40SHeiko Schocher };
736ff94bc40SHeiko Schocher
dbg_find_orphan(struct ubifs_info * c,ino_t inum)737ff94bc40SHeiko Schocher static int dbg_find_orphan(struct ubifs_info *c, ino_t inum)
738ff94bc40SHeiko Schocher {
739ff94bc40SHeiko Schocher struct ubifs_orphan *o;
740ff94bc40SHeiko Schocher struct rb_node *p;
741ff94bc40SHeiko Schocher
742ff94bc40SHeiko Schocher spin_lock(&c->orphan_lock);
743ff94bc40SHeiko Schocher p = c->orph_tree.rb_node;
744ff94bc40SHeiko Schocher while (p) {
745ff94bc40SHeiko Schocher o = rb_entry(p, struct ubifs_orphan, rb);
746ff94bc40SHeiko Schocher if (inum < o->inum)
747ff94bc40SHeiko Schocher p = p->rb_left;
748ff94bc40SHeiko Schocher else if (inum > o->inum)
749ff94bc40SHeiko Schocher p = p->rb_right;
750ff94bc40SHeiko Schocher else {
751ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
752ff94bc40SHeiko Schocher return 1;
753ff94bc40SHeiko Schocher }
754ff94bc40SHeiko Schocher }
755ff94bc40SHeiko Schocher spin_unlock(&c->orphan_lock);
756ff94bc40SHeiko Schocher return 0;
757ff94bc40SHeiko Schocher }
758ff94bc40SHeiko Schocher
dbg_ins_check_orphan(struct rb_root * root,ino_t inum)759ff94bc40SHeiko Schocher static int dbg_ins_check_orphan(struct rb_root *root, ino_t inum)
760ff94bc40SHeiko Schocher {
761ff94bc40SHeiko Schocher struct check_orphan *orphan, *o;
762ff94bc40SHeiko Schocher struct rb_node **p, *parent = NULL;
763ff94bc40SHeiko Schocher
764ff94bc40SHeiko Schocher orphan = kzalloc(sizeof(struct check_orphan), GFP_NOFS);
765ff94bc40SHeiko Schocher if (!orphan)
766ff94bc40SHeiko Schocher return -ENOMEM;
767ff94bc40SHeiko Schocher orphan->inum = inum;
768ff94bc40SHeiko Schocher
769ff94bc40SHeiko Schocher p = &root->rb_node;
770ff94bc40SHeiko Schocher while (*p) {
771ff94bc40SHeiko Schocher parent = *p;
772ff94bc40SHeiko Schocher o = rb_entry(parent, struct check_orphan, rb);
773ff94bc40SHeiko Schocher if (inum < o->inum)
774ff94bc40SHeiko Schocher p = &(*p)->rb_left;
775ff94bc40SHeiko Schocher else if (inum > o->inum)
776ff94bc40SHeiko Schocher p = &(*p)->rb_right;
777ff94bc40SHeiko Schocher else {
778ff94bc40SHeiko Schocher kfree(orphan);
779ff94bc40SHeiko Schocher return 0;
780ff94bc40SHeiko Schocher }
781ff94bc40SHeiko Schocher }
782ff94bc40SHeiko Schocher rb_link_node(&orphan->rb, parent, p);
783ff94bc40SHeiko Schocher rb_insert_color(&orphan->rb, root);
784ff94bc40SHeiko Schocher return 0;
785ff94bc40SHeiko Schocher }
786ff94bc40SHeiko Schocher
dbg_find_check_orphan(struct rb_root * root,ino_t inum)787ff94bc40SHeiko Schocher static int dbg_find_check_orphan(struct rb_root *root, ino_t inum)
788ff94bc40SHeiko Schocher {
789ff94bc40SHeiko Schocher struct check_orphan *o;
790ff94bc40SHeiko Schocher struct rb_node *p;
791ff94bc40SHeiko Schocher
792ff94bc40SHeiko Schocher p = root->rb_node;
793ff94bc40SHeiko Schocher while (p) {
794ff94bc40SHeiko Schocher o = rb_entry(p, struct check_orphan, rb);
795ff94bc40SHeiko Schocher if (inum < o->inum)
796ff94bc40SHeiko Schocher p = p->rb_left;
797ff94bc40SHeiko Schocher else if (inum > o->inum)
798ff94bc40SHeiko Schocher p = p->rb_right;
799ff94bc40SHeiko Schocher else
800ff94bc40SHeiko Schocher return 1;
801ff94bc40SHeiko Schocher }
802ff94bc40SHeiko Schocher return 0;
803ff94bc40SHeiko Schocher }
804ff94bc40SHeiko Schocher
dbg_free_check_tree(struct rb_root * root)805ff94bc40SHeiko Schocher static void dbg_free_check_tree(struct rb_root *root)
806ff94bc40SHeiko Schocher {
807ff94bc40SHeiko Schocher struct check_orphan *o, *n;
808ff94bc40SHeiko Schocher
809ff94bc40SHeiko Schocher rbtree_postorder_for_each_entry_safe(o, n, root, rb)
810ff94bc40SHeiko Schocher kfree(o);
811ff94bc40SHeiko Schocher }
812ff94bc40SHeiko Schocher
dbg_orphan_check(struct ubifs_info * c,struct ubifs_zbranch * zbr,void * priv)813ff94bc40SHeiko Schocher static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr,
814ff94bc40SHeiko Schocher void *priv)
815ff94bc40SHeiko Schocher {
816ff94bc40SHeiko Schocher struct check_info *ci = priv;
817ff94bc40SHeiko Schocher ino_t inum;
818ff94bc40SHeiko Schocher int err;
819ff94bc40SHeiko Schocher
820ff94bc40SHeiko Schocher inum = key_inum(c, &zbr->key);
821ff94bc40SHeiko Schocher if (inum != ci->last_ino) {
822ff94bc40SHeiko Schocher /* Lowest node type is the inode node, so it comes first */
823ff94bc40SHeiko Schocher if (key_type(c, &zbr->key) != UBIFS_INO_KEY)
824*0195a7bbSHeiko Schocher ubifs_err(c, "found orphan node ino %lu, type %d",
825ff94bc40SHeiko Schocher (unsigned long)inum, key_type(c, &zbr->key));
826ff94bc40SHeiko Schocher ci->last_ino = inum;
827ff94bc40SHeiko Schocher ci->tot_inos += 1;
828ff94bc40SHeiko Schocher err = ubifs_tnc_read_node(c, zbr, ci->node);
829ff94bc40SHeiko Schocher if (err) {
830*0195a7bbSHeiko Schocher ubifs_err(c, "node read failed, error %d", err);
831ff94bc40SHeiko Schocher return err;
832ff94bc40SHeiko Schocher }
833ff94bc40SHeiko Schocher if (ci->node->nlink == 0)
834ff94bc40SHeiko Schocher /* Must be recorded as an orphan */
835ff94bc40SHeiko Schocher if (!dbg_find_check_orphan(&ci->root, inum) &&
836ff94bc40SHeiko Schocher !dbg_find_orphan(c, inum)) {
837*0195a7bbSHeiko Schocher ubifs_err(c, "missing orphan, ino %lu",
838ff94bc40SHeiko Schocher (unsigned long)inum);
839ff94bc40SHeiko Schocher ci->missing += 1;
840ff94bc40SHeiko Schocher }
841ff94bc40SHeiko Schocher }
842ff94bc40SHeiko Schocher ci->leaf_cnt += 1;
843ff94bc40SHeiko Schocher return 0;
844ff94bc40SHeiko Schocher }
845ff94bc40SHeiko Schocher
dbg_read_orphans(struct check_info * ci,struct ubifs_scan_leb * sleb)846ff94bc40SHeiko Schocher static int dbg_read_orphans(struct check_info *ci, struct ubifs_scan_leb *sleb)
847ff94bc40SHeiko Schocher {
848ff94bc40SHeiko Schocher struct ubifs_scan_node *snod;
849ff94bc40SHeiko Schocher struct ubifs_orph_node *orph;
850ff94bc40SHeiko Schocher ino_t inum;
851ff94bc40SHeiko Schocher int i, n, err;
852ff94bc40SHeiko Schocher
853ff94bc40SHeiko Schocher list_for_each_entry(snod, &sleb->nodes, list) {
854ff94bc40SHeiko Schocher cond_resched();
855ff94bc40SHeiko Schocher if (snod->type != UBIFS_ORPH_NODE)
856ff94bc40SHeiko Schocher continue;
857ff94bc40SHeiko Schocher orph = snod->node;
858ff94bc40SHeiko Schocher n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
859ff94bc40SHeiko Schocher for (i = 0; i < n; i++) {
860ff94bc40SHeiko Schocher inum = le64_to_cpu(orph->inos[i]);
861ff94bc40SHeiko Schocher err = dbg_ins_check_orphan(&ci->root, inum);
862ff94bc40SHeiko Schocher if (err)
863ff94bc40SHeiko Schocher return err;
864ff94bc40SHeiko Schocher }
865ff94bc40SHeiko Schocher }
866ff94bc40SHeiko Schocher return 0;
867ff94bc40SHeiko Schocher }
868ff94bc40SHeiko Schocher
dbg_scan_orphans(struct ubifs_info * c,struct check_info * ci)869ff94bc40SHeiko Schocher static int dbg_scan_orphans(struct ubifs_info *c, struct check_info *ci)
870ff94bc40SHeiko Schocher {
871ff94bc40SHeiko Schocher int lnum, err = 0;
872ff94bc40SHeiko Schocher void *buf;
873ff94bc40SHeiko Schocher
874ff94bc40SHeiko Schocher /* Check no-orphans flag and skip this if no orphans */
875ff94bc40SHeiko Schocher if (c->no_orphs)
876ff94bc40SHeiko Schocher return 0;
877ff94bc40SHeiko Schocher
878ff94bc40SHeiko Schocher buf = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
879ff94bc40SHeiko Schocher if (!buf) {
880*0195a7bbSHeiko Schocher ubifs_err(c, "cannot allocate memory to check orphans");
881ff94bc40SHeiko Schocher return 0;
882ff94bc40SHeiko Schocher }
883ff94bc40SHeiko Schocher
884ff94bc40SHeiko Schocher for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
885ff94bc40SHeiko Schocher struct ubifs_scan_leb *sleb;
886ff94bc40SHeiko Schocher
887ff94bc40SHeiko Schocher sleb = ubifs_scan(c, lnum, 0, buf, 0);
888ff94bc40SHeiko Schocher if (IS_ERR(sleb)) {
889ff94bc40SHeiko Schocher err = PTR_ERR(sleb);
890ff94bc40SHeiko Schocher break;
891ff94bc40SHeiko Schocher }
892ff94bc40SHeiko Schocher
893ff94bc40SHeiko Schocher err = dbg_read_orphans(ci, sleb);
894ff94bc40SHeiko Schocher ubifs_scan_destroy(sleb);
895ff94bc40SHeiko Schocher if (err)
896ff94bc40SHeiko Schocher break;
897ff94bc40SHeiko Schocher }
898ff94bc40SHeiko Schocher
899ff94bc40SHeiko Schocher vfree(buf);
900ff94bc40SHeiko Schocher return err;
901ff94bc40SHeiko Schocher }
902ff94bc40SHeiko Schocher
dbg_check_orphans(struct ubifs_info * c)903ff94bc40SHeiko Schocher static int dbg_check_orphans(struct ubifs_info *c)
904ff94bc40SHeiko Schocher {
905ff94bc40SHeiko Schocher struct check_info ci;
906ff94bc40SHeiko Schocher int err;
907ff94bc40SHeiko Schocher
908ff94bc40SHeiko Schocher if (!dbg_is_chk_orph(c))
909ff94bc40SHeiko Schocher return 0;
910ff94bc40SHeiko Schocher
911ff94bc40SHeiko Schocher ci.last_ino = 0;
912ff94bc40SHeiko Schocher ci.tot_inos = 0;
913ff94bc40SHeiko Schocher ci.missing = 0;
914ff94bc40SHeiko Schocher ci.leaf_cnt = 0;
915ff94bc40SHeiko Schocher ci.root = RB_ROOT;
916ff94bc40SHeiko Schocher ci.node = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
917ff94bc40SHeiko Schocher if (!ci.node) {
918*0195a7bbSHeiko Schocher ubifs_err(c, "out of memory");
919ff94bc40SHeiko Schocher return -ENOMEM;
920ff94bc40SHeiko Schocher }
921ff94bc40SHeiko Schocher
922ff94bc40SHeiko Schocher err = dbg_scan_orphans(c, &ci);
923ff94bc40SHeiko Schocher if (err)
924ff94bc40SHeiko Schocher goto out;
925ff94bc40SHeiko Schocher
926ff94bc40SHeiko Schocher err = dbg_walk_index(c, &dbg_orphan_check, NULL, &ci);
927ff94bc40SHeiko Schocher if (err) {
928*0195a7bbSHeiko Schocher ubifs_err(c, "cannot scan TNC, error %d", err);
929ff94bc40SHeiko Schocher goto out;
930ff94bc40SHeiko Schocher }
931ff94bc40SHeiko Schocher
932ff94bc40SHeiko Schocher if (ci.missing) {
933*0195a7bbSHeiko Schocher ubifs_err(c, "%lu missing orphan(s)", ci.missing);
934ff94bc40SHeiko Schocher err = -EINVAL;
935ff94bc40SHeiko Schocher goto out;
936ff94bc40SHeiko Schocher }
937ff94bc40SHeiko Schocher
938ff94bc40SHeiko Schocher dbg_cmt("last inode number is %lu", ci.last_ino);
939ff94bc40SHeiko Schocher dbg_cmt("total number of inodes is %lu", ci.tot_inos);
940ff94bc40SHeiko Schocher dbg_cmt("total number of leaf nodes is %llu", ci.leaf_cnt);
941ff94bc40SHeiko Schocher
942ff94bc40SHeiko Schocher out:
943ff94bc40SHeiko Schocher dbg_free_check_tree(&ci.root);
944ff94bc40SHeiko Schocher kfree(ci.node);
945ff94bc40SHeiko Schocher return err;
946ff94bc40SHeiko Schocher }
947