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