diff options
Diffstat (limited to 'fs/xfs/xfs_bmap.c')
| -rw-r--r-- | fs/xfs/xfs_bmap.c | 327 |
1 files changed, 42 insertions, 285 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 99587ded043f..23f14e595c18 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -30,13 +30,10 @@ | |||
| 30 | #include "xfs_alloc_btree.h" | 30 | #include "xfs_alloc_btree.h" |
| 31 | #include "xfs_ialloc_btree.h" | 31 | #include "xfs_ialloc_btree.h" |
| 32 | #include "xfs_dir2_sf.h" | 32 | #include "xfs_dir2_sf.h" |
| 33 | #include "xfs_attr_sf.h" | ||
| 34 | #include "xfs_dinode.h" | 33 | #include "xfs_dinode.h" |
| 35 | #include "xfs_inode.h" | 34 | #include "xfs_inode.h" |
| 36 | #include "xfs_btree.h" | 35 | #include "xfs_btree.h" |
| 37 | #include "xfs_dmapi.h" | ||
| 38 | #include "xfs_mount.h" | 36 | #include "xfs_mount.h" |
| 39 | #include "xfs_ialloc.h" | ||
| 40 | #include "xfs_itable.h" | 37 | #include "xfs_itable.h" |
| 41 | #include "xfs_dir2_data.h" | 38 | #include "xfs_dir2_data.h" |
| 42 | #include "xfs_dir2_leaf.h" | 39 | #include "xfs_dir2_leaf.h" |
| @@ -104,7 +101,6 @@ xfs_bmap_add_extent( | |||
| 104 | xfs_fsblock_t *first, /* pointer to firstblock variable */ | 101 | xfs_fsblock_t *first, /* pointer to firstblock variable */ |
| 105 | xfs_bmap_free_t *flist, /* list of extents to be freed */ | 102 | xfs_bmap_free_t *flist, /* list of extents to be freed */ |
| 106 | int *logflagsp, /* inode logging flags */ | 103 | int *logflagsp, /* inode logging flags */ |
| 107 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 108 | int whichfork, /* data or attr fork */ | 104 | int whichfork, /* data or attr fork */ |
| 109 | int rsvd); /* OK to allocate reserved blocks */ | 105 | int rsvd); /* OK to allocate reserved blocks */ |
| 110 | 106 | ||
| @@ -122,7 +118,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 122 | xfs_fsblock_t *first, /* pointer to firstblock variable */ | 118 | xfs_fsblock_t *first, /* pointer to firstblock variable */ |
| 123 | xfs_bmap_free_t *flist, /* list of extents to be freed */ | 119 | xfs_bmap_free_t *flist, /* list of extents to be freed */ |
| 124 | int *logflagsp, /* inode logging flags */ | 120 | int *logflagsp, /* inode logging flags */ |
| 125 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 126 | int rsvd); /* OK to allocate reserved blocks */ | 121 | int rsvd); /* OK to allocate reserved blocks */ |
| 127 | 122 | ||
| 128 | /* | 123 | /* |
| @@ -135,7 +130,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 135 | xfs_extnum_t idx, /* extent number to update/insert */ | 130 | xfs_extnum_t idx, /* extent number to update/insert */ |
| 136 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 131 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 137 | int *logflagsp,/* inode logging flags */ | 132 | int *logflagsp,/* inode logging flags */ |
| 138 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 139 | int rsvd); /* OK to allocate reserved blocks */ | 133 | int rsvd); /* OK to allocate reserved blocks */ |
| 140 | 134 | ||
| 141 | /* | 135 | /* |
| @@ -149,7 +143,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 149 | xfs_btree_cur_t *cur, /* if null, not a btree */ | 143 | xfs_btree_cur_t *cur, /* if null, not a btree */ |
| 150 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 144 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 151 | int *logflagsp, /* inode logging flags */ | 145 | int *logflagsp, /* inode logging flags */ |
| 152 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 153 | int whichfork); /* data or attr fork */ | 146 | int whichfork); /* data or attr fork */ |
| 154 | 147 | ||
| 155 | /* | 148 | /* |
| @@ -162,8 +155,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 162 | xfs_extnum_t idx, /* extent number to update/insert */ | 155 | xfs_extnum_t idx, /* extent number to update/insert */ |
| 163 | xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ | 156 | xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ |
| 164 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 157 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 165 | int *logflagsp, /* inode logging flags */ | 158 | int *logflagsp); /* inode logging flags */ |
| 166 | xfs_extdelta_t *delta); /* Change made to incore extents */ | ||
| 167 | 159 | ||
| 168 | /* | 160 | /* |
| 169 | * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. | 161 | * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. |
| @@ -200,7 +192,6 @@ xfs_bmap_del_extent( | |||
| 200 | xfs_btree_cur_t *cur, /* if null, not a btree */ | 192 | xfs_btree_cur_t *cur, /* if null, not a btree */ |
| 201 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 193 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 202 | int *logflagsp,/* inode logging flags */ | 194 | int *logflagsp,/* inode logging flags */ |
| 203 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 204 | int whichfork, /* data or attr fork */ | 195 | int whichfork, /* data or attr fork */ |
| 205 | int rsvd); /* OK to allocate reserved blocks */ | 196 | int rsvd); /* OK to allocate reserved blocks */ |
| 206 | 197 | ||
| @@ -489,7 +480,6 @@ xfs_bmap_add_extent( | |||
| 489 | xfs_fsblock_t *first, /* pointer to firstblock variable */ | 480 | xfs_fsblock_t *first, /* pointer to firstblock variable */ |
| 490 | xfs_bmap_free_t *flist, /* list of extents to be freed */ | 481 | xfs_bmap_free_t *flist, /* list of extents to be freed */ |
| 491 | int *logflagsp, /* inode logging flags */ | 482 | int *logflagsp, /* inode logging flags */ |
| 492 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 493 | int whichfork, /* data or attr fork */ | 483 | int whichfork, /* data or attr fork */ |
| 494 | int rsvd) /* OK to use reserved data blocks */ | 484 | int rsvd) /* OK to use reserved data blocks */ |
| 495 | { | 485 | { |
| @@ -524,15 +514,6 @@ xfs_bmap_add_extent( | |||
| 524 | logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); | 514 | logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); |
| 525 | } else | 515 | } else |
| 526 | logflags = 0; | 516 | logflags = 0; |
| 527 | /* DELTA: single new extent */ | ||
| 528 | if (delta) { | ||
| 529 | if (delta->xed_startoff > new->br_startoff) | ||
| 530 | delta->xed_startoff = new->br_startoff; | ||
| 531 | if (delta->xed_blockcount < | ||
| 532 | new->br_startoff + new->br_blockcount) | ||
| 533 | delta->xed_blockcount = new->br_startoff + | ||
| 534 | new->br_blockcount; | ||
| 535 | } | ||
| 536 | } | 517 | } |
| 537 | /* | 518 | /* |
| 538 | * Any kind of new delayed allocation goes here. | 519 | * Any kind of new delayed allocation goes here. |
| @@ -542,7 +523,7 @@ xfs_bmap_add_extent( | |||
| 542 | ASSERT((cur->bc_private.b.flags & | 523 | ASSERT((cur->bc_private.b.flags & |
| 543 | XFS_BTCUR_BPRV_WASDEL) == 0); | 524 | XFS_BTCUR_BPRV_WASDEL) == 0); |
| 544 | if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, | 525 | if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, |
| 545 | &logflags, delta, rsvd))) | 526 | &logflags, rsvd))) |
| 546 | goto done; | 527 | goto done; |
| 547 | } | 528 | } |
| 548 | /* | 529 | /* |
| @@ -553,7 +534,7 @@ xfs_bmap_add_extent( | |||
| 553 | ASSERT((cur->bc_private.b.flags & | 534 | ASSERT((cur->bc_private.b.flags & |
| 554 | XFS_BTCUR_BPRV_WASDEL) == 0); | 535 | XFS_BTCUR_BPRV_WASDEL) == 0); |
| 555 | if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, | 536 | if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, |
| 556 | &logflags, delta, whichfork))) | 537 | &logflags, whichfork))) |
| 557 | goto done; | 538 | goto done; |
| 558 | } else { | 539 | } else { |
| 559 | xfs_bmbt_irec_t prev; /* old extent at offset idx */ | 540 | xfs_bmbt_irec_t prev; /* old extent at offset idx */ |
| @@ -578,17 +559,17 @@ xfs_bmap_add_extent( | |||
| 578 | XFS_BTCUR_BPRV_WASDEL); | 559 | XFS_BTCUR_BPRV_WASDEL); |
| 579 | if ((error = xfs_bmap_add_extent_delay_real(ip, | 560 | if ((error = xfs_bmap_add_extent_delay_real(ip, |
| 580 | idx, &cur, new, &da_new, first, flist, | 561 | idx, &cur, new, &da_new, first, flist, |
| 581 | &logflags, delta, rsvd))) | 562 | &logflags, rsvd))) |
| 582 | goto done; | 563 | goto done; |
| 583 | } else if (new->br_state == XFS_EXT_NORM) { | 564 | } else if (new->br_state == XFS_EXT_NORM) { |
| 584 | ASSERT(new->br_state == XFS_EXT_NORM); | 565 | ASSERT(new->br_state == XFS_EXT_NORM); |
| 585 | if ((error = xfs_bmap_add_extent_unwritten_real( | 566 | if ((error = xfs_bmap_add_extent_unwritten_real( |
| 586 | ip, idx, &cur, new, &logflags, delta))) | 567 | ip, idx, &cur, new, &logflags))) |
| 587 | goto done; | 568 | goto done; |
| 588 | } else { | 569 | } else { |
| 589 | ASSERT(new->br_state == XFS_EXT_UNWRITTEN); | 570 | ASSERT(new->br_state == XFS_EXT_UNWRITTEN); |
| 590 | if ((error = xfs_bmap_add_extent_unwritten_real( | 571 | if ((error = xfs_bmap_add_extent_unwritten_real( |
| 591 | ip, idx, &cur, new, &logflags, delta))) | 572 | ip, idx, &cur, new, &logflags))) |
| 592 | goto done; | 573 | goto done; |
| 593 | } | 574 | } |
| 594 | ASSERT(*curp == cur || *curp == NULL); | 575 | ASSERT(*curp == cur || *curp == NULL); |
| @@ -601,7 +582,7 @@ xfs_bmap_add_extent( | |||
| 601 | ASSERT((cur->bc_private.b.flags & | 582 | ASSERT((cur->bc_private.b.flags & |
| 602 | XFS_BTCUR_BPRV_WASDEL) == 0); | 583 | XFS_BTCUR_BPRV_WASDEL) == 0); |
| 603 | if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, | 584 | if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, |
| 604 | new, &logflags, delta, whichfork))) | 585 | new, &logflags, whichfork))) |
| 605 | goto done; | 586 | goto done; |
| 606 | } | 587 | } |
| 607 | } | 588 | } |
| @@ -666,7 +647,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 666 | xfs_fsblock_t *first, /* pointer to firstblock variable */ | 647 | xfs_fsblock_t *first, /* pointer to firstblock variable */ |
| 667 | xfs_bmap_free_t *flist, /* list of extents to be freed */ | 648 | xfs_bmap_free_t *flist, /* list of extents to be freed */ |
| 668 | int *logflagsp, /* inode logging flags */ | 649 | int *logflagsp, /* inode logging flags */ |
| 669 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 670 | int rsvd) /* OK to use reserved data block allocation */ | 650 | int rsvd) /* OK to use reserved data block allocation */ |
| 671 | { | 651 | { |
| 672 | xfs_btree_cur_t *cur; /* btree cursor */ | 652 | xfs_btree_cur_t *cur; /* btree cursor */ |
| @@ -797,11 +777,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 797 | goto done; | 777 | goto done; |
| 798 | } | 778 | } |
| 799 | *dnew = 0; | 779 | *dnew = 0; |
| 800 | /* DELTA: Three in-core extents are replaced by one. */ | ||
| 801 | temp = LEFT.br_startoff; | ||
| 802 | temp2 = LEFT.br_blockcount + | ||
| 803 | PREV.br_blockcount + | ||
| 804 | RIGHT.br_blockcount; | ||
| 805 | break; | 780 | break; |
| 806 | 781 | ||
| 807 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: | 782 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: |
| @@ -832,10 +807,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 832 | goto done; | 807 | goto done; |
| 833 | } | 808 | } |
| 834 | *dnew = 0; | 809 | *dnew = 0; |
| 835 | /* DELTA: Two in-core extents are replaced by one. */ | ||
| 836 | temp = LEFT.br_startoff; | ||
| 837 | temp2 = LEFT.br_blockcount + | ||
| 838 | PREV.br_blockcount; | ||
| 839 | break; | 810 | break; |
| 840 | 811 | ||
| 841 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: | 812 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
| @@ -867,10 +838,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 867 | goto done; | 838 | goto done; |
| 868 | } | 839 | } |
| 869 | *dnew = 0; | 840 | *dnew = 0; |
| 870 | /* DELTA: Two in-core extents are replaced by one. */ | ||
| 871 | temp = PREV.br_startoff; | ||
| 872 | temp2 = PREV.br_blockcount + | ||
| 873 | RIGHT.br_blockcount; | ||
| 874 | break; | 841 | break; |
| 875 | 842 | ||
| 876 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: | 843 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: |
| @@ -900,9 +867,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 900 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 867 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); |
| 901 | } | 868 | } |
| 902 | *dnew = 0; | 869 | *dnew = 0; |
| 903 | /* DELTA: The in-core extent described by new changed type. */ | ||
| 904 | temp = new->br_startoff; | ||
| 905 | temp2 = new->br_blockcount; | ||
| 906 | break; | 870 | break; |
| 907 | 871 | ||
| 908 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: | 872 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: |
| @@ -942,10 +906,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 942 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 906 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
| 943 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); | 907 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
| 944 | *dnew = temp; | 908 | *dnew = temp; |
| 945 | /* DELTA: The boundary between two in-core extents moved. */ | ||
| 946 | temp = LEFT.br_startoff; | ||
| 947 | temp2 = LEFT.br_blockcount + | ||
| 948 | PREV.br_blockcount; | ||
| 949 | break; | 909 | break; |
| 950 | 910 | ||
| 951 | case BMAP_LEFT_FILLING: | 911 | case BMAP_LEFT_FILLING: |
| @@ -990,9 +950,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 990 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 950 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
| 991 | trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); | 951 | trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); |
| 992 | *dnew = temp; | 952 | *dnew = temp; |
| 993 | /* DELTA: One in-core extent is split in two. */ | ||
| 994 | temp = PREV.br_startoff; | ||
| 995 | temp2 = PREV.br_blockcount; | ||
| 996 | break; | 953 | break; |
| 997 | 954 | ||
| 998 | case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: | 955 | case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
| @@ -1031,10 +988,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 1031 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 988 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
| 1032 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); | 989 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
| 1033 | *dnew = temp; | 990 | *dnew = temp; |
| 1034 | /* DELTA: The boundary between two in-core extents moved. */ | ||
| 1035 | temp = PREV.br_startoff; | ||
| 1036 | temp2 = PREV.br_blockcount + | ||
| 1037 | RIGHT.br_blockcount; | ||
| 1038 | break; | 991 | break; |
| 1039 | 992 | ||
| 1040 | case BMAP_RIGHT_FILLING: | 993 | case BMAP_RIGHT_FILLING: |
| @@ -1078,9 +1031,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 1078 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 1031 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
| 1079 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); | 1032 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
| 1080 | *dnew = temp; | 1033 | *dnew = temp; |
| 1081 | /* DELTA: One in-core extent is split in two. */ | ||
| 1082 | temp = PREV.br_startoff; | ||
| 1083 | temp2 = PREV.br_blockcount; | ||
| 1084 | break; | 1034 | break; |
| 1085 | 1035 | ||
| 1086 | case 0: | 1036 | case 0: |
| @@ -1161,9 +1111,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 1161 | nullstartblock((int)temp2)); | 1111 | nullstartblock((int)temp2)); |
| 1162 | trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); | 1112 | trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); |
| 1163 | *dnew = temp + temp2; | 1113 | *dnew = temp + temp2; |
| 1164 | /* DELTA: One in-core extent is split in three. */ | ||
| 1165 | temp = PREV.br_startoff; | ||
| 1166 | temp2 = PREV.br_blockcount; | ||
| 1167 | break; | 1114 | break; |
| 1168 | 1115 | ||
| 1169 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: | 1116 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
| @@ -1179,13 +1126,6 @@ xfs_bmap_add_extent_delay_real( | |||
| 1179 | ASSERT(0); | 1126 | ASSERT(0); |
| 1180 | } | 1127 | } |
| 1181 | *curp = cur; | 1128 | *curp = cur; |
| 1182 | if (delta) { | ||
| 1183 | temp2 += temp; | ||
| 1184 | if (delta->xed_startoff > temp) | ||
| 1185 | delta->xed_startoff = temp; | ||
| 1186 | if (delta->xed_blockcount < temp2) | ||
| 1187 | delta->xed_blockcount = temp2; | ||
| 1188 | } | ||
| 1189 | done: | 1129 | done: |
| 1190 | *logflagsp = rval; | 1130 | *logflagsp = rval; |
| 1191 | return error; | 1131 | return error; |
| @@ -1204,8 +1144,7 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1204 | xfs_extnum_t idx, /* extent number to update/insert */ | 1144 | xfs_extnum_t idx, /* extent number to update/insert */ |
| 1205 | xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ | 1145 | xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ |
| 1206 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 1146 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 1207 | int *logflagsp, /* inode logging flags */ | 1147 | int *logflagsp) /* inode logging flags */ |
| 1208 | xfs_extdelta_t *delta) /* Change made to incore extents */ | ||
| 1209 | { | 1148 | { |
| 1210 | xfs_btree_cur_t *cur; /* btree cursor */ | 1149 | xfs_btree_cur_t *cur; /* btree cursor */ |
| 1211 | xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ | 1150 | xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ |
| @@ -1219,8 +1158,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1219 | /* left is 0, right is 1, prev is 2 */ | 1158 | /* left is 0, right is 1, prev is 2 */ |
| 1220 | int rval=0; /* return value (logging flags) */ | 1159 | int rval=0; /* return value (logging flags) */ |
| 1221 | int state = 0;/* state bits, accessed thru macros */ | 1160 | int state = 0;/* state bits, accessed thru macros */ |
| 1222 | xfs_filblks_t temp=0; | ||
| 1223 | xfs_filblks_t temp2=0; | ||
| 1224 | 1161 | ||
| 1225 | #define LEFT r[0] | 1162 | #define LEFT r[0] |
| 1226 | #define RIGHT r[1] | 1163 | #define RIGHT r[1] |
| @@ -1341,11 +1278,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1341 | RIGHT.br_blockcount, LEFT.br_state))) | 1278 | RIGHT.br_blockcount, LEFT.br_state))) |
| 1342 | goto done; | 1279 | goto done; |
| 1343 | } | 1280 | } |
| 1344 | /* DELTA: Three in-core extents are replaced by one. */ | ||
| 1345 | temp = LEFT.br_startoff; | ||
| 1346 | temp2 = LEFT.br_blockcount + | ||
| 1347 | PREV.br_blockcount + | ||
| 1348 | RIGHT.br_blockcount; | ||
| 1349 | break; | 1281 | break; |
| 1350 | 1282 | ||
| 1351 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: | 1283 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: |
| @@ -1382,10 +1314,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1382 | LEFT.br_state))) | 1314 | LEFT.br_state))) |
| 1383 | goto done; | 1315 | goto done; |
| 1384 | } | 1316 | } |
| 1385 | /* DELTA: Two in-core extents are replaced by one. */ | ||
| 1386 | temp = LEFT.br_startoff; | ||
| 1387 | temp2 = LEFT.br_blockcount + | ||
| 1388 | PREV.br_blockcount; | ||
| 1389 | break; | 1317 | break; |
| 1390 | 1318 | ||
| 1391 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: | 1319 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
| @@ -1422,10 +1350,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1422 | newext))) | 1350 | newext))) |
| 1423 | goto done; | 1351 | goto done; |
| 1424 | } | 1352 | } |
| 1425 | /* DELTA: Two in-core extents are replaced by one. */ | ||
| 1426 | temp = PREV.br_startoff; | ||
| 1427 | temp2 = PREV.br_blockcount + | ||
| 1428 | RIGHT.br_blockcount; | ||
| 1429 | break; | 1353 | break; |
| 1430 | 1354 | ||
| 1431 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: | 1355 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: |
| @@ -1453,9 +1377,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1453 | newext))) | 1377 | newext))) |
| 1454 | goto done; | 1378 | goto done; |
| 1455 | } | 1379 | } |
| 1456 | /* DELTA: The in-core extent described by new changed type. */ | ||
| 1457 | temp = new->br_startoff; | ||
| 1458 | temp2 = new->br_blockcount; | ||
| 1459 | break; | 1380 | break; |
| 1460 | 1381 | ||
| 1461 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: | 1382 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: |
| @@ -1501,10 +1422,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1501 | LEFT.br_state)) | 1422 | LEFT.br_state)) |
| 1502 | goto done; | 1423 | goto done; |
| 1503 | } | 1424 | } |
| 1504 | /* DELTA: The boundary between two in-core extents moved. */ | ||
| 1505 | temp = LEFT.br_startoff; | ||
| 1506 | temp2 = LEFT.br_blockcount + | ||
| 1507 | PREV.br_blockcount; | ||
| 1508 | break; | 1425 | break; |
| 1509 | 1426 | ||
| 1510 | case BMAP_LEFT_FILLING: | 1427 | case BMAP_LEFT_FILLING: |
| @@ -1544,9 +1461,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1544 | goto done; | 1461 | goto done; |
| 1545 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1462 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); |
| 1546 | } | 1463 | } |
| 1547 | /* DELTA: One in-core extent is split in two. */ | ||
| 1548 | temp = PREV.br_startoff; | ||
| 1549 | temp2 = PREV.br_blockcount; | ||
| 1550 | break; | 1464 | break; |
| 1551 | 1465 | ||
| 1552 | case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: | 1466 | case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
| @@ -1587,10 +1501,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1587 | newext))) | 1501 | newext))) |
| 1588 | goto done; | 1502 | goto done; |
| 1589 | } | 1503 | } |
| 1590 | /* DELTA: The boundary between two in-core extents moved. */ | ||
| 1591 | temp = PREV.br_startoff; | ||
| 1592 | temp2 = PREV.br_blockcount + | ||
| 1593 | RIGHT.br_blockcount; | ||
| 1594 | break; | 1504 | break; |
| 1595 | 1505 | ||
| 1596 | case BMAP_RIGHT_FILLING: | 1506 | case BMAP_RIGHT_FILLING: |
| @@ -1630,9 +1540,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1630 | goto done; | 1540 | goto done; |
| 1631 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1541 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); |
| 1632 | } | 1542 | } |
| 1633 | /* DELTA: One in-core extent is split in two. */ | ||
| 1634 | temp = PREV.br_startoff; | ||
| 1635 | temp2 = PREV.br_blockcount; | ||
| 1636 | break; | 1543 | break; |
| 1637 | 1544 | ||
| 1638 | case 0: | 1545 | case 0: |
| @@ -1692,9 +1599,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1692 | goto done; | 1599 | goto done; |
| 1693 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1600 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); |
| 1694 | } | 1601 | } |
| 1695 | /* DELTA: One in-core extent is split in three. */ | ||
| 1696 | temp = PREV.br_startoff; | ||
| 1697 | temp2 = PREV.br_blockcount; | ||
| 1698 | break; | 1602 | break; |
| 1699 | 1603 | ||
| 1700 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: | 1604 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
| @@ -1710,13 +1614,6 @@ xfs_bmap_add_extent_unwritten_real( | |||
| 1710 | ASSERT(0); | 1614 | ASSERT(0); |
| 1711 | } | 1615 | } |
| 1712 | *curp = cur; | 1616 | *curp = cur; |
| 1713 | if (delta) { | ||
| 1714 | temp2 += temp; | ||
| 1715 | if (delta->xed_startoff > temp) | ||
| 1716 | delta->xed_startoff = temp; | ||
| 1717 | if (delta->xed_blockcount < temp2) | ||
| 1718 | delta->xed_blockcount = temp2; | ||
| 1719 | } | ||
| 1720 | done: | 1617 | done: |
| 1721 | *logflagsp = rval; | 1618 | *logflagsp = rval; |
| 1722 | return error; | 1619 | return error; |
| @@ -1736,7 +1633,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1736 | xfs_extnum_t idx, /* extent number to update/insert */ | 1633 | xfs_extnum_t idx, /* extent number to update/insert */ |
| 1737 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 1634 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 1738 | int *logflagsp, /* inode logging flags */ | 1635 | int *logflagsp, /* inode logging flags */ |
| 1739 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 1740 | int rsvd) /* OK to allocate reserved blocks */ | 1636 | int rsvd) /* OK to allocate reserved blocks */ |
| 1741 | { | 1637 | { |
| 1742 | xfs_bmbt_rec_host_t *ep; /* extent record for idx */ | 1638 | xfs_bmbt_rec_host_t *ep; /* extent record for idx */ |
| @@ -1747,7 +1643,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1747 | xfs_bmbt_irec_t right; /* right neighbor extent entry */ | 1643 | xfs_bmbt_irec_t right; /* right neighbor extent entry */ |
| 1748 | int state; /* state bits, accessed thru macros */ | 1644 | int state; /* state bits, accessed thru macros */ |
| 1749 | xfs_filblks_t temp=0; /* temp for indirect calculations */ | 1645 | xfs_filblks_t temp=0; /* temp for indirect calculations */ |
| 1750 | xfs_filblks_t temp2=0; | ||
| 1751 | 1646 | ||
| 1752 | ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); | 1647 | ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); |
| 1753 | ep = xfs_iext_get_ext(ifp, idx); | 1648 | ep = xfs_iext_get_ext(ifp, idx); |
| @@ -1819,9 +1714,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1819 | 1714 | ||
| 1820 | xfs_iext_remove(ip, idx, 1, state); | 1715 | xfs_iext_remove(ip, idx, 1, state); |
| 1821 | ip->i_df.if_lastex = idx - 1; | 1716 | ip->i_df.if_lastex = idx - 1; |
| 1822 | /* DELTA: Two in-core extents were replaced by one. */ | ||
| 1823 | temp2 = temp; | ||
| 1824 | temp = left.br_startoff; | ||
| 1825 | break; | 1717 | break; |
| 1826 | 1718 | ||
| 1827 | case BMAP_LEFT_CONTIG: | 1719 | case BMAP_LEFT_CONTIG: |
| @@ -1841,9 +1733,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1841 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); | 1733 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
| 1842 | 1734 | ||
| 1843 | ip->i_df.if_lastex = idx - 1; | 1735 | ip->i_df.if_lastex = idx - 1; |
| 1844 | /* DELTA: One in-core extent grew into a hole. */ | ||
| 1845 | temp2 = temp; | ||
| 1846 | temp = left.br_startoff; | ||
| 1847 | break; | 1736 | break; |
| 1848 | 1737 | ||
| 1849 | case BMAP_RIGHT_CONTIG: | 1738 | case BMAP_RIGHT_CONTIG: |
| @@ -1862,9 +1751,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1862 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); | 1751 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
| 1863 | 1752 | ||
| 1864 | ip->i_df.if_lastex = idx; | 1753 | ip->i_df.if_lastex = idx; |
| 1865 | /* DELTA: One in-core extent grew into a hole. */ | ||
| 1866 | temp2 = temp; | ||
| 1867 | temp = new->br_startoff; | ||
| 1868 | break; | 1754 | break; |
| 1869 | 1755 | ||
| 1870 | case 0: | 1756 | case 0: |
| @@ -1876,9 +1762,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1876 | oldlen = newlen = 0; | 1762 | oldlen = newlen = 0; |
| 1877 | xfs_iext_insert(ip, idx, 1, new, state); | 1763 | xfs_iext_insert(ip, idx, 1, new, state); |
| 1878 | ip->i_df.if_lastex = idx; | 1764 | ip->i_df.if_lastex = idx; |
| 1879 | /* DELTA: A new in-core extent was added in a hole. */ | ||
| 1880 | temp2 = new->br_blockcount; | ||
| 1881 | temp = new->br_startoff; | ||
| 1882 | break; | 1765 | break; |
| 1883 | } | 1766 | } |
| 1884 | if (oldlen != newlen) { | 1767 | if (oldlen != newlen) { |
| @@ -1889,13 +1772,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1889 | * Nothing to do for disk quota accounting here. | 1772 | * Nothing to do for disk quota accounting here. |
| 1890 | */ | 1773 | */ |
| 1891 | } | 1774 | } |
| 1892 | if (delta) { | ||
| 1893 | temp2 += temp; | ||
| 1894 | if (delta->xed_startoff > temp) | ||
| 1895 | delta->xed_startoff = temp; | ||
| 1896 | if (delta->xed_blockcount < temp2) | ||
| 1897 | delta->xed_blockcount = temp2; | ||
| 1898 | } | ||
| 1899 | *logflagsp = 0; | 1775 | *logflagsp = 0; |
| 1900 | return 0; | 1776 | return 0; |
| 1901 | } | 1777 | } |
| @@ -1911,7 +1787,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 1911 | xfs_btree_cur_t *cur, /* if null, not a btree */ | 1787 | xfs_btree_cur_t *cur, /* if null, not a btree */ |
| 1912 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 1788 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 1913 | int *logflagsp, /* inode logging flags */ | 1789 | int *logflagsp, /* inode logging flags */ |
| 1914 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 1915 | int whichfork) /* data or attr fork */ | 1790 | int whichfork) /* data or attr fork */ |
| 1916 | { | 1791 | { |
| 1917 | xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ | 1792 | xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ |
| @@ -1922,8 +1797,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 1922 | xfs_bmbt_irec_t right; /* right neighbor extent entry */ | 1797 | xfs_bmbt_irec_t right; /* right neighbor extent entry */ |
| 1923 | int rval=0; /* return value (logging flags) */ | 1798 | int rval=0; /* return value (logging flags) */ |
| 1924 | int state; /* state bits, accessed thru macros */ | 1799 | int state; /* state bits, accessed thru macros */ |
| 1925 | xfs_filblks_t temp=0; | ||
| 1926 | xfs_filblks_t temp2=0; | ||
| 1927 | 1800 | ||
| 1928 | ifp = XFS_IFORK_PTR(ip, whichfork); | 1801 | ifp = XFS_IFORK_PTR(ip, whichfork); |
| 1929 | ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); | 1802 | ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); |
| @@ -2020,11 +1893,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 2020 | left.br_state))) | 1893 | left.br_state))) |
| 2021 | goto done; | 1894 | goto done; |
| 2022 | } | 1895 | } |
| 2023 | /* DELTA: Two in-core extents were replaced by one. */ | ||
| 2024 | temp = left.br_startoff; | ||
| 2025 | temp2 = left.br_blockcount + | ||
| 2026 | new->br_blockcount + | ||
| 2027 | right.br_blockcount; | ||
| 2028 | break; | 1896 | break; |
| 2029 | 1897 | ||
| 2030 | case BMAP_LEFT_CONTIG: | 1898 | case BMAP_LEFT_CONTIG: |
| @@ -2056,10 +1924,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 2056 | left.br_state))) | 1924 | left.br_state))) |
| 2057 | goto done; | 1925 | goto done; |
| 2058 | } | 1926 | } |
| 2059 | /* DELTA: One in-core extent grew. */ | ||
| 2060 | temp = left.br_startoff; | ||
| 2061 | temp2 = left.br_blockcount + | ||
| 2062 | new->br_blockcount; | ||
| 2063 | break; | 1927 | break; |
| 2064 | 1928 | ||
| 2065 | case BMAP_RIGHT_CONTIG: | 1929 | case BMAP_RIGHT_CONTIG: |
| @@ -2092,10 +1956,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 2092 | right.br_state))) | 1956 | right.br_state))) |
| 2093 | goto done; | 1957 | goto done; |
| 2094 | } | 1958 | } |
| 2095 | /* DELTA: One in-core extent grew. */ | ||
| 2096 | temp = new->br_startoff; | ||
| 2097 | temp2 = new->br_blockcount + | ||
| 2098 | right.br_blockcount; | ||
| 2099 | break; | 1959 | break; |
| 2100 | 1960 | ||
| 2101 | case 0: | 1961 | case 0: |
| @@ -2123,18 +1983,8 @@ xfs_bmap_add_extent_hole_real( | |||
| 2123 | goto done; | 1983 | goto done; |
| 2124 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); | 1984 | XFS_WANT_CORRUPTED_GOTO(i == 1, done); |
| 2125 | } | 1985 | } |
| 2126 | /* DELTA: A new extent was added in a hole. */ | ||
| 2127 | temp = new->br_startoff; | ||
| 2128 | temp2 = new->br_blockcount; | ||
| 2129 | break; | 1986 | break; |
| 2130 | } | 1987 | } |
| 2131 | if (delta) { | ||
| 2132 | temp2 += temp; | ||
| 2133 | if (delta->xed_startoff > temp) | ||
| 2134 | delta->xed_startoff = temp; | ||
| 2135 | if (delta->xed_blockcount < temp2) | ||
| 2136 | delta->xed_blockcount = temp2; | ||
| 2137 | } | ||
| 2138 | done: | 1988 | done: |
| 2139 | *logflagsp = rval; | 1989 | *logflagsp = rval; |
| 2140 | return error; | 1990 | return error; |
| @@ -2959,7 +2809,6 @@ xfs_bmap_del_extent( | |||
| 2959 | xfs_btree_cur_t *cur, /* if null, not a btree */ | 2809 | xfs_btree_cur_t *cur, /* if null, not a btree */ |
| 2960 | xfs_bmbt_irec_t *del, /* data to remove from extents */ | 2810 | xfs_bmbt_irec_t *del, /* data to remove from extents */ |
| 2961 | int *logflagsp, /* inode logging flags */ | 2811 | int *logflagsp, /* inode logging flags */ |
| 2962 | xfs_extdelta_t *delta, /* Change made to incore extents */ | ||
| 2963 | int whichfork, /* data or attr fork */ | 2812 | int whichfork, /* data or attr fork */ |
| 2964 | int rsvd) /* OK to allocate reserved blocks */ | 2813 | int rsvd) /* OK to allocate reserved blocks */ |
| 2965 | { | 2814 | { |
| @@ -3265,14 +3114,6 @@ xfs_bmap_del_extent( | |||
| 3265 | if (da_old > da_new) | 3114 | if (da_old > da_new) |
| 3266 | xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), | 3115 | xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), |
| 3267 | rsvd); | 3116 | rsvd); |
| 3268 | if (delta) { | ||
| 3269 | /* DELTA: report the original extent. */ | ||
| 3270 | if (delta->xed_startoff > got.br_startoff) | ||
| 3271 | delta->xed_startoff = got.br_startoff; | ||
| 3272 | if (delta->xed_blockcount < got.br_startoff+got.br_blockcount) | ||
| 3273 | delta->xed_blockcount = got.br_startoff + | ||
| 3274 | got.br_blockcount; | ||
| 3275 | } | ||
| 3276 | done: | 3117 | done: |
| 3277 | *logflagsp = flags; | 3118 | *logflagsp = flags; |
| 3278 | return error; | 3119 | return error; |
| @@ -3754,9 +3595,10 @@ xfs_bmap_add_attrfork( | |||
| 3754 | ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; | 3595 | ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; |
| 3755 | } | 3596 | } |
| 3756 | ASSERT(ip->i_d.di_anextents == 0); | 3597 | ASSERT(ip->i_d.di_anextents == 0); |
| 3757 | IHOLD(ip); | 3598 | |
| 3758 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | 3599 | xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); |
| 3759 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 3600 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
| 3601 | |||
| 3760 | switch (ip->i_d.di_format) { | 3602 | switch (ip->i_d.di_format) { |
| 3761 | case XFS_DINODE_FMT_DEV: | 3603 | case XFS_DINODE_FMT_DEV: |
| 3762 | ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; | 3604 | ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; |
| @@ -4483,8 +4325,7 @@ xfs_bmapi( | |||
| 4483 | xfs_extlen_t total, /* total blocks needed */ | 4325 | xfs_extlen_t total, /* total blocks needed */ |
| 4484 | xfs_bmbt_irec_t *mval, /* output: map values */ | 4326 | xfs_bmbt_irec_t *mval, /* output: map values */ |
| 4485 | int *nmap, /* i/o: mval size/count */ | 4327 | int *nmap, /* i/o: mval size/count */ |
| 4486 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ | 4328 | xfs_bmap_free_t *flist) /* i/o: list extents to free */ |
| 4487 | xfs_extdelta_t *delta) /* o: change made to incore extents */ | ||
| 4488 | { | 4329 | { |
| 4489 | xfs_fsblock_t abno; /* allocated block number */ | 4330 | xfs_fsblock_t abno; /* allocated block number */ |
| 4490 | xfs_extlen_t alen; /* allocated extent length */ | 4331 | xfs_extlen_t alen; /* allocated extent length */ |
| @@ -4596,10 +4437,7 @@ xfs_bmapi( | |||
| 4596 | end = bno + len; | 4437 | end = bno + len; |
| 4597 | obno = bno; | 4438 | obno = bno; |
| 4598 | bma.ip = NULL; | 4439 | bma.ip = NULL; |
| 4599 | if (delta) { | 4440 | |
| 4600 | delta->xed_startoff = NULLFILEOFF; | ||
| 4601 | delta->xed_blockcount = 0; | ||
| 4602 | } | ||
| 4603 | while (bno < end && n < *nmap) { | 4441 | while (bno < end && n < *nmap) { |
| 4604 | /* | 4442 | /* |
| 4605 | * Reading past eof, act as though there's a hole | 4443 | * Reading past eof, act as though there's a hole |
| @@ -4620,19 +4458,13 @@ xfs_bmapi( | |||
| 4620 | * allocate the stuff asked for in this bmap call | 4458 | * allocate the stuff asked for in this bmap call |
| 4621 | * but that wouldn't be as good. | 4459 | * but that wouldn't be as good. |
| 4622 | */ | 4460 | */ |
| 4623 | if (wasdelay && !(flags & XFS_BMAPI_EXACT)) { | 4461 | if (wasdelay) { |
| 4624 | alen = (xfs_extlen_t)got.br_blockcount; | 4462 | alen = (xfs_extlen_t)got.br_blockcount; |
| 4625 | aoff = got.br_startoff; | 4463 | aoff = got.br_startoff; |
| 4626 | if (lastx != NULLEXTNUM && lastx) { | 4464 | if (lastx != NULLEXTNUM && lastx) { |
| 4627 | ep = xfs_iext_get_ext(ifp, lastx - 1); | 4465 | ep = xfs_iext_get_ext(ifp, lastx - 1); |
| 4628 | xfs_bmbt_get_all(ep, &prev); | 4466 | xfs_bmbt_get_all(ep, &prev); |
| 4629 | } | 4467 | } |
| 4630 | } else if (wasdelay) { | ||
| 4631 | alen = (xfs_extlen_t) | ||
| 4632 | XFS_FILBLKS_MIN(len, | ||
| 4633 | (got.br_startoff + | ||
| 4634 | got.br_blockcount) - bno); | ||
| 4635 | aoff = bno; | ||
| 4636 | } else { | 4468 | } else { |
| 4637 | alen = (xfs_extlen_t) | 4469 | alen = (xfs_extlen_t) |
| 4638 | XFS_FILBLKS_MIN(len, MAXEXTLEN); | 4470 | XFS_FILBLKS_MIN(len, MAXEXTLEN); |
| @@ -4831,7 +4663,7 @@ xfs_bmapi( | |||
| 4831 | got.br_state = XFS_EXT_UNWRITTEN; | 4663 | got.br_state = XFS_EXT_UNWRITTEN; |
| 4832 | } | 4664 | } |
| 4833 | error = xfs_bmap_add_extent(ip, lastx, &cur, &got, | 4665 | error = xfs_bmap_add_extent(ip, lastx, &cur, &got, |
| 4834 | firstblock, flist, &tmp_logflags, delta, | 4666 | firstblock, flist, &tmp_logflags, |
| 4835 | whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); | 4667 | whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); |
| 4836 | logflags |= tmp_logflags; | 4668 | logflags |= tmp_logflags; |
| 4837 | if (error) | 4669 | if (error) |
| @@ -4927,7 +4759,7 @@ xfs_bmapi( | |||
| 4927 | } | 4759 | } |
| 4928 | mval->br_state = XFS_EXT_NORM; | 4760 | mval->br_state = XFS_EXT_NORM; |
| 4929 | error = xfs_bmap_add_extent(ip, lastx, &cur, mval, | 4761 | error = xfs_bmap_add_extent(ip, lastx, &cur, mval, |
| 4930 | firstblock, flist, &tmp_logflags, delta, | 4762 | firstblock, flist, &tmp_logflags, |
| 4931 | whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); | 4763 | whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); |
| 4932 | logflags |= tmp_logflags; | 4764 | logflags |= tmp_logflags; |
| 4933 | if (error) | 4765 | if (error) |
| @@ -5017,14 +4849,6 @@ xfs_bmapi( | |||
| 5017 | ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || | 4849 | ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || |
| 5018 | XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); | 4850 | XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); |
| 5019 | error = 0; | 4851 | error = 0; |
| 5020 | if (delta && delta->xed_startoff != NULLFILEOFF) { | ||
| 5021 | /* A change was actually made. | ||
| 5022 | * Note that delta->xed_blockount is an offset at this | ||
| 5023 | * point and needs to be converted to a block count. | ||
| 5024 | */ | ||
| 5025 | ASSERT(delta->xed_blockcount > delta->xed_startoff); | ||
| 5026 | delta->xed_blockcount -= delta->xed_startoff; | ||
| 5027 | } | ||
| 5028 | error0: | 4852 | error0: |
| 5029 | /* | 4853 | /* |
| 5030 | * Log everything. Do this after conversion, there's no point in | 4854 | * Log everything. Do this after conversion, there's no point in |
| @@ -5136,8 +4960,6 @@ xfs_bunmapi( | |||
| 5136 | xfs_fsblock_t *firstblock, /* first allocated block | 4960 | xfs_fsblock_t *firstblock, /* first allocated block |
| 5137 | controls a.g. for allocs */ | 4961 | controls a.g. for allocs */ |
| 5138 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ | 4962 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ |
| 5139 | xfs_extdelta_t *delta, /* o: change made to incore | ||
| 5140 | extents */ | ||
| 5141 | int *done) /* set if not done yet */ | 4963 | int *done) /* set if not done yet */ |
| 5142 | { | 4964 | { |
| 5143 | xfs_btree_cur_t *cur; /* bmap btree cursor */ | 4965 | xfs_btree_cur_t *cur; /* bmap btree cursor */ |
| @@ -5196,10 +5018,7 @@ xfs_bunmapi( | |||
| 5196 | bno = start + len - 1; | 5018 | bno = start + len - 1; |
| 5197 | ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, | 5019 | ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, |
| 5198 | &prev); | 5020 | &prev); |
| 5199 | if (delta) { | 5021 | |
| 5200 | delta->xed_startoff = NULLFILEOFF; | ||
| 5201 | delta->xed_blockcount = 0; | ||
| 5202 | } | ||
| 5203 | /* | 5022 | /* |
| 5204 | * Check to see if the given block number is past the end of the | 5023 | * Check to see if the given block number is past the end of the |
| 5205 | * file, back up to the last block if so... | 5024 | * file, back up to the last block if so... |
| @@ -5297,7 +5116,7 @@ xfs_bunmapi( | |||
| 5297 | } | 5116 | } |
| 5298 | del.br_state = XFS_EXT_UNWRITTEN; | 5117 | del.br_state = XFS_EXT_UNWRITTEN; |
| 5299 | error = xfs_bmap_add_extent(ip, lastx, &cur, &del, | 5118 | error = xfs_bmap_add_extent(ip, lastx, &cur, &del, |
| 5300 | firstblock, flist, &logflags, delta, | 5119 | firstblock, flist, &logflags, |
| 5301 | XFS_DATA_FORK, 0); | 5120 | XFS_DATA_FORK, 0); |
| 5302 | if (error) | 5121 | if (error) |
| 5303 | goto error0; | 5122 | goto error0; |
| @@ -5352,7 +5171,7 @@ xfs_bunmapi( | |||
| 5352 | prev.br_state = XFS_EXT_UNWRITTEN; | 5171 | prev.br_state = XFS_EXT_UNWRITTEN; |
| 5353 | error = xfs_bmap_add_extent(ip, lastx - 1, &cur, | 5172 | error = xfs_bmap_add_extent(ip, lastx - 1, &cur, |
| 5354 | &prev, firstblock, flist, &logflags, | 5173 | &prev, firstblock, flist, &logflags, |
| 5355 | delta, XFS_DATA_FORK, 0); | 5174 | XFS_DATA_FORK, 0); |
| 5356 | if (error) | 5175 | if (error) |
| 5357 | goto error0; | 5176 | goto error0; |
| 5358 | goto nodelete; | 5177 | goto nodelete; |
| @@ -5361,7 +5180,7 @@ xfs_bunmapi( | |||
| 5361 | del.br_state = XFS_EXT_UNWRITTEN; | 5180 | del.br_state = XFS_EXT_UNWRITTEN; |
| 5362 | error = xfs_bmap_add_extent(ip, lastx, &cur, | 5181 | error = xfs_bmap_add_extent(ip, lastx, &cur, |
| 5363 | &del, firstblock, flist, &logflags, | 5182 | &del, firstblock, flist, &logflags, |
| 5364 | delta, XFS_DATA_FORK, 0); | 5183 | XFS_DATA_FORK, 0); |
| 5365 | if (error) | 5184 | if (error) |
| 5366 | goto error0; | 5185 | goto error0; |
| 5367 | goto nodelete; | 5186 | goto nodelete; |
| @@ -5414,7 +5233,7 @@ xfs_bunmapi( | |||
| 5414 | goto error0; | 5233 | goto error0; |
| 5415 | } | 5234 | } |
| 5416 | error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, | 5235 | error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, |
| 5417 | &tmp_logflags, delta, whichfork, rsvd); | 5236 | &tmp_logflags, whichfork, rsvd); |
| 5418 | logflags |= tmp_logflags; | 5237 | logflags |= tmp_logflags; |
| 5419 | if (error) | 5238 | if (error) |
| 5420 | goto error0; | 5239 | goto error0; |
| @@ -5471,14 +5290,6 @@ nodelete: | |||
| 5471 | ASSERT(ifp->if_ext_max == | 5290 | ASSERT(ifp->if_ext_max == |
| 5472 | XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); | 5291 | XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); |
| 5473 | error = 0; | 5292 | error = 0; |
| 5474 | if (delta && delta->xed_startoff != NULLFILEOFF) { | ||
| 5475 | /* A change was actually made. | ||
| 5476 | * Note that delta->xed_blockount is an offset at this | ||
| 5477 | * point and needs to be converted to a block count. | ||
| 5478 | */ | ||
| 5479 | ASSERT(delta->xed_blockcount > delta->xed_startoff); | ||
| 5480 | delta->xed_blockcount -= delta->xed_startoff; | ||
| 5481 | } | ||
| 5482 | error0: | 5293 | error0: |
| 5483 | /* | 5294 | /* |
| 5484 | * Log everything. Do this after conversion, there's no point in | 5295 | * Log everything. Do this after conversion, there's no point in |
| @@ -5605,28 +5416,6 @@ xfs_getbmap( | |||
| 5605 | prealloced = 0; | 5416 | prealloced = 0; |
| 5606 | fixlen = 1LL << 32; | 5417 | fixlen = 1LL << 32; |
| 5607 | } else { | 5418 | } else { |
| 5608 | /* | ||
| 5609 | * If the BMV_IF_NO_DMAPI_READ interface bit specified, do | ||
| 5610 | * not generate a DMAPI read event. Otherwise, if the | ||
| 5611 | * DM_EVENT_READ bit is set for the file, generate a read | ||
| 5612 | * event in order that the DMAPI application may do its thing | ||
| 5613 | * before we return the extents. Usually this means restoring | ||
| 5614 | * user file data to regions of the file that look like holes. | ||
| 5615 | * | ||
| 5616 | * The "old behavior" (from XFS_IOC_GETBMAP) is to not specify | ||
| 5617 | * BMV_IF_NO_DMAPI_READ so that read events are generated. | ||
| 5618 | * If this were not true, callers of ioctl(XFS_IOC_GETBMAP) | ||
| 5619 | * could misinterpret holes in a DMAPI file as true holes, | ||
| 5620 | * when in fact they may represent offline user data. | ||
| 5621 | */ | ||
| 5622 | if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && | ||
| 5623 | !(iflags & BMV_IF_NO_DMAPI_READ)) { | ||
| 5624 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, | ||
| 5625 | 0, 0, 0, NULL); | ||
| 5626 | if (error) | ||
| 5627 | return XFS_ERROR(error); | ||
| 5628 | } | ||
| 5629 | |||
| 5630 | if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && | 5419 | if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && |
| 5631 | ip->i_d.di_format != XFS_DINODE_FMT_BTREE && | 5420 | ip->i_d.di_format != XFS_DINODE_FMT_BTREE && |
| 5632 | ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) | 5421 | ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) |
| @@ -5713,7 +5502,7 @@ xfs_getbmap( | |||
| 5713 | error = xfs_bmapi(NULL, ip, XFS_BB_TO_FSBT(mp, bmv->bmv_offset), | 5502 | error = xfs_bmapi(NULL, ip, XFS_BB_TO_FSBT(mp, bmv->bmv_offset), |
| 5714 | XFS_BB_TO_FSB(mp, bmv->bmv_length), | 5503 | XFS_BB_TO_FSB(mp, bmv->bmv_length), |
| 5715 | bmapi_flags, NULL, 0, map, &nmap, | 5504 | bmapi_flags, NULL, 0, map, &nmap, |
| 5716 | NULL, NULL); | 5505 | NULL); |
| 5717 | if (error) | 5506 | if (error) |
| 5718 | goto out_free_map; | 5507 | goto out_free_map; |
| 5719 | ASSERT(nmap <= subnex); | 5508 | ASSERT(nmap <= subnex); |
| @@ -5859,66 +5648,34 @@ xfs_bmap_eof( | |||
| 5859 | } | 5648 | } |
| 5860 | 5649 | ||
| 5861 | #ifdef DEBUG | 5650 | #ifdef DEBUG |
| 5862 | STATIC | 5651 | STATIC struct xfs_buf * |
| 5863 | xfs_buf_t * | ||
| 5864 | xfs_bmap_get_bp( | 5652 | xfs_bmap_get_bp( |
| 5865 | xfs_btree_cur_t *cur, | 5653 | struct xfs_btree_cur *cur, |
| 5866 | xfs_fsblock_t bno) | 5654 | xfs_fsblock_t bno) |
| 5867 | { | 5655 | { |
| 5868 | int i; | 5656 | struct xfs_log_item_desc *lidp; |
| 5869 | xfs_buf_t *bp; | 5657 | int i; |
| 5870 | 5658 | ||
| 5871 | if (!cur) | 5659 | if (!cur) |
| 5872 | return(NULL); | 5660 | return NULL; |
| 5873 | |||
| 5874 | bp = NULL; | ||
| 5875 | for(i = 0; i < XFS_BTREE_MAXLEVELS; i++) { | ||
| 5876 | bp = cur->bc_bufs[i]; | ||
| 5877 | if (!bp) break; | ||
| 5878 | if (XFS_BUF_ADDR(bp) == bno) | ||
| 5879 | break; /* Found it */ | ||
| 5880 | } | ||
| 5881 | if (i == XFS_BTREE_MAXLEVELS) | ||
| 5882 | bp = NULL; | ||
| 5883 | |||
| 5884 | if (!bp) { /* Chase down all the log items to see if the bp is there */ | ||
| 5885 | xfs_log_item_chunk_t *licp; | ||
| 5886 | xfs_trans_t *tp; | ||
| 5887 | |||
| 5888 | tp = cur->bc_tp; | ||
| 5889 | licp = &tp->t_items; | ||
| 5890 | while (!bp && licp != NULL) { | ||
| 5891 | if (xfs_lic_are_all_free(licp)) { | ||
| 5892 | licp = licp->lic_next; | ||
| 5893 | continue; | ||
| 5894 | } | ||
| 5895 | for (i = 0; i < licp->lic_unused; i++) { | ||
| 5896 | xfs_log_item_desc_t *lidp; | ||
| 5897 | xfs_log_item_t *lip; | ||
| 5898 | xfs_buf_log_item_t *bip; | ||
| 5899 | xfs_buf_t *lbp; | ||
| 5900 | |||
| 5901 | if (xfs_lic_isfree(licp, i)) { | ||
| 5902 | continue; | ||
| 5903 | } | ||
| 5904 | |||
| 5905 | lidp = xfs_lic_slot(licp, i); | ||
| 5906 | lip = lidp->lid_item; | ||
| 5907 | if (lip->li_type != XFS_LI_BUF) | ||
| 5908 | continue; | ||
| 5909 | 5661 | ||
| 5910 | bip = (xfs_buf_log_item_t *)lip; | 5662 | for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) { |
| 5911 | lbp = bip->bli_buf; | 5663 | if (!cur->bc_bufs[i]) |
| 5664 | break; | ||
| 5665 | if (XFS_BUF_ADDR(cur->bc_bufs[i]) == bno) | ||
| 5666 | return cur->bc_bufs[i]; | ||
| 5667 | } | ||
| 5912 | 5668 | ||
| 5913 | if (XFS_BUF_ADDR(lbp) == bno) { | 5669 | /* Chase down all the log items to see if the bp is there */ |
| 5914 | bp = lbp; | 5670 | list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { |
| 5915 | break; /* Found it */ | 5671 | struct xfs_buf_log_item *bip; |
| 5916 | } | 5672 | bip = (struct xfs_buf_log_item *)lidp->lid_item; |
| 5917 | } | 5673 | if (bip->bli_item.li_type == XFS_LI_BUF && |
| 5918 | licp = licp->lic_next; | 5674 | XFS_BUF_ADDR(bip->bli_buf) == bno) |
| 5919 | } | 5675 | return bip->bli_buf; |
| 5920 | } | 5676 | } |
| 5921 | return(bp); | 5677 | |
| 5678 | return NULL; | ||
| 5922 | } | 5679 | } |
| 5923 | 5680 | ||
| 5924 | STATIC void | 5681 | STATIC void |
