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