aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2009-11-24 19:00:19 -0500
committerAlex Elder <aelder@sgi.com>2009-12-15 00:08:15 -0500
commit7574aa92f9b4952c458024e1fa51f20fed65ba07 (patch)
tree9f27ed8e5ec46de258b31ecf6c650c000b80a6da /fs
parent3ea6b3d0e6d0ffd91c0f8cadeb69b7133c038b32 (diff)
xfs: cleanup bmap extent state macros
Cleanup the extent state macros in the bmap code to use one common set of flags that we can pass to the tracing code later and remove a lot of the macro obsfucation. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs')
-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