1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * This file is part of UBIFS.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2006-2008 Nokia Corporation.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Author: Adrian Hunter
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/err.h>
12*4882a593Smuzhiyun #include "ubifs.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun * An orphan is an inode number whose inode node has been committed to the index
16*4882a593Smuzhiyun * with a link count of zero. That happens when an open file is deleted
17*4882a593Smuzhiyun * (unlinked) and then a commit is run. In the normal course of events the inode
18*4882a593Smuzhiyun * would be deleted when the file is closed. However in the case of an unclean
19*4882a593Smuzhiyun * unmount, orphans need to be accounted for. After an unclean unmount, the
20*4882a593Smuzhiyun * orphans' inodes must be deleted which means either scanning the entire index
21*4882a593Smuzhiyun * looking for them, or keeping a list on flash somewhere. This unit implements
22*4882a593Smuzhiyun * the latter approach.
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * The orphan area is a fixed number of LEBs situated between the LPT area and
25*4882a593Smuzhiyun * the main area. The number of orphan area LEBs is specified when the file
26*4882a593Smuzhiyun * system is created. The minimum number is 1. The size of the orphan area
27*4882a593Smuzhiyun * should be so that it can hold the maximum number of orphans that are expected
28*4882a593Smuzhiyun * to ever exist at one time.
29*4882a593Smuzhiyun *
30*4882a593Smuzhiyun * The number of orphans that can fit in a LEB is:
31*4882a593Smuzhiyun *
32*4882a593Smuzhiyun * (c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64)
33*4882a593Smuzhiyun *
34*4882a593Smuzhiyun * For example: a 15872 byte LEB can fit 1980 orphans so 1 LEB may be enough.
35*4882a593Smuzhiyun *
36*4882a593Smuzhiyun * Orphans are accumulated in a rb-tree. When an inode's link count drops to
37*4882a593Smuzhiyun * zero, the inode number is added to the rb-tree. It is removed from the tree
38*4882a593Smuzhiyun * when the inode is deleted. Any new orphans that are in the orphan tree when
39*4882a593Smuzhiyun * the commit is run, are written to the orphan area in 1 or more orphan nodes.
40*4882a593Smuzhiyun * If the orphan area is full, it is consolidated to make space. There is
41*4882a593Smuzhiyun * always enough space because validation prevents the user from creating more
42*4882a593Smuzhiyun * than the maximum number of orphans allowed.
43*4882a593Smuzhiyun */
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun static int dbg_check_orphans(struct ubifs_info *c);
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /**
48*4882a593Smuzhiyun * ubifs_add_orphan - add an orphan.
49*4882a593Smuzhiyun * @c: UBIFS file-system description object
50*4882a593Smuzhiyun * @inum: orphan inode number
51*4882a593Smuzhiyun *
52*4882a593Smuzhiyun * Add an orphan. This function is called when an inodes link count drops to
53*4882a593Smuzhiyun * zero.
54*4882a593Smuzhiyun */
ubifs_add_orphan(struct ubifs_info * c,ino_t inum)55*4882a593Smuzhiyun int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun struct ubifs_orphan *orphan, *o;
58*4882a593Smuzhiyun struct rb_node **p, *parent = NULL;
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_NOFS);
61*4882a593Smuzhiyun if (!orphan)
62*4882a593Smuzhiyun return -ENOMEM;
63*4882a593Smuzhiyun orphan->inum = inum;
64*4882a593Smuzhiyun orphan->new = 1;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
67*4882a593Smuzhiyun if (c->tot_orphans >= c->max_orphans) {
68*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
69*4882a593Smuzhiyun kfree(orphan);
70*4882a593Smuzhiyun return -ENFILE;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun p = &c->orph_tree.rb_node;
73*4882a593Smuzhiyun while (*p) {
74*4882a593Smuzhiyun parent = *p;
75*4882a593Smuzhiyun o = rb_entry(parent, struct ubifs_orphan, rb);
76*4882a593Smuzhiyun if (inum < o->inum)
77*4882a593Smuzhiyun p = &(*p)->rb_left;
78*4882a593Smuzhiyun else if (inum > o->inum)
79*4882a593Smuzhiyun p = &(*p)->rb_right;
80*4882a593Smuzhiyun else {
81*4882a593Smuzhiyun ubifs_err(c, "orphaned twice");
82*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
83*4882a593Smuzhiyun kfree(orphan);
84*4882a593Smuzhiyun return 0;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun c->tot_orphans += 1;
88*4882a593Smuzhiyun c->new_orphans += 1;
89*4882a593Smuzhiyun rb_link_node(&orphan->rb, parent, p);
90*4882a593Smuzhiyun rb_insert_color(&orphan->rb, &c->orph_tree);
91*4882a593Smuzhiyun list_add_tail(&orphan->list, &c->orph_list);
92*4882a593Smuzhiyun list_add_tail(&orphan->new_list, &c->orph_new);
93*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
94*4882a593Smuzhiyun dbg_gen("ino %lu", (unsigned long)inum);
95*4882a593Smuzhiyun return 0;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /**
99*4882a593Smuzhiyun * ubifs_delete_orphan - delete an orphan.
100*4882a593Smuzhiyun * @c: UBIFS file-system description object
101*4882a593Smuzhiyun * @inum: orphan inode number
102*4882a593Smuzhiyun *
103*4882a593Smuzhiyun * Delete an orphan. This function is called when an inode is deleted.
104*4882a593Smuzhiyun */
ubifs_delete_orphan(struct ubifs_info * c,ino_t inum)105*4882a593Smuzhiyun void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun struct ubifs_orphan *o;
108*4882a593Smuzhiyun struct rb_node *p;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
111*4882a593Smuzhiyun p = c->orph_tree.rb_node;
112*4882a593Smuzhiyun while (p) {
113*4882a593Smuzhiyun o = rb_entry(p, struct ubifs_orphan, rb);
114*4882a593Smuzhiyun if (inum < o->inum)
115*4882a593Smuzhiyun p = p->rb_left;
116*4882a593Smuzhiyun else if (inum > o->inum)
117*4882a593Smuzhiyun p = p->rb_right;
118*4882a593Smuzhiyun else {
119*4882a593Smuzhiyun if (o->del) {
120*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
121*4882a593Smuzhiyun dbg_gen("deleted twice ino %lu",
122*4882a593Smuzhiyun (unsigned long)inum);
123*4882a593Smuzhiyun return;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun if (o->cmt) {
126*4882a593Smuzhiyun o->del = 1;
127*4882a593Smuzhiyun o->dnext = c->orph_dnext;
128*4882a593Smuzhiyun c->orph_dnext = o;
129*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
130*4882a593Smuzhiyun dbg_gen("delete later ino %lu",
131*4882a593Smuzhiyun (unsigned long)inum);
132*4882a593Smuzhiyun return;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun rb_erase(p, &c->orph_tree);
135*4882a593Smuzhiyun list_del(&o->list);
136*4882a593Smuzhiyun c->tot_orphans -= 1;
137*4882a593Smuzhiyun if (o->new) {
138*4882a593Smuzhiyun list_del(&o->new_list);
139*4882a593Smuzhiyun c->new_orphans -= 1;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
142*4882a593Smuzhiyun kfree(o);
143*4882a593Smuzhiyun dbg_gen("inum %lu", (unsigned long)inum);
144*4882a593Smuzhiyun return;
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
148*4882a593Smuzhiyun ubifs_err(c, "missing orphan ino %lu", (unsigned long)inum);
149*4882a593Smuzhiyun dump_stack();
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun /**
153*4882a593Smuzhiyun * ubifs_orphan_start_commit - start commit of orphans.
154*4882a593Smuzhiyun * @c: UBIFS file-system description object
155*4882a593Smuzhiyun *
156*4882a593Smuzhiyun * Start commit of orphans.
157*4882a593Smuzhiyun */
ubifs_orphan_start_commit(struct ubifs_info * c)158*4882a593Smuzhiyun int ubifs_orphan_start_commit(struct ubifs_info *c)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun struct ubifs_orphan *orphan, **last;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
163*4882a593Smuzhiyun last = &c->orph_cnext;
164*4882a593Smuzhiyun list_for_each_entry(orphan, &c->orph_new, new_list) {
165*4882a593Smuzhiyun ubifs_assert(orphan->new);
166*4882a593Smuzhiyun ubifs_assert(!orphan->cmt);
167*4882a593Smuzhiyun orphan->new = 0;
168*4882a593Smuzhiyun orphan->cmt = 1;
169*4882a593Smuzhiyun *last = orphan;
170*4882a593Smuzhiyun last = &orphan->cnext;
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun *last = NULL;
173*4882a593Smuzhiyun c->cmt_orphans = c->new_orphans;
174*4882a593Smuzhiyun c->new_orphans = 0;
175*4882a593Smuzhiyun dbg_cmt("%d orphans to commit", c->cmt_orphans);
176*4882a593Smuzhiyun INIT_LIST_HEAD(&c->orph_new);
177*4882a593Smuzhiyun if (c->tot_orphans == 0)
178*4882a593Smuzhiyun c->no_orphs = 1;
179*4882a593Smuzhiyun else
180*4882a593Smuzhiyun c->no_orphs = 0;
181*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
182*4882a593Smuzhiyun return 0;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /**
186*4882a593Smuzhiyun * avail_orphs - calculate available space.
187*4882a593Smuzhiyun * @c: UBIFS file-system description object
188*4882a593Smuzhiyun *
189*4882a593Smuzhiyun * This function returns the number of orphans that can be written in the
190*4882a593Smuzhiyun * available space.
191*4882a593Smuzhiyun */
avail_orphs(struct ubifs_info * c)192*4882a593Smuzhiyun static int avail_orphs(struct ubifs_info *c)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun int avail_lebs, avail, gap;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun avail_lebs = c->orph_lebs - (c->ohead_lnum - c->orph_first) - 1;
197*4882a593Smuzhiyun avail = avail_lebs *
198*4882a593Smuzhiyun ((c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64));
199*4882a593Smuzhiyun gap = c->leb_size - c->ohead_offs;
200*4882a593Smuzhiyun if (gap >= UBIFS_ORPH_NODE_SZ + sizeof(__le64))
201*4882a593Smuzhiyun avail += (gap - UBIFS_ORPH_NODE_SZ) / sizeof(__le64);
202*4882a593Smuzhiyun return avail;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun /**
206*4882a593Smuzhiyun * tot_avail_orphs - calculate total space.
207*4882a593Smuzhiyun * @c: UBIFS file-system description object
208*4882a593Smuzhiyun *
209*4882a593Smuzhiyun * This function returns the number of orphans that can be written in half
210*4882a593Smuzhiyun * the total space. That leaves half the space for adding new orphans.
211*4882a593Smuzhiyun */
tot_avail_orphs(struct ubifs_info * c)212*4882a593Smuzhiyun static int tot_avail_orphs(struct ubifs_info *c)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun int avail_lebs, avail;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun avail_lebs = c->orph_lebs;
217*4882a593Smuzhiyun avail = avail_lebs *
218*4882a593Smuzhiyun ((c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64));
219*4882a593Smuzhiyun return avail / 2;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun /**
223*4882a593Smuzhiyun * do_write_orph_node - write a node to the orphan head.
224*4882a593Smuzhiyun * @c: UBIFS file-system description object
225*4882a593Smuzhiyun * @len: length of node
226*4882a593Smuzhiyun * @atomic: write atomically
227*4882a593Smuzhiyun *
228*4882a593Smuzhiyun * This function writes a node to the orphan head from the orphan buffer. If
229*4882a593Smuzhiyun * %atomic is not zero, then the write is done atomically. On success, %0 is
230*4882a593Smuzhiyun * returned, otherwise a negative error code is returned.
231*4882a593Smuzhiyun */
do_write_orph_node(struct ubifs_info * c,int len,int atomic)232*4882a593Smuzhiyun static int do_write_orph_node(struct ubifs_info *c, int len, int atomic)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun int err = 0;
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun if (atomic) {
237*4882a593Smuzhiyun ubifs_assert(c->ohead_offs == 0);
238*4882a593Smuzhiyun ubifs_prepare_node(c, c->orph_buf, len, 1);
239*4882a593Smuzhiyun len = ALIGN(len, c->min_io_size);
240*4882a593Smuzhiyun err = ubifs_leb_change(c, c->ohead_lnum, c->orph_buf, len);
241*4882a593Smuzhiyun } else {
242*4882a593Smuzhiyun if (c->ohead_offs == 0) {
243*4882a593Smuzhiyun /* Ensure LEB has been unmapped */
244*4882a593Smuzhiyun err = ubifs_leb_unmap(c, c->ohead_lnum);
245*4882a593Smuzhiyun if (err)
246*4882a593Smuzhiyun return err;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun err = ubifs_write_node(c, c->orph_buf, len, c->ohead_lnum,
249*4882a593Smuzhiyun c->ohead_offs);
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun return err;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /**
255*4882a593Smuzhiyun * write_orph_node - write an orphan node.
256*4882a593Smuzhiyun * @c: UBIFS file-system description object
257*4882a593Smuzhiyun * @atomic: write atomically
258*4882a593Smuzhiyun *
259*4882a593Smuzhiyun * This function builds an orphan node from the cnext list and writes it to the
260*4882a593Smuzhiyun * orphan head. On success, %0 is returned, otherwise a negative error code
261*4882a593Smuzhiyun * is returned.
262*4882a593Smuzhiyun */
write_orph_node(struct ubifs_info * c,int atomic)263*4882a593Smuzhiyun static int write_orph_node(struct ubifs_info *c, int atomic)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun struct ubifs_orphan *orphan, *cnext;
266*4882a593Smuzhiyun struct ubifs_orph_node *orph;
267*4882a593Smuzhiyun int gap, err, len, cnt, i;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun ubifs_assert(c->cmt_orphans > 0);
270*4882a593Smuzhiyun gap = c->leb_size - c->ohead_offs;
271*4882a593Smuzhiyun if (gap < UBIFS_ORPH_NODE_SZ + sizeof(__le64)) {
272*4882a593Smuzhiyun c->ohead_lnum += 1;
273*4882a593Smuzhiyun c->ohead_offs = 0;
274*4882a593Smuzhiyun gap = c->leb_size;
275*4882a593Smuzhiyun if (c->ohead_lnum > c->orph_last) {
276*4882a593Smuzhiyun /*
277*4882a593Smuzhiyun * We limit the number of orphans so that this should
278*4882a593Smuzhiyun * never happen.
279*4882a593Smuzhiyun */
280*4882a593Smuzhiyun ubifs_err(c, "out of space in orphan area");
281*4882a593Smuzhiyun return -EINVAL;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun cnt = (gap - UBIFS_ORPH_NODE_SZ) / sizeof(__le64);
285*4882a593Smuzhiyun if (cnt > c->cmt_orphans)
286*4882a593Smuzhiyun cnt = c->cmt_orphans;
287*4882a593Smuzhiyun len = UBIFS_ORPH_NODE_SZ + cnt * sizeof(__le64);
288*4882a593Smuzhiyun ubifs_assert(c->orph_buf);
289*4882a593Smuzhiyun orph = c->orph_buf;
290*4882a593Smuzhiyun orph->ch.node_type = UBIFS_ORPH_NODE;
291*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
292*4882a593Smuzhiyun cnext = c->orph_cnext;
293*4882a593Smuzhiyun for (i = 0; i < cnt; i++) {
294*4882a593Smuzhiyun orphan = cnext;
295*4882a593Smuzhiyun ubifs_assert(orphan->cmt);
296*4882a593Smuzhiyun orph->inos[i] = cpu_to_le64(orphan->inum);
297*4882a593Smuzhiyun orphan->cmt = 0;
298*4882a593Smuzhiyun cnext = orphan->cnext;
299*4882a593Smuzhiyun orphan->cnext = NULL;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun c->orph_cnext = cnext;
302*4882a593Smuzhiyun c->cmt_orphans -= cnt;
303*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
304*4882a593Smuzhiyun if (c->cmt_orphans)
305*4882a593Smuzhiyun orph->cmt_no = cpu_to_le64(c->cmt_no);
306*4882a593Smuzhiyun else
307*4882a593Smuzhiyun /* Mark the last node of the commit */
308*4882a593Smuzhiyun orph->cmt_no = cpu_to_le64((c->cmt_no) | (1ULL << 63));
309*4882a593Smuzhiyun ubifs_assert(c->ohead_offs + len <= c->leb_size);
310*4882a593Smuzhiyun ubifs_assert(c->ohead_lnum >= c->orph_first);
311*4882a593Smuzhiyun ubifs_assert(c->ohead_lnum <= c->orph_last);
312*4882a593Smuzhiyun err = do_write_orph_node(c, len, atomic);
313*4882a593Smuzhiyun c->ohead_offs += ALIGN(len, c->min_io_size);
314*4882a593Smuzhiyun c->ohead_offs = ALIGN(c->ohead_offs, 8);
315*4882a593Smuzhiyun return err;
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun /**
319*4882a593Smuzhiyun * write_orph_nodes - write orphan nodes until there are no more to commit.
320*4882a593Smuzhiyun * @c: UBIFS file-system description object
321*4882a593Smuzhiyun * @atomic: write atomically
322*4882a593Smuzhiyun *
323*4882a593Smuzhiyun * This function writes orphan nodes for all the orphans to commit. On success,
324*4882a593Smuzhiyun * %0 is returned, otherwise a negative error code is returned.
325*4882a593Smuzhiyun */
write_orph_nodes(struct ubifs_info * c,int atomic)326*4882a593Smuzhiyun static int write_orph_nodes(struct ubifs_info *c, int atomic)
327*4882a593Smuzhiyun {
328*4882a593Smuzhiyun int err;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun while (c->cmt_orphans > 0) {
331*4882a593Smuzhiyun err = write_orph_node(c, atomic);
332*4882a593Smuzhiyun if (err)
333*4882a593Smuzhiyun return err;
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun if (atomic) {
336*4882a593Smuzhiyun int lnum;
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun /* Unmap any unused LEBs after consolidation */
339*4882a593Smuzhiyun for (lnum = c->ohead_lnum + 1; lnum <= c->orph_last; lnum++) {
340*4882a593Smuzhiyun err = ubifs_leb_unmap(c, lnum);
341*4882a593Smuzhiyun if (err)
342*4882a593Smuzhiyun return err;
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun return 0;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun /**
349*4882a593Smuzhiyun * consolidate - consolidate the orphan area.
350*4882a593Smuzhiyun * @c: UBIFS file-system description object
351*4882a593Smuzhiyun *
352*4882a593Smuzhiyun * This function enables consolidation by putting all the orphans into the list
353*4882a593Smuzhiyun * to commit. The list is in the order that the orphans were added, and the
354*4882a593Smuzhiyun * LEBs are written atomically in order, so at no time can orphans be lost by
355*4882a593Smuzhiyun * an unclean unmount.
356*4882a593Smuzhiyun *
357*4882a593Smuzhiyun * This function returns %0 on success and a negative error code on failure.
358*4882a593Smuzhiyun */
consolidate(struct ubifs_info * c)359*4882a593Smuzhiyun static int consolidate(struct ubifs_info *c)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun int tot_avail = tot_avail_orphs(c), err = 0;
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
364*4882a593Smuzhiyun dbg_cmt("there is space for %d orphans and there are %d",
365*4882a593Smuzhiyun tot_avail, c->tot_orphans);
366*4882a593Smuzhiyun if (c->tot_orphans - c->new_orphans <= tot_avail) {
367*4882a593Smuzhiyun struct ubifs_orphan *orphan, **last;
368*4882a593Smuzhiyun int cnt = 0;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun /* Change the cnext list to include all non-new orphans */
371*4882a593Smuzhiyun last = &c->orph_cnext;
372*4882a593Smuzhiyun list_for_each_entry(orphan, &c->orph_list, list) {
373*4882a593Smuzhiyun if (orphan->new)
374*4882a593Smuzhiyun continue;
375*4882a593Smuzhiyun orphan->cmt = 1;
376*4882a593Smuzhiyun *last = orphan;
377*4882a593Smuzhiyun last = &orphan->cnext;
378*4882a593Smuzhiyun cnt += 1;
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun *last = NULL;
381*4882a593Smuzhiyun ubifs_assert(cnt == c->tot_orphans - c->new_orphans);
382*4882a593Smuzhiyun c->cmt_orphans = cnt;
383*4882a593Smuzhiyun c->ohead_lnum = c->orph_first;
384*4882a593Smuzhiyun c->ohead_offs = 0;
385*4882a593Smuzhiyun } else {
386*4882a593Smuzhiyun /*
387*4882a593Smuzhiyun * We limit the number of orphans so that this should
388*4882a593Smuzhiyun * never happen.
389*4882a593Smuzhiyun */
390*4882a593Smuzhiyun ubifs_err(c, "out of space in orphan area");
391*4882a593Smuzhiyun err = -EINVAL;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
394*4882a593Smuzhiyun return err;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /**
398*4882a593Smuzhiyun * commit_orphans - commit orphans.
399*4882a593Smuzhiyun * @c: UBIFS file-system description object
400*4882a593Smuzhiyun *
401*4882a593Smuzhiyun * This function commits orphans to flash. On success, %0 is returned,
402*4882a593Smuzhiyun * otherwise a negative error code is returned.
403*4882a593Smuzhiyun */
commit_orphans(struct ubifs_info * c)404*4882a593Smuzhiyun static int commit_orphans(struct ubifs_info *c)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun int avail, atomic = 0, err;
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun ubifs_assert(c->cmt_orphans > 0);
409*4882a593Smuzhiyun avail = avail_orphs(c);
410*4882a593Smuzhiyun if (avail < c->cmt_orphans) {
411*4882a593Smuzhiyun /* Not enough space to write new orphans, so consolidate */
412*4882a593Smuzhiyun err = consolidate(c);
413*4882a593Smuzhiyun if (err)
414*4882a593Smuzhiyun return err;
415*4882a593Smuzhiyun atomic = 1;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun err = write_orph_nodes(c, atomic);
418*4882a593Smuzhiyun return err;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun /**
422*4882a593Smuzhiyun * erase_deleted - erase the orphans marked for deletion.
423*4882a593Smuzhiyun * @c: UBIFS file-system description object
424*4882a593Smuzhiyun *
425*4882a593Smuzhiyun * During commit, the orphans being committed cannot be deleted, so they are
426*4882a593Smuzhiyun * marked for deletion and deleted by this function. Also, the recovery
427*4882a593Smuzhiyun * adds killed orphans to the deletion list, and therefore they are deleted
428*4882a593Smuzhiyun * here too.
429*4882a593Smuzhiyun */
erase_deleted(struct ubifs_info * c)430*4882a593Smuzhiyun static void erase_deleted(struct ubifs_info *c)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun struct ubifs_orphan *orphan, *dnext;
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
435*4882a593Smuzhiyun dnext = c->orph_dnext;
436*4882a593Smuzhiyun while (dnext) {
437*4882a593Smuzhiyun orphan = dnext;
438*4882a593Smuzhiyun dnext = orphan->dnext;
439*4882a593Smuzhiyun ubifs_assert(!orphan->new);
440*4882a593Smuzhiyun ubifs_assert(orphan->del);
441*4882a593Smuzhiyun rb_erase(&orphan->rb, &c->orph_tree);
442*4882a593Smuzhiyun list_del(&orphan->list);
443*4882a593Smuzhiyun c->tot_orphans -= 1;
444*4882a593Smuzhiyun dbg_gen("deleting orphan ino %lu", (unsigned long)orphan->inum);
445*4882a593Smuzhiyun kfree(orphan);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun c->orph_dnext = NULL;
448*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun /**
452*4882a593Smuzhiyun * ubifs_orphan_end_commit - end commit of orphans.
453*4882a593Smuzhiyun * @c: UBIFS file-system description object
454*4882a593Smuzhiyun *
455*4882a593Smuzhiyun * End commit of orphans.
456*4882a593Smuzhiyun */
ubifs_orphan_end_commit(struct ubifs_info * c)457*4882a593Smuzhiyun int ubifs_orphan_end_commit(struct ubifs_info *c)
458*4882a593Smuzhiyun {
459*4882a593Smuzhiyun int err;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun if (c->cmt_orphans != 0) {
462*4882a593Smuzhiyun err = commit_orphans(c);
463*4882a593Smuzhiyun if (err)
464*4882a593Smuzhiyun return err;
465*4882a593Smuzhiyun }
466*4882a593Smuzhiyun erase_deleted(c);
467*4882a593Smuzhiyun err = dbg_check_orphans(c);
468*4882a593Smuzhiyun return err;
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun /**
472*4882a593Smuzhiyun * ubifs_clear_orphans - erase all LEBs used for orphans.
473*4882a593Smuzhiyun * @c: UBIFS file-system description object
474*4882a593Smuzhiyun *
475*4882a593Smuzhiyun * If recovery is not required, then the orphans from the previous session
476*4882a593Smuzhiyun * are not needed. This function locates the LEBs used to record
477*4882a593Smuzhiyun * orphans, and un-maps them.
478*4882a593Smuzhiyun */
ubifs_clear_orphans(struct ubifs_info * c)479*4882a593Smuzhiyun int ubifs_clear_orphans(struct ubifs_info *c)
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun int lnum, err;
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
484*4882a593Smuzhiyun err = ubifs_leb_unmap(c, lnum);
485*4882a593Smuzhiyun if (err)
486*4882a593Smuzhiyun return err;
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun c->ohead_lnum = c->orph_first;
489*4882a593Smuzhiyun c->ohead_offs = 0;
490*4882a593Smuzhiyun return 0;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun /**
494*4882a593Smuzhiyun * insert_dead_orphan - insert an orphan.
495*4882a593Smuzhiyun * @c: UBIFS file-system description object
496*4882a593Smuzhiyun * @inum: orphan inode number
497*4882a593Smuzhiyun *
498*4882a593Smuzhiyun * This function is a helper to the 'do_kill_orphans()' function. The orphan
499*4882a593Smuzhiyun * must be kept until the next commit, so it is added to the rb-tree and the
500*4882a593Smuzhiyun * deletion list.
501*4882a593Smuzhiyun */
insert_dead_orphan(struct ubifs_info * c,ino_t inum)502*4882a593Smuzhiyun static int insert_dead_orphan(struct ubifs_info *c, ino_t inum)
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun struct ubifs_orphan *orphan, *o;
505*4882a593Smuzhiyun struct rb_node **p, *parent = NULL;
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_KERNEL);
508*4882a593Smuzhiyun if (!orphan)
509*4882a593Smuzhiyun return -ENOMEM;
510*4882a593Smuzhiyun orphan->inum = inum;
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun p = &c->orph_tree.rb_node;
513*4882a593Smuzhiyun while (*p) {
514*4882a593Smuzhiyun parent = *p;
515*4882a593Smuzhiyun o = rb_entry(parent, struct ubifs_orphan, rb);
516*4882a593Smuzhiyun if (inum < o->inum)
517*4882a593Smuzhiyun p = &(*p)->rb_left;
518*4882a593Smuzhiyun else if (inum > o->inum)
519*4882a593Smuzhiyun p = &(*p)->rb_right;
520*4882a593Smuzhiyun else {
521*4882a593Smuzhiyun /* Already added - no problem */
522*4882a593Smuzhiyun kfree(orphan);
523*4882a593Smuzhiyun return 0;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun }
526*4882a593Smuzhiyun c->tot_orphans += 1;
527*4882a593Smuzhiyun rb_link_node(&orphan->rb, parent, p);
528*4882a593Smuzhiyun rb_insert_color(&orphan->rb, &c->orph_tree);
529*4882a593Smuzhiyun list_add_tail(&orphan->list, &c->orph_list);
530*4882a593Smuzhiyun orphan->del = 1;
531*4882a593Smuzhiyun orphan->dnext = c->orph_dnext;
532*4882a593Smuzhiyun c->orph_dnext = orphan;
533*4882a593Smuzhiyun dbg_mnt("ino %lu, new %d, tot %d", (unsigned long)inum,
534*4882a593Smuzhiyun c->new_orphans, c->tot_orphans);
535*4882a593Smuzhiyun return 0;
536*4882a593Smuzhiyun }
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun /**
539*4882a593Smuzhiyun * do_kill_orphans - remove orphan inodes from the index.
540*4882a593Smuzhiyun * @c: UBIFS file-system description object
541*4882a593Smuzhiyun * @sleb: scanned LEB
542*4882a593Smuzhiyun * @last_cmt_no: cmt_no of last orphan node read is passed and returned here
543*4882a593Smuzhiyun * @outofdate: whether the LEB is out of date is returned here
544*4882a593Smuzhiyun * @last_flagged: whether the end orphan node is encountered
545*4882a593Smuzhiyun *
546*4882a593Smuzhiyun * This function is a helper to the 'kill_orphans()' function. It goes through
547*4882a593Smuzhiyun * every orphan node in a LEB and for every inode number recorded, removes
548*4882a593Smuzhiyun * all keys for that inode from the TNC.
549*4882a593Smuzhiyun */
do_kill_orphans(struct ubifs_info * c,struct ubifs_scan_leb * sleb,unsigned long long * last_cmt_no,int * outofdate,int * last_flagged)550*4882a593Smuzhiyun static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
551*4882a593Smuzhiyun unsigned long long *last_cmt_no, int *outofdate,
552*4882a593Smuzhiyun int *last_flagged)
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun struct ubifs_scan_node *snod;
555*4882a593Smuzhiyun struct ubifs_orph_node *orph;
556*4882a593Smuzhiyun unsigned long long cmt_no;
557*4882a593Smuzhiyun ino_t inum;
558*4882a593Smuzhiyun int i, n, err, first = 1;
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun list_for_each_entry(snod, &sleb->nodes, list) {
561*4882a593Smuzhiyun if (snod->type != UBIFS_ORPH_NODE) {
562*4882a593Smuzhiyun ubifs_err(c, "invalid node type %d in orphan area at %d:%d",
563*4882a593Smuzhiyun snod->type, sleb->lnum, snod->offs);
564*4882a593Smuzhiyun ubifs_dump_node(c, snod->node);
565*4882a593Smuzhiyun return -EINVAL;
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun orph = snod->node;
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun /* Check commit number */
571*4882a593Smuzhiyun cmt_no = le64_to_cpu(orph->cmt_no) & LLONG_MAX;
572*4882a593Smuzhiyun /*
573*4882a593Smuzhiyun * The commit number on the master node may be less, because
574*4882a593Smuzhiyun * of a failed commit. If there are several failed commits in a
575*4882a593Smuzhiyun * row, the commit number written on orphan nodes will continue
576*4882a593Smuzhiyun * to increase (because the commit number is adjusted here) even
577*4882a593Smuzhiyun * though the commit number on the master node stays the same
578*4882a593Smuzhiyun * because the master node has not been re-written.
579*4882a593Smuzhiyun */
580*4882a593Smuzhiyun if (cmt_no > c->cmt_no)
581*4882a593Smuzhiyun c->cmt_no = cmt_no;
582*4882a593Smuzhiyun if (cmt_no < *last_cmt_no && *last_flagged) {
583*4882a593Smuzhiyun /*
584*4882a593Smuzhiyun * The last orphan node had a higher commit number and
585*4882a593Smuzhiyun * was flagged as the last written for that commit
586*4882a593Smuzhiyun * number. That makes this orphan node, out of date.
587*4882a593Smuzhiyun */
588*4882a593Smuzhiyun if (!first) {
589*4882a593Smuzhiyun ubifs_err(c, "out of order commit number %llu in orphan node at %d:%d",
590*4882a593Smuzhiyun cmt_no, sleb->lnum, snod->offs);
591*4882a593Smuzhiyun ubifs_dump_node(c, snod->node);
592*4882a593Smuzhiyun return -EINVAL;
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun dbg_rcvry("out of date LEB %d", sleb->lnum);
595*4882a593Smuzhiyun *outofdate = 1;
596*4882a593Smuzhiyun return 0;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun if (first)
600*4882a593Smuzhiyun first = 0;
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
603*4882a593Smuzhiyun for (i = 0; i < n; i++) {
604*4882a593Smuzhiyun inum = le64_to_cpu(orph->inos[i]);
605*4882a593Smuzhiyun dbg_rcvry("deleting orphaned inode %lu",
606*4882a593Smuzhiyun (unsigned long)inum);
607*4882a593Smuzhiyun err = ubifs_tnc_remove_ino(c, inum);
608*4882a593Smuzhiyun if (err)
609*4882a593Smuzhiyun return err;
610*4882a593Smuzhiyun err = insert_dead_orphan(c, inum);
611*4882a593Smuzhiyun if (err)
612*4882a593Smuzhiyun return err;
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun *last_cmt_no = cmt_no;
616*4882a593Smuzhiyun if (le64_to_cpu(orph->cmt_no) & (1ULL << 63)) {
617*4882a593Smuzhiyun dbg_rcvry("last orph node for commit %llu at %d:%d",
618*4882a593Smuzhiyun cmt_no, sleb->lnum, snod->offs);
619*4882a593Smuzhiyun *last_flagged = 1;
620*4882a593Smuzhiyun } else
621*4882a593Smuzhiyun *last_flagged = 0;
622*4882a593Smuzhiyun }
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun return 0;
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun /**
628*4882a593Smuzhiyun * kill_orphans - remove all orphan inodes from the index.
629*4882a593Smuzhiyun * @c: UBIFS file-system description object
630*4882a593Smuzhiyun *
631*4882a593Smuzhiyun * If recovery is required, then orphan inodes recorded during the previous
632*4882a593Smuzhiyun * session (which ended with an unclean unmount) must be deleted from the index.
633*4882a593Smuzhiyun * This is done by updating the TNC, but since the index is not updated until
634*4882a593Smuzhiyun * the next commit, the LEBs where the orphan information is recorded are not
635*4882a593Smuzhiyun * erased until the next commit.
636*4882a593Smuzhiyun */
kill_orphans(struct ubifs_info * c)637*4882a593Smuzhiyun static int kill_orphans(struct ubifs_info *c)
638*4882a593Smuzhiyun {
639*4882a593Smuzhiyun unsigned long long last_cmt_no = 0;
640*4882a593Smuzhiyun int lnum, err = 0, outofdate = 0, last_flagged = 0;
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun c->ohead_lnum = c->orph_first;
643*4882a593Smuzhiyun c->ohead_offs = 0;
644*4882a593Smuzhiyun /* Check no-orphans flag and skip this if no orphans */
645*4882a593Smuzhiyun if (c->no_orphs) {
646*4882a593Smuzhiyun dbg_rcvry("no orphans");
647*4882a593Smuzhiyun return 0;
648*4882a593Smuzhiyun }
649*4882a593Smuzhiyun /*
650*4882a593Smuzhiyun * Orph nodes always start at c->orph_first and are written to each
651*4882a593Smuzhiyun * successive LEB in turn. Generally unused LEBs will have been unmapped
652*4882a593Smuzhiyun * but may contain out of date orphan nodes if the unmap didn't go
653*4882a593Smuzhiyun * through. In addition, the last orphan node written for each commit is
654*4882a593Smuzhiyun * marked (top bit of orph->cmt_no is set to 1). It is possible that
655*4882a593Smuzhiyun * there are orphan nodes from the next commit (i.e. the commit did not
656*4882a593Smuzhiyun * complete successfully). In that case, no orphans will have been lost
657*4882a593Smuzhiyun * due to the way that orphans are written, and any orphans added will
658*4882a593Smuzhiyun * be valid orphans anyway and so can be deleted.
659*4882a593Smuzhiyun */
660*4882a593Smuzhiyun for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
661*4882a593Smuzhiyun struct ubifs_scan_leb *sleb;
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun dbg_rcvry("LEB %d", lnum);
664*4882a593Smuzhiyun sleb = ubifs_scan(c, lnum, 0, c->sbuf, 1);
665*4882a593Smuzhiyun if (IS_ERR(sleb)) {
666*4882a593Smuzhiyun if (PTR_ERR(sleb) == -EUCLEAN)
667*4882a593Smuzhiyun sleb = ubifs_recover_leb(c, lnum, 0,
668*4882a593Smuzhiyun c->sbuf, -1);
669*4882a593Smuzhiyun if (IS_ERR(sleb)) {
670*4882a593Smuzhiyun err = PTR_ERR(sleb);
671*4882a593Smuzhiyun break;
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun err = do_kill_orphans(c, sleb, &last_cmt_no, &outofdate,
675*4882a593Smuzhiyun &last_flagged);
676*4882a593Smuzhiyun if (err || outofdate) {
677*4882a593Smuzhiyun ubifs_scan_destroy(sleb);
678*4882a593Smuzhiyun break;
679*4882a593Smuzhiyun }
680*4882a593Smuzhiyun if (sleb->endpt) {
681*4882a593Smuzhiyun c->ohead_lnum = lnum;
682*4882a593Smuzhiyun c->ohead_offs = sleb->endpt;
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun ubifs_scan_destroy(sleb);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun return err;
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun /**
690*4882a593Smuzhiyun * ubifs_mount_orphans - delete orphan inodes and erase LEBs that recorded them.
691*4882a593Smuzhiyun * @c: UBIFS file-system description object
692*4882a593Smuzhiyun * @unclean: indicates recovery from unclean unmount
693*4882a593Smuzhiyun * @read_only: indicates read only mount
694*4882a593Smuzhiyun *
695*4882a593Smuzhiyun * This function is called when mounting to erase orphans from the previous
696*4882a593Smuzhiyun * session. If UBIFS was not unmounted cleanly, then the inodes recorded as
697*4882a593Smuzhiyun * orphans are deleted.
698*4882a593Smuzhiyun */
ubifs_mount_orphans(struct ubifs_info * c,int unclean,int read_only)699*4882a593Smuzhiyun int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only)
700*4882a593Smuzhiyun {
701*4882a593Smuzhiyun int err = 0;
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun c->max_orphans = tot_avail_orphs(c);
704*4882a593Smuzhiyun
705*4882a593Smuzhiyun if (!read_only) {
706*4882a593Smuzhiyun c->orph_buf = vmalloc(c->leb_size);
707*4882a593Smuzhiyun if (!c->orph_buf)
708*4882a593Smuzhiyun return -ENOMEM;
709*4882a593Smuzhiyun }
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun if (unclean)
712*4882a593Smuzhiyun err = kill_orphans(c);
713*4882a593Smuzhiyun else if (!read_only)
714*4882a593Smuzhiyun err = ubifs_clear_orphans(c);
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun return err;
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun /*
720*4882a593Smuzhiyun * Everything below is related to debugging.
721*4882a593Smuzhiyun */
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun struct check_orphan {
724*4882a593Smuzhiyun struct rb_node rb;
725*4882a593Smuzhiyun ino_t inum;
726*4882a593Smuzhiyun };
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun struct check_info {
729*4882a593Smuzhiyun unsigned long last_ino;
730*4882a593Smuzhiyun unsigned long tot_inos;
731*4882a593Smuzhiyun unsigned long missing;
732*4882a593Smuzhiyun unsigned long long leaf_cnt;
733*4882a593Smuzhiyun struct ubifs_ino_node *node;
734*4882a593Smuzhiyun struct rb_root root;
735*4882a593Smuzhiyun };
736*4882a593Smuzhiyun
dbg_find_orphan(struct ubifs_info * c,ino_t inum)737*4882a593Smuzhiyun static int dbg_find_orphan(struct ubifs_info *c, ino_t inum)
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun struct ubifs_orphan *o;
740*4882a593Smuzhiyun struct rb_node *p;
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun spin_lock(&c->orphan_lock);
743*4882a593Smuzhiyun p = c->orph_tree.rb_node;
744*4882a593Smuzhiyun while (p) {
745*4882a593Smuzhiyun o = rb_entry(p, struct ubifs_orphan, rb);
746*4882a593Smuzhiyun if (inum < o->inum)
747*4882a593Smuzhiyun p = p->rb_left;
748*4882a593Smuzhiyun else if (inum > o->inum)
749*4882a593Smuzhiyun p = p->rb_right;
750*4882a593Smuzhiyun else {
751*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
752*4882a593Smuzhiyun return 1;
753*4882a593Smuzhiyun }
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun spin_unlock(&c->orphan_lock);
756*4882a593Smuzhiyun return 0;
757*4882a593Smuzhiyun }
758*4882a593Smuzhiyun
dbg_ins_check_orphan(struct rb_root * root,ino_t inum)759*4882a593Smuzhiyun static int dbg_ins_check_orphan(struct rb_root *root, ino_t inum)
760*4882a593Smuzhiyun {
761*4882a593Smuzhiyun struct check_orphan *orphan, *o;
762*4882a593Smuzhiyun struct rb_node **p, *parent = NULL;
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun orphan = kzalloc(sizeof(struct check_orphan), GFP_NOFS);
765*4882a593Smuzhiyun if (!orphan)
766*4882a593Smuzhiyun return -ENOMEM;
767*4882a593Smuzhiyun orphan->inum = inum;
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun p = &root->rb_node;
770*4882a593Smuzhiyun while (*p) {
771*4882a593Smuzhiyun parent = *p;
772*4882a593Smuzhiyun o = rb_entry(parent, struct check_orphan, rb);
773*4882a593Smuzhiyun if (inum < o->inum)
774*4882a593Smuzhiyun p = &(*p)->rb_left;
775*4882a593Smuzhiyun else if (inum > o->inum)
776*4882a593Smuzhiyun p = &(*p)->rb_right;
777*4882a593Smuzhiyun else {
778*4882a593Smuzhiyun kfree(orphan);
779*4882a593Smuzhiyun return 0;
780*4882a593Smuzhiyun }
781*4882a593Smuzhiyun }
782*4882a593Smuzhiyun rb_link_node(&orphan->rb, parent, p);
783*4882a593Smuzhiyun rb_insert_color(&orphan->rb, root);
784*4882a593Smuzhiyun return 0;
785*4882a593Smuzhiyun }
786*4882a593Smuzhiyun
dbg_find_check_orphan(struct rb_root * root,ino_t inum)787*4882a593Smuzhiyun static int dbg_find_check_orphan(struct rb_root *root, ino_t inum)
788*4882a593Smuzhiyun {
789*4882a593Smuzhiyun struct check_orphan *o;
790*4882a593Smuzhiyun struct rb_node *p;
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun p = root->rb_node;
793*4882a593Smuzhiyun while (p) {
794*4882a593Smuzhiyun o = rb_entry(p, struct check_orphan, rb);
795*4882a593Smuzhiyun if (inum < o->inum)
796*4882a593Smuzhiyun p = p->rb_left;
797*4882a593Smuzhiyun else if (inum > o->inum)
798*4882a593Smuzhiyun p = p->rb_right;
799*4882a593Smuzhiyun else
800*4882a593Smuzhiyun return 1;
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun return 0;
803*4882a593Smuzhiyun }
804*4882a593Smuzhiyun
dbg_free_check_tree(struct rb_root * root)805*4882a593Smuzhiyun static void dbg_free_check_tree(struct rb_root *root)
806*4882a593Smuzhiyun {
807*4882a593Smuzhiyun struct check_orphan *o, *n;
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun rbtree_postorder_for_each_entry_safe(o, n, root, rb)
810*4882a593Smuzhiyun kfree(o);
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun
dbg_orphan_check(struct ubifs_info * c,struct ubifs_zbranch * zbr,void * priv)813*4882a593Smuzhiyun static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr,
814*4882a593Smuzhiyun void *priv)
815*4882a593Smuzhiyun {
816*4882a593Smuzhiyun struct check_info *ci = priv;
817*4882a593Smuzhiyun ino_t inum;
818*4882a593Smuzhiyun int err;
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun inum = key_inum(c, &zbr->key);
821*4882a593Smuzhiyun if (inum != ci->last_ino) {
822*4882a593Smuzhiyun /* Lowest node type is the inode node, so it comes first */
823*4882a593Smuzhiyun if (key_type(c, &zbr->key) != UBIFS_INO_KEY)
824*4882a593Smuzhiyun ubifs_err(c, "found orphan node ino %lu, type %d",
825*4882a593Smuzhiyun (unsigned long)inum, key_type(c, &zbr->key));
826*4882a593Smuzhiyun ci->last_ino = inum;
827*4882a593Smuzhiyun ci->tot_inos += 1;
828*4882a593Smuzhiyun err = ubifs_tnc_read_node(c, zbr, ci->node);
829*4882a593Smuzhiyun if (err) {
830*4882a593Smuzhiyun ubifs_err(c, "node read failed, error %d", err);
831*4882a593Smuzhiyun return err;
832*4882a593Smuzhiyun }
833*4882a593Smuzhiyun if (ci->node->nlink == 0)
834*4882a593Smuzhiyun /* Must be recorded as an orphan */
835*4882a593Smuzhiyun if (!dbg_find_check_orphan(&ci->root, inum) &&
836*4882a593Smuzhiyun !dbg_find_orphan(c, inum)) {
837*4882a593Smuzhiyun ubifs_err(c, "missing orphan, ino %lu",
838*4882a593Smuzhiyun (unsigned long)inum);
839*4882a593Smuzhiyun ci->missing += 1;
840*4882a593Smuzhiyun }
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun ci->leaf_cnt += 1;
843*4882a593Smuzhiyun return 0;
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun
dbg_read_orphans(struct check_info * ci,struct ubifs_scan_leb * sleb)846*4882a593Smuzhiyun static int dbg_read_orphans(struct check_info *ci, struct ubifs_scan_leb *sleb)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun struct ubifs_scan_node *snod;
849*4882a593Smuzhiyun struct ubifs_orph_node *orph;
850*4882a593Smuzhiyun ino_t inum;
851*4882a593Smuzhiyun int i, n, err;
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun list_for_each_entry(snod, &sleb->nodes, list) {
854*4882a593Smuzhiyun cond_resched();
855*4882a593Smuzhiyun if (snod->type != UBIFS_ORPH_NODE)
856*4882a593Smuzhiyun continue;
857*4882a593Smuzhiyun orph = snod->node;
858*4882a593Smuzhiyun n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
859*4882a593Smuzhiyun for (i = 0; i < n; i++) {
860*4882a593Smuzhiyun inum = le64_to_cpu(orph->inos[i]);
861*4882a593Smuzhiyun err = dbg_ins_check_orphan(&ci->root, inum);
862*4882a593Smuzhiyun if (err)
863*4882a593Smuzhiyun return err;
864*4882a593Smuzhiyun }
865*4882a593Smuzhiyun }
866*4882a593Smuzhiyun return 0;
867*4882a593Smuzhiyun }
868*4882a593Smuzhiyun
dbg_scan_orphans(struct ubifs_info * c,struct check_info * ci)869*4882a593Smuzhiyun static int dbg_scan_orphans(struct ubifs_info *c, struct check_info *ci)
870*4882a593Smuzhiyun {
871*4882a593Smuzhiyun int lnum, err = 0;
872*4882a593Smuzhiyun void *buf;
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun /* Check no-orphans flag and skip this if no orphans */
875*4882a593Smuzhiyun if (c->no_orphs)
876*4882a593Smuzhiyun return 0;
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun buf = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
879*4882a593Smuzhiyun if (!buf) {
880*4882a593Smuzhiyun ubifs_err(c, "cannot allocate memory to check orphans");
881*4882a593Smuzhiyun return 0;
882*4882a593Smuzhiyun }
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
885*4882a593Smuzhiyun struct ubifs_scan_leb *sleb;
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun sleb = ubifs_scan(c, lnum, 0, buf, 0);
888*4882a593Smuzhiyun if (IS_ERR(sleb)) {
889*4882a593Smuzhiyun err = PTR_ERR(sleb);
890*4882a593Smuzhiyun break;
891*4882a593Smuzhiyun }
892*4882a593Smuzhiyun
893*4882a593Smuzhiyun err = dbg_read_orphans(ci, sleb);
894*4882a593Smuzhiyun ubifs_scan_destroy(sleb);
895*4882a593Smuzhiyun if (err)
896*4882a593Smuzhiyun break;
897*4882a593Smuzhiyun }
898*4882a593Smuzhiyun
899*4882a593Smuzhiyun vfree(buf);
900*4882a593Smuzhiyun return err;
901*4882a593Smuzhiyun }
902*4882a593Smuzhiyun
dbg_check_orphans(struct ubifs_info * c)903*4882a593Smuzhiyun static int dbg_check_orphans(struct ubifs_info *c)
904*4882a593Smuzhiyun {
905*4882a593Smuzhiyun struct check_info ci;
906*4882a593Smuzhiyun int err;
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun if (!dbg_is_chk_orph(c))
909*4882a593Smuzhiyun return 0;
910*4882a593Smuzhiyun
911*4882a593Smuzhiyun ci.last_ino = 0;
912*4882a593Smuzhiyun ci.tot_inos = 0;
913*4882a593Smuzhiyun ci.missing = 0;
914*4882a593Smuzhiyun ci.leaf_cnt = 0;
915*4882a593Smuzhiyun ci.root = RB_ROOT;
916*4882a593Smuzhiyun ci.node = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
917*4882a593Smuzhiyun if (!ci.node) {
918*4882a593Smuzhiyun ubifs_err(c, "out of memory");
919*4882a593Smuzhiyun return -ENOMEM;
920*4882a593Smuzhiyun }
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun err = dbg_scan_orphans(c, &ci);
923*4882a593Smuzhiyun if (err)
924*4882a593Smuzhiyun goto out;
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun err = dbg_walk_index(c, &dbg_orphan_check, NULL, &ci);
927*4882a593Smuzhiyun if (err) {
928*4882a593Smuzhiyun ubifs_err(c, "cannot scan TNC, error %d", err);
929*4882a593Smuzhiyun goto out;
930*4882a593Smuzhiyun }
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun if (ci.missing) {
933*4882a593Smuzhiyun ubifs_err(c, "%lu missing orphan(s)", ci.missing);
934*4882a593Smuzhiyun err = -EINVAL;
935*4882a593Smuzhiyun goto out;
936*4882a593Smuzhiyun }
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun dbg_cmt("last inode number is %lu", ci.last_ino);
939*4882a593Smuzhiyun dbg_cmt("total number of inodes is %lu", ci.tot_inos);
940*4882a593Smuzhiyun dbg_cmt("total number of leaf nodes is %llu", ci.leaf_cnt);
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun out:
943*4882a593Smuzhiyun dbg_free_check_tree(&ci.root);
944*4882a593Smuzhiyun kfree(ci.node);
945*4882a593Smuzhiyun return err;
946*4882a593Smuzhiyun }
947