.. | .. |
---|
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); |
---|