| .. | .. |
|---|
| 9 | 9 | #include "xfs_format.h" |
|---|
| 10 | 10 | #include "xfs_log_format.h" |
|---|
| 11 | 11 | #include "xfs_trans_resv.h" |
|---|
| 12 | | -#include "xfs_sb.h" |
|---|
| 13 | 12 | #include "xfs_mount.h" |
|---|
| 14 | 13 | #include "xfs_defer.h" |
|---|
| 15 | 14 | #include "xfs_btree.h" |
|---|
| .. | .. |
|---|
| 19 | 18 | #include "xfs_errortag.h" |
|---|
| 20 | 19 | #include "xfs_error.h" |
|---|
| 21 | 20 | #include "xfs_trace.h" |
|---|
| 22 | | -#include "xfs_cksum.h" |
|---|
| 23 | 21 | #include "xfs_trans.h" |
|---|
| 24 | 22 | #include "xfs_bit.h" |
|---|
| 25 | 23 | #include "xfs_refcount.h" |
|---|
| .. | .. |
|---|
| 48 | 46 | xfs_agblock_t bno, |
|---|
| 49 | 47 | int *stat) |
|---|
| 50 | 48 | { |
|---|
| 51 | | - trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, |
|---|
| 49 | + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_ag.agno, bno, |
|---|
| 52 | 50 | XFS_LOOKUP_LE); |
|---|
| 53 | 51 | cur->bc_rec.rc.rc_startblock = bno; |
|---|
| 54 | 52 | cur->bc_rec.rc.rc_blockcount = 0; |
|---|
| .. | .. |
|---|
| 65 | 63 | xfs_agblock_t bno, |
|---|
| 66 | 64 | int *stat) |
|---|
| 67 | 65 | { |
|---|
| 68 | | - trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, |
|---|
| 66 | + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_ag.agno, bno, |
|---|
| 69 | 67 | XFS_LOOKUP_GE); |
|---|
| 70 | 68 | cur->bc_rec.rc.rc_startblock = bno; |
|---|
| 71 | 69 | cur->bc_rec.rc.rc_blockcount = 0; |
|---|
| .. | .. |
|---|
| 82 | 80 | xfs_agblock_t bno, |
|---|
| 83 | 81 | int *stat) |
|---|
| 84 | 82 | { |
|---|
| 85 | | - trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, |
|---|
| 83 | + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_ag.agno, bno, |
|---|
| 86 | 84 | XFS_LOOKUP_LE); |
|---|
| 87 | 85 | cur->bc_rec.rc.rc_startblock = bno; |
|---|
| 88 | 86 | cur->bc_rec.rc.rc_blockcount = 0; |
|---|
| .. | .. |
|---|
| 110 | 108 | int *stat) |
|---|
| 111 | 109 | { |
|---|
| 112 | 110 | struct xfs_mount *mp = cur->bc_mp; |
|---|
| 113 | | - xfs_agnumber_t agno = cur->bc_private.a.agno; |
|---|
| 111 | + xfs_agnumber_t agno = cur->bc_ag.agno; |
|---|
| 114 | 112 | union xfs_btree_rec *rec; |
|---|
| 115 | 113 | int error; |
|---|
| 116 | 114 | xfs_agblock_t realstart; |
|---|
| .. | .. |
|---|
| 121 | 119 | |
|---|
| 122 | 120 | xfs_refcount_btrec_to_irec(rec, irec); |
|---|
| 123 | 121 | |
|---|
| 124 | | - agno = cur->bc_private.a.agno; |
|---|
| 122 | + agno = cur->bc_ag.agno; |
|---|
| 125 | 123 | if (irec->rc_blockcount == 0 || irec->rc_blockcount > MAXREFCEXTLEN) |
|---|
| 126 | 124 | goto out_bad_rec; |
|---|
| 127 | 125 | |
|---|
| .. | .. |
|---|
| 146 | 144 | if (irec->rc_refcount == 0 || irec->rc_refcount > MAXREFCOUNT) |
|---|
| 147 | 145 | goto out_bad_rec; |
|---|
| 148 | 146 | |
|---|
| 149 | | - trace_xfs_refcount_get(cur->bc_mp, cur->bc_private.a.agno, irec); |
|---|
| 147 | + trace_xfs_refcount_get(cur->bc_mp, cur->bc_ag.agno, irec); |
|---|
| 150 | 148 | return 0; |
|---|
| 151 | 149 | |
|---|
| 152 | 150 | out_bad_rec: |
|---|
| .. | .. |
|---|
| 171 | 169 | union xfs_btree_rec rec; |
|---|
| 172 | 170 | int error; |
|---|
| 173 | 171 | |
|---|
| 174 | | - trace_xfs_refcount_update(cur->bc_mp, cur->bc_private.a.agno, irec); |
|---|
| 172 | + trace_xfs_refcount_update(cur->bc_mp, cur->bc_ag.agno, irec); |
|---|
| 175 | 173 | rec.refc.rc_startblock = cpu_to_be32(irec->rc_startblock); |
|---|
| 176 | 174 | rec.refc.rc_blockcount = cpu_to_be32(irec->rc_blockcount); |
|---|
| 177 | 175 | rec.refc.rc_refcount = cpu_to_be32(irec->rc_refcount); |
|---|
| 178 | 176 | error = xfs_btree_update(cur, &rec); |
|---|
| 179 | 177 | if (error) |
|---|
| 180 | 178 | trace_xfs_refcount_update_error(cur->bc_mp, |
|---|
| 181 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 179 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 182 | 180 | return error; |
|---|
| 183 | 181 | } |
|---|
| 184 | 182 | |
|---|
| .. | .. |
|---|
| 195 | 193 | { |
|---|
| 196 | 194 | int error; |
|---|
| 197 | 195 | |
|---|
| 198 | | - trace_xfs_refcount_insert(cur->bc_mp, cur->bc_private.a.agno, irec); |
|---|
| 196 | + trace_xfs_refcount_insert(cur->bc_mp, cur->bc_ag.agno, irec); |
|---|
| 199 | 197 | cur->bc_rec.rc.rc_startblock = irec->rc_startblock; |
|---|
| 200 | 198 | cur->bc_rec.rc.rc_blockcount = irec->rc_blockcount; |
|---|
| 201 | 199 | cur->bc_rec.rc.rc_refcount = irec->rc_refcount; |
|---|
| 202 | 200 | error = xfs_btree_insert(cur, i); |
|---|
| 203 | 201 | if (error) |
|---|
| 204 | 202 | goto out_error; |
|---|
| 205 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); |
|---|
| 203 | + if (XFS_IS_CORRUPT(cur->bc_mp, *i != 1)) { |
|---|
| 204 | + error = -EFSCORRUPTED; |
|---|
| 205 | + goto out_error; |
|---|
| 206 | + } |
|---|
| 206 | 207 | |
|---|
| 207 | 208 | out_error: |
|---|
| 208 | 209 | if (error) |
|---|
| 209 | 210 | trace_xfs_refcount_insert_error(cur->bc_mp, |
|---|
| 210 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 211 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 211 | 212 | return error; |
|---|
| 212 | 213 | } |
|---|
| 213 | 214 | |
|---|
| .. | .. |
|---|
| 229 | 230 | error = xfs_refcount_get_rec(cur, &irec, &found_rec); |
|---|
| 230 | 231 | if (error) |
|---|
| 231 | 232 | goto out_error; |
|---|
| 232 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 233 | | - trace_xfs_refcount_delete(cur->bc_mp, cur->bc_private.a.agno, &irec); |
|---|
| 233 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 234 | + error = -EFSCORRUPTED; |
|---|
| 235 | + goto out_error; |
|---|
| 236 | + } |
|---|
| 237 | + trace_xfs_refcount_delete(cur->bc_mp, cur->bc_ag.agno, &irec); |
|---|
| 234 | 238 | error = xfs_btree_delete(cur, i); |
|---|
| 235 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); |
|---|
| 239 | + if (XFS_IS_CORRUPT(cur->bc_mp, *i != 1)) { |
|---|
| 240 | + error = -EFSCORRUPTED; |
|---|
| 241 | + goto out_error; |
|---|
| 242 | + } |
|---|
| 236 | 243 | if (error) |
|---|
| 237 | 244 | goto out_error; |
|---|
| 238 | 245 | error = xfs_refcount_lookup_ge(cur, irec.rc_startblock, &found_rec); |
|---|
| 239 | 246 | out_error: |
|---|
| 240 | 247 | if (error) |
|---|
| 241 | 248 | trace_xfs_refcount_delete_error(cur->bc_mp, |
|---|
| 242 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 249 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 243 | 250 | return error; |
|---|
| 244 | 251 | } |
|---|
| 245 | 252 | |
|---|
| .. | .. |
|---|
| 351 | 358 | error = xfs_refcount_get_rec(cur, &rcext, &found_rec); |
|---|
| 352 | 359 | if (error) |
|---|
| 353 | 360 | goto out_error; |
|---|
| 354 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 361 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 362 | + error = -EFSCORRUPTED; |
|---|
| 363 | + goto out_error; |
|---|
| 364 | + } |
|---|
| 355 | 365 | if (rcext.rc_startblock == agbno || xfs_refc_next(&rcext) <= agbno) |
|---|
| 356 | 366 | return 0; |
|---|
| 357 | 367 | |
|---|
| 358 | 368 | *shape_changed = true; |
|---|
| 359 | | - trace_xfs_refcount_split_extent(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 369 | + trace_xfs_refcount_split_extent(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 360 | 370 | &rcext, agbno); |
|---|
| 361 | 371 | |
|---|
| 362 | 372 | /* Establish the right extent. */ |
|---|
| .. | .. |
|---|
| 373 | 383 | error = xfs_refcount_insert(cur, &tmp, &found_rec); |
|---|
| 374 | 384 | if (error) |
|---|
| 375 | 385 | goto out_error; |
|---|
| 376 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 386 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 387 | + error = -EFSCORRUPTED; |
|---|
| 388 | + goto out_error; |
|---|
| 389 | + } |
|---|
| 377 | 390 | return error; |
|---|
| 378 | 391 | |
|---|
| 379 | 392 | out_error: |
|---|
| 380 | 393 | trace_xfs_refcount_split_extent_error(cur->bc_mp, |
|---|
| 381 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 394 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 382 | 395 | return error; |
|---|
| 383 | 396 | } |
|---|
| 384 | 397 | |
|---|
| .. | .. |
|---|
| 398 | 411 | int found_rec; |
|---|
| 399 | 412 | |
|---|
| 400 | 413 | trace_xfs_refcount_merge_center_extents(cur->bc_mp, |
|---|
| 401 | | - cur->bc_private.a.agno, left, center, right); |
|---|
| 414 | + cur->bc_ag.agno, left, center, right); |
|---|
| 402 | 415 | |
|---|
| 403 | 416 | /* |
|---|
| 404 | 417 | * Make sure the center and right extents are not in the btree. |
|---|
| .. | .. |
|---|
| 412 | 425 | &found_rec); |
|---|
| 413 | 426 | if (error) |
|---|
| 414 | 427 | goto out_error; |
|---|
| 415 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 428 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 429 | + error = -EFSCORRUPTED; |
|---|
| 430 | + goto out_error; |
|---|
| 431 | + } |
|---|
| 416 | 432 | |
|---|
| 417 | 433 | error = xfs_refcount_delete(cur, &found_rec); |
|---|
| 418 | 434 | if (error) |
|---|
| 419 | 435 | goto out_error; |
|---|
| 420 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 436 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 437 | + error = -EFSCORRUPTED; |
|---|
| 438 | + goto out_error; |
|---|
| 439 | + } |
|---|
| 421 | 440 | |
|---|
| 422 | 441 | if (center->rc_refcount > 1) { |
|---|
| 423 | 442 | error = xfs_refcount_delete(cur, &found_rec); |
|---|
| 424 | 443 | if (error) |
|---|
| 425 | 444 | goto out_error; |
|---|
| 426 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 427 | | - out_error); |
|---|
| 445 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 446 | + error = -EFSCORRUPTED; |
|---|
| 447 | + goto out_error; |
|---|
| 448 | + } |
|---|
| 428 | 449 | } |
|---|
| 429 | 450 | |
|---|
| 430 | 451 | /* Enlarge the left extent. */ |
|---|
| .. | .. |
|---|
| 432 | 453 | &found_rec); |
|---|
| 433 | 454 | if (error) |
|---|
| 434 | 455 | goto out_error; |
|---|
| 435 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 456 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 457 | + error = -EFSCORRUPTED; |
|---|
| 458 | + goto out_error; |
|---|
| 459 | + } |
|---|
| 436 | 460 | |
|---|
| 437 | 461 | left->rc_blockcount = extlen; |
|---|
| 438 | 462 | error = xfs_refcount_update(cur, left); |
|---|
| .. | .. |
|---|
| 444 | 468 | |
|---|
| 445 | 469 | out_error: |
|---|
| 446 | 470 | trace_xfs_refcount_merge_center_extents_error(cur->bc_mp, |
|---|
| 447 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 471 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 448 | 472 | return error; |
|---|
| 449 | 473 | } |
|---|
| 450 | 474 | |
|---|
| .. | .. |
|---|
| 463 | 487 | int found_rec; |
|---|
| 464 | 488 | |
|---|
| 465 | 489 | trace_xfs_refcount_merge_left_extent(cur->bc_mp, |
|---|
| 466 | | - cur->bc_private.a.agno, left, cleft); |
|---|
| 490 | + cur->bc_ag.agno, left, cleft); |
|---|
| 467 | 491 | |
|---|
| 468 | 492 | /* If the extent at agbno (cleft) wasn't synthesized, remove it. */ |
|---|
| 469 | 493 | if (cleft->rc_refcount > 1) { |
|---|
| .. | .. |
|---|
| 471 | 495 | &found_rec); |
|---|
| 472 | 496 | if (error) |
|---|
| 473 | 497 | goto out_error; |
|---|
| 474 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 475 | | - out_error); |
|---|
| 498 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 499 | + error = -EFSCORRUPTED; |
|---|
| 500 | + goto out_error; |
|---|
| 501 | + } |
|---|
| 476 | 502 | |
|---|
| 477 | 503 | error = xfs_refcount_delete(cur, &found_rec); |
|---|
| 478 | 504 | if (error) |
|---|
| 479 | 505 | goto out_error; |
|---|
| 480 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 481 | | - out_error); |
|---|
| 506 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 507 | + error = -EFSCORRUPTED; |
|---|
| 508 | + goto out_error; |
|---|
| 509 | + } |
|---|
| 482 | 510 | } |
|---|
| 483 | 511 | |
|---|
| 484 | 512 | /* Enlarge the left extent. */ |
|---|
| .. | .. |
|---|
| 486 | 514 | &found_rec); |
|---|
| 487 | 515 | if (error) |
|---|
| 488 | 516 | goto out_error; |
|---|
| 489 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 517 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 518 | + error = -EFSCORRUPTED; |
|---|
| 519 | + goto out_error; |
|---|
| 520 | + } |
|---|
| 490 | 521 | |
|---|
| 491 | 522 | left->rc_blockcount += cleft->rc_blockcount; |
|---|
| 492 | 523 | error = xfs_refcount_update(cur, left); |
|---|
| .. | .. |
|---|
| 499 | 530 | |
|---|
| 500 | 531 | out_error: |
|---|
| 501 | 532 | trace_xfs_refcount_merge_left_extent_error(cur->bc_mp, |
|---|
| 502 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 533 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 503 | 534 | return error; |
|---|
| 504 | 535 | } |
|---|
| 505 | 536 | |
|---|
| .. | .. |
|---|
| 517 | 548 | int found_rec; |
|---|
| 518 | 549 | |
|---|
| 519 | 550 | trace_xfs_refcount_merge_right_extent(cur->bc_mp, |
|---|
| 520 | | - cur->bc_private.a.agno, cright, right); |
|---|
| 551 | + cur->bc_ag.agno, cright, right); |
|---|
| 521 | 552 | |
|---|
| 522 | 553 | /* |
|---|
| 523 | 554 | * If the extent ending at agbno+aglen (cright) wasn't synthesized, |
|---|
| .. | .. |
|---|
| 528 | 559 | &found_rec); |
|---|
| 529 | 560 | if (error) |
|---|
| 530 | 561 | goto out_error; |
|---|
| 531 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 532 | | - out_error); |
|---|
| 562 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 563 | + error = -EFSCORRUPTED; |
|---|
| 564 | + goto out_error; |
|---|
| 565 | + } |
|---|
| 533 | 566 | |
|---|
| 534 | 567 | error = xfs_refcount_delete(cur, &found_rec); |
|---|
| 535 | 568 | if (error) |
|---|
| 536 | 569 | goto out_error; |
|---|
| 537 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 538 | | - out_error); |
|---|
| 570 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 571 | + error = -EFSCORRUPTED; |
|---|
| 572 | + goto out_error; |
|---|
| 573 | + } |
|---|
| 539 | 574 | } |
|---|
| 540 | 575 | |
|---|
| 541 | 576 | /* Enlarge the right extent. */ |
|---|
| .. | .. |
|---|
| 543 | 578 | &found_rec); |
|---|
| 544 | 579 | if (error) |
|---|
| 545 | 580 | goto out_error; |
|---|
| 546 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 581 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 582 | + error = -EFSCORRUPTED; |
|---|
| 583 | + goto out_error; |
|---|
| 584 | + } |
|---|
| 547 | 585 | |
|---|
| 548 | 586 | right->rc_startblock -= cright->rc_blockcount; |
|---|
| 549 | 587 | right->rc_blockcount += cright->rc_blockcount; |
|---|
| .. | .. |
|---|
| 556 | 594 | |
|---|
| 557 | 595 | out_error: |
|---|
| 558 | 596 | trace_xfs_refcount_merge_right_extent_error(cur->bc_mp, |
|---|
| 559 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 597 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 560 | 598 | return error; |
|---|
| 561 | 599 | } |
|---|
| 562 | 600 | |
|---|
| .. | .. |
|---|
| 589 | 627 | error = xfs_refcount_get_rec(cur, &tmp, &found_rec); |
|---|
| 590 | 628 | if (error) |
|---|
| 591 | 629 | goto out_error; |
|---|
| 592 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 630 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 631 | + error = -EFSCORRUPTED; |
|---|
| 632 | + goto out_error; |
|---|
| 633 | + } |
|---|
| 593 | 634 | |
|---|
| 594 | 635 | if (xfs_refc_next(&tmp) != agbno) |
|---|
| 595 | 636 | return 0; |
|---|
| .. | .. |
|---|
| 607 | 648 | error = xfs_refcount_get_rec(cur, &tmp, &found_rec); |
|---|
| 608 | 649 | if (error) |
|---|
| 609 | 650 | goto out_error; |
|---|
| 610 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 611 | | - out_error); |
|---|
| 651 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 652 | + error = -EFSCORRUPTED; |
|---|
| 653 | + goto out_error; |
|---|
| 654 | + } |
|---|
| 612 | 655 | |
|---|
| 613 | 656 | /* if tmp starts at the end of our range, just use that */ |
|---|
| 614 | 657 | if (tmp.rc_startblock == agbno) |
|---|
| .. | .. |
|---|
| 636 | 679 | cleft->rc_blockcount = aglen; |
|---|
| 637 | 680 | cleft->rc_refcount = 1; |
|---|
| 638 | 681 | } |
|---|
| 639 | | - trace_xfs_refcount_find_left_extent(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 682 | + trace_xfs_refcount_find_left_extent(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 640 | 683 | left, cleft, agbno); |
|---|
| 641 | 684 | return error; |
|---|
| 642 | 685 | |
|---|
| 643 | 686 | out_error: |
|---|
| 644 | 687 | trace_xfs_refcount_find_left_extent_error(cur->bc_mp, |
|---|
| 645 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 688 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 646 | 689 | return error; |
|---|
| 647 | 690 | } |
|---|
| 648 | 691 | |
|---|
| .. | .. |
|---|
| 673 | 716 | error = xfs_refcount_get_rec(cur, &tmp, &found_rec); |
|---|
| 674 | 717 | if (error) |
|---|
| 675 | 718 | goto out_error; |
|---|
| 676 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); |
|---|
| 719 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 720 | + error = -EFSCORRUPTED; |
|---|
| 721 | + goto out_error; |
|---|
| 722 | + } |
|---|
| 677 | 723 | |
|---|
| 678 | 724 | if (tmp.rc_startblock != agbno + aglen) |
|---|
| 679 | 725 | return 0; |
|---|
| .. | .. |
|---|
| 691 | 737 | error = xfs_refcount_get_rec(cur, &tmp, &found_rec); |
|---|
| 692 | 738 | if (error) |
|---|
| 693 | 739 | goto out_error; |
|---|
| 694 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, |
|---|
| 695 | | - out_error); |
|---|
| 740 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 741 | + error = -EFSCORRUPTED; |
|---|
| 742 | + goto out_error; |
|---|
| 743 | + } |
|---|
| 696 | 744 | |
|---|
| 697 | 745 | /* if tmp ends at the end of our range, just use that */ |
|---|
| 698 | 746 | if (xfs_refc_next(&tmp) == agbno + aglen) |
|---|
| .. | .. |
|---|
| 720 | 768 | cright->rc_blockcount = aglen; |
|---|
| 721 | 769 | cright->rc_refcount = 1; |
|---|
| 722 | 770 | } |
|---|
| 723 | | - trace_xfs_refcount_find_right_extent(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 771 | + trace_xfs_refcount_find_right_extent(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 724 | 772 | cright, right, agbno + aglen); |
|---|
| 725 | 773 | return error; |
|---|
| 726 | 774 | |
|---|
| 727 | 775 | out_error: |
|---|
| 728 | 776 | trace_xfs_refcount_find_right_extent_error(cur->bc_mp, |
|---|
| 729 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 777 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 730 | 778 | return error; |
|---|
| 731 | 779 | } |
|---|
| 732 | 780 | |
|---|
| .. | .. |
|---|
| 835 | 883 | { |
|---|
| 836 | 884 | unsigned long overhead; |
|---|
| 837 | 885 | |
|---|
| 838 | | - overhead = cur->bc_private.a.priv.refc.shape_changes * |
|---|
| 886 | + overhead = cur->bc_ag.refc.shape_changes * |
|---|
| 839 | 887 | xfs_allocfree_log_count(cur->bc_mp, 1); |
|---|
| 840 | 888 | overhead *= cur->bc_mp->m_sb.sb_blocksize; |
|---|
| 841 | 889 | |
|---|
| .. | .. |
|---|
| 843 | 891 | * Only allow 2 refcount extent updates per transaction if the |
|---|
| 844 | 892 | * refcount continue update "error" has been injected. |
|---|
| 845 | 893 | */ |
|---|
| 846 | | - if (cur->bc_private.a.priv.refc.nr_ops > 2 && |
|---|
| 894 | + if (cur->bc_ag.refc.nr_ops > 2 && |
|---|
| 847 | 895 | XFS_TEST_ERROR(false, cur->bc_mp, |
|---|
| 848 | 896 | XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE)) |
|---|
| 849 | 897 | return false; |
|---|
| 850 | 898 | |
|---|
| 851 | | - if (cur->bc_private.a.priv.refc.nr_ops == 0) |
|---|
| 899 | + if (cur->bc_ag.refc.nr_ops == 0) |
|---|
| 852 | 900 | return true; |
|---|
| 853 | 901 | else if (overhead > cur->bc_tp->t_log_res) |
|---|
| 854 | 902 | return false; |
|---|
| 855 | 903 | return cur->bc_tp->t_log_res - overhead > |
|---|
| 856 | | - cur->bc_private.a.priv.refc.nr_ops * XFS_REFCOUNT_ITEM_OVERHEAD; |
|---|
| 904 | + cur->bc_ag.refc.nr_ops * XFS_REFCOUNT_ITEM_OVERHEAD; |
|---|
| 857 | 905 | } |
|---|
| 858 | 906 | |
|---|
| 859 | 907 | /* |
|---|
| .. | .. |
|---|
| 904 | 952 | ext.rc_startblock - *agbno); |
|---|
| 905 | 953 | tmp.rc_refcount = 1 + adj; |
|---|
| 906 | 954 | trace_xfs_refcount_modify_extent(cur->bc_mp, |
|---|
| 907 | | - cur->bc_private.a.agno, &tmp); |
|---|
| 955 | + cur->bc_ag.agno, &tmp); |
|---|
| 908 | 956 | |
|---|
| 909 | 957 | /* |
|---|
| 910 | 958 | * Either cover the hole (increment) or |
|---|
| .. | .. |
|---|
| 915 | 963 | &found_tmp); |
|---|
| 916 | 964 | if (error) |
|---|
| 917 | 965 | goto out_error; |
|---|
| 918 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 919 | | - found_tmp == 1, out_error); |
|---|
| 920 | | - cur->bc_private.a.priv.refc.nr_ops++; |
|---|
| 966 | + if (XFS_IS_CORRUPT(cur->bc_mp, |
|---|
| 967 | + found_tmp != 1)) { |
|---|
| 968 | + error = -EFSCORRUPTED; |
|---|
| 969 | + goto out_error; |
|---|
| 970 | + } |
|---|
| 971 | + cur->bc_ag.refc.nr_ops++; |
|---|
| 921 | 972 | } else { |
|---|
| 922 | 973 | fsbno = XFS_AGB_TO_FSB(cur->bc_mp, |
|---|
| 923 | | - cur->bc_private.a.agno, |
|---|
| 974 | + cur->bc_ag.agno, |
|---|
| 924 | 975 | tmp.rc_startblock); |
|---|
| 925 | 976 | xfs_bmap_add_free(cur->bc_tp, fsbno, |
|---|
| 926 | 977 | tmp.rc_blockcount, oinfo); |
|---|
| .. | .. |
|---|
| 947 | 998 | goto skip; |
|---|
| 948 | 999 | ext.rc_refcount += adj; |
|---|
| 949 | 1000 | trace_xfs_refcount_modify_extent(cur->bc_mp, |
|---|
| 950 | | - cur->bc_private.a.agno, &ext); |
|---|
| 1001 | + cur->bc_ag.agno, &ext); |
|---|
| 951 | 1002 | if (ext.rc_refcount > 1) { |
|---|
| 952 | 1003 | error = xfs_refcount_update(cur, &ext); |
|---|
| 953 | 1004 | if (error) |
|---|
| 954 | 1005 | goto out_error; |
|---|
| 955 | | - cur->bc_private.a.priv.refc.nr_ops++; |
|---|
| 1006 | + cur->bc_ag.refc.nr_ops++; |
|---|
| 956 | 1007 | } else if (ext.rc_refcount == 1) { |
|---|
| 957 | 1008 | error = xfs_refcount_delete(cur, &found_rec); |
|---|
| 958 | 1009 | if (error) |
|---|
| 959 | 1010 | goto out_error; |
|---|
| 960 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 961 | | - found_rec == 1, out_error); |
|---|
| 962 | | - cur->bc_private.a.priv.refc.nr_ops++; |
|---|
| 1011 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 1012 | + error = -EFSCORRUPTED; |
|---|
| 1013 | + goto out_error; |
|---|
| 1014 | + } |
|---|
| 1015 | + cur->bc_ag.refc.nr_ops++; |
|---|
| 963 | 1016 | goto advloop; |
|---|
| 964 | 1017 | } else { |
|---|
| 965 | 1018 | fsbno = XFS_AGB_TO_FSB(cur->bc_mp, |
|---|
| 966 | | - cur->bc_private.a.agno, |
|---|
| 1019 | + cur->bc_ag.agno, |
|---|
| 967 | 1020 | ext.rc_startblock); |
|---|
| 968 | 1021 | xfs_bmap_add_free(cur->bc_tp, fsbno, ext.rc_blockcount, |
|---|
| 969 | 1022 | oinfo); |
|---|
| .. | .. |
|---|
| 982 | 1035 | return error; |
|---|
| 983 | 1036 | out_error: |
|---|
| 984 | 1037 | trace_xfs_refcount_modify_extent_error(cur->bc_mp, |
|---|
| 985 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 1038 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 986 | 1039 | return error; |
|---|
| 987 | 1040 | } |
|---|
| 988 | 1041 | |
|---|
| .. | .. |
|---|
| 1004 | 1057 | *new_agbno = agbno; |
|---|
| 1005 | 1058 | *new_aglen = aglen; |
|---|
| 1006 | 1059 | if (adj == XFS_REFCOUNT_ADJUST_INCREASE) |
|---|
| 1007 | | - trace_xfs_refcount_increase(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 1060 | + trace_xfs_refcount_increase(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 1008 | 1061 | agbno, aglen); |
|---|
| 1009 | 1062 | else |
|---|
| 1010 | | - trace_xfs_refcount_decrease(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 1063 | + trace_xfs_refcount_decrease(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 1011 | 1064 | agbno, aglen); |
|---|
| 1012 | 1065 | |
|---|
| 1013 | 1066 | /* |
|---|
| .. | .. |
|---|
| 1035 | 1088 | if (shape_changed) |
|---|
| 1036 | 1089 | shape_changes++; |
|---|
| 1037 | 1090 | if (shape_changes) |
|---|
| 1038 | | - cur->bc_private.a.priv.refc.shape_changes++; |
|---|
| 1091 | + cur->bc_ag.refc.shape_changes++; |
|---|
| 1039 | 1092 | |
|---|
| 1040 | 1093 | /* Now that we've taken care of the ends, adjust the middle extents */ |
|---|
| 1041 | 1094 | error = xfs_refcount_adjust_extents(cur, new_agbno, new_aglen, |
|---|
| .. | .. |
|---|
| 1046 | 1099 | return 0; |
|---|
| 1047 | 1100 | |
|---|
| 1048 | 1101 | out_error: |
|---|
| 1049 | | - trace_xfs_refcount_adjust_error(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 1102 | + trace_xfs_refcount_adjust_error(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 1050 | 1103 | error, _RET_IP_); |
|---|
| 1051 | 1104 | return error; |
|---|
| 1052 | 1105 | } |
|---|
| .. | .. |
|---|
| 1062 | 1115 | |
|---|
| 1063 | 1116 | if (rcur == NULL) |
|---|
| 1064 | 1117 | return; |
|---|
| 1065 | | - agbp = rcur->bc_private.a.agbp; |
|---|
| 1118 | + agbp = rcur->bc_ag.agbp; |
|---|
| 1066 | 1119 | xfs_btree_del_cursor(rcur, error); |
|---|
| 1067 | 1120 | if (error) |
|---|
| 1068 | 1121 | xfs_trans_brelse(tp, agbp); |
|---|
| .. | .. |
|---|
| 1112 | 1165 | * the startblock, get one now. |
|---|
| 1113 | 1166 | */ |
|---|
| 1114 | 1167 | rcur = *pcur; |
|---|
| 1115 | | - if (rcur != NULL && rcur->bc_private.a.agno != agno) { |
|---|
| 1116 | | - nr_ops = rcur->bc_private.a.priv.refc.nr_ops; |
|---|
| 1117 | | - shape_changes = rcur->bc_private.a.priv.refc.shape_changes; |
|---|
| 1168 | + if (rcur != NULL && rcur->bc_ag.agno != agno) { |
|---|
| 1169 | + nr_ops = rcur->bc_ag.refc.nr_ops; |
|---|
| 1170 | + shape_changes = rcur->bc_ag.refc.shape_changes; |
|---|
| 1118 | 1171 | xfs_refcount_finish_one_cleanup(tp, rcur, 0); |
|---|
| 1119 | 1172 | rcur = NULL; |
|---|
| 1120 | 1173 | *pcur = NULL; |
|---|
| .. | .. |
|---|
| 1124 | 1177 | XFS_ALLOC_FLAG_FREEING, &agbp); |
|---|
| 1125 | 1178 | if (error) |
|---|
| 1126 | 1179 | return error; |
|---|
| 1127 | | - if (!agbp) |
|---|
| 1128 | | - return -EFSCORRUPTED; |
|---|
| 1129 | 1180 | |
|---|
| 1130 | 1181 | rcur = xfs_refcountbt_init_cursor(mp, tp, agbp, agno); |
|---|
| 1131 | 1182 | if (!rcur) { |
|---|
| 1132 | 1183 | error = -ENOMEM; |
|---|
| 1133 | 1184 | goto out_cur; |
|---|
| 1134 | 1185 | } |
|---|
| 1135 | | - rcur->bc_private.a.priv.refc.nr_ops = nr_ops; |
|---|
| 1136 | | - rcur->bc_private.a.priv.refc.shape_changes = shape_changes; |
|---|
| 1186 | + rcur->bc_ag.refc.nr_ops = nr_ops; |
|---|
| 1187 | + rcur->bc_ag.refc.shape_changes = shape_changes; |
|---|
| 1137 | 1188 | } |
|---|
| 1138 | 1189 | *pcur = rcur; |
|---|
| 1139 | 1190 | |
|---|
| .. | .. |
|---|
| 1176 | 1227 | /* |
|---|
| 1177 | 1228 | * Record a refcount intent for later processing. |
|---|
| 1178 | 1229 | */ |
|---|
| 1179 | | -static int |
|---|
| 1230 | +static void |
|---|
| 1180 | 1231 | __xfs_refcount_add( |
|---|
| 1181 | 1232 | struct xfs_trans *tp, |
|---|
| 1182 | 1233 | enum xfs_refcount_intent_type type, |
|---|
| .. | .. |
|---|
| 1191 | 1242 | blockcount); |
|---|
| 1192 | 1243 | |
|---|
| 1193 | 1244 | ri = kmem_alloc(sizeof(struct xfs_refcount_intent), |
|---|
| 1194 | | - KM_SLEEP | KM_NOFS); |
|---|
| 1245 | + KM_NOFS); |
|---|
| 1195 | 1246 | INIT_LIST_HEAD(&ri->ri_list); |
|---|
| 1196 | 1247 | ri->ri_type = type; |
|---|
| 1197 | 1248 | ri->ri_startblock = startblock; |
|---|
| 1198 | 1249 | ri->ri_blockcount = blockcount; |
|---|
| 1199 | 1250 | |
|---|
| 1200 | 1251 | xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_REFCOUNT, &ri->ri_list); |
|---|
| 1201 | | - return 0; |
|---|
| 1202 | 1252 | } |
|---|
| 1203 | 1253 | |
|---|
| 1204 | 1254 | /* |
|---|
| 1205 | 1255 | * Increase the reference count of the blocks backing a file's extent. |
|---|
| 1206 | 1256 | */ |
|---|
| 1207 | | -int |
|---|
| 1257 | +void |
|---|
| 1208 | 1258 | xfs_refcount_increase_extent( |
|---|
| 1209 | 1259 | struct xfs_trans *tp, |
|---|
| 1210 | 1260 | struct xfs_bmbt_irec *PREV) |
|---|
| 1211 | 1261 | { |
|---|
| 1212 | 1262 | if (!xfs_sb_version_hasreflink(&tp->t_mountp->m_sb)) |
|---|
| 1213 | | - return 0; |
|---|
| 1263 | + return; |
|---|
| 1214 | 1264 | |
|---|
| 1215 | | - return __xfs_refcount_add(tp, XFS_REFCOUNT_INCREASE, |
|---|
| 1216 | | - PREV->br_startblock, PREV->br_blockcount); |
|---|
| 1265 | + __xfs_refcount_add(tp, XFS_REFCOUNT_INCREASE, PREV->br_startblock, |
|---|
| 1266 | + PREV->br_blockcount); |
|---|
| 1217 | 1267 | } |
|---|
| 1218 | 1268 | |
|---|
| 1219 | 1269 | /* |
|---|
| 1220 | 1270 | * Decrease the reference count of the blocks backing a file's extent. |
|---|
| 1221 | 1271 | */ |
|---|
| 1222 | | -int |
|---|
| 1272 | +void |
|---|
| 1223 | 1273 | xfs_refcount_decrease_extent( |
|---|
| 1224 | 1274 | struct xfs_trans *tp, |
|---|
| 1225 | 1275 | struct xfs_bmbt_irec *PREV) |
|---|
| 1226 | 1276 | { |
|---|
| 1227 | 1277 | if (!xfs_sb_version_hasreflink(&tp->t_mountp->m_sb)) |
|---|
| 1228 | | - return 0; |
|---|
| 1278 | + return; |
|---|
| 1229 | 1279 | |
|---|
| 1230 | | - return __xfs_refcount_add(tp, XFS_REFCOUNT_DECREASE, |
|---|
| 1231 | | - PREV->br_startblock, PREV->br_blockcount); |
|---|
| 1280 | + __xfs_refcount_add(tp, XFS_REFCOUNT_DECREASE, PREV->br_startblock, |
|---|
| 1281 | + PREV->br_blockcount); |
|---|
| 1232 | 1282 | } |
|---|
| 1233 | 1283 | |
|---|
| 1234 | 1284 | /* |
|---|
| .. | .. |
|---|
| 1253 | 1303 | int have; |
|---|
| 1254 | 1304 | int error; |
|---|
| 1255 | 1305 | |
|---|
| 1256 | | - trace_xfs_refcount_find_shared(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 1306 | + trace_xfs_refcount_find_shared(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 1257 | 1307 | agbno, aglen); |
|---|
| 1258 | 1308 | |
|---|
| 1259 | 1309 | /* By default, skip the whole range */ |
|---|
| .. | .. |
|---|
| 1275 | 1325 | error = xfs_refcount_get_rec(cur, &tmp, &i); |
|---|
| 1276 | 1326 | if (error) |
|---|
| 1277 | 1327 | goto out_error; |
|---|
| 1278 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); |
|---|
| 1328 | + if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { |
|---|
| 1329 | + error = -EFSCORRUPTED; |
|---|
| 1330 | + goto out_error; |
|---|
| 1331 | + } |
|---|
| 1279 | 1332 | |
|---|
| 1280 | 1333 | /* If the extent ends before the start, look at the next one */ |
|---|
| 1281 | 1334 | if (tmp.rc_startblock + tmp.rc_blockcount <= agbno) { |
|---|
| .. | .. |
|---|
| 1287 | 1340 | error = xfs_refcount_get_rec(cur, &tmp, &i); |
|---|
| 1288 | 1341 | if (error) |
|---|
| 1289 | 1342 | goto out_error; |
|---|
| 1290 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); |
|---|
| 1343 | + if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { |
|---|
| 1344 | + error = -EFSCORRUPTED; |
|---|
| 1345 | + goto out_error; |
|---|
| 1346 | + } |
|---|
| 1291 | 1347 | } |
|---|
| 1292 | 1348 | |
|---|
| 1293 | 1349 | /* If the extent starts after the range we want, bail out */ |
|---|
| .. | .. |
|---|
| 1315 | 1371 | error = xfs_refcount_get_rec(cur, &tmp, &i); |
|---|
| 1316 | 1372 | if (error) |
|---|
| 1317 | 1373 | goto out_error; |
|---|
| 1318 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); |
|---|
| 1374 | + if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { |
|---|
| 1375 | + error = -EFSCORRUPTED; |
|---|
| 1376 | + goto out_error; |
|---|
| 1377 | + } |
|---|
| 1319 | 1378 | if (tmp.rc_startblock >= agbno + aglen || |
|---|
| 1320 | 1379 | tmp.rc_startblock != *fbno + *flen) |
|---|
| 1321 | 1380 | break; |
|---|
| .. | .. |
|---|
| 1324 | 1383 | |
|---|
| 1325 | 1384 | done: |
|---|
| 1326 | 1385 | trace_xfs_refcount_find_shared_result(cur->bc_mp, |
|---|
| 1327 | | - cur->bc_private.a.agno, *fbno, *flen); |
|---|
| 1386 | + cur->bc_ag.agno, *fbno, *flen); |
|---|
| 1328 | 1387 | |
|---|
| 1329 | 1388 | out_error: |
|---|
| 1330 | 1389 | if (error) |
|---|
| 1331 | 1390 | trace_xfs_refcount_find_shared_error(cur->bc_mp, |
|---|
| 1332 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 1391 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 1333 | 1392 | return error; |
|---|
| 1334 | 1393 | } |
|---|
| 1335 | 1394 | |
|---|
| .. | .. |
|---|
| 1416 | 1475 | switch (adj) { |
|---|
| 1417 | 1476 | case XFS_REFCOUNT_ADJUST_COW_ALLOC: |
|---|
| 1418 | 1477 | /* Adding a CoW reservation, there should be nothing here. */ |
|---|
| 1419 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 1420 | | - ext.rc_startblock >= agbno + aglen, out_error); |
|---|
| 1478 | + if (XFS_IS_CORRUPT(cur->bc_mp, |
|---|
| 1479 | + agbno + aglen > ext.rc_startblock)) { |
|---|
| 1480 | + error = -EFSCORRUPTED; |
|---|
| 1481 | + goto out_error; |
|---|
| 1482 | + } |
|---|
| 1421 | 1483 | |
|---|
| 1422 | 1484 | tmp.rc_startblock = agbno; |
|---|
| 1423 | 1485 | tmp.rc_blockcount = aglen; |
|---|
| 1424 | 1486 | tmp.rc_refcount = 1; |
|---|
| 1425 | 1487 | trace_xfs_refcount_modify_extent(cur->bc_mp, |
|---|
| 1426 | | - cur->bc_private.a.agno, &tmp); |
|---|
| 1488 | + cur->bc_ag.agno, &tmp); |
|---|
| 1427 | 1489 | |
|---|
| 1428 | 1490 | error = xfs_refcount_insert(cur, &tmp, |
|---|
| 1429 | 1491 | &found_tmp); |
|---|
| 1430 | 1492 | if (error) |
|---|
| 1431 | 1493 | goto out_error; |
|---|
| 1432 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 1433 | | - found_tmp == 1, out_error); |
|---|
| 1494 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_tmp != 1)) { |
|---|
| 1495 | + error = -EFSCORRUPTED; |
|---|
| 1496 | + goto out_error; |
|---|
| 1497 | + } |
|---|
| 1434 | 1498 | break; |
|---|
| 1435 | 1499 | case XFS_REFCOUNT_ADJUST_COW_FREE: |
|---|
| 1436 | 1500 | /* Removing a CoW reservation, there should be one extent. */ |
|---|
| 1437 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 1438 | | - ext.rc_startblock == agbno, out_error); |
|---|
| 1439 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 1440 | | - ext.rc_blockcount == aglen, out_error); |
|---|
| 1441 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 1442 | | - ext.rc_refcount == 1, out_error); |
|---|
| 1501 | + if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_startblock != agbno)) { |
|---|
| 1502 | + error = -EFSCORRUPTED; |
|---|
| 1503 | + goto out_error; |
|---|
| 1504 | + } |
|---|
| 1505 | + if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount != aglen)) { |
|---|
| 1506 | + error = -EFSCORRUPTED; |
|---|
| 1507 | + goto out_error; |
|---|
| 1508 | + } |
|---|
| 1509 | + if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_refcount != 1)) { |
|---|
| 1510 | + error = -EFSCORRUPTED; |
|---|
| 1511 | + goto out_error; |
|---|
| 1512 | + } |
|---|
| 1443 | 1513 | |
|---|
| 1444 | 1514 | ext.rc_refcount = 0; |
|---|
| 1445 | 1515 | trace_xfs_refcount_modify_extent(cur->bc_mp, |
|---|
| 1446 | | - cur->bc_private.a.agno, &ext); |
|---|
| 1516 | + cur->bc_ag.agno, &ext); |
|---|
| 1447 | 1517 | error = xfs_refcount_delete(cur, &found_rec); |
|---|
| 1448 | 1518 | if (error) |
|---|
| 1449 | 1519 | goto out_error; |
|---|
| 1450 | | - XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, |
|---|
| 1451 | | - found_rec == 1, out_error); |
|---|
| 1520 | + if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { |
|---|
| 1521 | + error = -EFSCORRUPTED; |
|---|
| 1522 | + goto out_error; |
|---|
| 1523 | + } |
|---|
| 1452 | 1524 | break; |
|---|
| 1453 | 1525 | default: |
|---|
| 1454 | 1526 | ASSERT(0); |
|---|
| .. | .. |
|---|
| 1457 | 1529 | return error; |
|---|
| 1458 | 1530 | out_error: |
|---|
| 1459 | 1531 | trace_xfs_refcount_modify_extent_error(cur->bc_mp, |
|---|
| 1460 | | - cur->bc_private.a.agno, error, _RET_IP_); |
|---|
| 1532 | + cur->bc_ag.agno, error, _RET_IP_); |
|---|
| 1461 | 1533 | return error; |
|---|
| 1462 | 1534 | } |
|---|
| 1463 | 1535 | |
|---|
| .. | .. |
|---|
| 1503 | 1575 | return 0; |
|---|
| 1504 | 1576 | |
|---|
| 1505 | 1577 | out_error: |
|---|
| 1506 | | - trace_xfs_refcount_adjust_cow_error(cur->bc_mp, cur->bc_private.a.agno, |
|---|
| 1578 | + trace_xfs_refcount_adjust_cow_error(cur->bc_mp, cur->bc_ag.agno, |
|---|
| 1507 | 1579 | error, _RET_IP_); |
|---|
| 1508 | 1580 | return error; |
|---|
| 1509 | 1581 | } |
|---|
| .. | .. |
|---|
| 1517 | 1589 | xfs_agblock_t agbno, |
|---|
| 1518 | 1590 | xfs_extlen_t aglen) |
|---|
| 1519 | 1591 | { |
|---|
| 1520 | | - trace_xfs_refcount_cow_increase(rcur->bc_mp, rcur->bc_private.a.agno, |
|---|
| 1592 | + trace_xfs_refcount_cow_increase(rcur->bc_mp, rcur->bc_ag.agno, |
|---|
| 1521 | 1593 | agbno, aglen); |
|---|
| 1522 | 1594 | |
|---|
| 1523 | 1595 | /* Add refcount btree reservation */ |
|---|
| .. | .. |
|---|
| 1534 | 1606 | xfs_agblock_t agbno, |
|---|
| 1535 | 1607 | xfs_extlen_t aglen) |
|---|
| 1536 | 1608 | { |
|---|
| 1537 | | - trace_xfs_refcount_cow_decrease(rcur->bc_mp, rcur->bc_private.a.agno, |
|---|
| 1609 | + trace_xfs_refcount_cow_decrease(rcur->bc_mp, rcur->bc_ag.agno, |
|---|
| 1538 | 1610 | agbno, aglen); |
|---|
| 1539 | 1611 | |
|---|
| 1540 | 1612 | /* Remove refcount btree reservation */ |
|---|
| .. | .. |
|---|
| 1543 | 1615 | } |
|---|
| 1544 | 1616 | |
|---|
| 1545 | 1617 | /* Record a CoW staging extent in the refcount btree. */ |
|---|
| 1546 | | -int |
|---|
| 1618 | +void |
|---|
| 1547 | 1619 | xfs_refcount_alloc_cow_extent( |
|---|
| 1548 | 1620 | struct xfs_trans *tp, |
|---|
| 1549 | 1621 | xfs_fsblock_t fsb, |
|---|
| 1550 | 1622 | xfs_extlen_t len) |
|---|
| 1551 | 1623 | { |
|---|
| 1552 | 1624 | struct xfs_mount *mp = tp->t_mountp; |
|---|
| 1553 | | - int error; |
|---|
| 1554 | 1625 | |
|---|
| 1555 | 1626 | if (!xfs_sb_version_hasreflink(&mp->m_sb)) |
|---|
| 1556 | | - return 0; |
|---|
| 1627 | + return; |
|---|
| 1557 | 1628 | |
|---|
| 1558 | | - error = __xfs_refcount_add(tp, XFS_REFCOUNT_ALLOC_COW, fsb, len); |
|---|
| 1559 | | - if (error) |
|---|
| 1560 | | - return error; |
|---|
| 1629 | + __xfs_refcount_add(tp, XFS_REFCOUNT_ALLOC_COW, fsb, len); |
|---|
| 1561 | 1630 | |
|---|
| 1562 | 1631 | /* Add rmap entry */ |
|---|
| 1563 | | - return xfs_rmap_alloc_extent(tp, XFS_FSB_TO_AGNO(mp, fsb), |
|---|
| 1632 | + xfs_rmap_alloc_extent(tp, XFS_FSB_TO_AGNO(mp, fsb), |
|---|
| 1564 | 1633 | XFS_FSB_TO_AGBNO(mp, fsb), len, XFS_RMAP_OWN_COW); |
|---|
| 1565 | 1634 | } |
|---|
| 1566 | 1635 | |
|---|
| 1567 | 1636 | /* Forget a CoW staging event in the refcount btree. */ |
|---|
| 1568 | | -int |
|---|
| 1637 | +void |
|---|
| 1569 | 1638 | xfs_refcount_free_cow_extent( |
|---|
| 1570 | 1639 | struct xfs_trans *tp, |
|---|
| 1571 | 1640 | xfs_fsblock_t fsb, |
|---|
| 1572 | 1641 | xfs_extlen_t len) |
|---|
| 1573 | 1642 | { |
|---|
| 1574 | 1643 | struct xfs_mount *mp = tp->t_mountp; |
|---|
| 1575 | | - int error; |
|---|
| 1576 | 1644 | |
|---|
| 1577 | 1645 | if (!xfs_sb_version_hasreflink(&mp->m_sb)) |
|---|
| 1578 | | - return 0; |
|---|
| 1646 | + return; |
|---|
| 1579 | 1647 | |
|---|
| 1580 | 1648 | /* Remove rmap entry */ |
|---|
| 1581 | | - error = xfs_rmap_free_extent(tp, XFS_FSB_TO_AGNO(mp, fsb), |
|---|
| 1649 | + xfs_rmap_free_extent(tp, XFS_FSB_TO_AGNO(mp, fsb), |
|---|
| 1582 | 1650 | XFS_FSB_TO_AGBNO(mp, fsb), len, XFS_RMAP_OWN_COW); |
|---|
| 1583 | | - if (error) |
|---|
| 1584 | | - return error; |
|---|
| 1585 | | - |
|---|
| 1586 | | - return __xfs_refcount_add(tp, XFS_REFCOUNT_FREE_COW, fsb, len); |
|---|
| 1651 | + __xfs_refcount_add(tp, XFS_REFCOUNT_FREE_COW, fsb, len); |
|---|
| 1587 | 1652 | } |
|---|
| 1588 | 1653 | |
|---|
| 1589 | 1654 | struct xfs_refcount_recovery { |
|---|
| .. | .. |
|---|
| 1594 | 1659 | /* Stuff an extent on the recovery list. */ |
|---|
| 1595 | 1660 | STATIC int |
|---|
| 1596 | 1661 | xfs_refcount_recover_extent( |
|---|
| 1597 | | - struct xfs_btree_cur *cur, |
|---|
| 1662 | + struct xfs_btree_cur *cur, |
|---|
| 1598 | 1663 | union xfs_btree_rec *rec, |
|---|
| 1599 | 1664 | void *priv) |
|---|
| 1600 | 1665 | { |
|---|
| 1601 | 1666 | struct list_head *debris = priv; |
|---|
| 1602 | 1667 | struct xfs_refcount_recovery *rr; |
|---|
| 1603 | 1668 | |
|---|
| 1604 | | - if (be32_to_cpu(rec->refc.rc_refcount) != 1) |
|---|
| 1669 | + if (XFS_IS_CORRUPT(cur->bc_mp, |
|---|
| 1670 | + be32_to_cpu(rec->refc.rc_refcount) != 1)) |
|---|
| 1605 | 1671 | return -EFSCORRUPTED; |
|---|
| 1606 | 1672 | |
|---|
| 1607 | | - rr = kmem_alloc(sizeof(struct xfs_refcount_recovery), KM_SLEEP); |
|---|
| 1673 | + rr = kmem_alloc(sizeof(struct xfs_refcount_recovery), 0); |
|---|
| 1608 | 1674 | xfs_refcount_btrec_to_irec(rec, &rr->rr_rrec); |
|---|
| 1609 | 1675 | list_add_tail(&rr->rr_list, debris); |
|---|
| 1610 | 1676 | |
|---|
| .. | .. |
|---|
| 1650 | 1716 | error = xfs_alloc_read_agf(mp, tp, agno, 0, &agbp); |
|---|
| 1651 | 1717 | if (error) |
|---|
| 1652 | 1718 | goto out_trans; |
|---|
| 1653 | | - if (!agbp) { |
|---|
| 1654 | | - error = -ENOMEM; |
|---|
| 1655 | | - goto out_trans; |
|---|
| 1656 | | - } |
|---|
| 1657 | 1719 | cur = xfs_refcountbt_init_cursor(mp, tp, agbp, agno); |
|---|
| 1658 | 1720 | |
|---|
| 1659 | 1721 | /* Find all the leftover CoW staging extents. */ |
|---|
| .. | .. |
|---|
| 1681 | 1743 | /* Free the orphan record */ |
|---|
| 1682 | 1744 | agbno = rr->rr_rrec.rc_startblock - XFS_REFC_COW_START; |
|---|
| 1683 | 1745 | fsb = XFS_AGB_TO_FSB(mp, agno, agbno); |
|---|
| 1684 | | - error = xfs_refcount_free_cow_extent(tp, fsb, |
|---|
| 1746 | + xfs_refcount_free_cow_extent(tp, fsb, |
|---|
| 1685 | 1747 | rr->rr_rrec.rc_blockcount); |
|---|
| 1686 | | - if (error) |
|---|
| 1687 | | - goto out_trans; |
|---|
| 1688 | 1748 | |
|---|
| 1689 | 1749 | /* Free the block. */ |
|---|
| 1690 | 1750 | xfs_bmap_add_free(tp, fsb, rr->rr_rrec.rc_blockcount, NULL); |
|---|