Merge branch 'x86/core' into x86/xsave
[pandora-kernel.git] / fs / ubifs / lpt_commit.c
1 /*
2  * This file is part of UBIFS.
3  *
4  * Copyright (C) 2006-2008 Nokia Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 as published by
8  * the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * this program; if not, write to the Free Software Foundation, Inc., 51
17  * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  *
19  * Authors: Adrian Hunter
20  *          Artem Bityutskiy (Битюцкий Артём)
21  */
22
23 /*
24  * This file implements commit-related functionality of the LEB properties
25  * subsystem.
26  */
27
28 #include <linux/crc16.h>
29 #include "ubifs.h"
30
31 /**
32  * first_dirty_cnode - find first dirty cnode.
33  * @c: UBIFS file-system description object
34  * @nnode: nnode at which to start
35  *
36  * This function returns the first dirty cnode or %NULL if there is not one.
37  */
38 static struct ubifs_cnode *first_dirty_cnode(struct ubifs_nnode *nnode)
39 {
40         ubifs_assert(nnode);
41         while (1) {
42                 int i, cont = 0;
43
44                 for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
45                         struct ubifs_cnode *cnode;
46
47                         cnode = nnode->nbranch[i].cnode;
48                         if (cnode &&
49                             test_bit(DIRTY_CNODE, &cnode->flags)) {
50                                 if (cnode->level == 0)
51                                         return cnode;
52                                 nnode = (struct ubifs_nnode *)cnode;
53                                 cont = 1;
54                                 break;
55                         }
56                 }
57                 if (!cont)
58                         return (struct ubifs_cnode *)nnode;
59         }
60 }
61
62 /**
63  * next_dirty_cnode - find next dirty cnode.
64  * @cnode: cnode from which to begin searching
65  *
66  * This function returns the next dirty cnode or %NULL if there is not one.
67  */
68 static struct ubifs_cnode *next_dirty_cnode(struct ubifs_cnode *cnode)
69 {
70         struct ubifs_nnode *nnode;
71         int i;
72
73         ubifs_assert(cnode);
74         nnode = cnode->parent;
75         if (!nnode)
76                 return NULL;
77         for (i = cnode->iip + 1; i < UBIFS_LPT_FANOUT; i++) {
78                 cnode = nnode->nbranch[i].cnode;
79                 if (cnode && test_bit(DIRTY_CNODE, &cnode->flags)) {
80                         if (cnode->level == 0)
81                                 return cnode; /* cnode is a pnode */
82                         /* cnode is a nnode */
83                         return first_dirty_cnode((struct ubifs_nnode *)cnode);
84                 }
85         }
86         return (struct ubifs_cnode *)nnode;
87 }
88
89 /**
90  * get_cnodes_to_commit - create list of dirty cnodes to commit.
91  * @c: UBIFS file-system description object
92  *
93  * This function returns the number of cnodes to commit.
94  */
95 static int get_cnodes_to_commit(struct ubifs_info *c)
96 {
97         struct ubifs_cnode *cnode, *cnext;
98         int cnt = 0;
99
100         if (!c->nroot)
101                 return 0;
102
103         if (!test_bit(DIRTY_CNODE, &c->nroot->flags))
104                 return 0;
105
106         c->lpt_cnext = first_dirty_cnode(c->nroot);
107         cnode = c->lpt_cnext;
108         if (!cnode)
109                 return 0;
110         cnt += 1;
111         while (1) {
112                 ubifs_assert(!test_bit(COW_ZNODE, &cnode->flags));
113                 __set_bit(COW_ZNODE, &cnode->flags);
114                 cnext = next_dirty_cnode(cnode);
115                 if (!cnext) {
116                         cnode->cnext = c->lpt_cnext;
117                         break;
118                 }
119                 cnode->cnext = cnext;
120                 cnode = cnext;
121                 cnt += 1;
122         }
123         dbg_cmt("committing %d cnodes", cnt);
124         dbg_lp("committing %d cnodes", cnt);
125         ubifs_assert(cnt == c->dirty_nn_cnt + c->dirty_pn_cnt);
126         return cnt;
127 }
128
129 /**
130  * upd_ltab - update LPT LEB properties.
131  * @c: UBIFS file-system description object
132  * @lnum: LEB number
133  * @free: amount of free space
134  * @dirty: amount of dirty space to add
135  */
136 static void upd_ltab(struct ubifs_info *c, int lnum, int free, int dirty)
137 {
138         dbg_lp("LEB %d free %d dirty %d to %d +%d",
139                lnum, c->ltab[lnum - c->lpt_first].free,
140                c->ltab[lnum - c->lpt_first].dirty, free, dirty);
141         ubifs_assert(lnum >= c->lpt_first && lnum <= c->lpt_last);
142         c->ltab[lnum - c->lpt_first].free = free;
143         c->ltab[lnum - c->lpt_first].dirty += dirty;
144 }
145
146 /**
147  * alloc_lpt_leb - allocate an LPT LEB that is empty.
148  * @c: UBIFS file-system description object
149  * @lnum: LEB number is passed and returned here
150  *
151  * This function finds the next empty LEB in the ltab starting from @lnum. If a
152  * an empty LEB is found it is returned in @lnum and the function returns %0.
153  * Otherwise the function returns -ENOSPC.  Note however, that LPT is designed
154  * never to run out of space.
155  */
156 static int alloc_lpt_leb(struct ubifs_info *c, int *lnum)
157 {
158         int i, n;
159
160         n = *lnum - c->lpt_first + 1;
161         for (i = n; i < c->lpt_lebs; i++) {
162                 if (c->ltab[i].tgc || c->ltab[i].cmt)
163                         continue;
164                 if (c->ltab[i].free == c->leb_size) {
165                         c->ltab[i].cmt = 1;
166                         *lnum = i + c->lpt_first;
167                         return 0;
168                 }
169         }
170
171         for (i = 0; i < n; i++) {
172                 if (c->ltab[i].tgc || c->ltab[i].cmt)
173                         continue;
174                 if (c->ltab[i].free == c->leb_size) {
175                         c->ltab[i].cmt = 1;
176                         *lnum = i + c->lpt_first;
177                         return 0;
178                 }
179         }
180         dbg_err("last LEB %d", *lnum);
181         dump_stack();
182         return -ENOSPC;
183 }
184
185 /**
186  * layout_cnodes - layout cnodes for commit.
187  * @c: UBIFS file-system description object
188  *
189  * This function returns %0 on success and a negative error code on failure.
190  */
191 static int layout_cnodes(struct ubifs_info *c)
192 {
193         int lnum, offs, len, alen, done_lsave, done_ltab, err;
194         struct ubifs_cnode *cnode;
195
196         cnode = c->lpt_cnext;
197         if (!cnode)
198                 return 0;
199         lnum = c->nhead_lnum;
200         offs = c->nhead_offs;
201         /* Try to place lsave and ltab nicely */
202         done_lsave = !c->big_lpt;
203         done_ltab = 0;
204         if (!done_lsave && offs + c->lsave_sz <= c->leb_size) {
205                 done_lsave = 1;
206                 c->lsave_lnum = lnum;
207                 c->lsave_offs = offs;
208                 offs += c->lsave_sz;
209         }
210
211         if (offs + c->ltab_sz <= c->leb_size) {
212                 done_ltab = 1;
213                 c->ltab_lnum = lnum;
214                 c->ltab_offs = offs;
215                 offs += c->ltab_sz;
216         }
217
218         do {
219                 if (cnode->level) {
220                         len = c->nnode_sz;
221                         c->dirty_nn_cnt -= 1;
222                 } else {
223                         len = c->pnode_sz;
224                         c->dirty_pn_cnt -= 1;
225                 }
226                 while (offs + len > c->leb_size) {
227                         alen = ALIGN(offs, c->min_io_size);
228                         upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
229                         err = alloc_lpt_leb(c, &lnum);
230                         if (err)
231                                 return err;
232                         offs = 0;
233                         ubifs_assert(lnum >= c->lpt_first &&
234                                      lnum <= c->lpt_last);
235                         /* Try to place lsave and ltab nicely */
236                         if (!done_lsave) {
237                                 done_lsave = 1;
238                                 c->lsave_lnum = lnum;
239                                 c->lsave_offs = offs;
240                                 offs += c->lsave_sz;
241                                 continue;
242                         }
243                         if (!done_ltab) {
244                                 done_ltab = 1;
245                                 c->ltab_lnum = lnum;
246                                 c->ltab_offs = offs;
247                                 offs += c->ltab_sz;
248                                 continue;
249                         }
250                         break;
251                 }
252                 if (cnode->parent) {
253                         cnode->parent->nbranch[cnode->iip].lnum = lnum;
254                         cnode->parent->nbranch[cnode->iip].offs = offs;
255                 } else {
256                         c->lpt_lnum = lnum;
257                         c->lpt_offs = offs;
258                 }
259                 offs += len;
260                 cnode = cnode->cnext;
261         } while (cnode && cnode != c->lpt_cnext);
262
263         /* Make sure to place LPT's save table */
264         if (!done_lsave) {
265                 if (offs + c->lsave_sz > c->leb_size) {
266                         alen = ALIGN(offs, c->min_io_size);
267                         upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
268                         err = alloc_lpt_leb(c, &lnum);
269                         if (err)
270                                 return err;
271                         offs = 0;
272                         ubifs_assert(lnum >= c->lpt_first &&
273                                      lnum <= c->lpt_last);
274                 }
275                 done_lsave = 1;
276                 c->lsave_lnum = lnum;
277                 c->lsave_offs = offs;
278                 offs += c->lsave_sz;
279         }
280
281         /* Make sure to place LPT's own lprops table */
282         if (!done_ltab) {
283                 if (offs + c->ltab_sz > c->leb_size) {
284                         alen = ALIGN(offs, c->min_io_size);
285                         upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
286                         err = alloc_lpt_leb(c, &lnum);
287                         if (err)
288                                 return err;
289                         offs = 0;
290                         ubifs_assert(lnum >= c->lpt_first &&
291                                      lnum <= c->lpt_last);
292                 }
293                 done_ltab = 1;
294                 c->ltab_lnum = lnum;
295                 c->ltab_offs = offs;
296                 offs += c->ltab_sz;
297         }
298
299         alen = ALIGN(offs, c->min_io_size);
300         upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
301         return 0;
302 }
303
304 /**
305  * realloc_lpt_leb - allocate an LPT LEB that is empty.
306  * @c: UBIFS file-system description object
307  * @lnum: LEB number is passed and returned here
308  *
309  * This function duplicates exactly the results of the function alloc_lpt_leb.
310  * It is used during end commit to reallocate the same LEB numbers that were
311  * allocated by alloc_lpt_leb during start commit.
312  *
313  * This function finds the next LEB that was allocated by the alloc_lpt_leb
314  * function starting from @lnum. If a LEB is found it is returned in @lnum and
315  * the function returns %0. Otherwise the function returns -ENOSPC.
316  * Note however, that LPT is designed never to run out of space.
317  */
318 static int realloc_lpt_leb(struct ubifs_info *c, int *lnum)
319 {
320         int i, n;
321
322         n = *lnum - c->lpt_first + 1;
323         for (i = n; i < c->lpt_lebs; i++)
324                 if (c->ltab[i].cmt) {
325                         c->ltab[i].cmt = 0;
326                         *lnum = i + c->lpt_first;
327                         return 0;
328                 }
329
330         for (i = 0; i < n; i++)
331                 if (c->ltab[i].cmt) {
332                         c->ltab[i].cmt = 0;
333                         *lnum = i + c->lpt_first;
334                         return 0;
335                 }
336         dbg_err("last LEB %d", *lnum);
337         dump_stack();
338         return -ENOSPC;
339 }
340
341 /**
342  * write_cnodes - write cnodes for commit.
343  * @c: UBIFS file-system description object
344  *
345  * This function returns %0 on success and a negative error code on failure.
346  */
347 static int write_cnodes(struct ubifs_info *c)
348 {
349         int lnum, offs, len, from, err, wlen, alen, done_ltab, done_lsave;
350         struct ubifs_cnode *cnode;
351         void *buf = c->lpt_buf;
352
353         cnode = c->lpt_cnext;
354         if (!cnode)
355                 return 0;
356         lnum = c->nhead_lnum;
357         offs = c->nhead_offs;
358         from = offs;
359         /* Ensure empty LEB is unmapped */
360         if (offs == 0) {
361                 err = ubifs_leb_unmap(c, lnum);
362                 if (err)
363                         return err;
364         }
365         /* Try to place lsave and ltab nicely */
366         done_lsave = !c->big_lpt;
367         done_ltab = 0;
368         if (!done_lsave && offs + c->lsave_sz <= c->leb_size) {
369                 done_lsave = 1;
370                 ubifs_pack_lsave(c, buf + offs, c->lsave);
371                 offs += c->lsave_sz;
372         }
373
374         if (offs + c->ltab_sz <= c->leb_size) {
375                 done_ltab = 1;
376                 ubifs_pack_ltab(c, buf + offs, c->ltab_cmt);
377                 offs += c->ltab_sz;
378         }
379
380         /* Loop for each cnode */
381         do {
382                 if (cnode->level)
383                         len = c->nnode_sz;
384                 else
385                         len = c->pnode_sz;
386                 while (offs + len > c->leb_size) {
387                         wlen = offs - from;
388                         if (wlen) {
389                                 alen = ALIGN(wlen, c->min_io_size);
390                                 memset(buf + offs, 0xff, alen - wlen);
391                                 err = ubifs_leb_write(c, lnum, buf + from, from,
392                                                        alen, UBI_SHORTTERM);
393                                 if (err)
394                                         return err;
395                         }
396                         err = realloc_lpt_leb(c, &lnum);
397                         if (err)
398                                 return err;
399                         offs = 0;
400                         from = 0;
401                         ubifs_assert(lnum >= c->lpt_first &&
402                                      lnum <= c->lpt_last);
403                         err = ubifs_leb_unmap(c, lnum);
404                         if (err)
405                                 return err;
406                         /* Try to place lsave and ltab nicely */
407                         if (!done_lsave) {
408                                 done_lsave = 1;
409                                 ubifs_pack_lsave(c, buf + offs, c->lsave);
410                                 offs += c->lsave_sz;
411                                 continue;
412                         }
413                         if (!done_ltab) {
414                                 done_ltab = 1;
415                                 ubifs_pack_ltab(c, buf + offs, c->ltab_cmt);
416                                 offs += c->ltab_sz;
417                                 continue;
418                         }
419                         break;
420                 }
421                 if (cnode->level)
422                         ubifs_pack_nnode(c, buf + offs,
423                                          (struct ubifs_nnode *)cnode);
424                 else
425                         ubifs_pack_pnode(c, buf + offs,
426                                          (struct ubifs_pnode *)cnode);
427                 /*
428                  * The reason for the barriers is the same as in case of TNC.
429                  * See comment in 'write_index()'. 'dirty_cow_nnode()' and
430                  * 'dirty_cow_pnode()' are the functions for which this is
431                  * important.
432                  */
433                 clear_bit(DIRTY_CNODE, &cnode->flags);
434                 smp_mb__before_clear_bit();
435                 clear_bit(COW_ZNODE, &cnode->flags);
436                 smp_mb__after_clear_bit();
437                 offs += len;
438                 cnode = cnode->cnext;
439         } while (cnode && cnode != c->lpt_cnext);
440
441         /* Make sure to place LPT's save table */
442         if (!done_lsave) {
443                 if (offs + c->lsave_sz > c->leb_size) {
444                         wlen = offs - from;
445                         alen = ALIGN(wlen, c->min_io_size);
446                         memset(buf + offs, 0xff, alen - wlen);
447                         err = ubifs_leb_write(c, lnum, buf + from, from, alen,
448                                               UBI_SHORTTERM);
449                         if (err)
450                                 return err;
451                         err = realloc_lpt_leb(c, &lnum);
452                         if (err)
453                                 return err;
454                         offs = 0;
455                         ubifs_assert(lnum >= c->lpt_first &&
456                                      lnum <= c->lpt_last);
457                         err = ubifs_leb_unmap(c, lnum);
458                         if (err)
459                                 return err;
460                 }
461                 done_lsave = 1;
462                 ubifs_pack_lsave(c, buf + offs, c->lsave);
463                 offs += c->lsave_sz;
464         }
465
466         /* Make sure to place LPT's own lprops table */
467         if (!done_ltab) {
468                 if (offs + c->ltab_sz > c->leb_size) {
469                         wlen = offs - from;
470                         alen = ALIGN(wlen, c->min_io_size);
471                         memset(buf + offs, 0xff, alen - wlen);
472                         err = ubifs_leb_write(c, lnum, buf + from, from, alen,
473                                               UBI_SHORTTERM);
474                         if (err)
475                                 return err;
476                         err = realloc_lpt_leb(c, &lnum);
477                         if (err)
478                                 return err;
479                         offs = 0;
480                         ubifs_assert(lnum >= c->lpt_first &&
481                                      lnum <= c->lpt_last);
482                         err = ubifs_leb_unmap(c, lnum);
483                         if (err)
484                                 return err;
485                 }
486                 done_ltab = 1;
487                 ubifs_pack_ltab(c, buf + offs, c->ltab_cmt);
488                 offs += c->ltab_sz;
489         }
490
491         /* Write remaining data in buffer */
492         wlen = offs - from;
493         alen = ALIGN(wlen, c->min_io_size);
494         memset(buf + offs, 0xff, alen - wlen);
495         err = ubifs_leb_write(c, lnum, buf + from, from, alen, UBI_SHORTTERM);
496         if (err)
497                 return err;
498         c->nhead_lnum = lnum;
499         c->nhead_offs = ALIGN(offs, c->min_io_size);
500
501         dbg_lp("LPT root is at %d:%d", c->lpt_lnum, c->lpt_offs);
502         dbg_lp("LPT head is at %d:%d", c->nhead_lnum, c->nhead_offs);
503         dbg_lp("LPT ltab is at %d:%d", c->ltab_lnum, c->ltab_offs);
504         if (c->big_lpt)
505                 dbg_lp("LPT lsave is at %d:%d", c->lsave_lnum, c->lsave_offs);
506         return 0;
507 }
508
509 /**
510  * next_pnode - find next pnode.
511  * @c: UBIFS file-system description object
512  * @pnode: pnode
513  *
514  * This function returns the next pnode or %NULL if there are no more pnodes.
515  */
516 static struct ubifs_pnode *next_pnode(struct ubifs_info *c,
517                                       struct ubifs_pnode *pnode)
518 {
519         struct ubifs_nnode *nnode;
520         int iip;
521
522         /* Try to go right */
523         nnode = pnode->parent;
524         iip = pnode->iip + 1;
525         if (iip < UBIFS_LPT_FANOUT) {
526                 /* We assume here that LEB zero is never an LPT LEB */
527                 if (nnode->nbranch[iip].lnum)
528                         return ubifs_get_pnode(c, nnode, iip);
529                 else
530                         return NULL;
531         }
532
533         /* Go up while can't go right */
534         do {
535                 iip = nnode->iip + 1;
536                 nnode = nnode->parent;
537                 if (!nnode)
538                         return NULL;
539                 /* We assume here that LEB zero is never an LPT LEB */
540         } while (iip >= UBIFS_LPT_FANOUT || !nnode->nbranch[iip].lnum);
541
542         /* Go right */
543         nnode = ubifs_get_nnode(c, nnode, iip);
544         if (IS_ERR(nnode))
545                 return (void *)nnode;
546
547         /* Go down to level 1 */
548         while (nnode->level > 1) {
549                 nnode = ubifs_get_nnode(c, nnode, 0);
550                 if (IS_ERR(nnode))
551                         return (void *)nnode;
552         }
553
554         return ubifs_get_pnode(c, nnode, 0);
555 }
556
557 /**
558  * pnode_lookup - lookup a pnode in the LPT.
559  * @c: UBIFS file-system description object
560  * @i: pnode number (0 to main_lebs - 1)
561  *
562  * This function returns a pointer to the pnode on success or a negative
563  * error code on failure.
564  */
565 static struct ubifs_pnode *pnode_lookup(struct ubifs_info *c, int i)
566 {
567         int err, h, iip, shft;
568         struct ubifs_nnode *nnode;
569
570         if (!c->nroot) {
571                 err = ubifs_read_nnode(c, NULL, 0);
572                 if (err)
573                         return ERR_PTR(err);
574         }
575         i <<= UBIFS_LPT_FANOUT_SHIFT;
576         nnode = c->nroot;
577         shft = c->lpt_hght * UBIFS_LPT_FANOUT_SHIFT;
578         for (h = 1; h < c->lpt_hght; h++) {
579                 iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
580                 shft -= UBIFS_LPT_FANOUT_SHIFT;
581                 nnode = ubifs_get_nnode(c, nnode, iip);
582                 if (IS_ERR(nnode))
583                         return ERR_PTR(PTR_ERR(nnode));
584         }
585         iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
586         return ubifs_get_pnode(c, nnode, iip);
587 }
588
589 /**
590  * add_pnode_dirt - add dirty space to LPT LEB properties.
591  * @c: UBIFS file-system description object
592  * @pnode: pnode for which to add dirt
593  */
594 static void add_pnode_dirt(struct ubifs_info *c, struct ubifs_pnode *pnode)
595 {
596         ubifs_add_lpt_dirt(c, pnode->parent->nbranch[pnode->iip].lnum,
597                            c->pnode_sz);
598 }
599
600 /**
601  * do_make_pnode_dirty - mark a pnode dirty.
602  * @c: UBIFS file-system description object
603  * @pnode: pnode to mark dirty
604  */
605 static void do_make_pnode_dirty(struct ubifs_info *c, struct ubifs_pnode *pnode)
606 {
607         /* Assumes cnext list is empty i.e. not called during commit */
608         if (!test_and_set_bit(DIRTY_CNODE, &pnode->flags)) {
609                 struct ubifs_nnode *nnode;
610
611                 c->dirty_pn_cnt += 1;
612                 add_pnode_dirt(c, pnode);
613                 /* Mark parent and ancestors dirty too */
614                 nnode = pnode->parent;
615                 while (nnode) {
616                         if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) {
617                                 c->dirty_nn_cnt += 1;
618                                 ubifs_add_nnode_dirt(c, nnode);
619                                 nnode = nnode->parent;
620                         } else
621                                 break;
622                 }
623         }
624 }
625
626 /**
627  * make_tree_dirty - mark the entire LEB properties tree dirty.
628  * @c: UBIFS file-system description object
629  *
630  * This function is used by the "small" LPT model to cause the entire LEB
631  * properties tree to be written.  The "small" LPT model does not use LPT
632  * garbage collection because it is more efficient to write the entire tree
633  * (because it is small).
634  *
635  * This function returns %0 on success and a negative error code on failure.
636  */
637 static int make_tree_dirty(struct ubifs_info *c)
638 {
639         struct ubifs_pnode *pnode;
640
641         pnode = pnode_lookup(c, 0);
642         while (pnode) {
643                 do_make_pnode_dirty(c, pnode);
644                 pnode = next_pnode(c, pnode);
645                 if (IS_ERR(pnode))
646                         return PTR_ERR(pnode);
647         }
648         return 0;
649 }
650
651 /**
652  * need_write_all - determine if the LPT area is running out of free space.
653  * @c: UBIFS file-system description object
654  *
655  * This function returns %1 if the LPT area is running out of free space and %0
656  * if it is not.
657  */
658 static int need_write_all(struct ubifs_info *c)
659 {
660         long long free = 0;
661         int i;
662
663         for (i = 0; i < c->lpt_lebs; i++) {
664                 if (i + c->lpt_first == c->nhead_lnum)
665                         free += c->leb_size - c->nhead_offs;
666                 else if (c->ltab[i].free == c->leb_size)
667                         free += c->leb_size;
668                 else if (c->ltab[i].free + c->ltab[i].dirty == c->leb_size)
669                         free += c->leb_size;
670         }
671         /* Less than twice the size left */
672         if (free <= c->lpt_sz * 2)
673                 return 1;
674         return 0;
675 }
676
677 /**
678  * lpt_tgc_start - start trivial garbage collection of LPT LEBs.
679  * @c: UBIFS file-system description object
680  *
681  * LPT trivial garbage collection is where a LPT LEB contains only dirty and
682  * free space and so may be reused as soon as the next commit is completed.
683  * This function is called during start commit to mark LPT LEBs for trivial GC.
684  */
685 static void lpt_tgc_start(struct ubifs_info *c)
686 {
687         int i;
688
689         for (i = 0; i < c->lpt_lebs; i++) {
690                 if (i + c->lpt_first == c->nhead_lnum)
691                         continue;
692                 if (c->ltab[i].dirty > 0 &&
693                     c->ltab[i].free + c->ltab[i].dirty == c->leb_size) {
694                         c->ltab[i].tgc = 1;
695                         c->ltab[i].free = c->leb_size;
696                         c->ltab[i].dirty = 0;
697                         dbg_lp("LEB %d", i + c->lpt_first);
698                 }
699         }
700 }
701
702 /**
703  * lpt_tgc_end - end trivial garbage collection of LPT LEBs.
704  * @c: UBIFS file-system description object
705  *
706  * LPT trivial garbage collection is where a LPT LEB contains only dirty and
707  * free space and so may be reused as soon as the next commit is completed.
708  * This function is called after the commit is completed (master node has been
709  * written) and unmaps LPT LEBs that were marked for trivial GC.
710  */
711 static int lpt_tgc_end(struct ubifs_info *c)
712 {
713         int i, err;
714
715         for (i = 0; i < c->lpt_lebs; i++)
716                 if (c->ltab[i].tgc) {
717                         err = ubifs_leb_unmap(c, i + c->lpt_first);
718                         if (err)
719                                 return err;
720                         c->ltab[i].tgc = 0;
721                         dbg_lp("LEB %d", i + c->lpt_first);
722                 }
723         return 0;
724 }
725
726 /**
727  * populate_lsave - fill the lsave array with important LEB numbers.
728  * @c: the UBIFS file-system description object
729  *
730  * This function is only called for the "big" model. It records a small number
731  * of LEB numbers of important LEBs.  Important LEBs are ones that are (from
732  * most important to least important): empty, freeable, freeable index, dirty
733  * index, dirty or free. Upon mount, we read this list of LEB numbers and bring
734  * their pnodes into memory.  That will stop us from having to scan the LPT
735  * straight away. For the "small" model we assume that scanning the LPT is no
736  * big deal.
737  */
738 static void populate_lsave(struct ubifs_info *c)
739 {
740         struct ubifs_lprops *lprops;
741         struct ubifs_lpt_heap *heap;
742         int i, cnt = 0;
743
744         ubifs_assert(c->big_lpt);
745         if (!(c->lpt_drty_flgs & LSAVE_DIRTY)) {
746                 c->lpt_drty_flgs |= LSAVE_DIRTY;
747                 ubifs_add_lpt_dirt(c, c->lsave_lnum, c->lsave_sz);
748         }
749         list_for_each_entry(lprops, &c->empty_list, list) {
750                 c->lsave[cnt++] = lprops->lnum;
751                 if (cnt >= c->lsave_cnt)
752                         return;
753         }
754         list_for_each_entry(lprops, &c->freeable_list, list) {
755                 c->lsave[cnt++] = lprops->lnum;
756                 if (cnt >= c->lsave_cnt)
757                         return;
758         }
759         list_for_each_entry(lprops, &c->frdi_idx_list, list) {
760                 c->lsave[cnt++] = lprops->lnum;
761                 if (cnt >= c->lsave_cnt)
762                         return;
763         }
764         heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1];
765         for (i = 0; i < heap->cnt; i++) {
766                 c->lsave[cnt++] = heap->arr[i]->lnum;
767                 if (cnt >= c->lsave_cnt)
768                         return;
769         }
770         heap = &c->lpt_heap[LPROPS_DIRTY - 1];
771         for (i = 0; i < heap->cnt; i++) {
772                 c->lsave[cnt++] = heap->arr[i]->lnum;
773                 if (cnt >= c->lsave_cnt)
774                         return;
775         }
776         heap = &c->lpt_heap[LPROPS_FREE - 1];
777         for (i = 0; i < heap->cnt; i++) {
778                 c->lsave[cnt++] = heap->arr[i]->lnum;
779                 if (cnt >= c->lsave_cnt)
780                         return;
781         }
782         /* Fill it up completely */
783         while (cnt < c->lsave_cnt)
784                 c->lsave[cnt++] = c->main_first;
785 }
786
787 /**
788  * nnode_lookup - lookup a nnode in the LPT.
789  * @c: UBIFS file-system description object
790  * @i: nnode number
791  *
792  * This function returns a pointer to the nnode on success or a negative
793  * error code on failure.
794  */
795 static struct ubifs_nnode *nnode_lookup(struct ubifs_info *c, int i)
796 {
797         int err, iip;
798         struct ubifs_nnode *nnode;
799
800         if (!c->nroot) {
801                 err = ubifs_read_nnode(c, NULL, 0);
802                 if (err)
803                         return ERR_PTR(err);
804         }
805         nnode = c->nroot;
806         while (1) {
807                 iip = i & (UBIFS_LPT_FANOUT - 1);
808                 i >>= UBIFS_LPT_FANOUT_SHIFT;
809                 if (!i)
810                         break;
811                 nnode = ubifs_get_nnode(c, nnode, iip);
812                 if (IS_ERR(nnode))
813                         return nnode;
814         }
815         return nnode;
816 }
817
818 /**
819  * make_nnode_dirty - find a nnode and, if found, make it dirty.
820  * @c: UBIFS file-system description object
821  * @node_num: nnode number of nnode to make dirty
822  * @lnum: LEB number where nnode was written
823  * @offs: offset where nnode was written
824  *
825  * This function is used by LPT garbage collection.  LPT garbage collection is
826  * used only for the "big" LPT model (c->big_lpt == 1).  Garbage collection
827  * simply involves marking all the nodes in the LEB being garbage-collected as
828  * dirty.  The dirty nodes are written next commit, after which the LEB is free
829  * to be reused.
830  *
831  * This function returns %0 on success and a negative error code on failure.
832  */
833 static int make_nnode_dirty(struct ubifs_info *c, int node_num, int lnum,
834                             int offs)
835 {
836         struct ubifs_nnode *nnode;
837
838         nnode = nnode_lookup(c, node_num);
839         if (IS_ERR(nnode))
840                 return PTR_ERR(nnode);
841         if (nnode->parent) {
842                 struct ubifs_nbranch *branch;
843
844                 branch = &nnode->parent->nbranch[nnode->iip];
845                 if (branch->lnum != lnum || branch->offs != offs)
846                         return 0; /* nnode is obsolete */
847         } else if (c->lpt_lnum != lnum || c->lpt_offs != offs)
848                         return 0; /* nnode is obsolete */
849         /* Assumes cnext list is empty i.e. not called during commit */
850         if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) {
851                 c->dirty_nn_cnt += 1;
852                 ubifs_add_nnode_dirt(c, nnode);
853                 /* Mark parent and ancestors dirty too */
854                 nnode = nnode->parent;
855                 while (nnode) {
856                         if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) {
857                                 c->dirty_nn_cnt += 1;
858                                 ubifs_add_nnode_dirt(c, nnode);
859                                 nnode = nnode->parent;
860                         } else
861                                 break;
862                 }
863         }
864         return 0;
865 }
866
867 /**
868  * make_pnode_dirty - find a pnode and, if found, make it dirty.
869  * @c: UBIFS file-system description object
870  * @node_num: pnode number of pnode to make dirty
871  * @lnum: LEB number where pnode was written
872  * @offs: offset where pnode was written
873  *
874  * This function is used by LPT garbage collection.  LPT garbage collection is
875  * used only for the "big" LPT model (c->big_lpt == 1).  Garbage collection
876  * simply involves marking all the nodes in the LEB being garbage-collected as
877  * dirty.  The dirty nodes are written next commit, after which the LEB is free
878  * to be reused.
879  *
880  * This function returns %0 on success and a negative error code on failure.
881  */
882 static int make_pnode_dirty(struct ubifs_info *c, int node_num, int lnum,
883                             int offs)
884 {
885         struct ubifs_pnode *pnode;
886         struct ubifs_nbranch *branch;
887
888         pnode = pnode_lookup(c, node_num);
889         if (IS_ERR(pnode))
890                 return PTR_ERR(pnode);
891         branch = &pnode->parent->nbranch[pnode->iip];
892         if (branch->lnum != lnum || branch->offs != offs)
893                 return 0;
894         do_make_pnode_dirty(c, pnode);
895         return 0;
896 }
897
898 /**
899  * make_ltab_dirty - make ltab node dirty.
900  * @c: UBIFS file-system description object
901  * @lnum: LEB number where ltab was written
902  * @offs: offset where ltab was written
903  *
904  * This function is used by LPT garbage collection.  LPT garbage collection is
905  * used only for the "big" LPT model (c->big_lpt == 1).  Garbage collection
906  * simply involves marking all the nodes in the LEB being garbage-collected as
907  * dirty.  The dirty nodes are written next commit, after which the LEB is free
908  * to be reused.
909  *
910  * This function returns %0 on success and a negative error code on failure.
911  */
912 static int make_ltab_dirty(struct ubifs_info *c, int lnum, int offs)
913 {
914         if (lnum != c->ltab_lnum || offs != c->ltab_offs)
915                 return 0; /* This ltab node is obsolete */
916         if (!(c->lpt_drty_flgs & LTAB_DIRTY)) {
917                 c->lpt_drty_flgs |= LTAB_DIRTY;
918                 ubifs_add_lpt_dirt(c, c->ltab_lnum, c->ltab_sz);
919         }
920         return 0;
921 }
922
923 /**
924  * make_lsave_dirty - make lsave node dirty.
925  * @c: UBIFS file-system description object
926  * @lnum: LEB number where lsave was written
927  * @offs: offset where lsave was written
928  *
929  * This function is used by LPT garbage collection.  LPT garbage collection is
930  * used only for the "big" LPT model (c->big_lpt == 1).  Garbage collection
931  * simply involves marking all the nodes in the LEB being garbage-collected as
932  * dirty.  The dirty nodes are written next commit, after which the LEB is free
933  * to be reused.
934  *
935  * This function returns %0 on success and a negative error code on failure.
936  */
937 static int make_lsave_dirty(struct ubifs_info *c, int lnum, int offs)
938 {
939         if (lnum != c->lsave_lnum || offs != c->lsave_offs)
940                 return 0; /* This lsave node is obsolete */
941         if (!(c->lpt_drty_flgs & LSAVE_DIRTY)) {
942                 c->lpt_drty_flgs |= LSAVE_DIRTY;
943                 ubifs_add_lpt_dirt(c, c->lsave_lnum, c->lsave_sz);
944         }
945         return 0;
946 }
947
948 /**
949  * make_node_dirty - make node dirty.
950  * @c: UBIFS file-system description object
951  * @node_type: LPT node type
952  * @node_num: node number
953  * @lnum: LEB number where node was written
954  * @offs: offset where node was written
955  *
956  * This function is used by LPT garbage collection.  LPT garbage collection is
957  * used only for the "big" LPT model (c->big_lpt == 1).  Garbage collection
958  * simply involves marking all the nodes in the LEB being garbage-collected as
959  * dirty.  The dirty nodes are written next commit, after which the LEB is free
960  * to be reused.
961  *
962  * This function returns %0 on success and a negative error code on failure.
963  */
964 static int make_node_dirty(struct ubifs_info *c, int node_type, int node_num,
965                            int lnum, int offs)
966 {
967         switch (node_type) {
968         case UBIFS_LPT_NNODE:
969                 return make_nnode_dirty(c, node_num, lnum, offs);
970         case UBIFS_LPT_PNODE:
971                 return make_pnode_dirty(c, node_num, lnum, offs);
972         case UBIFS_LPT_LTAB:
973                 return make_ltab_dirty(c, lnum, offs);
974         case UBIFS_LPT_LSAVE:
975                 return make_lsave_dirty(c, lnum, offs);
976         }
977         return -EINVAL;
978 }
979
980 /**
981  * get_lpt_node_len - return the length of a node based on its type.
982  * @c: UBIFS file-system description object
983  * @node_type: LPT node type
984  */
985 static int get_lpt_node_len(struct ubifs_info *c, int node_type)
986 {
987         switch (node_type) {
988         case UBIFS_LPT_NNODE:
989                 return c->nnode_sz;
990         case UBIFS_LPT_PNODE:
991                 return c->pnode_sz;
992         case UBIFS_LPT_LTAB:
993                 return c->ltab_sz;
994         case UBIFS_LPT_LSAVE:
995                 return c->lsave_sz;
996         }
997         return 0;
998 }
999
1000 /**
1001  * get_pad_len - return the length of padding in a buffer.
1002  * @c: UBIFS file-system description object
1003  * @buf: buffer
1004  * @len: length of buffer
1005  */
1006 static int get_pad_len(struct ubifs_info *c, uint8_t *buf, int len)
1007 {
1008         int offs, pad_len;
1009
1010         if (c->min_io_size == 1)
1011                 return 0;
1012         offs = c->leb_size - len;
1013         pad_len = ALIGN(offs, c->min_io_size) - offs;
1014         return pad_len;
1015 }
1016
1017 /**
1018  * get_lpt_node_type - return type (and node number) of a node in a buffer.
1019  * @c: UBIFS file-system description object
1020  * @buf: buffer
1021  * @node_num: node number is returned here
1022  */
1023 static int get_lpt_node_type(struct ubifs_info *c, uint8_t *buf, int *node_num)
1024 {
1025         uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
1026         int pos = 0, node_type;
1027
1028         node_type = ubifs_unpack_bits(&addr, &pos, UBIFS_LPT_TYPE_BITS);
1029         *node_num = ubifs_unpack_bits(&addr, &pos, c->pcnt_bits);
1030         return node_type;
1031 }
1032
1033 /**
1034  * is_a_node - determine if a buffer contains a node.
1035  * @c: UBIFS file-system description object
1036  * @buf: buffer
1037  * @len: length of buffer
1038  *
1039  * This function returns %1 if the buffer contains a node or %0 if it does not.
1040  */
1041 static int is_a_node(struct ubifs_info *c, uint8_t *buf, int len)
1042 {
1043         uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
1044         int pos = 0, node_type, node_len;
1045         uint16_t crc, calc_crc;
1046
1047         node_type = ubifs_unpack_bits(&addr, &pos, UBIFS_LPT_TYPE_BITS);
1048         if (node_type == UBIFS_LPT_NOT_A_NODE)
1049                 return 0;
1050         node_len = get_lpt_node_len(c, node_type);
1051         if (!node_len || node_len > len)
1052                 return 0;
1053         pos = 0;
1054         addr = buf;
1055         crc = ubifs_unpack_bits(&addr, &pos, UBIFS_LPT_CRC_BITS);
1056         calc_crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
1057                          node_len - UBIFS_LPT_CRC_BYTES);
1058         if (crc != calc_crc)
1059                 return 0;
1060         return 1;
1061 }
1062
1063
1064 /**
1065  * lpt_gc_lnum - garbage collect a LPT LEB.
1066  * @c: UBIFS file-system description object
1067  * @lnum: LEB number to garbage collect
1068  *
1069  * LPT garbage collection is used only for the "big" LPT model
1070  * (c->big_lpt == 1).  Garbage collection simply involves marking all the nodes
1071  * in the LEB being garbage-collected as dirty.  The dirty nodes are written
1072  * next commit, after which the LEB is free to be reused.
1073  *
1074  * This function returns %0 on success and a negative error code on failure.
1075  */
1076 static int lpt_gc_lnum(struct ubifs_info *c, int lnum)
1077 {
1078         int err, len = c->leb_size, node_type, node_num, node_len, offs;
1079         void *buf = c->lpt_buf;
1080
1081         dbg_lp("LEB %d", lnum);
1082         err = ubi_read(c->ubi, lnum, buf, 0, c->leb_size);
1083         if (err) {
1084                 ubifs_err("cannot read LEB %d, error %d", lnum, err);
1085                 return err;
1086         }
1087         while (1) {
1088                 if (!is_a_node(c, buf, len)) {
1089                         int pad_len;
1090
1091                         pad_len = get_pad_len(c, buf, len);
1092                         if (pad_len) {
1093                                 buf += pad_len;
1094                                 len -= pad_len;
1095                                 continue;
1096                         }
1097                         return 0;
1098                 }
1099                 node_type = get_lpt_node_type(c, buf, &node_num);
1100                 node_len = get_lpt_node_len(c, node_type);
1101                 offs = c->leb_size - len;
1102                 ubifs_assert(node_len != 0);
1103                 mutex_lock(&c->lp_mutex);
1104                 err = make_node_dirty(c, node_type, node_num, lnum, offs);
1105                 mutex_unlock(&c->lp_mutex);
1106                 if (err)
1107                         return err;
1108                 buf += node_len;
1109                 len -= node_len;
1110         }
1111         return 0;
1112 }
1113
1114 /**
1115  * lpt_gc - LPT garbage collection.
1116  * @c: UBIFS file-system description object
1117  *
1118  * Select a LPT LEB for LPT garbage collection and call 'lpt_gc_lnum()'.
1119  * Returns %0 on success and a negative error code on failure.
1120  */
1121 static int lpt_gc(struct ubifs_info *c)
1122 {
1123         int i, lnum = -1, dirty = 0;
1124
1125         mutex_lock(&c->lp_mutex);
1126         for (i = 0; i < c->lpt_lebs; i++) {
1127                 ubifs_assert(!c->ltab[i].tgc);
1128                 if (i + c->lpt_first == c->nhead_lnum ||
1129                     c->ltab[i].free + c->ltab[i].dirty == c->leb_size)
1130                         continue;
1131                 if (c->ltab[i].dirty > dirty) {
1132                         dirty = c->ltab[i].dirty;
1133                         lnum = i + c->lpt_first;
1134                 }
1135         }
1136         mutex_unlock(&c->lp_mutex);
1137         if (lnum == -1)
1138                 return -ENOSPC;
1139         return lpt_gc_lnum(c, lnum);
1140 }
1141
1142 /**
1143  * ubifs_lpt_start_commit - UBIFS commit starts.
1144  * @c: the UBIFS file-system description object
1145  *
1146  * This function has to be called when UBIFS starts the commit operation.
1147  * This function "freezes" all currently dirty LEB properties and does not
1148  * change them anymore. Further changes are saved and tracked separately
1149  * because they are not part of this commit. This function returns zero in case
1150  * of success and a negative error code in case of failure.
1151  */
1152 int ubifs_lpt_start_commit(struct ubifs_info *c)
1153 {
1154         int err, cnt;
1155
1156         dbg_lp("");
1157
1158         mutex_lock(&c->lp_mutex);
1159         err = dbg_check_ltab(c);
1160         if (err)
1161                 goto out;
1162
1163         if (c->check_lpt_free) {
1164                 /*
1165                  * We ensure there is enough free space in
1166                  * ubifs_lpt_post_commit() by marking nodes dirty. That
1167                  * information is lost when we unmount, so we also need
1168                  * to check free space once after mounting also.
1169                  */
1170                 c->check_lpt_free = 0;
1171                 while (need_write_all(c)) {
1172                         mutex_unlock(&c->lp_mutex);
1173                         err = lpt_gc(c);
1174                         if (err)
1175                                 return err;
1176                         mutex_lock(&c->lp_mutex);
1177                 }
1178         }
1179
1180         lpt_tgc_start(c);
1181
1182         if (!c->dirty_pn_cnt) {
1183                 dbg_cmt("no cnodes to commit");
1184                 err = 0;
1185                 goto out;
1186         }
1187
1188         if (!c->big_lpt && need_write_all(c)) {
1189                 /* If needed, write everything */
1190                 err = make_tree_dirty(c);
1191                 if (err)
1192                         goto out;
1193                 lpt_tgc_start(c);
1194         }
1195
1196         if (c->big_lpt)
1197                 populate_lsave(c);
1198
1199         cnt = get_cnodes_to_commit(c);
1200         ubifs_assert(cnt != 0);
1201
1202         err = layout_cnodes(c);
1203         if (err)
1204                 goto out;
1205
1206         /* Copy the LPT's own lprops for end commit to write */
1207         memcpy(c->ltab_cmt, c->ltab,
1208                sizeof(struct ubifs_lpt_lprops) * c->lpt_lebs);
1209         c->lpt_drty_flgs &= ~(LTAB_DIRTY | LSAVE_DIRTY);
1210
1211 out:
1212         mutex_unlock(&c->lp_mutex);
1213         return err;
1214 }
1215
1216 /**
1217  * free_obsolete_cnodes - free obsolete cnodes for commit end.
1218  * @c: UBIFS file-system description object
1219  */
1220 static void free_obsolete_cnodes(struct ubifs_info *c)
1221 {
1222         struct ubifs_cnode *cnode, *cnext;
1223
1224         cnext = c->lpt_cnext;
1225         if (!cnext)
1226                 return;
1227         do {
1228                 cnode = cnext;
1229                 cnext = cnode->cnext;
1230                 if (test_bit(OBSOLETE_CNODE, &cnode->flags))
1231                         kfree(cnode);
1232                 else
1233                         cnode->cnext = NULL;
1234         } while (cnext != c->lpt_cnext);
1235         c->lpt_cnext = NULL;
1236 }
1237
1238 /**
1239  * ubifs_lpt_end_commit - finish the commit operation.
1240  * @c: the UBIFS file-system description object
1241  *
1242  * This function has to be called when the commit operation finishes. It
1243  * flushes the changes which were "frozen" by 'ubifs_lprops_start_commit()' to
1244  * the media. Returns zero in case of success and a negative error code in case
1245  * of failure.
1246  */
1247 int ubifs_lpt_end_commit(struct ubifs_info *c)
1248 {
1249         int err;
1250
1251         dbg_lp("");
1252
1253         if (!c->lpt_cnext)
1254                 return 0;
1255
1256         err = write_cnodes(c);
1257         if (err)
1258                 return err;
1259
1260         mutex_lock(&c->lp_mutex);
1261         free_obsolete_cnodes(c);
1262         mutex_unlock(&c->lp_mutex);
1263
1264         return 0;
1265 }
1266
1267 /**
1268  * ubifs_lpt_post_commit - post commit LPT trivial GC and LPT GC.
1269  * @c: UBIFS file-system description object
1270  *
1271  * LPT trivial GC is completed after a commit. Also LPT GC is done after a
1272  * commit for the "big" LPT model.
1273  */
1274 int ubifs_lpt_post_commit(struct ubifs_info *c)
1275 {
1276         int err;
1277
1278         mutex_lock(&c->lp_mutex);
1279         err = lpt_tgc_end(c);
1280         if (err)
1281                 goto out;
1282         if (c->big_lpt)
1283                 while (need_write_all(c)) {
1284                         mutex_unlock(&c->lp_mutex);
1285                         err = lpt_gc(c);
1286                         if (err)
1287                                 return err;
1288                         mutex_lock(&c->lp_mutex);
1289                 }
1290 out:
1291         mutex_unlock(&c->lp_mutex);
1292         return err;
1293 }
1294
1295 /**
1296  * first_nnode - find the first nnode in memory.
1297  * @c: UBIFS file-system description object
1298  * @hght: height of tree where nnode found is returned here
1299  *
1300  * This function returns a pointer to the nnode found or %NULL if no nnode is
1301  * found. This function is a helper to 'ubifs_lpt_free()'.
1302  */
1303 static struct ubifs_nnode *first_nnode(struct ubifs_info *c, int *hght)
1304 {
1305         struct ubifs_nnode *nnode;
1306         int h, i, found;
1307
1308         nnode = c->nroot;
1309         *hght = 0;
1310         if (!nnode)
1311                 return NULL;
1312         for (h = 1; h < c->lpt_hght; h++) {
1313                 found = 0;
1314                 for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1315                         if (nnode->nbranch[i].nnode) {
1316                                 found = 1;
1317                                 nnode = nnode->nbranch[i].nnode;
1318                                 *hght = h;
1319                                 break;
1320                         }
1321                 }
1322                 if (!found)
1323                         break;
1324         }
1325         return nnode;
1326 }
1327
1328 /**
1329  * next_nnode - find the next nnode in memory.
1330  * @c: UBIFS file-system description object
1331  * @nnode: nnode from which to start.
1332  * @hght: height of tree where nnode is, is passed and returned here
1333  *
1334  * This function returns a pointer to the nnode found or %NULL if no nnode is
1335  * found. This function is a helper to 'ubifs_lpt_free()'.
1336  */
1337 static struct ubifs_nnode *next_nnode(struct ubifs_info *c,
1338                                       struct ubifs_nnode *nnode, int *hght)
1339 {
1340         struct ubifs_nnode *parent;
1341         int iip, h, i, found;
1342
1343         parent = nnode->parent;
1344         if (!parent)
1345                 return NULL;
1346         if (nnode->iip == UBIFS_LPT_FANOUT - 1) {
1347                 *hght -= 1;
1348                 return parent;
1349         }
1350         for (iip = nnode->iip + 1; iip < UBIFS_LPT_FANOUT; iip++) {
1351                 nnode = parent->nbranch[iip].nnode;
1352                 if (nnode)
1353                         break;
1354         }
1355         if (!nnode) {
1356                 *hght -= 1;
1357                 return parent;
1358         }
1359         for (h = *hght + 1; h < c->lpt_hght; h++) {
1360                 found = 0;
1361                 for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1362                         if (nnode->nbranch[i].nnode) {
1363                                 found = 1;
1364                                 nnode = nnode->nbranch[i].nnode;
1365                                 *hght = h;
1366                                 break;
1367                         }
1368                 }
1369                 if (!found)
1370                         break;
1371         }
1372         return nnode;
1373 }
1374
1375 /**
1376  * ubifs_lpt_free - free resources owned by the LPT.
1377  * @c: UBIFS file-system description object
1378  * @wr_only: free only resources used for writing
1379  */
1380 void ubifs_lpt_free(struct ubifs_info *c, int wr_only)
1381 {
1382         struct ubifs_nnode *nnode;
1383         int i, hght;
1384
1385         /* Free write-only things first */
1386
1387         free_obsolete_cnodes(c); /* Leftover from a failed commit */
1388
1389         vfree(c->ltab_cmt);
1390         c->ltab_cmt = NULL;
1391         vfree(c->lpt_buf);
1392         c->lpt_buf = NULL;
1393         kfree(c->lsave);
1394         c->lsave = NULL;
1395
1396         if (wr_only)
1397                 return;
1398
1399         /* Now free the rest */
1400
1401         nnode = first_nnode(c, &hght);
1402         while (nnode) {
1403                 for (i = 0; i < UBIFS_LPT_FANOUT; i++)
1404                         kfree(nnode->nbranch[i].nnode);
1405                 nnode = next_nnode(c, nnode, &hght);
1406         }
1407         for (i = 0; i < LPROPS_HEAP_CNT; i++)
1408                 kfree(c->lpt_heap[i].arr);
1409         kfree(c->dirty_idx.arr);
1410         kfree(c->nroot);
1411         vfree(c->ltab);
1412         kfree(c->lpt_nod_buf);
1413 }
1414
1415 #ifdef CONFIG_UBIFS_FS_DEBUG
1416
1417 /**
1418  * dbg_is_all_ff - determine if a buffer contains only 0xff bytes.
1419  * @buf: buffer
1420  * @len: buffer length
1421  */
1422 static int dbg_is_all_ff(uint8_t *buf, int len)
1423 {
1424         int i;
1425
1426         for (i = 0; i < len; i++)
1427                 if (buf[i] != 0xff)
1428                         return 0;
1429         return 1;
1430 }
1431
1432 /**
1433  * dbg_is_nnode_dirty - determine if a nnode is dirty.
1434  * @c: the UBIFS file-system description object
1435  * @lnum: LEB number where nnode was written
1436  * @offs: offset where nnode was written
1437  */
1438 static int dbg_is_nnode_dirty(struct ubifs_info *c, int lnum, int offs)
1439 {
1440         struct ubifs_nnode *nnode;
1441         int hght;
1442
1443         /* Entire tree is in memory so first_nnode / next_nnode are ok */
1444         nnode = first_nnode(c, &hght);
1445         for (; nnode; nnode = next_nnode(c, nnode, &hght)) {
1446                 struct ubifs_nbranch *branch;
1447
1448                 cond_resched();
1449                 if (nnode->parent) {
1450                         branch = &nnode->parent->nbranch[nnode->iip];
1451                         if (branch->lnum != lnum || branch->offs != offs)
1452                                 continue;
1453                         if (test_bit(DIRTY_CNODE, &nnode->flags))
1454                                 return 1;
1455                         return 0;
1456                 } else {
1457                         if (c->lpt_lnum != lnum || c->lpt_offs != offs)
1458                                 continue;
1459                         if (test_bit(DIRTY_CNODE, &nnode->flags))
1460                                 return 1;
1461                         return 0;
1462                 }
1463         }
1464         return 1;
1465 }
1466
1467 /**
1468  * dbg_is_pnode_dirty - determine if a pnode is dirty.
1469  * @c: the UBIFS file-system description object
1470  * @lnum: LEB number where pnode was written
1471  * @offs: offset where pnode was written
1472  */
1473 static int dbg_is_pnode_dirty(struct ubifs_info *c, int lnum, int offs)
1474 {
1475         int i, cnt;
1476
1477         cnt = DIV_ROUND_UP(c->main_lebs, UBIFS_LPT_FANOUT);
1478         for (i = 0; i < cnt; i++) {
1479                 struct ubifs_pnode *pnode;
1480                 struct ubifs_nbranch *branch;
1481
1482                 cond_resched();
1483                 pnode = pnode_lookup(c, i);
1484                 if (IS_ERR(pnode))
1485                         return PTR_ERR(pnode);
1486                 branch = &pnode->parent->nbranch[pnode->iip];
1487                 if (branch->lnum != lnum || branch->offs != offs)
1488                         continue;
1489                 if (test_bit(DIRTY_CNODE, &pnode->flags))
1490                         return 1;
1491                 return 0;
1492         }
1493         return 1;
1494 }
1495
1496 /**
1497  * dbg_is_ltab_dirty - determine if a ltab node is dirty.
1498  * @c: the UBIFS file-system description object
1499  * @lnum: LEB number where ltab node was written
1500  * @offs: offset where ltab node was written
1501  */
1502 static int dbg_is_ltab_dirty(struct ubifs_info *c, int lnum, int offs)
1503 {
1504         if (lnum != c->ltab_lnum || offs != c->ltab_offs)
1505                 return 1;
1506         return (c->lpt_drty_flgs & LTAB_DIRTY) != 0;
1507 }
1508
1509 /**
1510  * dbg_is_lsave_dirty - determine if a lsave node is dirty.
1511  * @c: the UBIFS file-system description object
1512  * @lnum: LEB number where lsave node was written
1513  * @offs: offset where lsave node was written
1514  */
1515 static int dbg_is_lsave_dirty(struct ubifs_info *c, int lnum, int offs)
1516 {
1517         if (lnum != c->lsave_lnum || offs != c->lsave_offs)
1518                 return 1;
1519         return (c->lpt_drty_flgs & LSAVE_DIRTY) != 0;
1520 }
1521
1522 /**
1523  * dbg_is_node_dirty - determine if a node is dirty.
1524  * @c: the UBIFS file-system description object
1525  * @node_type: node type
1526  * @lnum: LEB number where node was written
1527  * @offs: offset where node was written
1528  */
1529 static int dbg_is_node_dirty(struct ubifs_info *c, int node_type, int lnum,
1530                              int offs)
1531 {
1532         switch (node_type) {
1533         case UBIFS_LPT_NNODE:
1534                 return dbg_is_nnode_dirty(c, lnum, offs);
1535         case UBIFS_LPT_PNODE:
1536                 return dbg_is_pnode_dirty(c, lnum, offs);
1537         case UBIFS_LPT_LTAB:
1538                 return dbg_is_ltab_dirty(c, lnum, offs);
1539         case UBIFS_LPT_LSAVE:
1540                 return dbg_is_lsave_dirty(c, lnum, offs);
1541         }
1542         return 1;
1543 }
1544
1545 /**
1546  * dbg_check_ltab_lnum - check the ltab for a LPT LEB number.
1547  * @c: the UBIFS file-system description object
1548  * @lnum: LEB number where node was written
1549  * @offs: offset where node was written
1550  *
1551  * This function returns %0 on success and a negative error code on failure.
1552  */
1553 static int dbg_check_ltab_lnum(struct ubifs_info *c, int lnum)
1554 {
1555         int err, len = c->leb_size, dirty = 0, node_type, node_num, node_len;
1556         int ret;
1557         void *buf = c->dbg_buf;
1558
1559         dbg_lp("LEB %d", lnum);
1560         err = ubi_read(c->ubi, lnum, buf, 0, c->leb_size);
1561         if (err) {
1562                 dbg_msg("ubi_read failed, LEB %d, error %d", lnum, err);
1563                 return err;
1564         }
1565         while (1) {
1566                 if (!is_a_node(c, buf, len)) {
1567                         int i, pad_len;
1568
1569                         pad_len = get_pad_len(c, buf, len);
1570                         if (pad_len) {
1571                                 buf += pad_len;
1572                                 len -= pad_len;
1573                                 dirty += pad_len;
1574                                 continue;
1575                         }
1576                         if (!dbg_is_all_ff(buf, len)) {
1577                                 dbg_msg("invalid empty space in LEB %d at %d",
1578                                         lnum, c->leb_size - len);
1579                                 err = -EINVAL;
1580                         }
1581                         i = lnum - c->lpt_first;
1582                         if (len != c->ltab[i].free) {
1583                                 dbg_msg("invalid free space in LEB %d "
1584                                         "(free %d, expected %d)",
1585                                         lnum, len, c->ltab[i].free);
1586                                 err = -EINVAL;
1587                         }
1588                         if (dirty != c->ltab[i].dirty) {
1589                                 dbg_msg("invalid dirty space in LEB %d "
1590                                         "(dirty %d, expected %d)",
1591                                         lnum, dirty, c->ltab[i].dirty);
1592                                 err = -EINVAL;
1593                         }
1594                         return err;
1595                 }
1596                 node_type = get_lpt_node_type(c, buf, &node_num);
1597                 node_len = get_lpt_node_len(c, node_type);
1598                 ret = dbg_is_node_dirty(c, node_type, lnum, c->leb_size - len);
1599                 if (ret == 1)
1600                         dirty += node_len;
1601                 buf += node_len;
1602                 len -= node_len;
1603         }
1604 }
1605
1606 /**
1607  * dbg_check_ltab - check the free and dirty space in the ltab.
1608  * @c: the UBIFS file-system description object
1609  *
1610  * This function returns %0 on success and a negative error code on failure.
1611  */
1612 int dbg_check_ltab(struct ubifs_info *c)
1613 {
1614         int lnum, err, i, cnt;
1615
1616         if (!(ubifs_chk_flags & UBIFS_CHK_LPROPS))
1617                 return 0;
1618
1619         /* Bring the entire tree into memory */
1620         cnt = DIV_ROUND_UP(c->main_lebs, UBIFS_LPT_FANOUT);
1621         for (i = 0; i < cnt; i++) {
1622                 struct ubifs_pnode *pnode;
1623
1624                 pnode = pnode_lookup(c, i);
1625                 if (IS_ERR(pnode))
1626                         return PTR_ERR(pnode);
1627                 cond_resched();
1628         }
1629
1630         /* Check nodes */
1631         err = dbg_check_lpt_nodes(c, (struct ubifs_cnode *)c->nroot, 0, 0);
1632         if (err)
1633                 return err;
1634
1635         /* Check each LEB */
1636         for (lnum = c->lpt_first; lnum <= c->lpt_last; lnum++) {
1637                 err = dbg_check_ltab_lnum(c, lnum);
1638                 if (err) {
1639                         dbg_err("failed at LEB %d", lnum);
1640                         return err;
1641                 }
1642         }
1643
1644         dbg_lp("succeeded");
1645         return 0;
1646 }
1647
1648 #endif /* CONFIG_UBIFS_FS_DEBUG */