xref: /openbmc/linux/fs/ubifs/lpt_commit.c (revision 93dc544c)
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 */
1649