aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_bmap.c394
-rw-r--r--fs/xfs/xfs_bmap.h12
2 files changed, 184 insertions, 222 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
index 8971fb09d387..6154ca030724 100644
--- a/fs/xfs/xfs_bmap.c
+++ b/fs/xfs/xfs_bmap.c
@@ -759,26 +759,10 @@ xfs_bmap_add_extent_delay_real(
759 xfs_filblks_t temp=0; /* value for dnew calculations */ 759 xfs_filblks_t temp=0; /* value for dnew calculations */
760 xfs_filblks_t temp2=0;/* value for dnew calculations */ 760 xfs_filblks_t temp2=0;/* value for dnew calculations */
761 int tmp_rval; /* partial logging flags */ 761 int tmp_rval; /* partial logging flags */
762 enum { /* bit number definitions for state */
763 LEFT_CONTIG, RIGHT_CONTIG,
764 LEFT_FILLING, RIGHT_FILLING,
765 LEFT_DELAY, RIGHT_DELAY,
766 LEFT_VALID, RIGHT_VALID
767 };
768 762
769#define LEFT r[0] 763#define LEFT r[0]
770#define RIGHT r[1] 764#define RIGHT r[1]
771#define PREV r[2] 765#define PREV r[2]
772#define MASK(b) (1 << (b))
773#define MASK2(a,b) (MASK(a) | MASK(b))
774#define MASK3(a,b,c) (MASK2(a,b) | MASK(c))
775#define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d))
776#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b)))
777#define STATE_TEST(b) (state & MASK(b))
778#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \
779 ((state &= ~MASK(b)), 0))
780#define SWITCH_STATE \
781 (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG))
782 766
783 /* 767 /*
784 * Set up a bunch of variables to make the tests simpler. 768 * Set up a bunch of variables to make the tests simpler.
@@ -790,56 +774,69 @@ xfs_bmap_add_extent_delay_real(
790 new_endoff = new->br_startoff + new->br_blockcount; 774 new_endoff = new->br_startoff + new->br_blockcount;
791 ASSERT(PREV.br_startoff <= new->br_startoff); 775 ASSERT(PREV.br_startoff <= new->br_startoff);
792 ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); 776 ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff);
777
793 /* 778 /*
794 * Set flags determining what part of the previous delayed allocation 779 * Set flags determining what part of the previous delayed allocation
795 * extent is being replaced by a real allocation. 780 * extent is being replaced by a real allocation.
796 */ 781 */
797 STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); 782 if (PREV.br_startoff == new->br_startoff)
798 STATE_SET(RIGHT_FILLING, 783 state |= BMAP_LEFT_FILLING;
799 PREV.br_startoff + PREV.br_blockcount == new_endoff); 784 if (PREV.br_startoff + PREV.br_blockcount == new_endoff)
785 state |= BMAP_RIGHT_FILLING;
786
800 /* 787 /*
801 * Check and set flags if this segment has a left neighbor. 788 * Check and set flags if this segment has a left neighbor.
802 * Don't set contiguous if the combined extent would be too large. 789 * Don't set contiguous if the combined extent would be too large.
803 */ 790 */
804 if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { 791 if (idx > 0) {
792 state |= BMAP_LEFT_VALID;
805 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); 793 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT);
806 STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock)); 794
795 if (isnullstartblock(LEFT.br_startblock))
796 state |= BMAP_LEFT_DELAY;
807 } 797 }
808 STATE_SET(LEFT_CONTIG, 798
809 STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && 799 if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) &&
810 LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && 800 LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff &&
811 LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && 801 LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock &&
812 LEFT.br_state == new->br_state && 802 LEFT.br_state == new->br_state &&
813 LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); 803 LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN)
804 state |= BMAP_LEFT_CONTIG;
805
814 /* 806 /*
815 * Check and set flags if this segment has a right neighbor. 807 * Check and set flags if this segment has a right neighbor.
816 * Don't set contiguous if the combined extent would be too large. 808 * Don't set contiguous if the combined extent would be too large.
817 * Also check for all-three-contiguous being too large. 809 * Also check for all-three-contiguous being too large.
818 */ 810 */
819 if (STATE_SET_TEST(RIGHT_VALID, 811 if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) {
820 idx < 812 state |= BMAP_RIGHT_VALID;
821 ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) {
822 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); 813 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT);
823 STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock)); 814
815 if (isnullstartblock(RIGHT.br_startblock))
816 state |= BMAP_RIGHT_DELAY;
824 } 817 }
825 STATE_SET(RIGHT_CONTIG, 818
826 STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && 819 if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) &&
827 new_endoff == RIGHT.br_startoff && 820 new_endoff == RIGHT.br_startoff &&
828 new->br_startblock + new->br_blockcount == 821 new->br_startblock + new->br_blockcount == RIGHT.br_startblock &&
829 RIGHT.br_startblock && 822 new->br_state == RIGHT.br_state &&
830 new->br_state == RIGHT.br_state && 823 new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN &&
831 new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && 824 ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING |
832 ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != 825 BMAP_RIGHT_FILLING)) !=
833 MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || 826 (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING |
834 LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount 827 BMAP_RIGHT_FILLING) ||
835 <= MAXEXTLEN)); 828 LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount
829 <= MAXEXTLEN))
830 state |= BMAP_RIGHT_CONTIG;
831
836 error = 0; 832 error = 0;
837 /* 833 /*
838 * Switch out based on the FILLING and CONTIG state bits. 834 * Switch out based on the FILLING and CONTIG state bits.
839 */ 835 */
840 switch (SWITCH_STATE) { 836 switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG |
841 837 BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) {
842 case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): 838 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG |
839 BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
843 /* 840 /*
844 * Filling in all of a previously delayed allocation extent. 841 * Filling in all of a previously delayed allocation extent.
845 * The left and right neighbors are both contiguous with new. 842 * The left and right neighbors are both contiguous with new.
@@ -885,7 +882,7 @@ xfs_bmap_add_extent_delay_real(
885 RIGHT.br_blockcount; 882 RIGHT.br_blockcount;
886 break; 883 break;
887 884
888 case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): 885 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG:
889 /* 886 /*
890 * Filling in all of a previously delayed allocation extent. 887 * Filling in all of a previously delayed allocation extent.
891 * The left neighbor is contiguous, the right is not. 888 * The left neighbor is contiguous, the right is not.
@@ -921,7 +918,7 @@ xfs_bmap_add_extent_delay_real(
921 PREV.br_blockcount; 918 PREV.br_blockcount;
922 break; 919 break;
923 920
924 case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): 921 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
925 /* 922 /*
926 * Filling in all of a previously delayed allocation extent. 923 * Filling in all of a previously delayed allocation extent.
927 * The right neighbor is contiguous, the left is not. 924 * The right neighbor is contiguous, the left is not.
@@ -956,7 +953,7 @@ xfs_bmap_add_extent_delay_real(
956 RIGHT.br_blockcount; 953 RIGHT.br_blockcount;
957 break; 954 break;
958 955
959 case MASK2(LEFT_FILLING, RIGHT_FILLING): 956 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING:
960 /* 957 /*
961 * Filling in all of a previously delayed allocation extent. 958 * Filling in all of a previously delayed allocation extent.
962 * Neither the left nor right neighbors are contiguous with 959 * Neither the left nor right neighbors are contiguous with
@@ -987,7 +984,7 @@ xfs_bmap_add_extent_delay_real(
987 temp2 = new->br_blockcount; 984 temp2 = new->br_blockcount;
988 break; 985 break;
989 986
990 case MASK2(LEFT_FILLING, LEFT_CONTIG): 987 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG:
991 /* 988 /*
992 * Filling in the first part of a previous delayed allocation. 989 * Filling in the first part of a previous delayed allocation.
993 * The left neighbor is contiguous. 990 * The left neighbor is contiguous.
@@ -1029,7 +1026,7 @@ xfs_bmap_add_extent_delay_real(
1029 PREV.br_blockcount; 1026 PREV.br_blockcount;
1030 break; 1027 break;
1031 1028
1032 case MASK(LEFT_FILLING): 1029 case BMAP_LEFT_FILLING:
1033 /* 1030 /*
1034 * Filling in the first part of a previous delayed allocation. 1031 * Filling in the first part of a previous delayed allocation.
1035 * The left neighbor is not contiguous. 1032 * The left neighbor is not contiguous.
@@ -1078,7 +1075,7 @@ xfs_bmap_add_extent_delay_real(
1078 temp2 = PREV.br_blockcount; 1075 temp2 = PREV.br_blockcount;
1079 break; 1076 break;
1080 1077
1081 case MASK2(RIGHT_FILLING, RIGHT_CONTIG): 1078 case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
1082 /* 1079 /*
1083 * Filling in the last part of a previous delayed allocation. 1080 * Filling in the last part of a previous delayed allocation.
1084 * The right neighbor is contiguous with the new allocation. 1081 * The right neighbor is contiguous with the new allocation.
@@ -1120,7 +1117,7 @@ xfs_bmap_add_extent_delay_real(
1120 RIGHT.br_blockcount; 1117 RIGHT.br_blockcount;
1121 break; 1118 break;
1122 1119
1123 case MASK(RIGHT_FILLING): 1120 case BMAP_RIGHT_FILLING:
1124 /* 1121 /*
1125 * Filling in the last part of a previous delayed allocation. 1122 * Filling in the last part of a previous delayed allocation.
1126 * The right neighbor is not contiguous. 1123 * The right neighbor is not contiguous.
@@ -1253,13 +1250,13 @@ xfs_bmap_add_extent_delay_real(
1253 temp2 = PREV.br_blockcount; 1250 temp2 = PREV.br_blockcount;
1254 break; 1251 break;
1255 1252
1256 case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): 1253 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1257 case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): 1254 case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1258 case MASK2(LEFT_FILLING, RIGHT_CONTIG): 1255 case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG:
1259 case MASK2(RIGHT_FILLING, LEFT_CONTIG): 1256 case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG:
1260 case MASK2(LEFT_CONTIG, RIGHT_CONTIG): 1257 case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1261 case MASK(LEFT_CONTIG): 1258 case BMAP_LEFT_CONTIG:
1262 case MASK(RIGHT_CONTIG): 1259 case BMAP_RIGHT_CONTIG:
1263 /* 1260 /*
1264 * These cases are all impossible. 1261 * These cases are all impossible.
1265 */ 1262 */
@@ -1279,14 +1276,6 @@ done:
1279#undef LEFT 1276#undef LEFT
1280#undef RIGHT 1277#undef RIGHT
1281#undef PREV 1278#undef PREV
1282#undef MASK
1283#undef MASK2
1284#undef MASK3
1285#undef MASK4
1286#undef STATE_SET
1287#undef STATE_TEST
1288#undef STATE_SET_TEST
1289#undef SWITCH_STATE
1290} 1279}
1291 1280
1292/* 1281/*
@@ -1316,27 +1305,10 @@ xfs_bmap_add_extent_unwritten_real(
1316 int state = 0;/* state bits, accessed thru macros */ 1305 int state = 0;/* state bits, accessed thru macros */
1317 xfs_filblks_t temp=0; 1306 xfs_filblks_t temp=0;
1318 xfs_filblks_t temp2=0; 1307 xfs_filblks_t temp2=0;
1319 enum { /* bit number definitions for state */
1320 LEFT_CONTIG, RIGHT_CONTIG,
1321 LEFT_FILLING, RIGHT_FILLING,
1322 LEFT_DELAY, RIGHT_DELAY,
1323 LEFT_VALID, RIGHT_VALID
1324 };
1325 1308
1326#define LEFT r[0] 1309#define LEFT r[0]
1327#define RIGHT r[1] 1310#define RIGHT r[1]
1328#define PREV r[2] 1311#define PREV r[2]
1329#define MASK(b) (1 << (b))
1330#define MASK2(a,b) (MASK(a) | MASK(b))
1331#define MASK3(a,b,c) (MASK2(a,b) | MASK(c))
1332#define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d))
1333#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b)))
1334#define STATE_TEST(b) (state & MASK(b))
1335#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \
1336 ((state &= ~MASK(b)), 0))
1337#define SWITCH_STATE \
1338 (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG))
1339
1340 /* 1312 /*
1341 * Set up a bunch of variables to make the tests simpler. 1313 * Set up a bunch of variables to make the tests simpler.
1342 */ 1314 */
@@ -1352,55 +1324,67 @@ xfs_bmap_add_extent_unwritten_real(
1352 new_endoff = new->br_startoff + new->br_blockcount; 1324 new_endoff = new->br_startoff + new->br_blockcount;
1353 ASSERT(PREV.br_startoff <= new->br_startoff); 1325 ASSERT(PREV.br_startoff <= new->br_startoff);
1354 ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); 1326 ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff);
1327
1355 /* 1328 /*
1356 * Set flags determining what part of the previous oldext allocation 1329 * Set flags determining what part of the previous oldext allocation
1357 * extent is being replaced by a newext allocation. 1330 * extent is being replaced by a newext allocation.
1358 */ 1331 */
1359 STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); 1332 if (PREV.br_startoff == new->br_startoff)
1360 STATE_SET(RIGHT_FILLING, 1333 state |= BMAP_LEFT_FILLING;
1361 PREV.br_startoff + PREV.br_blockcount == new_endoff); 1334 if (PREV.br_startoff + PREV.br_blockcount == new_endoff)
1335 state |= BMAP_RIGHT_FILLING;
1336
1362 /* 1337 /*
1363 * Check and set flags if this segment has a left neighbor. 1338 * Check and set flags if this segment has a left neighbor.
1364 * Don't set contiguous if the combined extent would be too large. 1339 * Don't set contiguous if the combined extent would be too large.
1365 */ 1340 */
1366 if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { 1341 if (idx > 0) {
1342 state |= BMAP_LEFT_VALID;
1367 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); 1343 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT);
1368 STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock)); 1344
1345 if (isnullstartblock(LEFT.br_startblock))
1346 state |= BMAP_LEFT_DELAY;
1369 } 1347 }
1370 STATE_SET(LEFT_CONTIG, 1348
1371 STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && 1349 if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) &&
1372 LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && 1350 LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff &&
1373 LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && 1351 LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock &&
1374 LEFT.br_state == newext && 1352 LEFT.br_state == newext &&
1375 LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); 1353 LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN)
1354 state |= BMAP_LEFT_CONTIG;
1355
1376 /* 1356 /*
1377 * Check and set flags if this segment has a right neighbor. 1357 * Check and set flags if this segment has a right neighbor.
1378 * Don't set contiguous if the combined extent would be too large. 1358 * Don't set contiguous if the combined extent would be too large.
1379 * Also check for all-three-contiguous being too large. 1359 * Also check for all-three-contiguous being too large.
1380 */ 1360 */
1381 if (STATE_SET_TEST(RIGHT_VALID, 1361 if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) {
1382 idx < 1362 state |= BMAP_RIGHT_VALID;
1383 ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) {
1384 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); 1363 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT);
1385 STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock)); 1364 if (isnullstartblock(RIGHT.br_startblock))
1365 state |= BMAP_RIGHT_DELAY;
1386 } 1366 }
1387 STATE_SET(RIGHT_CONTIG, 1367
1388 STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && 1368 if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) &&
1389 new_endoff == RIGHT.br_startoff && 1369 new_endoff == RIGHT.br_startoff &&
1390 new->br_startblock + new->br_blockcount == 1370 new->br_startblock + new->br_blockcount == RIGHT.br_startblock &&
1391 RIGHT.br_startblock && 1371 newext == RIGHT.br_state &&
1392 newext == RIGHT.br_state && 1372 new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN &&
1393 new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && 1373 ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING |
1394 ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != 1374 BMAP_RIGHT_FILLING)) !=
1395 MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || 1375 (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING |
1396 LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount 1376 BMAP_RIGHT_FILLING) ||
1397 <= MAXEXTLEN)); 1377 LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount
1378 <= MAXEXTLEN))
1379 state |= BMAP_RIGHT_CONTIG;
1380
1398 /* 1381 /*
1399 * Switch out based on the FILLING and CONTIG state bits. 1382 * Switch out based on the FILLING and CONTIG state bits.
1400 */ 1383 */
1401 switch (SWITCH_STATE) { 1384 switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG |
1402 1385 BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) {
1403 case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): 1386 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG |
1387 BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
1404 /* 1388 /*
1405 * Setting all of a previous oldext extent to newext. 1389 * Setting all of a previous oldext extent to newext.
1406 * The left and right neighbors are both contiguous with new. 1390 * The left and right neighbors are both contiguous with new.
@@ -1450,7 +1434,7 @@ xfs_bmap_add_extent_unwritten_real(
1450 RIGHT.br_blockcount; 1434 RIGHT.br_blockcount;
1451 break; 1435 break;
1452 1436
1453 case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): 1437 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG:
1454 /* 1438 /*
1455 * Setting all of a previous oldext extent to newext. 1439 * Setting all of a previous oldext extent to newext.
1456 * The left neighbor is contiguous, the right is not. 1440 * The left neighbor is contiguous, the right is not.
@@ -1492,7 +1476,7 @@ xfs_bmap_add_extent_unwritten_real(
1492 PREV.br_blockcount; 1476 PREV.br_blockcount;
1493 break; 1477 break;
1494 1478
1495 case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): 1479 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
1496 /* 1480 /*
1497 * Setting all of a previous oldext extent to newext. 1481 * Setting all of a previous oldext extent to newext.
1498 * The right neighbor is contiguous, the left is not. 1482 * The right neighbor is contiguous, the left is not.
@@ -1535,7 +1519,7 @@ xfs_bmap_add_extent_unwritten_real(
1535 RIGHT.br_blockcount; 1519 RIGHT.br_blockcount;
1536 break; 1520 break;
1537 1521
1538 case MASK2(LEFT_FILLING, RIGHT_FILLING): 1522 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING:
1539 /* 1523 /*
1540 * Setting all of a previous oldext extent to newext. 1524 * Setting all of a previous oldext extent to newext.
1541 * Neither the left nor right neighbors are contiguous with 1525 * Neither the left nor right neighbors are contiguous with
@@ -1566,7 +1550,7 @@ xfs_bmap_add_extent_unwritten_real(
1566 temp2 = new->br_blockcount; 1550 temp2 = new->br_blockcount;
1567 break; 1551 break;
1568 1552
1569 case MASK2(LEFT_FILLING, LEFT_CONTIG): 1553 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG:
1570 /* 1554 /*
1571 * Setting the first part of a previous oldext extent to newext. 1555 * Setting the first part of a previous oldext extent to newext.
1572 * The left neighbor is contiguous. 1556 * The left neighbor is contiguous.
@@ -1617,7 +1601,7 @@ xfs_bmap_add_extent_unwritten_real(
1617 PREV.br_blockcount; 1601 PREV.br_blockcount;
1618 break; 1602 break;
1619 1603
1620 case MASK(LEFT_FILLING): 1604 case BMAP_LEFT_FILLING:
1621 /* 1605 /*
1622 * Setting the first part of a previous oldext extent to newext. 1606 * Setting the first part of a previous oldext extent to newext.
1623 * The left neighbor is not contiguous. 1607 * The left neighbor is not contiguous.
@@ -1660,7 +1644,7 @@ xfs_bmap_add_extent_unwritten_real(
1660 temp2 = PREV.br_blockcount; 1644 temp2 = PREV.br_blockcount;
1661 break; 1645 break;
1662 1646
1663 case MASK2(RIGHT_FILLING, RIGHT_CONTIG): 1647 case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
1664 /* 1648 /*
1665 * Setting the last part of a previous oldext extent to newext. 1649 * Setting the last part of a previous oldext extent to newext.
1666 * The right neighbor is contiguous with the new allocation. 1650 * The right neighbor is contiguous with the new allocation.
@@ -1707,7 +1691,7 @@ xfs_bmap_add_extent_unwritten_real(
1707 RIGHT.br_blockcount; 1691 RIGHT.br_blockcount;
1708 break; 1692 break;
1709 1693
1710 case MASK(RIGHT_FILLING): 1694 case BMAP_RIGHT_FILLING:
1711 /* 1695 /*
1712 * Setting the last part of a previous oldext extent to newext. 1696 * Setting the last part of a previous oldext extent to newext.
1713 * The right neighbor is not contiguous. 1697 * The right neighbor is not contiguous.
@@ -1813,13 +1797,13 @@ xfs_bmap_add_extent_unwritten_real(
1813 temp2 = PREV.br_blockcount; 1797 temp2 = PREV.br_blockcount;
1814 break; 1798 break;
1815 1799
1816 case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): 1800 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1817 case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): 1801 case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1818 case MASK2(LEFT_FILLING, RIGHT_CONTIG): 1802 case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG:
1819 case MASK2(RIGHT_FILLING, LEFT_CONTIG): 1803 case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG:
1820 case MASK2(LEFT_CONTIG, RIGHT_CONTIG): 1804 case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1821 case MASK(LEFT_CONTIG): 1805 case BMAP_LEFT_CONTIG:
1822 case MASK(RIGHT_CONTIG): 1806 case BMAP_RIGHT_CONTIG:
1823 /* 1807 /*
1824 * These cases are all impossible. 1808 * These cases are all impossible.
1825 */ 1809 */
@@ -1839,14 +1823,6 @@ done:
1839#undef LEFT 1823#undef LEFT
1840#undef RIGHT 1824#undef RIGHT
1841#undef PREV 1825#undef PREV
1842#undef MASK
1843#undef MASK2
1844#undef MASK3
1845#undef MASK4
1846#undef STATE_SET
1847#undef STATE_TEST
1848#undef STATE_SET_TEST
1849#undef SWITCH_STATE
1850} 1826}
1851 1827
1852/* 1828/*
@@ -1872,62 +1848,57 @@ xfs_bmap_add_extent_hole_delay(
1872 int state; /* state bits, accessed thru macros */ 1848 int state; /* state bits, accessed thru macros */
1873 xfs_filblks_t temp=0; /* temp for indirect calculations */ 1849 xfs_filblks_t temp=0; /* temp for indirect calculations */
1874 xfs_filblks_t temp2=0; 1850 xfs_filblks_t temp2=0;
1875 enum { /* bit number definitions for state */
1876 LEFT_CONTIG, RIGHT_CONTIG,
1877 LEFT_DELAY, RIGHT_DELAY,
1878 LEFT_VALID, RIGHT_VALID
1879 };
1880
1881#define MASK(b) (1 << (b))
1882#define MASK2(a,b) (MASK(a) | MASK(b))
1883#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b)))
1884#define STATE_TEST(b) (state & MASK(b))
1885#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \
1886 ((state &= ~MASK(b)), 0))
1887#define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG))
1888 1851
1889 ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); 1852 ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
1890 ep = xfs_iext_get_ext(ifp, idx); 1853 ep = xfs_iext_get_ext(ifp, idx);
1891 state = 0; 1854 state = 0;
1892 ASSERT(isnullstartblock(new->br_startblock)); 1855 ASSERT(isnullstartblock(new->br_startblock));
1856
1893 /* 1857 /*
1894 * Check and set flags if this segment has a left neighbor 1858 * Check and set flags if this segment has a left neighbor
1895 */ 1859 */
1896 if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { 1860 if (idx > 0) {
1861 state |= BMAP_LEFT_VALID;
1897 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); 1862 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left);
1898 STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock)); 1863
1864 if (isnullstartblock(left.br_startblock))
1865 state |= BMAP_LEFT_DELAY;
1899 } 1866 }
1867
1900 /* 1868 /*
1901 * Check and set flags if the current (right) segment exists. 1869 * Check and set flags if the current (right) segment exists.
1902 * If it doesn't exist, we're converting the hole at end-of-file. 1870 * If it doesn't exist, we're converting the hole at end-of-file.
1903 */ 1871 */
1904 if (STATE_SET_TEST(RIGHT_VALID, 1872 if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) {
1905 idx < 1873 state |= BMAP_RIGHT_VALID;
1906 ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) {
1907 xfs_bmbt_get_all(ep, &right); 1874 xfs_bmbt_get_all(ep, &right);
1908 STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock)); 1875
1876 if (isnullstartblock(right.br_startblock))
1877 state |= BMAP_RIGHT_DELAY;
1909 } 1878 }
1879
1910 /* 1880 /*
1911 * Set contiguity flags on the left and right neighbors. 1881 * Set contiguity flags on the left and right neighbors.
1912 * Don't let extents get too large, even if the pieces are contiguous. 1882 * Don't let extents get too large, even if the pieces are contiguous.
1913 */ 1883 */
1914 STATE_SET(LEFT_CONTIG, 1884 if ((state & BMAP_LEFT_VALID) && (state & BMAP_LEFT_DELAY) &&
1915 STATE_TEST(LEFT_VALID) && STATE_TEST(LEFT_DELAY) && 1885 left.br_startoff + left.br_blockcount == new->br_startoff &&
1916 left.br_startoff + left.br_blockcount == new->br_startoff && 1886 left.br_blockcount + new->br_blockcount <= MAXEXTLEN)
1917 left.br_blockcount + new->br_blockcount <= MAXEXTLEN); 1887 state |= BMAP_LEFT_CONTIG;
1918 STATE_SET(RIGHT_CONTIG, 1888
1919 STATE_TEST(RIGHT_VALID) && STATE_TEST(RIGHT_DELAY) && 1889 if ((state & BMAP_RIGHT_VALID) && (state & BMAP_RIGHT_DELAY) &&
1920 new->br_startoff + new->br_blockcount == right.br_startoff && 1890 new->br_startoff + new->br_blockcount == right.br_startoff &&
1921 new->br_blockcount + right.br_blockcount <= MAXEXTLEN && 1891 new->br_blockcount + right.br_blockcount <= MAXEXTLEN &&
1922 (!STATE_TEST(LEFT_CONTIG) || 1892 (!(state & BMAP_LEFT_CONTIG) ||
1923 (left.br_blockcount + new->br_blockcount + 1893 (left.br_blockcount + new->br_blockcount +
1924 right.br_blockcount <= MAXEXTLEN))); 1894 right.br_blockcount <= MAXEXTLEN)))
1895 state |= BMAP_RIGHT_CONTIG;
1896
1925 /* 1897 /*
1926 * Switch out based on the contiguity flags. 1898 * Switch out based on the contiguity flags.
1927 */ 1899 */
1928 switch (SWITCH_STATE) { 1900 switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) {
1929 1901 case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
1930 case MASK2(LEFT_CONTIG, RIGHT_CONTIG):
1931 /* 1902 /*
1932 * New allocation is contiguous with delayed allocations 1903 * New allocation is contiguous with delayed allocations
1933 * on the left and on the right. 1904 * on the left and on the right.
@@ -1954,7 +1925,7 @@ xfs_bmap_add_extent_hole_delay(
1954 temp = left.br_startoff; 1925 temp = left.br_startoff;
1955 break; 1926 break;
1956 1927
1957 case MASK(LEFT_CONTIG): 1928 case BMAP_LEFT_CONTIG:
1958 /* 1929 /*
1959 * New allocation is contiguous with a delayed allocation 1930 * New allocation is contiguous with a delayed allocation
1960 * on the left. 1931 * on the left.
@@ -1977,7 +1948,7 @@ xfs_bmap_add_extent_hole_delay(
1977 temp = left.br_startoff; 1948 temp = left.br_startoff;
1978 break; 1949 break;
1979 1950
1980 case MASK(RIGHT_CONTIG): 1951 case BMAP_RIGHT_CONTIG:
1981 /* 1952 /*
1982 * New allocation is contiguous with a delayed allocation 1953 * New allocation is contiguous with a delayed allocation
1983 * on the right. 1954 * on the right.
@@ -2030,12 +2001,6 @@ xfs_bmap_add_extent_hole_delay(
2030 } 2001 }
2031 *logflagsp = 0; 2002 *logflagsp = 0;
2032 return 0; 2003 return 0;
2033#undef MASK
2034#undef MASK2
2035#undef STATE_SET
2036#undef STATE_TEST
2037#undef STATE_SET_TEST
2038#undef SWITCH_STATE
2039} 2004}
2040 2005
2041/* 2006/*
@@ -2062,69 +2027,60 @@ xfs_bmap_add_extent_hole_real(
2062 int state; /* state bits, accessed thru macros */ 2027 int state; /* state bits, accessed thru macros */
2063 xfs_filblks_t temp=0; 2028 xfs_filblks_t temp=0;
2064 xfs_filblks_t temp2=0; 2029 xfs_filblks_t temp2=0;
2065 enum { /* bit number definitions for state */
2066 LEFT_CONTIG, RIGHT_CONTIG,
2067 LEFT_DELAY, RIGHT_DELAY,
2068 LEFT_VALID, RIGHT_VALID
2069 };
2070
2071#define MASK(b) (1 << (b))
2072#define MASK2(a,b) (MASK(a) | MASK(b))
2073#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b)))
2074#define STATE_TEST(b) (state & MASK(b))
2075#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \
2076 ((state &= ~MASK(b)), 0))
2077#define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG))
2078 2030
2079 ifp = XFS_IFORK_PTR(ip, whichfork); 2031 ifp = XFS_IFORK_PTR(ip, whichfork);
2080 ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); 2032 ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t));
2081 ep = xfs_iext_get_ext(ifp, idx); 2033 ep = xfs_iext_get_ext(ifp, idx);
2082 state = 0; 2034 state = 0;
2035
2083 /* 2036 /*
2084 * Check and set flags if this segment has a left neighbor. 2037 * Check and set flags if this segment has a left neighbor.
2085 */ 2038 */
2086 if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { 2039 if (idx > 0) {
2040 state |= BMAP_LEFT_VALID;
2087 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); 2041 xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left);
2088 STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock)); 2042 if (isnullstartblock(left.br_startblock))
2043 state |= BMAP_LEFT_DELAY;
2089 } 2044 }
2045
2090 /* 2046 /*
2091 * Check and set flags if this segment has a current value. 2047 * Check and set flags if this segment has a current value.
2092 * Not true if we're inserting into the "hole" at eof. 2048 * Not true if we're inserting into the "hole" at eof.
2093 */ 2049 */
2094 if (STATE_SET_TEST(RIGHT_VALID, 2050 if (idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) {
2095 idx < 2051 state |= BMAP_RIGHT_VALID;
2096 ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) {
2097 xfs_bmbt_get_all(ep, &right); 2052 xfs_bmbt_get_all(ep, &right);
2098 STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock)); 2053 if (isnullstartblock(right.br_startblock))
2054 state |= BMAP_RIGHT_DELAY;
2099 } 2055 }
2056
2100 /* 2057 /*
2101 * We're inserting a real allocation between "left" and "right". 2058 * We're inserting a real allocation between "left" and "right".
2102 * Set the contiguity flags. Don't let extents get too large. 2059 * Set the contiguity flags. Don't let extents get too large.
2103 */ 2060 */
2104 STATE_SET(LEFT_CONTIG, 2061 if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) &&
2105 STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && 2062 left.br_startoff + left.br_blockcount == new->br_startoff &&
2106 left.br_startoff + left.br_blockcount == new->br_startoff && 2063 left.br_startblock + left.br_blockcount == new->br_startblock &&
2107 left.br_startblock + left.br_blockcount == new->br_startblock && 2064 left.br_state == new->br_state &&
2108 left.br_state == new->br_state && 2065 left.br_blockcount + new->br_blockcount <= MAXEXTLEN)
2109 left.br_blockcount + new->br_blockcount <= MAXEXTLEN); 2066 state |= BMAP_LEFT_CONTIG;
2110 STATE_SET(RIGHT_CONTIG, 2067
2111 STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && 2068 if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) &&
2112 new->br_startoff + new->br_blockcount == right.br_startoff && 2069 new->br_startoff + new->br_blockcount == right.br_startoff &&
2113 new->br_startblock + new->br_blockcount == 2070 new->br_startblock + new->br_blockcount == right.br_startblock &&
2114 right.br_startblock && 2071 new->br_state == right.br_state &&
2115 new->br_state == right.br_state && 2072 new->br_blockcount + right.br_blockcount <= MAXEXTLEN &&
2116 new->br_blockcount + right.br_blockcount <= MAXEXTLEN && 2073 (!(state & BMAP_LEFT_CONTIG) ||
2117 (!STATE_TEST(LEFT_CONTIG) || 2074 left.br_blockcount + new->br_blockcount +
2118 left.br_blockcount + new->br_blockcount + 2075 right.br_blockcount <= MAXEXTLEN))
2119 right.br_blockcount <= MAXEXTLEN)); 2076 state |= BMAP_RIGHT_CONTIG;
2120 2077
2121 error = 0; 2078 error = 0;
2122 /* 2079 /*
2123 * Select which case we're in here, and implement it. 2080 * Select which case we're in here, and implement it.
2124 */ 2081 */
2125 switch (SWITCH_STATE) { 2082 switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) {
2126 2083 case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG:
2127 case MASK2(LEFT_CONTIG, RIGHT_CONTIG):
2128 /* 2084 /*
2129 * New allocation is contiguous with real allocations on the 2085 * New allocation is contiguous with real allocations on the
2130 * left and on the right. 2086 * left and on the right.
@@ -2173,7 +2129,7 @@ xfs_bmap_add_extent_hole_real(
2173 right.br_blockcount; 2129 right.br_blockcount;
2174 break; 2130 break;
2175 2131
2176 case MASK(LEFT_CONTIG): 2132 case BMAP_LEFT_CONTIG:
2177 /* 2133 /*
2178 * New allocation is contiguous with a real allocation 2134 * New allocation is contiguous with a real allocation
2179 * on the left. 2135 * on the left.
@@ -2207,7 +2163,7 @@ xfs_bmap_add_extent_hole_real(
2207 new->br_blockcount; 2163 new->br_blockcount;
2208 break; 2164 break;
2209 2165
2210 case MASK(RIGHT_CONTIG): 2166 case BMAP_RIGHT_CONTIG:
2211 /* 2167 /*
2212 * New allocation is contiguous with a real allocation 2168 * New allocation is contiguous with a real allocation
2213 * on the right. 2169 * on the right.
@@ -2283,12 +2239,6 @@ xfs_bmap_add_extent_hole_real(
2283done: 2239done:
2284 *logflagsp = rval; 2240 *logflagsp = rval;
2285 return error; 2241 return error;
2286#undef MASK
2287#undef MASK2
2288#undef STATE_SET
2289#undef STATE_TEST
2290#undef STATE_SET_TEST
2291#undef SWITCH_STATE
2292} 2242}
2293 2243
2294/* 2244/*
diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h
index 56f62d2edc35..f1ae5a1519c3 100644
--- a/fs/xfs/xfs_bmap.h
+++ b/fs/xfs/xfs_bmap.h
@@ -135,6 +135,18 @@ typedef struct xfs_bmalloca {
135 char conv; /* overwriting unwritten extents */ 135 char conv; /* overwriting unwritten extents */
136} xfs_bmalloca_t; 136} xfs_bmalloca_t;
137 137
138/*
139 * Flags for xfs_bmap_add_extent*.
140 */
141#define BMAP_LEFT_CONTIG (1 << 0)
142#define BMAP_RIGHT_CONTIG (1 << 1)
143#define BMAP_LEFT_FILLING (1 << 2)
144#define BMAP_RIGHT_FILLING (1 << 3)
145#define BMAP_LEFT_DELAY (1 << 4)
146#define BMAP_RIGHT_DELAY (1 << 5)
147#define BMAP_LEFT_VALID (1 << 6)
148#define BMAP_RIGHT_VALID (1 << 7)
149
138#if defined(__KERNEL__) && defined(XFS_BMAP_TRACE) 150#if defined(__KERNEL__) && defined(XFS_BMAP_TRACE)
139/* 151/*
140 * Trace operations for bmap extent tracing 152 * Trace operations for bmap extent tracing