aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2008-10-30 02:11:19 -0400
committerLachlan McIlroy <lachlan@sgi.com>2008-10-30 02:11:19 -0400
commit60197e8df364df326dcbb987519f367ad0ee1a11 (patch)
tree18b38d1711a49363fd5f20f04159b360ee3ec833 /fs/xfs/xfs_inode.c
parent5b4d89ae0f5ae45c7fa1dfc616fd2bb8634bb7b7 (diff)
[XFS] Cleanup maxrecs calculation.
Clean up the way the maximum and minimum records for the btree blocks are calculated. For the alloc and inobt btrees all the values are pre-calculated in xfs_mount_common, and we switch the current loop around the ugly generic macros that use cpp token pasting to generate type names to two small helpers in normal C code. For the bmbt and bmdr trees these helpers also exist, but can be called during runtime, too. Here we also kill various macros dealing with them and inline the logic into the get_minrecs / get_maxrecs / get_dmaxrecs methods in xfs_bmap_btree.c. Note that all these new helpers take an xfs_mount * argument which will be needed to determine the size of a btree block once we add support for extended btree blocks with CRCs and other RAS information. SGI-PV: 988146 SGI-Modid: xfs-linux-melb:xfs-kern:32292a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Donald Douwsma <donaldd@sgi.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r--fs/xfs/xfs_inode.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 0c65ba2faa43..73b604e15dcd 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -622,7 +622,7 @@ xfs_iformat_btree(
622 ifp = XFS_IFORK_PTR(ip, whichfork); 622 ifp = XFS_IFORK_PTR(ip, whichfork);
623 dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); 623 dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork);
624 size = XFS_BMAP_BROOT_SPACE(dfp); 624 size = XFS_BMAP_BROOT_SPACE(dfp);
625 nrecs = XFS_BMAP_BROOT_NUMRECS(dfp); 625 nrecs = be16_to_cpu(dfp->bb_numrecs);
626 626
627 /* 627 /*
628 * blow out if -- fork has less extents than can fit in 628 * blow out if -- fork has less extents than can fit in
@@ -650,8 +650,9 @@ xfs_iformat_btree(
650 * Copy and convert from the on-disk structure 650 * Copy and convert from the on-disk structure
651 * to the in-memory structure. 651 * to the in-memory structure.
652 */ 652 */
653 xfs_bmdr_to_bmbt(dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), 653 xfs_bmdr_to_bmbt(ip->i_mount, dfp,
654 ifp->if_broot, size); 654 XFS_DFORK_SIZE(dip, ip->i_mount, whichfork),
655 ifp->if_broot, size);
655 ifp->if_flags &= ~XFS_IFEXTENTS; 656 ifp->if_flags &= ~XFS_IFEXTENTS;
656 ifp->if_flags |= XFS_IFBROOT; 657 ifp->if_flags |= XFS_IFBROOT;
657 658
@@ -2348,6 +2349,7 @@ xfs_iroot_realloc(
2348 int rec_diff, 2349 int rec_diff,
2349 int whichfork) 2350 int whichfork)
2350{ 2351{
2352 struct xfs_mount *mp = ip->i_mount;
2351 int cur_max; 2353 int cur_max;
2352 xfs_ifork_t *ifp; 2354 xfs_ifork_t *ifp;
2353 xfs_bmbt_block_t *new_broot; 2355 xfs_bmbt_block_t *new_broot;
@@ -2383,7 +2385,7 @@ xfs_iroot_realloc(
2383 * location. The records don't change location because 2385 * location. The records don't change location because
2384 * they are kept butted up against the btree block header. 2386 * they are kept butted up against the btree block header.
2385 */ 2387 */
2386 cur_max = XFS_BMAP_BROOT_MAXRECS(ifp->if_broot_bytes); 2388 cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0);
2387 new_max = cur_max + rec_diff; 2389 new_max = cur_max + rec_diff;
2388 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); 2390 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
2389 ifp->if_broot = (xfs_bmbt_block_t *) 2391 ifp->if_broot = (xfs_bmbt_block_t *)
@@ -2391,10 +2393,10 @@ xfs_iroot_realloc(
2391 new_size, 2393 new_size,
2392 (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ 2394 (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */
2393 KM_SLEEP); 2395 KM_SLEEP);
2394 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(ifp->if_broot, 1, 2396 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
2395 ifp->if_broot_bytes); 2397 ifp->if_broot_bytes);
2396 np = (char *)XFS_BMAP_BROOT_PTR_ADDR(ifp->if_broot, 1, 2398 np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
2397 (int)new_size); 2399 (int)new_size);
2398 ifp->if_broot_bytes = (int)new_size; 2400 ifp->if_broot_bytes = (int)new_size;
2399 ASSERT(ifp->if_broot_bytes <= 2401 ASSERT(ifp->if_broot_bytes <=
2400 XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); 2402 XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ);
@@ -2408,7 +2410,7 @@ xfs_iroot_realloc(
2408 * records, just get rid of the root and clear the status bit. 2410 * records, just get rid of the root and clear the status bit.
2409 */ 2411 */
2410 ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); 2412 ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0));
2411 cur_max = XFS_BMAP_BROOT_MAXRECS(ifp->if_broot_bytes); 2413 cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0);
2412 new_max = cur_max + rec_diff; 2414 new_max = cur_max + rec_diff;
2413 ASSERT(new_max >= 0); 2415 ASSERT(new_max >= 0);
2414 if (new_max > 0) 2416 if (new_max > 0)
@@ -2442,9 +2444,9 @@ xfs_iroot_realloc(
2442 /* 2444 /*
2443 * Then copy the pointers. 2445 * Then copy the pointers.
2444 */ 2446 */
2445 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(ifp->if_broot, 1, 2447 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
2446 ifp->if_broot_bytes); 2448 ifp->if_broot_bytes);
2447 np = (char *)XFS_BMAP_BROOT_PTR_ADDR(new_broot, 1, 2449 np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1,
2448 (int)new_size); 2450 (int)new_size);
2449 memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t)); 2451 memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t));
2450 } 2452 }
@@ -2920,7 +2922,7 @@ xfs_iflush_fork(
2920 ASSERT(ifp->if_broot_bytes <= 2922 ASSERT(ifp->if_broot_bytes <=
2921 (XFS_IFORK_SIZE(ip, whichfork) + 2923 (XFS_IFORK_SIZE(ip, whichfork) +
2922 XFS_BROOT_SIZE_ADJ)); 2924 XFS_BROOT_SIZE_ADJ));
2923 xfs_bmbt_to_bmdr(ifp->if_broot, ifp->if_broot_bytes, 2925 xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes,
2924 (xfs_bmdr_block_t *)cp, 2926 (xfs_bmdr_block_t *)cp,
2925 XFS_DFORK_SIZE(dip, mp, whichfork)); 2927 XFS_DFORK_SIZE(dip, mp, whichfork));
2926 } 2928 }