1 /* 2 * This file is part of UBIFS. 3 * 4 * Copyright (C) 2006-2008 Nokia Corporation. 5 * 6 * SPDX-License-Identifier: GPL-2.0+ 7 * 8 * Authors: Adrian Hunter 9 * Artem Bityutskiy (Битюцкий Артём) 10 */ 11 12 /* 13 * This file implements commit-related functionality of the LEB properties 14 * subsystem. 15 */ 16 17 #ifndef __UBOOT__ 18 #include <linux/crc16.h> 19 #include <linux/slab.h> 20 #include <linux/random.h> 21 #else 22 #include <linux/compat.h> 23 #include <linux/err.h> 24 #include "crc16.h" 25 #endif 26 #include "ubifs.h" 27 28 #ifndef __UBOOT__ 29 static int dbg_populate_lsave(struct ubifs_info *c); 30 #endif 31 32 /** 33 * first_dirty_cnode - find first dirty cnode. 34 * @c: UBIFS file-system description object 35 * @nnode: nnode at which to start 36 * 37 * This function returns the first dirty cnode or %NULL if there is not one. 38 */ 39 static struct ubifs_cnode *first_dirty_cnode(struct ubifs_nnode *nnode) 40 { 41 ubifs_assert(nnode); 42 while (1) { 43 int i, cont = 0; 44 45 for (i = 0; i < UBIFS_LPT_FANOUT; i++) { 46 struct ubifs_cnode *cnode; 47 48 cnode = nnode->nbranch[i].cnode; 49 if (cnode && 50 test_bit(DIRTY_CNODE, &cnode->flags)) { 51 if (cnode->level == 0) 52 return cnode; 53 nnode = (struct ubifs_nnode *)cnode; 54 cont = 1; 55 break; 56 } 57 } 58 if (!cont) 59 return (struct ubifs_cnode *)nnode; 60 } 61 } 62 63 /** 64 * next_dirty_cnode - find next dirty cnode. 65 * @cnode: cnode from which to begin searching 66 * 67 * This function returns the next dirty cnode or %NULL if there is not one. 68 */ 69 static struct ubifs_cnode *next_dirty_cnode(struct ubifs_cnode *cnode) 70 { 71 struct ubifs_nnode *nnode; 72 int i; 73 74 ubifs_assert(cnode); 75 nnode = cnode->parent; 76 if (!nnode) 77 return NULL; 78 for (i = cnode->iip + 1; i < UBIFS_LPT_FANOUT; i++) { 79 cnode = nnode->nbranch[i].cnode; 80 if (cnode && test_bit(DIRTY_CNODE, &cnode->flags)) { 81 if (cnode->level == 0) 82 return cnode; /* cnode is a pnode */ 83 /* cnode is a nnode */ 84 return first_dirty_cnode((struct ubifs_nnode *)cnode); 85 } 86 } 87 return (struct ubifs_cnode *)nnode; 88 } 89 90 /** 91 * get_cnodes_to_commit - create list of dirty cnodes to commit. 92 * @c: UBIFS file-system description object 93 * 94 * This function returns the number of cnodes to commit. 95 */ 96 static int get_cnodes_to_commit(struct ubifs_info *c) 97 { 98 struct ubifs_cnode *cnode, *cnext; 99 int cnt = 0; 100 101 if (!c->nroot) 102 return 0; 103 104 if (!test_bit(DIRTY_CNODE, &c->nroot->flags)) 105 return 0; 106 107 c->lpt_cnext = first_dirty_cnode(c->nroot); 108 cnode = c->lpt_cnext; 109 if (!cnode) 110 return 0; 111 cnt += 1; 112 while (1) { 113 ubifs_assert(!test_bit(COW_CNODE, &cnode->flags)); 114 __set_bit(COW_CNODE, &cnode->flags); 115 cnext = next_dirty_cnode(cnode); 116 if (!cnext) { 117 cnode->cnext = c->lpt_cnext; 118 break; 119 } 120 cnode->cnext = cnext; 121 cnode = cnext; 122 cnt += 1; 123 } 124 dbg_cmt("committing %d cnodes", cnt); 125 dbg_lp("committing %d cnodes", cnt); 126 ubifs_assert(cnt == c->dirty_nn_cnt + c->dirty_pn_cnt); 127 return cnt; 128 } 129 130 /** 131 * upd_ltab - update LPT LEB properties. 132 * @c: UBIFS file-system description object 133 * @lnum: LEB number 134 * @free: amount of free space 135 * @dirty: amount of dirty space to add 136 */ 137 static void upd_ltab(struct ubifs_info *c, int lnum, int free, int dirty) 138 { 139 dbg_lp("LEB %d free %d dirty %d to %d +%d", 140 lnum, c->ltab[lnum - c->lpt_first].free, 141 c->ltab[lnum - c->lpt_first].dirty, free, dirty); 142 ubifs_assert(lnum >= c->lpt_first && lnum <= c->lpt_last); 143 c->ltab[lnum - c->lpt_first].free = free; 144 c->ltab[lnum - c->lpt_first].dirty += dirty; 145 } 146 147 /** 148 * alloc_lpt_leb - allocate an LPT LEB that is empty. 149 * @c: UBIFS file-system description object 150 * @lnum: LEB number is passed and returned here 151 * 152 * This function finds the next empty LEB in the ltab starting from @lnum. If a 153 * an empty LEB is found it is returned in @lnum and the function returns %0. 154 * Otherwise the function returns -ENOSPC. Note however, that LPT is designed 155 * never to run out of space. 156 */ 157 static int alloc_lpt_leb(struct ubifs_info *c, int *lnum) 158 { 159 int i, n; 160 161 n = *lnum - c->lpt_first + 1; 162 for (i = n; i < c->lpt_lebs; i++) { 163 if (c->ltab[i].tgc || c->ltab[i].cmt) 164 continue; 165 if (c->ltab[i].free == c->leb_size) { 166 c->ltab[i].cmt = 1; 167 *lnum = i + c->lpt_first; 168 return 0; 169 } 170 } 171 172 for (i = 0; i < n; i++) { 173 if (c->ltab[i].tgc || c->ltab[i].cmt) 174 continue; 175 if (c->ltab[i].free == c->leb_size) { 176 c->ltab[i].cmt = 1; 177 *lnum = i + c->lpt_first; 178 return 0; 179 } 180 } 181 return -ENOSPC; 182 } 183 184 /** 185 * layout_cnodes - layout cnodes for commit. 186 * @c: UBIFS file-system description object 187 * 188 * This function returns %0 on success and a negative error code on failure. 189 */ 190 static int layout_cnodes(struct ubifs_info *c) 191 { 192 int lnum, offs, len, alen, done_lsave, done_ltab, err; 193 struct ubifs_cnode *cnode; 194 195 err = dbg_chk_lpt_sz(c, 0, 0); 196 if (err) 197 return err; 198 cnode = c->lpt_cnext; 199 if (!cnode) 200 return 0; 201 lnum = c->nhead_lnum; 202 offs = c->nhead_offs; 203 /* Try to place lsave and ltab nicely */ 204 done_lsave = !c->big_lpt; 205 done_ltab = 0; 206 if (!done_lsave && offs + c->lsave_sz <= c->leb_size) { 207 done_lsave = 1; 208 c->lsave_lnum = lnum; 209 c->lsave_offs = offs; 210 offs += c->lsave_sz; 211 dbg_chk_lpt_sz(c, 1, c->lsave_sz); 212 } 213 214 if (offs + c->ltab_sz <= c->leb_size) { 215 done_ltab = 1; 216 c->ltab_lnum = lnum; 217 c->ltab_offs = offs; 218 offs += c->ltab_sz; 219 dbg_chk_lpt_sz(c, 1, c->ltab_sz); 220 } 221 222 do { 223 if (cnode->level) { 224 len = c->nnode_sz; 225 c->dirty_nn_cnt -= 1; 226 } else { 227 len = c->pnode_sz; 228 c->dirty_pn_cnt -= 1; 229 } 230 while (offs + len > c->leb_size) { 231 alen = ALIGN(offs, c->min_io_size); 232 upd_ltab(c, lnum, c->leb_size - alen, alen - offs); 233 dbg_chk_lpt_sz(c, 2, c->leb_size - offs); 234 err = alloc_lpt_leb(c, &lnum); 235 if (err) 236 goto no_space; 237 offs = 0; 238 ubifs_assert(lnum >= c->lpt_first && 239 lnum <= c->lpt_last); 240 /* Try to place lsave and ltab nicely */ 241 if (!done_lsave) { 242 done_lsave = 1; 243 c->lsave_lnum = lnum; 244 c->lsave_offs = offs; 245 offs += c->lsave_sz; 246 dbg_chk_lpt_sz(c, 1, c->lsave_sz); 247 continue; 248 } 249 if (!done_ltab) { 250 done_ltab = 1; 251 c->ltab_lnum = lnum; 252 c->ltab_offs = offs; 253 offs += c->ltab_sz; 254 dbg_chk_lpt_sz(c, 1, c->ltab_sz); 255 continue; 256 } 257 break; 258 } 259 if (cnode->parent) { 260 cnode->parent->nbranch[cnode->iip].lnum = lnum; 261 cnode->parent->nbranch[cnode->iip].offs = offs; 262 } else { 263 c->lpt_lnum = lnum; 264 c->lpt_offs = offs; 265 } 266 offs += len; 267 dbg_chk_lpt_sz(c, 1, len); 268 cnode = cnode->cnext; 269 } while (cnode && cnode != c->lpt_cnext); 270 271 /* Make sure to place LPT's save table */ 272 if (!done_lsave) { 273 if (offs + c->lsave_sz > c->leb_size) { 274 alen = ALIGN(offs, c->min_io_size); 275 upd_ltab(c, lnum, c->leb_size - alen, alen - offs); 276 dbg_chk_lpt_sz(c, 2, c->leb_size - offs); 277 err = alloc_lpt_leb(c, &lnum); 278 if (err) 279 goto no_space; 280 offs = 0; 281 ubifs_assert(lnum >= c->lpt_first && 282 lnum <= c->lpt_last); 283 } 284 done_lsave = 1; 285 c->lsave_lnum = lnum; 286 c->lsave_offs = offs; 287 offs += c->lsave_sz; 288 dbg_chk_lpt_sz(c, 1, c->lsave_sz); 289 } 290 291 /* Make sure to place LPT's own lprops table */ 292 if (!done_ltab) { 293 if (offs + c->ltab_sz > c->leb_size) { 294 alen = ALIGN(offs, c->min_io_size); 295 upd_ltab(c, lnum, c->leb_size - alen, alen - offs); 296 dbg_chk_lpt_sz(c, 2, c->leb_size - offs); 297 err = alloc_lpt_leb(c, &lnum); 298 if (err) 299 goto no_space; 300 offs = 0; 301 ubifs_assert(lnum >= c->lpt_first && 302 lnum <= c->lpt_last); 303 } 304 c->ltab_lnum = lnum; 305 c->ltab_offs = offs; 306 offs += c->ltab_sz; 307 dbg_chk_lpt_sz(c, 1, c->ltab_sz); 308 } 309 310 alen = ALIGN(offs, c->min_io_size); 311 upd_ltab(c, lnum, c->leb_size - alen, alen - offs); 312 dbg_chk_lpt_sz(c, 4, alen - offs); 313 err = dbg_chk_lpt_sz(c, 3, alen); 314 if (err) 315 return err; 316 return 0; 317 318 no_space: 319 ubifs_err(c, "LPT out of space at LEB %d:%d needing %d, done_ltab %d, done_lsave %d", 320 lnum, offs, len, done_ltab, done_lsave); 321 ubifs_dump_lpt_info(c); 322 ubifs_dump_lpt_lebs(c); 323 dump_stack(); 324 return err; 325 } 326 327 #ifndef __UBOOT__ 328 /** 329 * realloc_lpt_leb - allocate an LPT LEB that is empty. 330 * @c: UBIFS file-system description object 331 * @lnum: LEB number is passed and returned here 332 * 333 * This function duplicates exactly the results of the function alloc_lpt_leb. 334 * It is used during end commit to reallocate the same LEB numbers that were 335 * allocated by alloc_lpt_leb during start commit. 336 * 337 * This function finds the next LEB that was allocated by the alloc_lpt_leb 338 * function starting from @lnum. If a LEB is found it is returned in @lnum and 339 * the function returns %0. Otherwise the function returns -ENOSPC. 340 * Note however, that LPT is designed never to run out of space. 341 */ 342 static int realloc_lpt_leb(struct ubifs_info *c, int *lnum) 343 { 344 int i, n; 345 346 n = *lnum - c->lpt_first + 1; 347 for (i = n; i < c->lpt_lebs; i++) 348 if (c->ltab[i].cmt) { 349 c->ltab[i].cmt = 0; 350 *lnum = i + c->lpt_first; 351 return 0; 352 } 353 354 for (i = 0; i < n; i++) 355 if (c->ltab[i].cmt) { 356 c->ltab[i].cmt = 0; 357 *lnum = i + c->lpt_first; 358 return 0; 359 } 360 return -ENOSPC; 361 } 362 363 /** 364 * write_cnodes - write cnodes for commit. 365 * @c: UBIFS file-system description object 366 * 367 * This function returns %0 on success and a negative error code on failure. 368 */ 369 static int write_cnodes(struct ubifs_info *c) 370 { 371 int lnum, offs, len, from, err, wlen, alen, done_ltab, done_lsave; 372 struct ubifs_cnode *cnode; 373 void *buf = c->lpt_buf; 374 375 cnode = c->lpt_cnext; 376 if (!cnode) 377 return 0; 378 lnum = c->nhead_lnum; 379 offs = c->nhead_offs; 380 from = offs; 381 /* Ensure empty LEB is unmapped */ 382 if (offs == 0) { 383 err = ubifs_leb_unmap(c, lnum); 384 if (err) 385 return err; 386 } 387 /* Try to place lsave and ltab nicely */ 388 done_lsave = !c->big_lpt; 389 done_ltab = 0; 390 if (!done_lsave && offs + c->lsave_sz <= c->leb_size) { 391 done_lsave = 1; 392 ubifs_pack_lsave(c, buf + offs, c->lsave); 393 offs += c->lsave_sz; 394 dbg_chk_lpt_sz(c, 1, c->lsave_sz); 395 } 396 397 if (offs + c->ltab_sz <= c->leb_size) { 398 done_ltab = 1; 399 ubifs_pack_ltab(c, buf + offs, c->ltab_cmt); 400 offs += c->ltab_sz; 401 dbg_chk_lpt_sz(c, 1, c->ltab_sz); 402 } 403 404 /* Loop for each cnode */ 405 do { 406 if (cnode->level) 407 len = c->nnode_sz; 408 else 409 len = c->pnode_sz; 410 while (offs + len > c->leb_size) { 411 wlen = offs - from; 412 if (wlen) { 413 alen = ALIGN(wlen, c->min_io_size); 414 memset(buf + offs, 0xff, alen - wlen); 415 err = ubifs_leb_write(c, lnum, buf + from, from, 416 alen); 417 if (err) 418 return err; 419 } 420 dbg_chk_lpt_sz(c, 2, c->leb_size - offs); 421 err = realloc_lpt_leb(c, &lnum); 422 if (err) 423 goto no_space; 424 offs = from = 0; 425 ubifs_assert(lnum >= c->lpt_first && 426 lnum <= c->lpt_last); 427 err = ubifs_leb_unmap(c, lnum); 428 if (err) 429 return err; 430 /* Try to place lsave and ltab nicely */ 431 if (!done_lsave) { 432 done_lsave = 1; 433 ubifs_pack_lsave(c, buf + offs, c->lsave); 434 offs += c->lsave_sz; 435 dbg_chk_lpt_sz(c, 1, c->lsave_sz); 436 continue; 437 } 438 if (!done_ltab) { 439 done_ltab = 1; 440 ubifs_pack_ltab(c, buf + offs, c->ltab_cmt); 441 offs += c->ltab_sz; 442 dbg_chk_lpt_sz(c, 1, c->ltab_sz); 443 continue; 444 } 445 break; 446 } 447 if (cnode->level) 448 ubifs_pack_nnode(c, buf + offs, 449 (struct ubifs_nnode *)cnode); 450 else 451 ubifs_pack_pnode(c, buf + offs, 452 (struct ubifs_pnode *)cnode); 453 /* 454 * The reason for the barriers is the same as in case of TNC. 455 * See comment in 'write_index()'. 'dirty_cow_nnode()' and 456 * 'dirty_cow_pnode()' are the functions for which this is 457 * important. 458 */ 459 clear_bit(DIRTY_CNODE, &cnode->flags); 460 smp_mb__before_atomic(); 461 clear_bit(COW_CNODE, &cnode->flags); 462 smp_mb__after_atomic(); 463 offs += len; 464 dbg_chk_lpt_sz(c, 1, len); 465 cnode = cnode->cnext; 466 } while (cnode && cnode != c->lpt_cnext); 467 468 /* Make sure to place LPT's save table */ 469 if (!done_lsave) { 470 if (offs + c->lsave_sz > c->leb_size) { 471 wlen = offs - from; 472 alen = ALIGN(wlen, c->min_io_size); 473 memset(buf + offs, 0xff, alen - wlen); 474 err = ubifs_leb_write(c, lnum, buf + from, from, alen); 475 if (err) 476 return err; 477 dbg_chk_lpt_sz(c, 2, c->leb_size - offs); 478 err = realloc_lpt_leb(c, &lnum); 479 if (err) 480 goto no_space; 481 offs = from = 0; 482 ubifs_assert(lnum >= c->lpt_first && 483 lnum <= c->lpt_last); 484 err = ubifs_leb_unmap(c, lnum); 485 if (err) 486 return err; 487 } 488 done_lsave = 1; 489 ubifs_pack_lsave(c, buf + offs, c->lsave); 490 offs += c->lsave_sz; 491 dbg_chk_lpt_sz(c, 1, c->lsave_sz); 492 } 493 494 /* Make sure to place LPT's own lprops table */ 495 if (!done_ltab) { 496 if (offs + c->ltab_sz > c->leb_size) { 497 wlen = offs - from; 498 alen = ALIGN(wlen, c->min_io_size); 499 memset(buf + offs, 0xff, alen - wlen); 500 err = ubifs_leb_write(c, lnum, buf + from, from, alen); 501 if (err) 502 return err; 503 dbg_chk_lpt_sz(c, 2, c->leb_size - offs); 504 err = realloc_lpt_leb(c, &lnum); 505 if (err) 506 goto no_space; 507 offs = from = 0; 508 ubifs_assert(lnum >= c->lpt_first && 509 lnum <= c->lpt_last); 510 err = ubifs_leb_unmap(c, lnum); 511 if (err) 512 return err; 513 } 514 ubifs_pack_ltab(c, buf + offs, c->ltab_cmt); 515 offs += c->ltab_sz; 516 dbg_chk_lpt_sz(c, 1, c->ltab_sz); 517 } 518 519 /* Write remaining data in buffer */ 520 wlen = offs - from; 521 alen = ALIGN(wlen, c->min_io_size); 522 memset(buf + offs, 0xff, alen - wlen); 523 err = ubifs_leb_write(c, lnum, buf + from, from, alen); 524 if (err) 525 return err; 526 527 dbg_chk_lpt_sz(c, 4, alen - wlen); 528 err = dbg_chk_lpt_sz(c, 3, ALIGN(offs, c->min_io_size)); 529 if (err) 530 return err; 531 532 c->nhead_lnum = lnum; 533 c->nhead_offs = ALIGN(offs, c->min_io_size); 534 535 dbg_lp("LPT root is at %d:%d", c->lpt_lnum, c->lpt_offs); 536 dbg_lp("LPT head is at %d:%d", c->nhead_lnum, c->nhead_offs); 537 dbg_lp("LPT ltab is at %d:%d", c->ltab_lnum, c->ltab_offs); 538 if (c->big_lpt) 539 dbg_lp("LPT lsave is at %d:%d", c->lsave_lnum, c->lsave_offs); 540 541 return 0; 542 543 no_space: 544 ubifs_err(c, "LPT out of space mismatch at LEB %d:%d needing %d, done_ltab %d, done_lsave %d", 545 lnum, offs, len, done_ltab, done_lsave); 546 ubifs_dump_lpt_info(c); 547 ubifs_dump_lpt_lebs(c); 548 dump_stack(); 549 return err; 550 } 551 #endif 552 553 /** 554 * next_pnode_to_dirty - find next pnode to dirty. 555 * @c: UBIFS file-system description object 556 * @pnode: pnode 557 * 558 * This function returns the next pnode to dirty or %NULL if there are no more 559 * pnodes. Note that pnodes that have never been written (lnum == 0) are 560 * skipped. 561 */ 562 static struct ubifs_pnode *next_pnode_to_dirty(struct ubifs_info *c, 563 struct ubifs_pnode *pnode) 564 { 565 struct ubifs_nnode *nnode; 566 int iip; 567 568 /* Try to go right */ 569 nnode = pnode->parent; 570 for (iip = pnode->iip + 1; iip < UBIFS_LPT_FANOUT; iip++) { 571 if (nnode->nbranch[iip].lnum) 572 return ubifs_get_pnode(c, nnode, iip); 573 } 574 575 /* Go up while can't go right */ 576 do { 577 iip = nnode->iip + 1; 578 nnode = nnode->parent; 579 if (!nnode) 580 return NULL; 581 for (; iip < UBIFS_LPT_FANOUT; iip++) { 582 if (nnode->nbranch[iip].lnum) 583 break; 584 } 585 } while (iip >= UBIFS_LPT_FANOUT); 586 587 /* Go right */ 588 nnode = ubifs_get_nnode(c, nnode, iip); 589 if (IS_ERR(nnode)) 590 return (void *)nnode; 591 592 /* Go down to level 1 */ 593 while (nnode->level > 1) { 594 for (iip = 0; iip < UBIFS_LPT_FANOUT; iip++) { 595 if (nnode->nbranch[iip].lnum) 596 break; 597 } 598 if (iip >= UBIFS_LPT_FANOUT) { 599 /* 600 * Should not happen, but we need to keep going 601 * if it does. 602 */ 603 iip = 0; 604 } 605 nnode = ubifs_get_nnode(c, nnode, iip); 606 if (IS_ERR(nnode)) 607 return (void *)nnode; 608 } 609 610 for (iip = 0; iip < UBIFS_LPT_FANOUT; iip++) 611 if (nnode->nbranch[iip].lnum) 612 break; 613 if (iip >= UBIFS_LPT_FANOUT) 614 /* Should not happen, but we need to keep going if it does */ 615 iip = 0; 616 return ubifs_get_pnode(c, nnode, iip); 617 } 618 619 /** 620 * pnode_lookup - lookup a pnode in the LPT. 621 * @c: UBIFS file-system description object 622 * @i: pnode number (0 to main_lebs - 1) 623 * 624 * This function returns a pointer to the pnode on success or a negative 625 * error code on failure. 626 */ 627 static struct ubifs_pnode *pnode_lookup(struct ubifs_info *c, int i) 628 { 629 int err, h, iip, shft; 630 struct ubifs_nnode *nnode; 631 632 if (!c->nroot) { 633 err = ubifs_read_nnode(c, NULL, 0); 634 if (err) 635 return ERR_PTR(err); 636 } 637 i <<= UBIFS_LPT_FANOUT_SHIFT; 638 nnode = c->nroot; 639 shft = c->lpt_hght * UBIFS_LPT_FANOUT_SHIFT; 640 for (h = 1; h < c->lpt_hght; h++) { 641 iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1)); 642 shft -= UBIFS_LPT_FANOUT_SHIFT; 643 nnode = ubifs_get_nnode(c, nnode, iip); 644 if (IS_ERR(nnode)) 645 return ERR_CAST(nnode); 646 } 647 iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1)); 648 return ubifs_get_pnode(c, nnode, iip); 649 } 650 651 /** 652 * add_pnode_dirt - add dirty space to LPT LEB properties. 653 * @c: UBIFS file-system description object 654 * @pnode: pnode for which to add dirt 655 */ 656 static void add_pnode_dirt(struct ubifs_info *c, struct ubifs_pnode *pnode) 657 { 658 ubifs_add_lpt_dirt(c, pnode->parent->nbranch[pnode->iip].lnum, 659 c->pnode_sz); 660 } 661 662 /** 663 * do_make_pnode_dirty - mark a pnode dirty. 664 * @c: UBIFS file-system description object 665 * @pnode: pnode to mark dirty 666 */ 667 static void do_make_pnode_dirty(struct ubifs_info *c, struct ubifs_pnode *pnode) 668 { 669 /* Assumes cnext list is empty i.e. not called during commit */ 670 if (!test_and_set_bit(DIRTY_CNODE, &pnode->flags)) { 671 struct ubifs_nnode *nnode; 672 673 c->dirty_pn_cnt += 1; 674 add_pnode_dirt(c, pnode); 675 /* Mark parent and ancestors dirty too */ 676 nnode = pnode->parent; 677 while (nnode) { 678 if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) { 679 c->dirty_nn_cnt += 1; 680 ubifs_add_nnode_dirt(c, nnode); 681 nnode = nnode->parent; 682 } else 683 break; 684 } 685 } 686 } 687 688 /** 689 * make_tree_dirty - mark the entire LEB properties tree dirty. 690 * @c: UBIFS file-system description object 691 * 692 * This function is used by the "small" LPT model to cause the entire LEB 693 * properties tree to be written. The "small" LPT model does not use LPT 694 * garbage collection because it is more efficient to write the entire tree 695 * (because it is small). 696 * 697 * This function returns %0 on success and a negative error code on failure. 698 */ 699 static int make_tree_dirty(struct ubifs_info *c) 700 { 701 struct ubifs_pnode *pnode; 702 703 pnode = pnode_lookup(c, 0); 704 if (IS_ERR(pnode)) 705 return PTR_ERR(pnode); 706 707 while (pnode) { 708 do_make_pnode_dirty(c, pnode); 709 pnode = next_pnode_to_dirty(c, pnode); 710 if (IS_ERR(pnode)) 711 return PTR_ERR(pnode); 712 } 713 return 0; 714 } 715 716 /** 717 * need_write_all - determine if the LPT area is running out of free space. 718 * @c: UBIFS file-system description object 719 * 720 * This function returns %1 if the LPT area is running out of free space and %0 721 * if it is not. 722 */ 723 static int need_write_all(struct ubifs_info *c) 724 { 725 long long free = 0; 726 int i; 727 728 for (i = 0; i < c->lpt_lebs; i++) { 729 if (i + c->lpt_first == c->nhead_lnum) 730 free += c->leb_size - c->nhead_offs; 731 else if (c->ltab[i].free == c->leb_size) 732 free += c->leb_size; 733 else if (c->ltab[i].free + c->ltab[i].dirty == c->leb_size) 734 free += c->leb_size; 735 } 736 /* Less than twice the size left */ 737 if (free <= c->lpt_sz * 2) 738 return 1; 739 return 0; 740 } 741 742 /** 743 * lpt_tgc_start - start trivial garbage collection of LPT LEBs. 744 * @c: UBIFS file-system description object 745 * 746 * LPT trivial garbage collection is where a LPT LEB contains only dirty and 747 * free space and so may be reused as soon as the next commit is completed. 748 * This function is called during start commit to mark LPT LEBs for trivial GC. 749 */ 750 static void lpt_tgc_start(struct ubifs_info *c) 751 { 752 int i; 753 754 for (i = 0; i < c->lpt_lebs; i++) { 755 if (i + c->lpt_first == c->nhead_lnum) 756 continue; 757 if (c->ltab[i].dirty > 0 && 758 c->ltab[i].free + c->ltab[i].dirty == c->leb_size) { 759 c->ltab[i].tgc = 1; 760 c->ltab[i].free = c->leb_size; 761 c->ltab[i].dirty = 0; 762 dbg_lp("LEB %d", i + c->lpt_first); 763 } 764 } 765 } 766 767 /** 768 * lpt_tgc_end - end trivial garbage collection of LPT LEBs. 769 * @c: UBIFS file-system description object 770 * 771 * LPT trivial garbage collection is where a LPT LEB contains only dirty and 772 * free space and so may be reused as soon as the next commit is completed. 773 * This function is called after the commit is completed (master node has been 774 * written) and un-maps LPT LEBs that were marked for trivial GC. 775 */ 776 static int lpt_tgc_end(struct ubifs_info *c) 777 { 778 int i, err; 779 780 for (i = 0; i < c->lpt_lebs; i++) 781 if (c->ltab[i].tgc) { 782 err = ubifs_leb_unmap(c, i + c->lpt_first); 783 if (err) 784 return err; 785 c->ltab[i].tgc = 0; 786 dbg_lp("LEB %d", i + c->lpt_first); 787 } 788 return 0; 789 } 790 791 /** 792 * populate_lsave - fill the lsave array with important LEB numbers. 793 * @c: the UBIFS file-system description object 794 * 795 * This function is only called for the "big" model. It records a small number 796 * of LEB numbers of important LEBs. Important LEBs are ones that are (from 797 * most important to least important): empty, freeable, freeable index, dirty 798 * index, dirty or free. Upon mount, we read this list of LEB numbers and bring 799 * their pnodes into memory. That will stop us from having to scan the LPT 800 * straight away. For the "small" model we assume that scanning the LPT is no 801 * big deal. 802 */ 803 static void populate_lsave(struct ubifs_info *c) 804 { 805 struct ubifs_lprops *lprops; 806 struct ubifs_lpt_heap *heap; 807 int i, cnt = 0; 808 809 ubifs_assert(c->big_lpt); 810 if (!(c->lpt_drty_flgs & LSAVE_DIRTY)) { 811 c->lpt_drty_flgs |= LSAVE_DIRTY; 812 ubifs_add_lpt_dirt(c, c->lsave_lnum, c->lsave_sz); 813 } 814 815 #ifndef __UBOOT__ 816 if (dbg_populate_lsave(c)) 817 return; 818 #endif 819 820 list_for_each_entry(lprops, &c->empty_list, list) { 821 c->lsave[cnt++] = lprops->lnum; 822 if (cnt >= c->lsave_cnt) 823 return; 824 } 825 list_for_each_entry(lprops, &c->freeable_list, list) { 826 c->lsave[cnt++] = lprops->lnum; 827 if (cnt >= c->lsave_cnt) 828 return; 829 } 830 list_for_each_entry(lprops, &c->frdi_idx_list, list) { 831 c->lsave[cnt++] = lprops->lnum; 832 if (cnt >= c->lsave_cnt) 833 return; 834 } 835 heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1]; 836 for (i = 0; i < heap->cnt; i++) { 837 c->lsave[cnt++] = heap->arr[i]->lnum; 838 if (cnt >= c->lsave_cnt) 839 return; 840 } 841 heap = &c->lpt_heap[LPROPS_DIRTY - 1]; 842 for (i = 0; i < heap->cnt; i++) { 843 c->lsave[cnt++] = heap->arr[i]->lnum; 844 if (cnt >= c->lsave_cnt) 845 return; 846 } 847 heap = &c->lpt_heap[LPROPS_FREE - 1]; 848 for (i = 0; i < heap->cnt; i++) { 849 c->lsave[cnt++] = heap->arr[i]->lnum; 850 if (cnt >= c->lsave_cnt) 851 return; 852 } 853 /* Fill it up completely */ 854 while (cnt < c->lsave_cnt) 855 c->lsave[cnt++] = c->main_first; 856 } 857 858 /** 859 * nnode_lookup - lookup a nnode in the LPT. 860 * @c: UBIFS file-system description object 861 * @i: nnode number 862 * 863 * This function returns a pointer to the nnode on success or a negative 864 * error code on failure. 865 */ 866 static struct ubifs_nnode *nnode_lookup(struct ubifs_info *c, int i) 867 { 868 int err, iip; 869 struct ubifs_nnode *nnode; 870 871 if (!c->nroot) { 872 err = ubifs_read_nnode(c, NULL, 0); 873 if (err) 874 return ERR_PTR(err); 875 } 876 nnode = c->nroot; 877 while (1) { 878 iip = i & (UBIFS_LPT_FANOUT - 1); 879 i >>= UBIFS_LPT_FANOUT_SHIFT; 880 if (!i) 881 break; 882 nnode = ubifs_get_nnode(c, nnode, iip); 883 if (IS_ERR(nnode)) 884 return nnode; 885 } 886 return nnode; 887 } 888 889 /** 890 * make_nnode_dirty - find a nnode and, if found, make it dirty. 891 * @c: UBIFS file-system description object 892 * @node_num: nnode number of nnode to make dirty 893 * @lnum: LEB number where nnode was written 894 * @offs: offset where nnode was written 895 * 896 * This function is used by LPT garbage collection. LPT garbage collection is 897 * used only for the "big" LPT model (c->big_lpt == 1). Garbage collection 898 * simply involves marking all the nodes in the LEB being garbage-collected as 899 * dirty. The dirty nodes are written next commit, after which the LEB is free 900 * to be reused. 901 * 902 * This function returns %0 on success and a negative error code on failure. 903 */ 904 static int make_nnode_dirty(struct ubifs_info *c, int node_num, int lnum, 905 int offs) 906 { 907 struct ubifs_nnode *nnode; 908 909 nnode = nnode_lookup(c, node_num); 910 if (IS_ERR(nnode)) 911 return PTR_ERR(nnode); 912 if (nnode->parent) { 913 struct ubifs_nbranch *branch; 914 915 branch = &nnode->parent->nbranch[nnode->iip]; 916 if (branch->lnum != lnum || branch->offs != offs) 917 return 0; /* nnode is obsolete */ 918 } else if (c->lpt_lnum != lnum || c->lpt_offs != offs) 919 return 0; /* nnode is obsolete */ 920 /* Assumes cnext list is empty i.e. not called during commit */ 921 if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) { 922 c->dirty_nn_cnt += 1; 923 ubifs_add_nnode_dirt(c, nnode); 924 /* Mark parent and ancestors dirty too */ 925 nnode = nnode->parent; 926 while (nnode) { 927 if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) { 928 c->dirty_nn_cnt += 1; 929 ubifs_add_nnode_dirt(c, nnode); 930 nnode = nnode->parent; 931 } else 932 break; 933 } 934 } 935 return 0; 936 } 937 938 /** 939 * make_pnode_dirty - find a pnode and, if found, make it dirty. 940 * @c: UBIFS file-system description object 941 * @node_num: pnode number of pnode to make dirty 942 * @lnum: LEB number where pnode was written 943 * @offs: offset where pnode was written 944 * 945 * This function is used by LPT garbage collection. LPT garbage collection is 946 * used only for the "big" LPT model (c->big_lpt == 1). Garbage collection 947 * simply involves marking all the nodes in the LEB being garbage-collected as 948 * dirty. The dirty nodes are written next commit, after which the LEB is free 949 * to be reused. 950 * 951 * This function returns %0 on success and a negative error code on failure. 952 */ 953 static int make_pnode_dirty(struct ubifs_info *c, int node_num, int lnum, 954 int offs) 955 { 956 struct ubifs_pnode *pnode; 957 struct ubifs_nbranch *branch; 958 959 pnode = pnode_lookup(c, node_num); 960 if (IS_ERR(pnode)) 961 return PTR_ERR(pnode); 962 branch = &pnode->parent->nbranch[pnode->iip]; 963 if (branch->lnum != lnum || branch->offs != offs) 964 return 0; 965 do_make_pnode_dirty(c, pnode); 966 return 0; 967 } 968 969 /** 970 * make_ltab_dirty - make ltab node dirty. 971 * @c: UBIFS file-system description object 972 * @lnum: LEB number where ltab was written 973 * @offs: offset where ltab was written 974 * 975 * This function is used by LPT garbage collection. LPT garbage collection is 976 * used only for the "big" LPT model (c->big_lpt == 1). Garbage collection 977 * simply involves marking all the nodes in the LEB being garbage-collected as 978 * dirty. The dirty nodes are written next commit, after which the LEB is free 979 * to be reused. 980 * 981 * This function returns %0 on success and a negative error code on failure. 982 */ 983 static int make_ltab_dirty(struct ubifs_info *c, int lnum, int offs) 984 { 985 if (lnum != c->ltab_lnum || offs != c->ltab_offs) 986 return 0; /* This ltab node is obsolete */ 987 if (!(c->lpt_drty_flgs & LTAB_DIRTY)) { 988 c->lpt_drty_flgs |= LTAB_DIRTY; 989 ubifs_add_lpt_dirt(c, c->ltab_lnum, c->ltab_sz); 990 } 991 return 0; 992 } 993 994 /** 995 * make_lsave_dirty - make lsave node dirty. 996 * @c: UBIFS file-system description object 997 * @lnum: LEB number where lsave was written 998 * @offs: offset where lsave was written 999 * 1000 * This function is used by LPT garbage collection. LPT garbage collection is 1001 * used only for the "big" LPT model (c->big_lpt == 1). Garbage collection 1002 * simply involves marking all the nodes in the LEB being garbage-collected as 1003 * dirty. The dirty nodes are written next commit, after which the LEB is free 1004 * to be reused. 1005 * 1006 * This function returns %0 on success and a negative error code on failure. 1007 */ 1008 static int make_lsave_dirty(struct ubifs_info *c, int lnum, int offs) 1009 { 1010 if (lnum != c->lsave_lnum || offs != c->lsave_offs) 1011 return 0; /* This lsave node is obsolete */ 1012 if (!(c->lpt_drty_flgs & LSAVE_DIRTY)) { 1013 c->lpt_drty_flgs |= LSAVE_DIRTY; 1014 ubifs_add_lpt_dirt(c, c->lsave_lnum, c->lsave_sz); 1015 } 1016 return 0; 1017 } 1018 1019 /** 1020 * make_node_dirty - make node dirty. 1021 * @c: UBIFS file-system description object 1022 * @node_type: LPT node type 1023 * @node_num: node number 1024 * @lnum: LEB number where node was written 1025 * @offs: offset where node was written 1026 * 1027 * This function is used by LPT garbage collection. LPT garbage collection is 1028 * used only for the "big" LPT model (c->big_lpt == 1). Garbage collection 1029 * simply involves marking all the nodes in the LEB being garbage-collected as 1030 * dirty. The dirty nodes are written next commit, after which the LEB is free 1031 * to be reused. 1032 * 1033 * This function returns %0 on success and a negative error code on failure. 1034 */ 1035 static int make_node_dirty(struct ubifs_info *c, int node_type, int node_num, 1036 int lnum, int offs) 1037 { 1038 switch (node_type) { 1039 case UBIFS_LPT_NNODE: 1040 return make_nnode_dirty(c, node_num, lnum, offs); 1041 case UBIFS_LPT_PNODE: 1042 return make_pnode_dirty(c, node_num, lnum, offs); 1043 case UBIFS_LPT_LTAB: 1044 return make_ltab_dirty(c, lnum, offs); 1045 case UBIFS_LPT_LSAVE: 1046 return make_lsave_dirty(c, lnum, offs); 1047 } 1048 return -EINVAL; 1049 } 1050 1051 /** 1052 * get_lpt_node_len - return the length of a node based on its type. 1053 * @c: UBIFS file-system description object 1054 * @node_type: LPT node type 1055 */ 1056 static int get_lpt_node_len(const struct ubifs_info *c, int node_type) 1057 { 1058 switch (node_type) { 1059 case UBIFS_LPT_NNODE: 1060 return c->nnode_sz; 1061 case UBIFS_LPT_PNODE: 1062 return c->pnode_sz; 1063 case UBIFS_LPT_LTAB: 1064 return c->ltab_sz; 1065 case UBIFS_LPT_LSAVE: 1066 return c->lsave_sz; 1067 } 1068 return 0; 1069 } 1070 1071 /** 1072 * get_pad_len - return the length of padding in a buffer. 1073 * @c: UBIFS file-system description object 1074 * @buf: buffer 1075 * @len: length of buffer 1076 */ 1077 static int get_pad_len(const struct ubifs_info *c, uint8_t *buf, int len) 1078 { 1079 int offs, pad_len; 1080 1081 if (c->min_io_size == 1) 1082 return 0; 1083 offs = c->leb_size - len; 1084 pad_len = ALIGN(offs, c->min_io_size) - offs; 1085 return pad_len; 1086 } 1087 1088 /** 1089 * get_lpt_node_type - return type (and node number) of a node in a buffer. 1090 * @c: UBIFS file-system description object 1091 * @buf: buffer 1092 * @node_num: node number is returned here 1093 */ 1094 static int get_lpt_node_type(const struct ubifs_info *c, uint8_t *buf, 1095 int *node_num) 1096 { 1097 uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; 1098 int pos = 0, node_type; 1099 1100 node_type = ubifs_unpack_bits(&addr, &pos, UBIFS_LPT_TYPE_BITS); 1101 *node_num = ubifs_unpack_bits(&addr, &pos, c->pcnt_bits); 1102 return node_type; 1103 } 1104 1105 /** 1106 * is_a_node - determine if a buffer contains a node. 1107 * @c: UBIFS file-system description object 1108 * @buf: buffer 1109 * @len: length of buffer 1110 * 1111 * This function returns %1 if the buffer contains a node or %0 if it does not. 1112 */ 1113 static int is_a_node(const struct ubifs_info *c, uint8_t *buf, int len) 1114 { 1115 uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; 1116 int pos = 0, node_type, node_len; 1117 uint16_t crc, calc_crc; 1118 1119 if (len < UBIFS_LPT_CRC_BYTES + (UBIFS_LPT_TYPE_BITS + 7) / 8) 1120 return 0; 1121 node_type = ubifs_unpack_bits(&addr, &pos, UBIFS_LPT_TYPE_BITS); 1122 if (node_type == UBIFS_LPT_NOT_A_NODE) 1123 return 0; 1124 node_len = get_lpt_node_len(c, node_type); 1125 if (!node_len || node_len > len) 1126 return 0; 1127 pos = 0; 1128 addr = buf; 1129 crc = ubifs_unpack_bits(&addr, &pos, UBIFS_LPT_CRC_BITS); 1130 calc_crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES, 1131 node_len - UBIFS_LPT_CRC_BYTES); 1132 if (crc != calc_crc) 1133 return 0; 1134 return 1; 1135 } 1136 1137 /** 1138 * lpt_gc_lnum - garbage collect a LPT LEB. 1139 * @c: UBIFS file-system description object 1140 * @lnum: LEB number to garbage collect 1141 * 1142 * LPT garbage collection is used only for the "big" LPT model 1143 * (c->big_lpt == 1). Garbage collection simply involves marking all the nodes 1144 * in the LEB being garbage-collected as dirty. The dirty nodes are written 1145 * next commit, after which the LEB is free to be reused. 1146 * 1147 * This function returns %0 on success and a negative error code on failure. 1148 */ 1149 static int lpt_gc_lnum(struct ubifs_info *c, int lnum) 1150 { 1151 int err, len = c->leb_size, node_type, node_num, node_len, offs; 1152 void *buf = c->lpt_buf; 1153 1154 dbg_lp("LEB %d", lnum); 1155 1156 err = ubifs_leb_read(c, lnum, buf, 0, c->leb_size, 1); 1157 if (err) 1158 return err; 1159 1160 while (1) { 1161 if (!is_a_node(c, buf, len)) { 1162 int pad_len; 1163 1164 pad_len = get_pad_len(c, buf, len); 1165 if (pad_len) { 1166 buf += pad_len; 1167 len -= pad_len; 1168 continue; 1169 } 1170 return 0; 1171 } 1172 node_type = get_lpt_node_type(c, buf, &node_num); 1173 node_len = get_lpt_node_len(c, node_type); 1174 offs = c->leb_size - len; 1175 ubifs_assert(node_len != 0); 1176 mutex_lock(&c->lp_mutex); 1177 err = make_node_dirty(c, node_type, node_num, lnum, offs); 1178 mutex_unlock(&c->lp_mutex); 1179 if (err) 1180 return err; 1181 buf += node_len; 1182 len -= node_len; 1183 } 1184 return 0; 1185 } 1186 1187 /** 1188 * lpt_gc - LPT garbage collection. 1189 * @c: UBIFS file-system description object 1190 * 1191 * Select a LPT LEB for LPT garbage collection and call 'lpt_gc_lnum()'. 1192 * Returns %0 on success and a negative error code on failure. 1193 */ 1194 static int lpt_gc(struct ubifs_info *c) 1195 { 1196 int i, lnum = -1, dirty = 0; 1197 1198 mutex_lock(&c->lp_mutex); 1199 for (i = 0; i < c->lpt_lebs; i++) { 1200 ubifs_assert(!c->ltab[i].tgc); 1201 if (i + c->lpt_first == c->nhead_lnum || 1202 c->ltab[i].free + c->ltab[i].dirty == c->leb_size) 1203 continue; 1204 if (c->ltab[i].dirty > dirty) { 1205 dirty = c->ltab[i].dirty; 1206 lnum = i + c->lpt_first; 1207 } 1208 } 1209 mutex_unlock(&c->lp_mutex); 1210 if (lnum == -1) 1211 return -ENOSPC; 1212 return lpt_gc_lnum(c, lnum); 1213 } 1214 1215 /** 1216 * ubifs_lpt_start_commit - UBIFS commit starts. 1217 * @c: the UBIFS file-system description object 1218 * 1219 * This function has to be called when UBIFS starts the commit operation. 1220 * This function "freezes" all currently dirty LEB properties and does not 1221 * change them anymore. Further changes are saved and tracked separately 1222 * because they are not part of this commit. This function returns zero in case 1223 * of success and a negative error code in case of failure. 1224 */ 1225 int ubifs_lpt_start_commit(struct ubifs_info *c) 1226 { 1227 int err, cnt; 1228 1229 dbg_lp(""); 1230 1231 mutex_lock(&c->lp_mutex); 1232 err = dbg_chk_lpt_free_spc(c); 1233 if (err) 1234 goto out; 1235 err = dbg_check_ltab(c); 1236 if (err) 1237 goto out; 1238 1239 if (c->check_lpt_free) { 1240 /* 1241 * We ensure there is enough free space in 1242 * ubifs_lpt_post_commit() by marking nodes dirty. That 1243 * information is lost when we unmount, so we also need 1244 * to check free space once after mounting also. 1245 */ 1246 c->check_lpt_free = 0; 1247 while (need_write_all(c)) { 1248 mutex_unlock(&c->lp_mutex); 1249 err = lpt_gc(c); 1250 if (err) 1251 return err; 1252 mutex_lock(&c->lp_mutex); 1253 } 1254 } 1255 1256 lpt_tgc_start(c); 1257 1258 if (!c->dirty_pn_cnt) { 1259 dbg_cmt("no cnodes to commit"); 1260 err = 0; 1261 goto out; 1262 } 1263 1264 if (!c->big_lpt && need_write_all(c)) { 1265 /* If needed, write everything */ 1266 err = make_tree_dirty(c); 1267 if (err) 1268 goto out; 1269 lpt_tgc_start(c); 1270 } 1271 1272 if (c->big_lpt) 1273 populate_lsave(c); 1274 1275 cnt = get_cnodes_to_commit(c); 1276 ubifs_assert(cnt != 0); 1277 1278 err = layout_cnodes(c); 1279 if (err) 1280 goto out; 1281 1282 /* Copy the LPT's own lprops for end commit to write */ 1283 memcpy(c->ltab_cmt, c->ltab, 1284 sizeof(struct ubifs_lpt_lprops) * c->lpt_lebs); 1285 c->lpt_drty_flgs &= ~(LTAB_DIRTY | LSAVE_DIRTY); 1286 1287 out: 1288 mutex_unlock(&c->lp_mutex); 1289 return err; 1290 } 1291 1292 /** 1293 * free_obsolete_cnodes - free obsolete cnodes for commit end. 1294 * @c: UBIFS file-system description object 1295 */ 1296 static void free_obsolete_cnodes(struct ubifs_info *c) 1297 { 1298 struct ubifs_cnode *cnode, *cnext; 1299 1300 cnext = c->lpt_cnext; 1301 if (!cnext) 1302 return; 1303 do { 1304 cnode = cnext; 1305 cnext = cnode->cnext; 1306 if (test_bit(OBSOLETE_CNODE, &cnode->flags)) 1307 kfree(cnode); 1308 else 1309 cnode->cnext = NULL; 1310 } while (cnext != c->lpt_cnext); 1311 c->lpt_cnext = NULL; 1312 } 1313 1314 #ifndef __UBOOT__ 1315 /** 1316 * ubifs_lpt_end_commit - finish the commit operation. 1317 * @c: the UBIFS file-system description object 1318 * 1319 * This function has to be called when the commit operation finishes. It 1320 * flushes the changes which were "frozen" by 'ubifs_lprops_start_commit()' to 1321 * the media. Returns zero in case of success and a negative error code in case 1322 * of failure. 1323 */ 1324 int ubifs_lpt_end_commit(struct ubifs_info *c) 1325 { 1326 int err; 1327 1328 dbg_lp(""); 1329 1330 if (!c->lpt_cnext) 1331 return 0; 1332 1333 err = write_cnodes(c); 1334 if (err) 1335 return err; 1336 1337 mutex_lock(&c->lp_mutex); 1338 free_obsolete_cnodes(c); 1339 mutex_unlock(&c->lp_mutex); 1340 1341 return 0; 1342 } 1343 #endif 1344 1345 /** 1346 * ubifs_lpt_post_commit - post commit LPT trivial GC and LPT GC. 1347 * @c: UBIFS file-system description object 1348 * 1349 * LPT trivial GC is completed after a commit. Also LPT GC is done after a 1350 * commit for the "big" LPT model. 1351 */ 1352 int ubifs_lpt_post_commit(struct ubifs_info *c) 1353 { 1354 int err; 1355 1356 mutex_lock(&c->lp_mutex); 1357 err = lpt_tgc_end(c); 1358 if (err) 1359 goto out; 1360 if (c->big_lpt) 1361 while (need_write_all(c)) { 1362 mutex_unlock(&c->lp_mutex); 1363 err = lpt_gc(c); 1364 if (err) 1365 return err; 1366 mutex_lock(&c->lp_mutex); 1367 } 1368 out: 1369 mutex_unlock(&c->lp_mutex); 1370 return err; 1371 } 1372 1373 /** 1374 * first_nnode - find the first nnode in memory. 1375 * @c: UBIFS file-system description object 1376 * @hght: height of tree where nnode found is returned here 1377 * 1378 * This function returns a pointer to the nnode found or %NULL if no nnode is 1379 * found. This function is a helper to 'ubifs_lpt_free()'. 1380 */ 1381 static struct ubifs_nnode *first_nnode(struct ubifs_info *c, int *hght) 1382 { 1383 struct ubifs_nnode *nnode; 1384 int h, i, found; 1385 1386 nnode = c->nroot; 1387 *hght = 0; 1388 if (!nnode) 1389 return NULL; 1390 for (h = 1; h < c->lpt_hght; h++) { 1391 found = 0; 1392 for (i = 0; i < UBIFS_LPT_FANOUT; i++) { 1393 if (nnode->nbranch[i].nnode) { 1394 found = 1; 1395 nnode = nnode->nbranch[i].nnode; 1396 *hght = h; 1397 break; 1398 } 1399 } 1400 if (!found) 1401 break; 1402 } 1403 return nnode; 1404 } 1405 1406 /** 1407 * next_nnode - find the next nnode in memory. 1408 * @c: UBIFS file-system description object 1409 * @nnode: nnode from which to start. 1410 * @hght: height of tree where nnode is, is passed and returned here 1411 * 1412 * This function returns a pointer to the nnode found or %NULL if no nnode is 1413 * found. This function is a helper to 'ubifs_lpt_free()'. 1414 */ 1415 static struct ubifs_nnode *next_nnode(struct ubifs_info *c, 1416 struct ubifs_nnode *nnode, int *hght) 1417 { 1418 struct ubifs_nnode *parent; 1419 int iip, h, i, found; 1420 1421 parent = nnode->parent; 1422 if (!parent) 1423 return NULL; 1424 if (nnode->iip == UBIFS_LPT_FANOUT - 1) { 1425 *hght -= 1; 1426 return parent; 1427 } 1428 for (iip = nnode->iip + 1; iip < UBIFS_LPT_FANOUT; iip++) { 1429 nnode = parent->nbranch[iip].nnode; 1430 if (nnode) 1431 break; 1432 } 1433 if (!nnode) { 1434 *hght -= 1; 1435 return parent; 1436 } 1437 for (h = *hght + 1; h < c->lpt_hght; h++) { 1438 found = 0; 1439 for (i = 0; i < UBIFS_LPT_FANOUT; i++) { 1440 if (nnode->nbranch[i].nnode) { 1441 found = 1; 1442 nnode = nnode->nbranch[i].nnode; 1443 *hght = h; 1444 break; 1445 } 1446 } 1447 if (!found) 1448 break; 1449 } 1450 return nnode; 1451 } 1452 1453 /** 1454 * ubifs_lpt_free - free resources owned by the LPT. 1455 * @c: UBIFS file-system description object 1456 * @wr_only: free only resources used for writing 1457 */ 1458 void ubifs_lpt_free(struct ubifs_info *c, int wr_only) 1459 { 1460 struct ubifs_nnode *nnode; 1461 int i, hght; 1462 1463 /* Free write-only things first */ 1464 1465 free_obsolete_cnodes(c); /* Leftover from a failed commit */ 1466 1467 vfree(c->ltab_cmt); 1468 c->ltab_cmt = NULL; 1469 vfree(c->lpt_buf); 1470 c->lpt_buf = NULL; 1471 kfree(c->lsave); 1472 c->lsave = NULL; 1473 1474 if (wr_only) 1475 return; 1476 1477 /* Now free the rest */ 1478 1479 nnode = first_nnode(c, &hght); 1480 while (nnode) { 1481 for (i = 0; i < UBIFS_LPT_FANOUT; i++) 1482 kfree(nnode->nbranch[i].nnode); 1483 nnode = next_nnode(c, nnode, &hght); 1484 } 1485 for (i = 0; i < LPROPS_HEAP_CNT; i++) 1486 kfree(c->lpt_heap[i].arr); 1487 kfree(c->dirty_idx.arr); 1488 kfree(c->nroot); 1489 vfree(c->ltab); 1490 kfree(c->lpt_nod_buf); 1491 } 1492 1493 #ifndef __UBOOT__ 1494 /* 1495 * Everything below is related to debugging. 1496 */ 1497 1498 /** 1499 * dbg_is_all_ff - determine if a buffer contains only 0xFF bytes. 1500 * @buf: buffer 1501 * @len: buffer length 1502 */ 1503 static int dbg_is_all_ff(uint8_t *buf, int len) 1504 { 1505 int i; 1506 1507 for (i = 0; i < len; i++) 1508 if (buf[i] != 0xff) 1509 return 0; 1510 return 1; 1511 } 1512 1513 /** 1514 * dbg_is_nnode_dirty - determine if a nnode is dirty. 1515 * @c: the UBIFS file-system description object 1516 * @lnum: LEB number where nnode was written 1517 * @offs: offset where nnode was written 1518 */ 1519 static int dbg_is_nnode_dirty(struct ubifs_info *c, int lnum, int offs) 1520 { 1521 struct ubifs_nnode *nnode; 1522 int hght; 1523 1524 /* Entire tree is in memory so first_nnode / next_nnode are OK */ 1525 nnode = first_nnode(c, &hght); 1526 for (; nnode; nnode = next_nnode(c, nnode, &hght)) { 1527 struct ubifs_nbranch *branch; 1528 1529 cond_resched(); 1530 if (nnode->parent) { 1531 branch = &nnode->parent->nbranch[nnode->iip]; 1532 if (branch->lnum != lnum || branch->offs != offs) 1533 continue; 1534 if (test_bit(DIRTY_CNODE, &nnode->flags)) 1535 return 1; 1536 return 0; 1537 } else { 1538 if (c->lpt_lnum != lnum || c->lpt_offs != offs) 1539 continue; 1540 if (test_bit(DIRTY_CNODE, &nnode->flags)) 1541 return 1; 1542 return 0; 1543 } 1544 } 1545 return 1; 1546 } 1547 1548 /** 1549 * dbg_is_pnode_dirty - determine if a pnode is dirty. 1550 * @c: the UBIFS file-system description object 1551 * @lnum: LEB number where pnode was written 1552 * @offs: offset where pnode was written 1553 */ 1554 static int dbg_is_pnode_dirty(struct ubifs_info *c, int lnum, int offs) 1555 { 1556 int i, cnt; 1557 1558 cnt = DIV_ROUND_UP(c->main_lebs, UBIFS_LPT_FANOUT); 1559 for (i = 0; i < cnt; i++) { 1560 struct ubifs_pnode *pnode; 1561 struct ubifs_nbranch *branch; 1562 1563 cond_resched(); 1564 pnode = pnode_lookup(c, i); 1565 if (IS_ERR(pnode)) 1566 return PTR_ERR(pnode); 1567 branch = &pnode->parent->nbranch[pnode->iip]; 1568 if (branch->lnum != lnum || branch->offs != offs) 1569 continue; 1570 if (test_bit(DIRTY_CNODE, &pnode->flags)) 1571 return 1; 1572 return 0; 1573 } 1574 return 1; 1575 } 1576 1577 /** 1578 * dbg_is_ltab_dirty - determine if a ltab node is dirty. 1579 * @c: the UBIFS file-system description object 1580 * @lnum: LEB number where ltab node was written 1581 * @offs: offset where ltab node was written 1582 */ 1583 static int dbg_is_ltab_dirty(struct ubifs_info *c, int lnum, int offs) 1584 { 1585 if (lnum != c->ltab_lnum || offs != c->ltab_offs) 1586 return 1; 1587 return (c->lpt_drty_flgs & LTAB_DIRTY) != 0; 1588 } 1589 1590 /** 1591 * dbg_is_lsave_dirty - determine if a lsave node is dirty. 1592 * @c: the UBIFS file-system description object 1593 * @lnum: LEB number where lsave node was written 1594 * @offs: offset where lsave node was written 1595 */ 1596 static int dbg_is_lsave_dirty(struct ubifs_info *c, int lnum, int offs) 1597 { 1598 if (lnum != c->lsave_lnum || offs != c->lsave_offs) 1599 return 1; 1600 return (c->lpt_drty_flgs & LSAVE_DIRTY) != 0; 1601 } 1602 1603 /** 1604 * dbg_is_node_dirty - determine if a node is dirty. 1605 * @c: the UBIFS file-system description object 1606 * @node_type: node type 1607 * @lnum: LEB number where node was written 1608 * @offs: offset where node was written 1609 */ 1610 static int dbg_is_node_dirty(struct ubifs_info *c, int node_type, int lnum, 1611 int offs) 1612 { 1613 switch (node_type) { 1614 case UBIFS_LPT_NNODE: 1615 return dbg_is_nnode_dirty(c, lnum, offs); 1616 case UBIFS_LPT_PNODE: 1617 return dbg_is_pnode_dirty(c, lnum, offs); 1618 case UBIFS_LPT_LTAB: 1619 return dbg_is_ltab_dirty(c, lnum, offs); 1620 case UBIFS_LPT_LSAVE: 1621 return dbg_is_lsave_dirty(c, lnum, offs); 1622 } 1623 return 1; 1624 } 1625 1626 /** 1627 * dbg_check_ltab_lnum - check the ltab for a LPT LEB number. 1628 * @c: the UBIFS file-system description object 1629 * @lnum: LEB number where node was written 1630 * @offs: offset where node was written 1631 * 1632 * This function returns %0 on success and a negative error code on failure. 1633 */ 1634 static int dbg_check_ltab_lnum(struct ubifs_info *c, int lnum) 1635 { 1636 int err, len = c->leb_size, dirty = 0, node_type, node_num, node_len; 1637 int ret; 1638 void *buf, *p; 1639 1640 if (!dbg_is_chk_lprops(c)) 1641 return 0; 1642 1643 buf = p = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL); 1644 if (!buf) { 1645 ubifs_err(c, "cannot allocate memory for ltab checking"); 1646 return 0; 1647 } 1648 1649 dbg_lp("LEB %d", lnum); 1650 1651 err = ubifs_leb_read(c, lnum, buf, 0, c->leb_size, 1); 1652 if (err) 1653 goto out; 1654 1655 while (1) { 1656 if (!is_a_node(c, p, len)) { 1657 int i, pad_len; 1658 1659 pad_len = get_pad_len(c, p, len); 1660 if (pad_len) { 1661 p += pad_len; 1662 len -= pad_len; 1663 dirty += pad_len; 1664 continue; 1665 } 1666 if (!dbg_is_all_ff(p, len)) { 1667 ubifs_err(c, "invalid empty space in LEB %d at %d", 1668 lnum, c->leb_size - len); 1669 err = -EINVAL; 1670 } 1671 i = lnum - c->lpt_first; 1672 if (len != c->ltab[i].free) { 1673 ubifs_err(c, "invalid free space in LEB %d (free %d, expected %d)", 1674 lnum, len, c->ltab[i].free); 1675 err = -EINVAL; 1676 } 1677 if (dirty != c->ltab[i].dirty) { 1678 ubifs_err(c, "invalid dirty space in LEB %d (dirty %d, expected %d)", 1679 lnum, dirty, c->ltab[i].dirty); 1680 err = -EINVAL; 1681 } 1682 goto out; 1683 } 1684 node_type = get_lpt_node_type(c, p, &node_num); 1685 node_len = get_lpt_node_len(c, node_type); 1686 ret = dbg_is_node_dirty(c, node_type, lnum, c->leb_size - len); 1687 if (ret == 1) 1688 dirty += node_len; 1689 p += node_len; 1690 len -= node_len; 1691 } 1692 1693 err = 0; 1694 out: 1695 vfree(buf); 1696 return err; 1697 } 1698 1699 /** 1700 * dbg_check_ltab - check the free and dirty space in the ltab. 1701 * @c: the UBIFS file-system description object 1702 * 1703 * This function returns %0 on success and a negative error code on failure. 1704 */ 1705 int dbg_check_ltab(struct ubifs_info *c) 1706 { 1707 int lnum, err, i, cnt; 1708 1709 if (!dbg_is_chk_lprops(c)) 1710 return 0; 1711 1712 /* Bring the entire tree into memory */ 1713 cnt = DIV_ROUND_UP(c->main_lebs, UBIFS_LPT_FANOUT); 1714 for (i = 0; i < cnt; i++) { 1715 struct ubifs_pnode *pnode; 1716 1717 pnode = pnode_lookup(c, i); 1718 if (IS_ERR(pnode)) 1719 return PTR_ERR(pnode); 1720 cond_resched(); 1721 } 1722 1723 /* Check nodes */ 1724 err = dbg_check_lpt_nodes(c, (struct ubifs_cnode *)c->nroot, 0, 0); 1725 if (err) 1726 return err; 1727 1728 /* Check each LEB */ 1729 for (lnum = c->lpt_first; lnum <= c->lpt_last; lnum++) { 1730 err = dbg_check_ltab_lnum(c, lnum); 1731 if (err) { 1732 ubifs_err(c, "failed at LEB %d", lnum); 1733 return err; 1734 } 1735 } 1736 1737 dbg_lp("succeeded"); 1738 return 0; 1739 } 1740 1741 /** 1742 * dbg_chk_lpt_free_spc - check LPT free space is enough to write entire LPT. 1743 * @c: the UBIFS file-system description object 1744 * 1745 * This function returns %0 on success and a negative error code on failure. 1746 */ 1747 int dbg_chk_lpt_free_spc(struct ubifs_info *c) 1748 { 1749 long long free = 0; 1750 int i; 1751 1752 if (!dbg_is_chk_lprops(c)) 1753 return 0; 1754 1755 for (i = 0; i < c->lpt_lebs; i++) { 1756 if (c->ltab[i].tgc || c->ltab[i].cmt) 1757 continue; 1758 if (i + c->lpt_first == c->nhead_lnum) 1759 free += c->leb_size - c->nhead_offs; 1760 else if (c->ltab[i].free == c->leb_size) 1761 free += c->leb_size; 1762 } 1763 if (free < c->lpt_sz) { 1764 ubifs_err(c, "LPT space error: free %lld lpt_sz %lld", 1765 free, c->lpt_sz); 1766 ubifs_dump_lpt_info(c); 1767 ubifs_dump_lpt_lebs(c); 1768 dump_stack(); 1769 return -EINVAL; 1770 } 1771 return 0; 1772 } 1773 1774 /** 1775 * dbg_chk_lpt_sz - check LPT does not write more than LPT size. 1776 * @c: the UBIFS file-system description object 1777 * @action: what to do 1778 * @len: length written 1779 * 1780 * This function returns %0 on success and a negative error code on failure. 1781 * The @action argument may be one of: 1782 * o %0 - LPT debugging checking starts, initialize debugging variables; 1783 * o %1 - wrote an LPT node, increase LPT size by @len bytes; 1784 * o %2 - switched to a different LEB and wasted @len bytes; 1785 * o %3 - check that we've written the right number of bytes. 1786 * o %4 - wasted @len bytes; 1787 */ 1788 int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len) 1789 { 1790 struct ubifs_debug_info *d = c->dbg; 1791 long long chk_lpt_sz, lpt_sz; 1792 int err = 0; 1793 1794 if (!dbg_is_chk_lprops(c)) 1795 return 0; 1796 1797 switch (action) { 1798 case 0: 1799 d->chk_lpt_sz = 0; 1800 d->chk_lpt_sz2 = 0; 1801 d->chk_lpt_lebs = 0; 1802 d->chk_lpt_wastage = 0; 1803 if (c->dirty_pn_cnt > c->pnode_cnt) { 1804 ubifs_err(c, "dirty pnodes %d exceed max %d", 1805 c->dirty_pn_cnt, c->pnode_cnt); 1806 err = -EINVAL; 1807 } 1808 if (c->dirty_nn_cnt > c->nnode_cnt) { 1809 ubifs_err(c, "dirty nnodes %d exceed max %d", 1810 c->dirty_nn_cnt, c->nnode_cnt); 1811 err = -EINVAL; 1812 } 1813 return err; 1814 case 1: 1815 d->chk_lpt_sz += len; 1816 return 0; 1817 case 2: 1818 d->chk_lpt_sz += len; 1819 d->chk_lpt_wastage += len; 1820 d->chk_lpt_lebs += 1; 1821 return 0; 1822 case 3: 1823 chk_lpt_sz = c->leb_size; 1824 chk_lpt_sz *= d->chk_lpt_lebs; 1825 chk_lpt_sz += len - c->nhead_offs; 1826 if (d->chk_lpt_sz != chk_lpt_sz) { 1827 ubifs_err(c, "LPT wrote %lld but space used was %lld", 1828 d->chk_lpt_sz, chk_lpt_sz); 1829 err = -EINVAL; 1830 } 1831 if (d->chk_lpt_sz > c->lpt_sz) { 1832 ubifs_err(c, "LPT wrote %lld but lpt_sz is %lld", 1833 d->chk_lpt_sz, c->lpt_sz); 1834 err = -EINVAL; 1835 } 1836 if (d->chk_lpt_sz2 && d->chk_lpt_sz != d->chk_lpt_sz2) { 1837 ubifs_err(c, "LPT layout size %lld but wrote %lld", 1838 d->chk_lpt_sz, d->chk_lpt_sz2); 1839 err = -EINVAL; 1840 } 1841 if (d->chk_lpt_sz2 && d->new_nhead_offs != len) { 1842 ubifs_err(c, "LPT new nhead offs: expected %d was %d", 1843 d->new_nhead_offs, len); 1844 err = -EINVAL; 1845 } 1846 lpt_sz = (long long)c->pnode_cnt * c->pnode_sz; 1847 lpt_sz += (long long)c->nnode_cnt * c->nnode_sz; 1848 lpt_sz += c->ltab_sz; 1849 if (c->big_lpt) 1850 lpt_sz += c->lsave_sz; 1851 if (d->chk_lpt_sz - d->chk_lpt_wastage > lpt_sz) { 1852 ubifs_err(c, "LPT chk_lpt_sz %lld + waste %lld exceeds %lld", 1853 d->chk_lpt_sz, d->chk_lpt_wastage, lpt_sz); 1854 err = -EINVAL; 1855 } 1856 if (err) { 1857 ubifs_dump_lpt_info(c); 1858 ubifs_dump_lpt_lebs(c); 1859 dump_stack(); 1860 } 1861 d->chk_lpt_sz2 = d->chk_lpt_sz; 1862 d->chk_lpt_sz = 0; 1863 d->chk_lpt_wastage = 0; 1864 d->chk_lpt_lebs = 0; 1865 d->new_nhead_offs = len; 1866 return err; 1867 case 4: 1868 d->chk_lpt_sz += len; 1869 d->chk_lpt_wastage += len; 1870 return 0; 1871 default: 1872 return -EINVAL; 1873 } 1874 } 1875 1876 /** 1877 * ubifs_dump_lpt_leb - dump an LPT LEB. 1878 * @c: UBIFS file-system description object 1879 * @lnum: LEB number to dump 1880 * 1881 * This function dumps an LEB from LPT area. Nodes in this area are very 1882 * different to nodes in the main area (e.g., they do not have common headers, 1883 * they do not have 8-byte alignments, etc), so we have a separate function to 1884 * dump LPT area LEBs. Note, LPT has to be locked by the caller. 1885 */ 1886 static void dump_lpt_leb(const struct ubifs_info *c, int lnum) 1887 { 1888 int err, len = c->leb_size, node_type, node_num, node_len, offs; 1889 void *buf, *p; 1890 1891 pr_err("(pid %d) start dumping LEB %d\n", current->pid, lnum); 1892 buf = p = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL); 1893 if (!buf) { 1894 ubifs_err(c, "cannot allocate memory to dump LPT"); 1895 return; 1896 } 1897 1898 err = ubifs_leb_read(c, lnum, buf, 0, c->leb_size, 1); 1899 if (err) 1900 goto out; 1901 1902 while (1) { 1903 offs = c->leb_size - len; 1904 if (!is_a_node(c, p, len)) { 1905 int pad_len; 1906 1907 pad_len = get_pad_len(c, p, len); 1908 if (pad_len) { 1909 pr_err("LEB %d:%d, pad %d bytes\n", 1910 lnum, offs, pad_len); 1911 p += pad_len; 1912 len -= pad_len; 1913 continue; 1914 } 1915 if (len) 1916 pr_err("LEB %d:%d, free %d bytes\n", 1917 lnum, offs, len); 1918 break; 1919 } 1920 1921 node_type = get_lpt_node_type(c, p, &node_num); 1922 switch (node_type) { 1923 case UBIFS_LPT_PNODE: 1924 { 1925 node_len = c->pnode_sz; 1926 if (c->big_lpt) 1927 pr_err("LEB %d:%d, pnode num %d\n", 1928 lnum, offs, node_num); 1929 else 1930 pr_err("LEB %d:%d, pnode\n", lnum, offs); 1931 break; 1932 } 1933 case UBIFS_LPT_NNODE: 1934 { 1935 int i; 1936 struct ubifs_nnode nnode; 1937 1938 node_len = c->nnode_sz; 1939 if (c->big_lpt) 1940 pr_err("LEB %d:%d, nnode num %d, ", 1941 lnum, offs, node_num); 1942 else 1943 pr_err("LEB %d:%d, nnode, ", 1944 lnum, offs); 1945 err = ubifs_unpack_nnode(c, p, &nnode); 1946 if (err) { 1947 pr_err("failed to unpack_node, error %d\n", 1948 err); 1949 break; 1950 } 1951 for (i = 0; i < UBIFS_LPT_FANOUT; i++) { 1952 pr_cont("%d:%d", nnode.nbranch[i].lnum, 1953 nnode.nbranch[i].offs); 1954 if (i != UBIFS_LPT_FANOUT - 1) 1955 pr_cont(", "); 1956 } 1957 pr_cont("\n"); 1958 break; 1959 } 1960 case UBIFS_LPT_LTAB: 1961 node_len = c->ltab_sz; 1962 pr_err("LEB %d:%d, ltab\n", lnum, offs); 1963 break; 1964 case UBIFS_LPT_LSAVE: 1965 node_len = c->lsave_sz; 1966 pr_err("LEB %d:%d, lsave len\n", lnum, offs); 1967 break; 1968 default: 1969 ubifs_err(c, "LPT node type %d not recognized", node_type); 1970 goto out; 1971 } 1972 1973 p += node_len; 1974 len -= node_len; 1975 } 1976 1977 pr_err("(pid %d) finish dumping LEB %d\n", current->pid, lnum); 1978 out: 1979 vfree(buf); 1980 return; 1981 } 1982 1983 /** 1984 * ubifs_dump_lpt_lebs - dump LPT lebs. 1985 * @c: UBIFS file-system description object 1986 * 1987 * This function dumps all LPT LEBs. The caller has to make sure the LPT is 1988 * locked. 1989 */ 1990 void ubifs_dump_lpt_lebs(const struct ubifs_info *c) 1991 { 1992 int i; 1993 1994 pr_err("(pid %d) start dumping all LPT LEBs\n", current->pid); 1995 for (i = 0; i < c->lpt_lebs; i++) 1996 dump_lpt_leb(c, i + c->lpt_first); 1997 pr_err("(pid %d) finish dumping all LPT LEBs\n", current->pid); 1998 } 1999 2000 /** 2001 * dbg_populate_lsave - debugging version of 'populate_lsave()' 2002 * @c: UBIFS file-system description object 2003 * 2004 * This is a debugging version for 'populate_lsave()' which populates lsave 2005 * with random LEBs instead of useful LEBs, which is good for test coverage. 2006 * Returns zero if lsave has not been populated (this debugging feature is 2007 * disabled) an non-zero if lsave has been populated. 2008 */ 2009 static int dbg_populate_lsave(struct ubifs_info *c) 2010 { 2011 struct ubifs_lprops *lprops; 2012 struct ubifs_lpt_heap *heap; 2013 int i; 2014 2015 if (!dbg_is_chk_gen(c)) 2016 return 0; 2017 if (prandom_u32() & 3) 2018 return 0; 2019 2020 for (i = 0; i < c->lsave_cnt; i++) 2021 c->lsave[i] = c->main_first; 2022 2023 list_for_each_entry(lprops, &c->empty_list, list) 2024 c->lsave[prandom_u32() % c->lsave_cnt] = lprops->lnum; 2025 list_for_each_entry(lprops, &c->freeable_list, list) 2026 c->lsave[prandom_u32() % c->lsave_cnt] = lprops->lnum; 2027 list_for_each_entry(lprops, &c->frdi_idx_list, list) 2028 c->lsave[prandom_u32() % c->lsave_cnt] = lprops->lnum; 2029 2030 heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1]; 2031 for (i = 0; i < heap->cnt; i++) 2032 c->lsave[prandom_u32() % c->lsave_cnt] = heap->arr[i]->lnum; 2033 heap = &c->lpt_heap[LPROPS_DIRTY - 1]; 2034 for (i = 0; i < heap->cnt; i++) 2035 c->lsave[prandom_u32() % c->lsave_cnt] = heap->arr[i]->lnum; 2036 heap = &c->lpt_heap[LPROPS_FREE - 1]; 2037 for (i = 0; i < heap->cnt; i++) 2038 c->lsave[prandom_u32() % c->lsave_cnt] = heap->arr[i]->lnum; 2039 2040 return 1; 2041 } 2042 #endif 2043