xref: /openbmc/u-boot/fs/ubifs/orphan.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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