diff options
Diffstat (limited to 'fs/jfs/jfs_dmap.c')
-rw-r--r-- | fs/jfs/jfs_dmap.c | 419 |
1 files changed, 206 insertions, 213 deletions
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index f3b1ebb22280..e1985066b1c6 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c | |||
@@ -154,12 +154,12 @@ static const s8 budtab[256] = { | |||
154 | * the in-core descriptor is initialized from disk. | 154 | * the in-core descriptor is initialized from disk. |
155 | * | 155 | * |
156 | * PARAMETERS: | 156 | * PARAMETERS: |
157 | * ipbmap - pointer to in-core inode for the block map. | 157 | * ipbmap - pointer to in-core inode for the block map. |
158 | * | 158 | * |
159 | * RETURN VALUES: | 159 | * RETURN VALUES: |
160 | * 0 - success | 160 | * 0 - success |
161 | * -ENOMEM - insufficient memory | 161 | * -ENOMEM - insufficient memory |
162 | * -EIO - i/o error | 162 | * -EIO - i/o error |
163 | */ | 163 | */ |
164 | int dbMount(struct inode *ipbmap) | 164 | int dbMount(struct inode *ipbmap) |
165 | { | 165 | { |
@@ -232,11 +232,11 @@ int dbMount(struct inode *ipbmap) | |||
232 | * the memory for this descriptor is freed. | 232 | * the memory for this descriptor is freed. |
233 | * | 233 | * |
234 | * PARAMETERS: | 234 | * PARAMETERS: |
235 | * ipbmap - pointer to in-core inode for the block map. | 235 | * ipbmap - pointer to in-core inode for the block map. |
236 | * | 236 | * |
237 | * RETURN VALUES: | 237 | * RETURN VALUES: |
238 | * 0 - success | 238 | * 0 - success |
239 | * -EIO - i/o error | 239 | * -EIO - i/o error |
240 | */ | 240 | */ |
241 | int dbUnmount(struct inode *ipbmap, int mounterror) | 241 | int dbUnmount(struct inode *ipbmap, int mounterror) |
242 | { | 242 | { |
@@ -320,13 +320,13 @@ int dbSync(struct inode *ipbmap) | |||
320 | * at a time. | 320 | * at a time. |
321 | * | 321 | * |
322 | * PARAMETERS: | 322 | * PARAMETERS: |
323 | * ip - pointer to in-core inode; | 323 | * ip - pointer to in-core inode; |
324 | * blkno - starting block number to be freed. | 324 | * blkno - starting block number to be freed. |
325 | * nblocks - number of blocks to be freed. | 325 | * nblocks - number of blocks to be freed. |
326 | * | 326 | * |
327 | * RETURN VALUES: | 327 | * RETURN VALUES: |
328 | * 0 - success | 328 | * 0 - success |
329 | * -EIO - i/o error | 329 | * -EIO - i/o error |
330 | */ | 330 | */ |
331 | int dbFree(struct inode *ip, s64 blkno, s64 nblocks) | 331 | int dbFree(struct inode *ip, s64 blkno, s64 nblocks) |
332 | { | 332 | { |
@@ -395,23 +395,23 @@ int dbFree(struct inode *ip, s64 blkno, s64 nblocks) | |||
395 | /* | 395 | /* |
396 | * NAME: dbUpdatePMap() | 396 | * NAME: dbUpdatePMap() |
397 | * | 397 | * |
398 | * FUNCTION: update the allocation state (free or allocate) of the | 398 | * FUNCTION: update the allocation state (free or allocate) of the |
399 | * specified block range in the persistent block allocation map. | 399 | * specified block range in the persistent block allocation map. |
400 | * | 400 | * |
401 | * the blocks will be updated in the persistent map one | 401 | * the blocks will be updated in the persistent map one |
402 | * dmap at a time. | 402 | * dmap at a time. |
403 | * | 403 | * |
404 | * PARAMETERS: | 404 | * PARAMETERS: |
405 | * ipbmap - pointer to in-core inode for the block map. | 405 | * ipbmap - pointer to in-core inode for the block map. |
406 | * free - 'true' if block range is to be freed from the persistent | 406 | * free - 'true' if block range is to be freed from the persistent |
407 | * map; 'false' if it is to be allocated. | 407 | * map; 'false' if it is to be allocated. |
408 | * blkno - starting block number of the range. | 408 | * blkno - starting block number of the range. |
409 | * nblocks - number of contiguous blocks in the range. | 409 | * nblocks - number of contiguous blocks in the range. |
410 | * tblk - transaction block; | 410 | * tblk - transaction block; |
411 | * | 411 | * |
412 | * RETURN VALUES: | 412 | * RETURN VALUES: |
413 | * 0 - success | 413 | * 0 - success |
414 | * -EIO - i/o error | 414 | * -EIO - i/o error |
415 | */ | 415 | */ |
416 | int | 416 | int |
417 | dbUpdatePMap(struct inode *ipbmap, | 417 | dbUpdatePMap(struct inode *ipbmap, |
@@ -573,7 +573,7 @@ dbUpdatePMap(struct inode *ipbmap, | |||
573 | /* | 573 | /* |
574 | * NAME: dbNextAG() | 574 | * NAME: dbNextAG() |
575 | * | 575 | * |
576 | * FUNCTION: find the preferred allocation group for new allocations. | 576 | * FUNCTION: find the preferred allocation group for new allocations. |
577 | * | 577 | * |
578 | * Within the allocation groups, we maintain a preferred | 578 | * Within the allocation groups, we maintain a preferred |
579 | * allocation group which consists of a group with at least | 579 | * allocation group which consists of a group with at least |
@@ -589,10 +589,10 @@ dbUpdatePMap(struct inode *ipbmap, | |||
589 | * empty ags around for large allocations. | 589 | * empty ags around for large allocations. |
590 | * | 590 | * |
591 | * PARAMETERS: | 591 | * PARAMETERS: |
592 | * ipbmap - pointer to in-core inode for the block map. | 592 | * ipbmap - pointer to in-core inode for the block map. |
593 | * | 593 | * |
594 | * RETURN VALUES: | 594 | * RETURN VALUES: |
595 | * the preferred allocation group number. | 595 | * the preferred allocation group number. |
596 | */ | 596 | */ |
597 | int dbNextAG(struct inode *ipbmap) | 597 | int dbNextAG(struct inode *ipbmap) |
598 | { | 598 | { |
@@ -656,7 +656,7 @@ unlock: | |||
656 | /* | 656 | /* |
657 | * NAME: dbAlloc() | 657 | * NAME: dbAlloc() |
658 | * | 658 | * |
659 | * FUNCTION: attempt to allocate a specified number of contiguous free | 659 | * FUNCTION: attempt to allocate a specified number of contiguous free |
660 | * blocks from the working allocation block map. | 660 | * blocks from the working allocation block map. |
661 | * | 661 | * |
662 | * the block allocation policy uses hints and a multi-step | 662 | * the block allocation policy uses hints and a multi-step |
@@ -680,16 +680,16 @@ unlock: | |||
680 | * size or requests that specify no hint value. | 680 | * size or requests that specify no hint value. |
681 | * | 681 | * |
682 | * PARAMETERS: | 682 | * PARAMETERS: |
683 | * ip - pointer to in-core inode; | 683 | * ip - pointer to in-core inode; |
684 | * hint - allocation hint. | 684 | * hint - allocation hint. |
685 | * nblocks - number of contiguous blocks in the range. | 685 | * nblocks - number of contiguous blocks in the range. |
686 | * results - on successful return, set to the starting block number | 686 | * results - on successful return, set to the starting block number |
687 | * of the newly allocated contiguous range. | 687 | * of the newly allocated contiguous range. |
688 | * | 688 | * |
689 | * RETURN VALUES: | 689 | * RETURN VALUES: |
690 | * 0 - success | 690 | * 0 - success |
691 | * -ENOSPC - insufficient disk resources | 691 | * -ENOSPC - insufficient disk resources |
692 | * -EIO - i/o error | 692 | * -EIO - i/o error |
693 | */ | 693 | */ |
694 | int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | 694 | int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) |
695 | { | 695 | { |
@@ -706,12 +706,6 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
706 | /* assert that nblocks is valid */ | 706 | /* assert that nblocks is valid */ |
707 | assert(nblocks > 0); | 707 | assert(nblocks > 0); |
708 | 708 | ||
709 | #ifdef _STILL_TO_PORT | ||
710 | /* DASD limit check F226941 */ | ||
711 | if (OVER_LIMIT(ip, nblocks)) | ||
712 | return -ENOSPC; | ||
713 | #endif /* _STILL_TO_PORT */ | ||
714 | |||
715 | /* get the log2 number of blocks to be allocated. | 709 | /* get the log2 number of blocks to be allocated. |
716 | * if the number of blocks is not a log2 multiple, | 710 | * if the number of blocks is not a log2 multiple, |
717 | * it will be rounded up to the next log2 multiple. | 711 | * it will be rounded up to the next log2 multiple. |
@@ -720,7 +714,6 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
720 | 714 | ||
721 | bmp = JFS_SBI(ip->i_sb)->bmap; | 715 | bmp = JFS_SBI(ip->i_sb)->bmap; |
722 | 716 | ||
723 | //retry: /* serialize w.r.t.extendfs() */ | ||
724 | mapSize = bmp->db_mapsize; | 717 | mapSize = bmp->db_mapsize; |
725 | 718 | ||
726 | /* the hint should be within the map */ | 719 | /* the hint should be within the map */ |
@@ -879,17 +872,17 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
879 | /* | 872 | /* |
880 | * NAME: dbAllocExact() | 873 | * NAME: dbAllocExact() |
881 | * | 874 | * |
882 | * FUNCTION: try to allocate the requested extent; | 875 | * FUNCTION: try to allocate the requested extent; |
883 | * | 876 | * |
884 | * PARAMETERS: | 877 | * PARAMETERS: |
885 | * ip - pointer to in-core inode; | 878 | * ip - pointer to in-core inode; |
886 | * blkno - extent address; | 879 | * blkno - extent address; |
887 | * nblocks - extent length; | 880 | * nblocks - extent length; |
888 | * | 881 | * |
889 | * RETURN VALUES: | 882 | * RETURN VALUES: |
890 | * 0 - success | 883 | * 0 - success |
891 | * -ENOSPC - insufficient disk resources | 884 | * -ENOSPC - insufficient disk resources |
892 | * -EIO - i/o error | 885 | * -EIO - i/o error |
893 | */ | 886 | */ |
894 | int dbAllocExact(struct inode *ip, s64 blkno, int nblocks) | 887 | int dbAllocExact(struct inode *ip, s64 blkno, int nblocks) |
895 | { | 888 | { |
@@ -946,7 +939,7 @@ int dbAllocExact(struct inode *ip, s64 blkno, int nblocks) | |||
946 | /* | 939 | /* |
947 | * NAME: dbReAlloc() | 940 | * NAME: dbReAlloc() |
948 | * | 941 | * |
949 | * FUNCTION: attempt to extend a current allocation by a specified | 942 | * FUNCTION: attempt to extend a current allocation by a specified |
950 | * number of blocks. | 943 | * number of blocks. |
951 | * | 944 | * |
952 | * this routine attempts to satisfy the allocation request | 945 | * this routine attempts to satisfy the allocation request |
@@ -959,21 +952,21 @@ int dbAllocExact(struct inode *ip, s64 blkno, int nblocks) | |||
959 | * number of blocks required. | 952 | * number of blocks required. |
960 | * | 953 | * |
961 | * PARAMETERS: | 954 | * PARAMETERS: |
962 | * ip - pointer to in-core inode requiring allocation. | 955 | * ip - pointer to in-core inode requiring allocation. |
963 | * blkno - starting block of the current allocation. | 956 | * blkno - starting block of the current allocation. |
964 | * nblocks - number of contiguous blocks within the current | 957 | * nblocks - number of contiguous blocks within the current |
965 | * allocation. | 958 | * allocation. |
966 | * addnblocks - number of blocks to add to the allocation. | 959 | * addnblocks - number of blocks to add to the allocation. |
967 | * results - on successful return, set to the starting block number | 960 | * results - on successful return, set to the starting block number |
968 | * of the existing allocation if the existing allocation | 961 | * of the existing allocation if the existing allocation |
969 | * was extended in place or to a newly allocated contiguous | 962 | * was extended in place or to a newly allocated contiguous |
970 | * range if the existing allocation could not be extended | 963 | * range if the existing allocation could not be extended |
971 | * in place. | 964 | * in place. |
972 | * | 965 | * |
973 | * RETURN VALUES: | 966 | * RETURN VALUES: |
974 | * 0 - success | 967 | * 0 - success |
975 | * -ENOSPC - insufficient disk resources | 968 | * -ENOSPC - insufficient disk resources |
976 | * -EIO - i/o error | 969 | * -EIO - i/o error |
977 | */ | 970 | */ |
978 | int | 971 | int |
979 | dbReAlloc(struct inode *ip, | 972 | dbReAlloc(struct inode *ip, |
@@ -1004,7 +997,7 @@ dbReAlloc(struct inode *ip, | |||
1004 | /* | 997 | /* |
1005 | * NAME: dbExtend() | 998 | * NAME: dbExtend() |
1006 | * | 999 | * |
1007 | * FUNCTION: attempt to extend a current allocation by a specified | 1000 | * FUNCTION: attempt to extend a current allocation by a specified |
1008 | * number of blocks. | 1001 | * number of blocks. |
1009 | * | 1002 | * |
1010 | * this routine attempts to satisfy the allocation request | 1003 | * this routine attempts to satisfy the allocation request |
@@ -1013,16 +1006,16 @@ dbReAlloc(struct inode *ip, | |||
1013 | * immediately following the current allocation. | 1006 | * immediately following the current allocation. |
1014 | * | 1007 | * |
1015 | * PARAMETERS: | 1008 | * PARAMETERS: |
1016 | * ip - pointer to in-core inode requiring allocation. | 1009 | * ip - pointer to in-core inode requiring allocation. |
1017 | * blkno - starting block of the current allocation. | 1010 | * blkno - starting block of the current allocation. |
1018 | * nblocks - number of contiguous blocks within the current | 1011 | * nblocks - number of contiguous blocks within the current |
1019 | * allocation. | 1012 | * allocation. |
1020 | * addnblocks - number of blocks to add to the allocation. | 1013 | * addnblocks - number of blocks to add to the allocation. |
1021 | * | 1014 | * |
1022 | * RETURN VALUES: | 1015 | * RETURN VALUES: |
1023 | * 0 - success | 1016 | * 0 - success |
1024 | * -ENOSPC - insufficient disk resources | 1017 | * -ENOSPC - insufficient disk resources |
1025 | * -EIO - i/o error | 1018 | * -EIO - i/o error |
1026 | */ | 1019 | */ |
1027 | static int dbExtend(struct inode *ip, s64 blkno, s64 nblocks, s64 addnblocks) | 1020 | static int dbExtend(struct inode *ip, s64 blkno, s64 nblocks, s64 addnblocks) |
1028 | { | 1021 | { |
@@ -1109,19 +1102,19 @@ static int dbExtend(struct inode *ip, s64 blkno, s64 nblocks, s64 addnblocks) | |||
1109 | /* | 1102 | /* |
1110 | * NAME: dbAllocNext() | 1103 | * NAME: dbAllocNext() |
1111 | * | 1104 | * |
1112 | * FUNCTION: attempt to allocate the blocks of the specified block | 1105 | * FUNCTION: attempt to allocate the blocks of the specified block |
1113 | * range within a dmap. | 1106 | * range within a dmap. |
1114 | * | 1107 | * |
1115 | * PARAMETERS: | 1108 | * PARAMETERS: |
1116 | * bmp - pointer to bmap descriptor | 1109 | * bmp - pointer to bmap descriptor |
1117 | * dp - pointer to dmap. | 1110 | * dp - pointer to dmap. |
1118 | * blkno - starting block number of the range. | 1111 | * blkno - starting block number of the range. |
1119 | * nblocks - number of contiguous free blocks of the range. | 1112 | * nblocks - number of contiguous free blocks of the range. |
1120 | * | 1113 | * |
1121 | * RETURN VALUES: | 1114 | * RETURN VALUES: |
1122 | * 0 - success | 1115 | * 0 - success |
1123 | * -ENOSPC - insufficient disk resources | 1116 | * -ENOSPC - insufficient disk resources |
1124 | * -EIO - i/o error | 1117 | * -EIO - i/o error |
1125 | * | 1118 | * |
1126 | * serialization: IREAD_LOCK(ipbmap) held on entry/exit; | 1119 | * serialization: IREAD_LOCK(ipbmap) held on entry/exit; |
1127 | */ | 1120 | */ |
@@ -1233,7 +1226,7 @@ static int dbAllocNext(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
1233 | /* | 1226 | /* |
1234 | * NAME: dbAllocNear() | 1227 | * NAME: dbAllocNear() |
1235 | * | 1228 | * |
1236 | * FUNCTION: attempt to allocate a number of contiguous free blocks near | 1229 | * FUNCTION: attempt to allocate a number of contiguous free blocks near |
1237 | * a specified block (hint) within a dmap. | 1230 | * a specified block (hint) within a dmap. |
1238 | * | 1231 | * |
1239 | * starting with the dmap leaf that covers the hint, we'll | 1232 | * starting with the dmap leaf that covers the hint, we'll |
@@ -1242,18 +1235,18 @@ static int dbAllocNext(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
1242 | * the desired free space. | 1235 | * the desired free space. |
1243 | * | 1236 | * |
1244 | * PARAMETERS: | 1237 | * PARAMETERS: |
1245 | * bmp - pointer to bmap descriptor | 1238 | * bmp - pointer to bmap descriptor |
1246 | * dp - pointer to dmap. | 1239 | * dp - pointer to dmap. |
1247 | * blkno - block number to allocate near. | 1240 | * blkno - block number to allocate near. |
1248 | * nblocks - actual number of contiguous free blocks desired. | 1241 | * nblocks - actual number of contiguous free blocks desired. |
1249 | * l2nb - log2 number of contiguous free blocks desired. | 1242 | * l2nb - log2 number of contiguous free blocks desired. |
1250 | * results - on successful return, set to the starting block number | 1243 | * results - on successful return, set to the starting block number |
1251 | * of the newly allocated range. | 1244 | * of the newly allocated range. |
1252 | * | 1245 | * |
1253 | * RETURN VALUES: | 1246 | * RETURN VALUES: |
1254 | * 0 - success | 1247 | * 0 - success |
1255 | * -ENOSPC - insufficient disk resources | 1248 | * -ENOSPC - insufficient disk resources |
1256 | * -EIO - i/o error | 1249 | * -EIO - i/o error |
1257 | * | 1250 | * |
1258 | * serialization: IREAD_LOCK(ipbmap) held on entry/exit; | 1251 | * serialization: IREAD_LOCK(ipbmap) held on entry/exit; |
1259 | */ | 1252 | */ |
@@ -1316,7 +1309,7 @@ dbAllocNear(struct bmap * bmp, | |||
1316 | /* | 1309 | /* |
1317 | * NAME: dbAllocAG() | 1310 | * NAME: dbAllocAG() |
1318 | * | 1311 | * |
1319 | * FUNCTION: attempt to allocate the specified number of contiguous | 1312 | * FUNCTION: attempt to allocate the specified number of contiguous |
1320 | * free blocks within the specified allocation group. | 1313 | * free blocks within the specified allocation group. |
1321 | * | 1314 | * |
1322 | * unless the allocation group size is equal to the number | 1315 | * unless the allocation group size is equal to the number |
@@ -1353,17 +1346,17 @@ dbAllocNear(struct bmap * bmp, | |||
1353 | * the allocation group. | 1346 | * the allocation group. |
1354 | * | 1347 | * |
1355 | * PARAMETERS: | 1348 | * PARAMETERS: |
1356 | * bmp - pointer to bmap descriptor | 1349 | * bmp - pointer to bmap descriptor |
1357 | * agno - allocation group number. | 1350 | * agno - allocation group number. |
1358 | * nblocks - actual number of contiguous free blocks desired. | 1351 | * nblocks - actual number of contiguous free blocks desired. |
1359 | * l2nb - log2 number of contiguous free blocks desired. | 1352 | * l2nb - log2 number of contiguous free blocks desired. |
1360 | * results - on successful return, set to the starting block number | 1353 | * results - on successful return, set to the starting block number |
1361 | * of the newly allocated range. | 1354 | * of the newly allocated range. |
1362 | * | 1355 | * |
1363 | * RETURN VALUES: | 1356 | * RETURN VALUES: |
1364 | * 0 - success | 1357 | * 0 - success |
1365 | * -ENOSPC - insufficient disk resources | 1358 | * -ENOSPC - insufficient disk resources |
1366 | * -EIO - i/o error | 1359 | * -EIO - i/o error |
1367 | * | 1360 | * |
1368 | * note: IWRITE_LOCK(ipmap) held on entry/exit; | 1361 | * note: IWRITE_LOCK(ipmap) held on entry/exit; |
1369 | */ | 1362 | */ |
@@ -1546,7 +1539,7 @@ dbAllocAG(struct bmap * bmp, int agno, s64 nblocks, int l2nb, s64 * results) | |||
1546 | /* | 1539 | /* |
1547 | * NAME: dbAllocAny() | 1540 | * NAME: dbAllocAny() |
1548 | * | 1541 | * |
1549 | * FUNCTION: attempt to allocate the specified number of contiguous | 1542 | * FUNCTION: attempt to allocate the specified number of contiguous |
1550 | * free blocks anywhere in the file system. | 1543 | * free blocks anywhere in the file system. |
1551 | * | 1544 | * |
1552 | * dbAllocAny() attempts to find the sufficient free space by | 1545 | * dbAllocAny() attempts to find the sufficient free space by |
@@ -1556,16 +1549,16 @@ dbAllocAG(struct bmap * bmp, int agno, s64 nblocks, int l2nb, s64 * results) | |||
1556 | * desired free space is allocated. | 1549 | * desired free space is allocated. |
1557 | * | 1550 | * |
1558 | * PARAMETERS: | 1551 | * PARAMETERS: |
1559 | * bmp - pointer to bmap descriptor | 1552 | * bmp - pointer to bmap descriptor |
1560 | * nblocks - actual number of contiguous free blocks desired. | 1553 | * nblocks - actual number of contiguous free blocks desired. |
1561 | * l2nb - log2 number of contiguous free blocks desired. | 1554 | * l2nb - log2 number of contiguous free blocks desired. |
1562 | * results - on successful return, set to the starting block number | 1555 | * results - on successful return, set to the starting block number |
1563 | * of the newly allocated range. | 1556 | * of the newly allocated range. |
1564 | * | 1557 | * |
1565 | * RETURN VALUES: | 1558 | * RETURN VALUES: |
1566 | * 0 - success | 1559 | * 0 - success |
1567 | * -ENOSPC - insufficient disk resources | 1560 | * -ENOSPC - insufficient disk resources |
1568 | * -EIO - i/o error | 1561 | * -EIO - i/o error |
1569 | * | 1562 | * |
1570 | * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; | 1563 | * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; |
1571 | */ | 1564 | */ |
@@ -1598,9 +1591,9 @@ static int dbAllocAny(struct bmap * bmp, s64 nblocks, int l2nb, s64 * results) | |||
1598 | /* | 1591 | /* |
1599 | * NAME: dbFindCtl() | 1592 | * NAME: dbFindCtl() |
1600 | * | 1593 | * |
1601 | * FUNCTION: starting at a specified dmap control page level and block | 1594 | * FUNCTION: starting at a specified dmap control page level and block |
1602 | * number, search down the dmap control levels for a range of | 1595 | * number, search down the dmap control levels for a range of |
1603 | * contiguous free blocks large enough to satisfy an allocation | 1596 | * contiguous free blocks large enough to satisfy an allocation |
1604 | * request for the specified number of free blocks. | 1597 | * request for the specified number of free blocks. |
1605 | * | 1598 | * |
1606 | * if sufficient contiguous free blocks are found, this routine | 1599 | * if sufficient contiguous free blocks are found, this routine |
@@ -1609,17 +1602,17 @@ static int dbAllocAny(struct bmap * bmp, s64 nblocks, int l2nb, s64 * results) | |||
1609 | * is sufficient in size. | 1602 | * is sufficient in size. |
1610 | * | 1603 | * |
1611 | * PARAMETERS: | 1604 | * PARAMETERS: |
1612 | * bmp - pointer to bmap descriptor | 1605 | * bmp - pointer to bmap descriptor |
1613 | * level - starting dmap control page level. | 1606 | * level - starting dmap control page level. |
1614 | * l2nb - log2 number of contiguous free blocks desired. | 1607 | * l2nb - log2 number of contiguous free blocks desired. |
1615 | * *blkno - on entry, starting block number for conducting the search. | 1608 | * *blkno - on entry, starting block number for conducting the search. |
1616 | * on successful return, the first block within a dmap page | 1609 | * on successful return, the first block within a dmap page |
1617 | * that contains or starts a range of contiguous free blocks. | 1610 | * that contains or starts a range of contiguous free blocks. |
1618 | * | 1611 | * |
1619 | * RETURN VALUES: | 1612 | * RETURN VALUES: |
1620 | * 0 - success | 1613 | * 0 - success |
1621 | * -ENOSPC - insufficient disk resources | 1614 | * -ENOSPC - insufficient disk resources |
1622 | * -EIO - i/o error | 1615 | * -EIO - i/o error |
1623 | * | 1616 | * |
1624 | * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; | 1617 | * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; |
1625 | */ | 1618 | */ |
@@ -1699,7 +1692,7 @@ static int dbFindCtl(struct bmap * bmp, int l2nb, int level, s64 * blkno) | |||
1699 | /* | 1692 | /* |
1700 | * NAME: dbAllocCtl() | 1693 | * NAME: dbAllocCtl() |
1701 | * | 1694 | * |
1702 | * FUNCTION: attempt to allocate a specified number of contiguous | 1695 | * FUNCTION: attempt to allocate a specified number of contiguous |
1703 | * blocks starting within a specific dmap. | 1696 | * blocks starting within a specific dmap. |
1704 | * | 1697 | * |
1705 | * this routine is called by higher level routines that search | 1698 | * this routine is called by higher level routines that search |
@@ -1726,18 +1719,18 @@ static int dbFindCtl(struct bmap * bmp, int l2nb, int level, s64 * blkno) | |||
1726 | * first dmap (i.e. blkno). | 1719 | * first dmap (i.e. blkno). |
1727 | * | 1720 | * |
1728 | * PARAMETERS: | 1721 | * PARAMETERS: |
1729 | * bmp - pointer to bmap descriptor | 1722 | * bmp - pointer to bmap descriptor |
1730 | * nblocks - actual number of contiguous free blocks to allocate. | 1723 | * nblocks - actual number of contiguous free blocks to allocate. |
1731 | * l2nb - log2 number of contiguous free blocks to allocate. | 1724 | * l2nb - log2 number of contiguous free blocks to allocate. |
1732 | * blkno - starting block number of the dmap to start the allocation | 1725 | * blkno - starting block number of the dmap to start the allocation |
1733 | * from. | 1726 | * from. |
1734 | * results - on successful return, set to the starting block number | 1727 | * results - on successful return, set to the starting block number |
1735 | * of the newly allocated range. | 1728 | * of the newly allocated range. |
1736 | * | 1729 | * |
1737 | * RETURN VALUES: | 1730 | * RETURN VALUES: |
1738 | * 0 - success | 1731 | * 0 - success |
1739 | * -ENOSPC - insufficient disk resources | 1732 | * -ENOSPC - insufficient disk resources |
1740 | * -EIO - i/o error | 1733 | * -EIO - i/o error |
1741 | * | 1734 | * |
1742 | * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; | 1735 | * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; |
1743 | */ | 1736 | */ |
@@ -1870,7 +1863,7 @@ dbAllocCtl(struct bmap * bmp, s64 nblocks, int l2nb, s64 blkno, s64 * results) | |||
1870 | /* | 1863 | /* |
1871 | * NAME: dbAllocDmapLev() | 1864 | * NAME: dbAllocDmapLev() |
1872 | * | 1865 | * |
1873 | * FUNCTION: attempt to allocate a specified number of contiguous blocks | 1866 | * FUNCTION: attempt to allocate a specified number of contiguous blocks |
1874 | * from a specified dmap. | 1867 | * from a specified dmap. |
1875 | * | 1868 | * |
1876 | * this routine checks if the contiguous blocks are available. | 1869 | * this routine checks if the contiguous blocks are available. |
@@ -1878,17 +1871,17 @@ dbAllocCtl(struct bmap * bmp, s64 nblocks, int l2nb, s64 blkno, s64 * results) | |||
1878 | * returned. | 1871 | * returned. |
1879 | * | 1872 | * |
1880 | * PARAMETERS: | 1873 | * PARAMETERS: |
1881 | * mp - pointer to bmap descriptor | 1874 | * mp - pointer to bmap descriptor |
1882 | * dp - pointer to dmap to attempt to allocate blocks from. | 1875 | * dp - pointer to dmap to attempt to allocate blocks from. |
1883 | * l2nb - log2 number of contiguous block desired. | 1876 | * l2nb - log2 number of contiguous block desired. |
1884 | * nblocks - actual number of contiguous block desired. | 1877 | * nblocks - actual number of contiguous block desired. |
1885 | * results - on successful return, set to the starting block number | 1878 | * results - on successful return, set to the starting block number |
1886 | * of the newly allocated range. | 1879 | * of the newly allocated range. |
1887 | * | 1880 | * |
1888 | * RETURN VALUES: | 1881 | * RETURN VALUES: |
1889 | * 0 - success | 1882 | * 0 - success |
1890 | * -ENOSPC - insufficient disk resources | 1883 | * -ENOSPC - insufficient disk resources |
1891 | * -EIO - i/o error | 1884 | * -EIO - i/o error |
1892 | * | 1885 | * |
1893 | * serialization: IREAD_LOCK(ipbmap), e.g., from dbAlloc(), or | 1886 | * serialization: IREAD_LOCK(ipbmap), e.g., from dbAlloc(), or |
1894 | * IWRITE_LOCK(ipbmap), e.g., dbAllocCtl(), held on entry/exit; | 1887 | * IWRITE_LOCK(ipbmap), e.g., dbAllocCtl(), held on entry/exit; |
@@ -1933,7 +1926,7 @@ dbAllocDmapLev(struct bmap * bmp, | |||
1933 | /* | 1926 | /* |
1934 | * NAME: dbAllocDmap() | 1927 | * NAME: dbAllocDmap() |
1935 | * | 1928 | * |
1936 | * FUNCTION: adjust the disk allocation map to reflect the allocation | 1929 | * FUNCTION: adjust the disk allocation map to reflect the allocation |
1937 | * of a specified block range within a dmap. | 1930 | * of a specified block range within a dmap. |
1938 | * | 1931 | * |
1939 | * this routine allocates the specified blocks from the dmap | 1932 | * this routine allocates the specified blocks from the dmap |
@@ -1946,14 +1939,14 @@ dbAllocDmapLev(struct bmap * bmp, | |||
1946 | * covers this dmap. | 1939 | * covers this dmap. |
1947 | * | 1940 | * |
1948 | * PARAMETERS: | 1941 | * PARAMETERS: |
1949 | * bmp - pointer to bmap descriptor | 1942 | * bmp - pointer to bmap descriptor |
1950 | * dp - pointer to dmap to allocate the block range from. | 1943 | * dp - pointer to dmap to allocate the block range from. |
1951 | * blkno - starting block number of the block to be allocated. | 1944 | * blkno - starting block number of the block to be allocated. |
1952 | * nblocks - number of blocks to be allocated. | 1945 | * nblocks - number of blocks to be allocated. |
1953 | * | 1946 | * |
1954 | * RETURN VALUES: | 1947 | * RETURN VALUES: |
1955 | * 0 - success | 1948 | * 0 - success |
1956 | * -EIO - i/o error | 1949 | * -EIO - i/o error |
1957 | * | 1950 | * |
1958 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; | 1951 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; |
1959 | */ | 1952 | */ |
@@ -1989,7 +1982,7 @@ static int dbAllocDmap(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
1989 | /* | 1982 | /* |
1990 | * NAME: dbFreeDmap() | 1983 | * NAME: dbFreeDmap() |
1991 | * | 1984 | * |
1992 | * FUNCTION: adjust the disk allocation map to reflect the allocation | 1985 | * FUNCTION: adjust the disk allocation map to reflect the allocation |
1993 | * of a specified block range within a dmap. | 1986 | * of a specified block range within a dmap. |
1994 | * | 1987 | * |
1995 | * this routine frees the specified blocks from the dmap through | 1988 | * this routine frees the specified blocks from the dmap through |
@@ -1997,18 +1990,18 @@ static int dbAllocDmap(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
1997 | * causes the maximum string of free blocks within the dmap to | 1990 | * causes the maximum string of free blocks within the dmap to |
1998 | * change (i.e. the value of the root of the dmap's dmtree), this | 1991 | * change (i.e. the value of the root of the dmap's dmtree), this |
1999 | * routine will cause this change to be reflected up through the | 1992 | * routine will cause this change to be reflected up through the |
2000 | * appropriate levels of the dmap control pages by a call to | 1993 | * appropriate levels of the dmap control pages by a call to |
2001 | * dbAdjCtl() for the L0 dmap control page that covers this dmap. | 1994 | * dbAdjCtl() for the L0 dmap control page that covers this dmap. |
2002 | * | 1995 | * |
2003 | * PARAMETERS: | 1996 | * PARAMETERS: |
2004 | * bmp - pointer to bmap descriptor | 1997 | * bmp - pointer to bmap descriptor |
2005 | * dp - pointer to dmap to free the block range from. | 1998 | * dp - pointer to dmap to free the block range from. |
2006 | * blkno - starting block number of the block to be freed. | 1999 | * blkno - starting block number of the block to be freed. |
2007 | * nblocks - number of blocks to be freed. | 2000 | * nblocks - number of blocks to be freed. |
2008 | * | 2001 | * |
2009 | * RETURN VALUES: | 2002 | * RETURN VALUES: |
2010 | * 0 - success | 2003 | * 0 - success |
2011 | * -EIO - i/o error | 2004 | * -EIO - i/o error |
2012 | * | 2005 | * |
2013 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; | 2006 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; |
2014 | */ | 2007 | */ |
@@ -2055,7 +2048,7 @@ static int dbFreeDmap(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
2055 | /* | 2048 | /* |
2056 | * NAME: dbAllocBits() | 2049 | * NAME: dbAllocBits() |
2057 | * | 2050 | * |
2058 | * FUNCTION: allocate a specified block range from a dmap. | 2051 | * FUNCTION: allocate a specified block range from a dmap. |
2059 | * | 2052 | * |
2060 | * this routine updates the dmap to reflect the working | 2053 | * this routine updates the dmap to reflect the working |
2061 | * state allocation of the specified block range. it directly | 2054 | * state allocation of the specified block range. it directly |
@@ -2065,10 +2058,10 @@ static int dbFreeDmap(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
2065 | * dmap's dmtree, as a whole, to reflect the allocated range. | 2058 | * dmap's dmtree, as a whole, to reflect the allocated range. |
2066 | * | 2059 | * |
2067 | * PARAMETERS: | 2060 | * PARAMETERS: |
2068 | * bmp - pointer to bmap descriptor | 2061 | * bmp - pointer to bmap descriptor |
2069 | * dp - pointer to dmap to allocate bits from. | 2062 | * dp - pointer to dmap to allocate bits from. |
2070 | * blkno - starting block number of the bits to be allocated. | 2063 | * blkno - starting block number of the bits to be allocated. |
2071 | * nblocks - number of bits to be allocated. | 2064 | * nblocks - number of bits to be allocated. |
2072 | * | 2065 | * |
2073 | * RETURN VALUES: none | 2066 | * RETURN VALUES: none |
2074 | * | 2067 | * |
@@ -2149,7 +2142,7 @@ static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
2149 | * the allocated words. | 2142 | * the allocated words. |
2150 | */ | 2143 | */ |
2151 | for (; nwords > 0; nwords -= nw) { | 2144 | for (; nwords > 0; nwords -= nw) { |
2152 | if (leaf[word] < BUDMIN) { | 2145 | if (leaf[word] < BUDMIN) { |
2153 | jfs_error(bmp->db_ipbmap->i_sb, | 2146 | jfs_error(bmp->db_ipbmap->i_sb, |
2154 | "dbAllocBits: leaf page " | 2147 | "dbAllocBits: leaf page " |
2155 | "corrupt"); | 2148 | "corrupt"); |
@@ -2202,7 +2195,7 @@ static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
2202 | /* | 2195 | /* |
2203 | * NAME: dbFreeBits() | 2196 | * NAME: dbFreeBits() |
2204 | * | 2197 | * |
2205 | * FUNCTION: free a specified block range from a dmap. | 2198 | * FUNCTION: free a specified block range from a dmap. |
2206 | * | 2199 | * |
2207 | * this routine updates the dmap to reflect the working | 2200 | * this routine updates the dmap to reflect the working |
2208 | * state allocation of the specified block range. it directly | 2201 | * state allocation of the specified block range. it directly |
@@ -2212,10 +2205,10 @@ static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
2212 | * dmtree, as a whole, to reflect the deallocated range. | 2205 | * dmtree, as a whole, to reflect the deallocated range. |
2213 | * | 2206 | * |
2214 | * PARAMETERS: | 2207 | * PARAMETERS: |
2215 | * bmp - pointer to bmap descriptor | 2208 | * bmp - pointer to bmap descriptor |
2216 | * dp - pointer to dmap to free bits from. | 2209 | * dp - pointer to dmap to free bits from. |
2217 | * blkno - starting block number of the bits to be freed. | 2210 | * blkno - starting block number of the bits to be freed. |
2218 | * nblocks - number of bits to be freed. | 2211 | * nblocks - number of bits to be freed. |
2219 | * | 2212 | * |
2220 | * RETURN VALUES: 0 for success | 2213 | * RETURN VALUES: 0 for success |
2221 | * | 2214 | * |
@@ -2388,19 +2381,19 @@ static int dbFreeBits(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
2388 | * the new root value and the next dmap control page level to | 2381 | * the new root value and the next dmap control page level to |
2389 | * be adjusted. | 2382 | * be adjusted. |
2390 | * PARAMETERS: | 2383 | * PARAMETERS: |
2391 | * bmp - pointer to bmap descriptor | 2384 | * bmp - pointer to bmap descriptor |
2392 | * blkno - the first block of a block range within a dmap. it is | 2385 | * blkno - the first block of a block range within a dmap. it is |
2393 | * the allocation or deallocation of this block range that | 2386 | * the allocation or deallocation of this block range that |
2394 | * requires the dmap control page to be adjusted. | 2387 | * requires the dmap control page to be adjusted. |
2395 | * newval - the new value of the lower level dmap or dmap control | 2388 | * newval - the new value of the lower level dmap or dmap control |
2396 | * page root. | 2389 | * page root. |
2397 | * alloc - 'true' if adjustment is due to an allocation. | 2390 | * alloc - 'true' if adjustment is due to an allocation. |
2398 | * level - current level of dmap control page (i.e. L0, L1, L2) to | 2391 | * level - current level of dmap control page (i.e. L0, L1, L2) to |
2399 | * be adjusted. | 2392 | * be adjusted. |
2400 | * | 2393 | * |
2401 | * RETURN VALUES: | 2394 | * RETURN VALUES: |
2402 | * 0 - success | 2395 | * 0 - success |
2403 | * -EIO - i/o error | 2396 | * -EIO - i/o error |
2404 | * | 2397 | * |
2405 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; | 2398 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; |
2406 | */ | 2399 | */ |
@@ -2544,16 +2537,16 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level) | |||
2544 | /* | 2537 | /* |
2545 | * NAME: dbSplit() | 2538 | * NAME: dbSplit() |
2546 | * | 2539 | * |
2547 | * FUNCTION: update the leaf of a dmtree with a new value, splitting | 2540 | * FUNCTION: update the leaf of a dmtree with a new value, splitting |
2548 | * the leaf from the binary buddy system of the dmtree's | 2541 | * the leaf from the binary buddy system of the dmtree's |
2549 | * leaves, as required. | 2542 | * leaves, as required. |
2550 | * | 2543 | * |
2551 | * PARAMETERS: | 2544 | * PARAMETERS: |
2552 | * tp - pointer to the tree containing the leaf. | 2545 | * tp - pointer to the tree containing the leaf. |
2553 | * leafno - the number of the leaf to be updated. | 2546 | * leafno - the number of the leaf to be updated. |
2554 | * splitsz - the size the binary buddy system starting at the leaf | 2547 | * splitsz - the size the binary buddy system starting at the leaf |
2555 | * must be split to, specified as the log2 number of blocks. | 2548 | * must be split to, specified as the log2 number of blocks. |
2556 | * newval - the new value for the leaf. | 2549 | * newval - the new value for the leaf. |
2557 | * | 2550 | * |
2558 | * RETURN VALUES: none | 2551 | * RETURN VALUES: none |
2559 | * | 2552 | * |
@@ -2600,7 +2593,7 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval) | |||
2600 | /* | 2593 | /* |
2601 | * NAME: dbBackSplit() | 2594 | * NAME: dbBackSplit() |
2602 | * | 2595 | * |
2603 | * FUNCTION: back split the binary buddy system of dmtree leaves | 2596 | * FUNCTION: back split the binary buddy system of dmtree leaves |
2604 | * that hold a specified leaf until the specified leaf | 2597 | * that hold a specified leaf until the specified leaf |
2605 | * starts its own binary buddy system. | 2598 | * starts its own binary buddy system. |
2606 | * | 2599 | * |
@@ -2617,8 +2610,8 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval) | |||
2617 | * in which a previous join operation must be backed out. | 2610 | * in which a previous join operation must be backed out. |
2618 | * | 2611 | * |
2619 | * PARAMETERS: | 2612 | * PARAMETERS: |
2620 | * tp - pointer to the tree containing the leaf. | 2613 | * tp - pointer to the tree containing the leaf. |
2621 | * leafno - the number of the leaf to be updated. | 2614 | * leafno - the number of the leaf to be updated. |
2622 | * | 2615 | * |
2623 | * RETURN VALUES: none | 2616 | * RETURN VALUES: none |
2624 | * | 2617 | * |
@@ -2692,14 +2685,14 @@ static int dbBackSplit(dmtree_t * tp, int leafno) | |||
2692 | /* | 2685 | /* |
2693 | * NAME: dbJoin() | 2686 | * NAME: dbJoin() |
2694 | * | 2687 | * |
2695 | * FUNCTION: update the leaf of a dmtree with a new value, joining | 2688 | * FUNCTION: update the leaf of a dmtree with a new value, joining |
2696 | * the leaf with other leaves of the dmtree into a multi-leaf | 2689 | * the leaf with other leaves of the dmtree into a multi-leaf |
2697 | * binary buddy system, as required. | 2690 | * binary buddy system, as required. |
2698 | * | 2691 | * |
2699 | * PARAMETERS: | 2692 | * PARAMETERS: |
2700 | * tp - pointer to the tree containing the leaf. | 2693 | * tp - pointer to the tree containing the leaf. |
2701 | * leafno - the number of the leaf to be updated. | 2694 | * leafno - the number of the leaf to be updated. |
2702 | * newval - the new value for the leaf. | 2695 | * newval - the new value for the leaf. |
2703 | * | 2696 | * |
2704 | * RETURN VALUES: none | 2697 | * RETURN VALUES: none |
2705 | */ | 2698 | */ |
@@ -2785,15 +2778,15 @@ static int dbJoin(dmtree_t * tp, int leafno, int newval) | |||
2785 | /* | 2778 | /* |
2786 | * NAME: dbAdjTree() | 2779 | * NAME: dbAdjTree() |
2787 | * | 2780 | * |
2788 | * FUNCTION: update a leaf of a dmtree with a new value, adjusting | 2781 | * FUNCTION: update a leaf of a dmtree with a new value, adjusting |
2789 | * the dmtree, as required, to reflect the new leaf value. | 2782 | * the dmtree, as required, to reflect the new leaf value. |
2790 | * the combination of any buddies must already be done before | 2783 | * the combination of any buddies must already be done before |
2791 | * this is called. | 2784 | * this is called. |
2792 | * | 2785 | * |
2793 | * PARAMETERS: | 2786 | * PARAMETERS: |
2794 | * tp - pointer to the tree to be adjusted. | 2787 | * tp - pointer to the tree to be adjusted. |
2795 | * leafno - the number of the leaf to be updated. | 2788 | * leafno - the number of the leaf to be updated. |
2796 | * newval - the new value for the leaf. | 2789 | * newval - the new value for the leaf. |
2797 | * | 2790 | * |
2798 | * RETURN VALUES: none | 2791 | * RETURN VALUES: none |
2799 | */ | 2792 | */ |
@@ -2852,7 +2845,7 @@ static void dbAdjTree(dmtree_t * tp, int leafno, int newval) | |||
2852 | /* | 2845 | /* |
2853 | * NAME: dbFindLeaf() | 2846 | * NAME: dbFindLeaf() |
2854 | * | 2847 | * |
2855 | * FUNCTION: search a dmtree_t for sufficient free blocks, returning | 2848 | * FUNCTION: search a dmtree_t for sufficient free blocks, returning |
2856 | * the index of a leaf describing the free blocks if | 2849 | * the index of a leaf describing the free blocks if |
2857 | * sufficient free blocks are found. | 2850 | * sufficient free blocks are found. |
2858 | * | 2851 | * |
@@ -2861,15 +2854,15 @@ static void dbAdjTree(dmtree_t * tp, int leafno, int newval) | |||
2861 | * free space. | 2854 | * free space. |
2862 | * | 2855 | * |
2863 | * PARAMETERS: | 2856 | * PARAMETERS: |
2864 | * tp - pointer to the tree to be searched. | 2857 | * tp - pointer to the tree to be searched. |
2865 | * l2nb - log2 number of free blocks to search for. | 2858 | * l2nb - log2 number of free blocks to search for. |
2866 | * leafidx - return pointer to be set to the index of the leaf | 2859 | * leafidx - return pointer to be set to the index of the leaf |
2867 | * describing at least l2nb free blocks if sufficient | 2860 | * describing at least l2nb free blocks if sufficient |
2868 | * free blocks are found. | 2861 | * free blocks are found. |
2869 | * | 2862 | * |
2870 | * RETURN VALUES: | 2863 | * RETURN VALUES: |
2871 | * 0 - success | 2864 | * 0 - success |
2872 | * -ENOSPC - insufficient free blocks. | 2865 | * -ENOSPC - insufficient free blocks. |
2873 | */ | 2866 | */ |
2874 | static int dbFindLeaf(dmtree_t * tp, int l2nb, int *leafidx) | 2867 | static int dbFindLeaf(dmtree_t * tp, int l2nb, int *leafidx) |
2875 | { | 2868 | { |
@@ -2916,18 +2909,18 @@ static int dbFindLeaf(dmtree_t * tp, int l2nb, int *leafidx) | |||
2916 | /* | 2909 | /* |
2917 | * NAME: dbFindBits() | 2910 | * NAME: dbFindBits() |
2918 | * | 2911 | * |
2919 | * FUNCTION: find a specified number of binary buddy free bits within a | 2912 | * FUNCTION: find a specified number of binary buddy free bits within a |
2920 | * dmap bitmap word value. | 2913 | * dmap bitmap word value. |
2921 | * | 2914 | * |
2922 | * this routine searches the bitmap value for (1 << l2nb) free | 2915 | * this routine searches the bitmap value for (1 << l2nb) free |
2923 | * bits at (1 << l2nb) alignments within the value. | 2916 | * bits at (1 << l2nb) alignments within the value. |
2924 | * | 2917 | * |
2925 | * PARAMETERS: | 2918 | * PARAMETERS: |
2926 | * word - dmap bitmap word value. | 2919 | * word - dmap bitmap word value. |
2927 | * l2nb - number of free bits specified as a log2 number. | 2920 | * l2nb - number of free bits specified as a log2 number. |
2928 | * | 2921 | * |
2929 | * RETURN VALUES: | 2922 | * RETURN VALUES: |
2930 | * starting bit number of free bits. | 2923 | * starting bit number of free bits. |
2931 | */ | 2924 | */ |
2932 | static int dbFindBits(u32 word, int l2nb) | 2925 | static int dbFindBits(u32 word, int l2nb) |
2933 | { | 2926 | { |
@@ -2963,14 +2956,14 @@ static int dbFindBits(u32 word, int l2nb) | |||
2963 | /* | 2956 | /* |
2964 | * NAME: dbMaxBud(u8 *cp) | 2957 | * NAME: dbMaxBud(u8 *cp) |
2965 | * | 2958 | * |
2966 | * FUNCTION: determine the largest binary buddy string of free | 2959 | * FUNCTION: determine the largest binary buddy string of free |
2967 | * bits within 32-bits of the map. | 2960 | * bits within 32-bits of the map. |
2968 | * | 2961 | * |
2969 | * PARAMETERS: | 2962 | * PARAMETERS: |
2970 | * cp - pointer to the 32-bit value. | 2963 | * cp - pointer to the 32-bit value. |
2971 | * | 2964 | * |
2972 | * RETURN VALUES: | 2965 | * RETURN VALUES: |
2973 | * largest binary buddy of free bits within a dmap word. | 2966 | * largest binary buddy of free bits within a dmap word. |
2974 | */ | 2967 | */ |
2975 | static int dbMaxBud(u8 * cp) | 2968 | static int dbMaxBud(u8 * cp) |
2976 | { | 2969 | { |
@@ -3000,14 +2993,14 @@ static int dbMaxBud(u8 * cp) | |||
3000 | /* | 2993 | /* |
3001 | * NAME: cnttz(uint word) | 2994 | * NAME: cnttz(uint word) |
3002 | * | 2995 | * |
3003 | * FUNCTION: determine the number of trailing zeros within a 32-bit | 2996 | * FUNCTION: determine the number of trailing zeros within a 32-bit |
3004 | * value. | 2997 | * value. |
3005 | * | 2998 | * |
3006 | * PARAMETERS: | 2999 | * PARAMETERS: |
3007 | * value - 32-bit value to be examined. | 3000 | * value - 32-bit value to be examined. |
3008 | * | 3001 | * |
3009 | * RETURN VALUES: | 3002 | * RETURN VALUES: |
3010 | * count of trailing zeros | 3003 | * count of trailing zeros |
3011 | */ | 3004 | */ |
3012 | static int cnttz(u32 word) | 3005 | static int cnttz(u32 word) |
3013 | { | 3006 | { |
@@ -3025,14 +3018,14 @@ static int cnttz(u32 word) | |||
3025 | /* | 3018 | /* |
3026 | * NAME: cntlz(u32 value) | 3019 | * NAME: cntlz(u32 value) |
3027 | * | 3020 | * |
3028 | * FUNCTION: determine the number of leading zeros within a 32-bit | 3021 | * FUNCTION: determine the number of leading zeros within a 32-bit |
3029 | * value. | 3022 | * value. |
3030 | * | 3023 | * |
3031 | * PARAMETERS: | 3024 | * PARAMETERS: |
3032 | * value - 32-bit value to be examined. | 3025 | * value - 32-bit value to be examined. |
3033 | * | 3026 | * |
3034 | * RETURN VALUES: | 3027 | * RETURN VALUES: |
3035 | * count of leading zeros | 3028 | * count of leading zeros |
3036 | */ | 3029 | */ |
3037 | static int cntlz(u32 value) | 3030 | static int cntlz(u32 value) |
3038 | { | 3031 | { |
@@ -3050,14 +3043,14 @@ static int cntlz(u32 value) | |||
3050 | * NAME: blkstol2(s64 nb) | 3043 | * NAME: blkstol2(s64 nb) |
3051 | * | 3044 | * |
3052 | * FUNCTION: convert a block count to its log2 value. if the block | 3045 | * FUNCTION: convert a block count to its log2 value. if the block |
3053 | * count is not a l2 multiple, it is rounded up to the next | 3046 | * count is not a l2 multiple, it is rounded up to the next |
3054 | * larger l2 multiple. | 3047 | * larger l2 multiple. |
3055 | * | 3048 | * |
3056 | * PARAMETERS: | 3049 | * PARAMETERS: |
3057 | * nb - number of blocks | 3050 | * nb - number of blocks |
3058 | * | 3051 | * |
3059 | * RETURN VALUES: | 3052 | * RETURN VALUES: |
3060 | * log2 number of blocks | 3053 | * log2 number of blocks |
3061 | */ | 3054 | */ |
3062 | static int blkstol2(s64 nb) | 3055 | static int blkstol2(s64 nb) |
3063 | { | 3056 | { |
@@ -3099,13 +3092,13 @@ static int blkstol2(s64 nb) | |||
3099 | * at a time. | 3092 | * at a time. |
3100 | * | 3093 | * |
3101 | * PARAMETERS: | 3094 | * PARAMETERS: |
3102 | * ip - pointer to in-core inode; | 3095 | * ip - pointer to in-core inode; |
3103 | * blkno - starting block number to be freed. | 3096 | * blkno - starting block number to be freed. |
3104 | * nblocks - number of blocks to be freed. | 3097 | * nblocks - number of blocks to be freed. |
3105 | * | 3098 | * |
3106 | * RETURN VALUES: | 3099 | * RETURN VALUES: |
3107 | * 0 - success | 3100 | * 0 - success |
3108 | * -EIO - i/o error | 3101 | * -EIO - i/o error |
3109 | */ | 3102 | */ |
3110 | int dbAllocBottomUp(struct inode *ip, s64 blkno, s64 nblocks) | 3103 | int dbAllocBottomUp(struct inode *ip, s64 blkno, s64 nblocks) |
3111 | { | 3104 | { |
@@ -3278,10 +3271,10 @@ static int dbAllocDmapBU(struct bmap * bmp, struct dmap * dp, s64 blkno, | |||
3278 | * L2 | 3271 | * L2 |
3279 | * | | 3272 | * | |
3280 | * L1---------------------------------L1 | 3273 | * L1---------------------------------L1 |
3281 | * | | | 3274 | * | | |
3282 | * L0---------L0---------L0 L0---------L0---------L0 | 3275 | * L0---------L0---------L0 L0---------L0---------L0 |
3283 | * | | | | | | | 3276 | * | | | | | | |
3284 | * d0,...,dn d0,...,dn d0,...,dn d0,...,dn d0,...,dn d0,.,dm; | 3277 | * d0,...,dn d0,...,dn d0,...,dn d0,...,dn d0,...,dn d0,.,dm; |
3285 | * L2L1L0d0,...,dnL0d0,...,dnL0d0,...,dnL1L0d0,...,dnL0d0,...,dnL0d0,..dm | 3278 | * L2L1L0d0,...,dnL0d0,...,dnL0d0,...,dnL1L0d0,...,dnL0d0,...,dnL0d0,..dm |
3286 | * | 3279 | * |
3287 | * <---old---><----------------------------extend-----------------------> | 3280 | * <---old---><----------------------------extend-----------------------> |
@@ -3307,7 +3300,7 @@ int dbExtendFS(struct inode *ipbmap, s64 blkno, s64 nblocks) | |||
3307 | (long long) blkno, (long long) nblocks, (long long) newsize); | 3300 | (long long) blkno, (long long) nblocks, (long long) newsize); |
3308 | 3301 | ||
3309 | /* | 3302 | /* |
3310 | * initialize bmap control page. | 3303 | * initialize bmap control page. |
3311 | * | 3304 | * |
3312 | * all the data in bmap control page should exclude | 3305 | * all the data in bmap control page should exclude |
3313 | * the mkfs hidden dmap page. | 3306 | * the mkfs hidden dmap page. |
@@ -3330,7 +3323,7 @@ int dbExtendFS(struct inode *ipbmap, s64 blkno, s64 nblocks) | |||
3330 | bmp->db_numag += ((u32) newsize % (u32) bmp->db_agsize) ? 1 : 0; | 3323 | bmp->db_numag += ((u32) newsize % (u32) bmp->db_agsize) ? 1 : 0; |
3331 | 3324 | ||
3332 | /* | 3325 | /* |
3333 | * reconfigure db_agfree[] | 3326 | * reconfigure db_agfree[] |
3334 | * from old AG configuration to new AG configuration; | 3327 | * from old AG configuration to new AG configuration; |
3335 | * | 3328 | * |
3336 | * coalesce contiguous k (newAGSize/oldAGSize) AGs; | 3329 | * coalesce contiguous k (newAGSize/oldAGSize) AGs; |
@@ -3362,7 +3355,7 @@ int dbExtendFS(struct inode *ipbmap, s64 blkno, s64 nblocks) | |||
3362 | bmp->db_maxag = bmp->db_maxag / k; | 3355 | bmp->db_maxag = bmp->db_maxag / k; |
3363 | 3356 | ||
3364 | /* | 3357 | /* |
3365 | * extend bmap | 3358 | * extend bmap |
3366 | * | 3359 | * |
3367 | * update bit maps and corresponding level control pages; | 3360 | * update bit maps and corresponding level control pages; |
3368 | * global control page db_nfree, db_agfree[agno], db_maxfreebud; | 3361 | * global control page db_nfree, db_agfree[agno], db_maxfreebud; |
@@ -3410,7 +3403,7 @@ int dbExtendFS(struct inode *ipbmap, s64 blkno, s64 nblocks) | |||
3410 | /* compute start L0 */ | 3403 | /* compute start L0 */ |
3411 | j = 0; | 3404 | j = 0; |
3412 | l1leaf = l1dcp->stree + CTLLEAFIND; | 3405 | l1leaf = l1dcp->stree + CTLLEAFIND; |
3413 | p += nbperpage; /* 1st L0 of L1.k */ | 3406 | p += nbperpage; /* 1st L0 of L1.k */ |
3414 | } | 3407 | } |
3415 | 3408 | ||
3416 | /* | 3409 | /* |
@@ -3548,7 +3541,7 @@ errout: | |||
3548 | return -EIO; | 3541 | return -EIO; |
3549 | 3542 | ||
3550 | /* | 3543 | /* |
3551 | * finalize bmap control page | 3544 | * finalize bmap control page |
3552 | */ | 3545 | */ |
3553 | finalize: | 3546 | finalize: |
3554 | 3547 | ||
@@ -3567,7 +3560,7 @@ void dbFinalizeBmap(struct inode *ipbmap) | |||
3567 | int i, n; | 3560 | int i, n; |
3568 | 3561 | ||
3569 | /* | 3562 | /* |
3570 | * finalize bmap control page | 3563 | * finalize bmap control page |
3571 | */ | 3564 | */ |
3572 | //finalize: | 3565 | //finalize: |
3573 | /* | 3566 | /* |
@@ -3953,8 +3946,8 @@ static int dbGetL2AGSize(s64 nblocks) | |||
3953 | * convert number of map pages to the zero origin top dmapctl level | 3946 | * convert number of map pages to the zero origin top dmapctl level |
3954 | */ | 3947 | */ |
3955 | #define BMAPPGTOLEV(npages) \ | 3948 | #define BMAPPGTOLEV(npages) \ |
3956 | (((npages) <= 3 + MAXL0PAGES) ? 0 \ | 3949 | (((npages) <= 3 + MAXL0PAGES) ? 0 : \ |
3957 | : ((npages) <= 2 + MAXL1PAGES) ? 1 : 2) | 3950 | ((npages) <= 2 + MAXL1PAGES) ? 1 : 2) |
3958 | 3951 | ||
3959 | s64 dbMapFileSizeToMapSize(struct inode * ipbmap) | 3952 | s64 dbMapFileSizeToMapSize(struct inode * ipbmap) |
3960 | { | 3953 | { |
@@ -3981,8 +3974,8 @@ s64 dbMapFileSizeToMapSize(struct inode * ipbmap) | |||
3981 | factor = | 3974 | factor = |
3982 | (i == 2) ? MAXL1PAGES : ((i == 1) ? MAXL0PAGES : 1); | 3975 | (i == 2) ? MAXL1PAGES : ((i == 1) ? MAXL0PAGES : 1); |
3983 | complete = (u32) npages / factor; | 3976 | complete = (u32) npages / factor; |
3984 | ndmaps += complete * ((i == 2) ? LPERCTL * LPERCTL | 3977 | ndmaps += complete * ((i == 2) ? LPERCTL * LPERCTL : |
3985 | : ((i == 1) ? LPERCTL : 1)); | 3978 | ((i == 1) ? LPERCTL : 1)); |
3986 | 3979 | ||
3987 | /* pages in last/incomplete child */ | 3980 | /* pages in last/incomplete child */ |
3988 | npages = (u32) npages % factor; | 3981 | npages = (u32) npages % factor; |