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 |