aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2008-10-30 02:14:34 -0400
committerLachlan McIlroy <lachlan@sgi.com>2008-10-30 02:14:34 -0400
commit7cc95a821df8f09a5d37a923cf8c3a7c3ee00c29 (patch)
tree8fde02d4c9a52b7da7b3e961f8a23cf4b493a4a4 /fs/xfs
parent136341b41ad4883bd668120f727a52c42331fe8a (diff)
[XFS] Always use struct xfs_btree_block instead of short / longform
structures. Always use the generic xfs_btree_block type instead of the short / long structures. Add XFS_BTREE_SBLOCK_LEN / XFS_BTREE_LBLOCK_LEN defines for the length of a short / long form block. The rationale for this is that we will grow more btree block header variants to support CRCs and other RAS information, and always accessing them through the same datatype with unions for the short / long form pointers makes implementing this much easier. SGI-PV: 988146 SGI-Modid: xfs-linux-melb:xfs-kern:32300a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Donald Douwsma <donaldd@sgi.com> Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_alloc.c23
-rw-r--r--fs/xfs/xfs_alloc_btree.c2
-rw-r--r--fs/xfs/xfs_alloc_btree.h18
-rw-r--r--fs/xfs/xfs_bmap.c71
-rw-r--r--fs/xfs/xfs_bmap_btree.c14
-rw-r--r--fs/xfs/xfs_bmap_btree.h23
-rw-r--r--fs/xfs/xfs_btree.c81
-rw-r--r--fs/xfs/xfs_btree.h53
-rw-r--r--fs/xfs/xfs_dinode.h2
-rw-r--r--fs/xfs/xfs_fsops.c20
-rw-r--r--fs/xfs/xfs_ialloc_btree.c2
-rw-r--r--fs/xfs/xfs_ialloc_btree.h19
-rw-r--r--fs/xfs/xfs_inode.c13
-rw-r--r--fs/xfs/xfs_inode.h3
-rw-r--r--fs/xfs/xfs_log_recover.c8
15 files changed, 165 insertions, 187 deletions
diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c
index 0a2a87208b17..c47ce9075728 100644
--- a/fs/xfs/xfs_alloc.c
+++ b/fs/xfs/xfs_alloc.c
@@ -380,21 +380,20 @@ xfs_alloc_fixup_trees(
380 return error; 380 return error;
381 XFS_WANT_CORRUPTED_RETURN(i == 1); 381 XFS_WANT_CORRUPTED_RETURN(i == 1);
382 } 382 }
383
383#ifdef DEBUG 384#ifdef DEBUG
384 { 385 if (bno_cur->bc_nlevels == 1 && cnt_cur->bc_nlevels == 1) {
385 xfs_alloc_block_t *bnoblock; 386 struct xfs_btree_block *bnoblock;
386 xfs_alloc_block_t *cntblock; 387 struct xfs_btree_block *cntblock;
387 388
388 if (bno_cur->bc_nlevels == 1 && 389 bnoblock = XFS_BUF_TO_BLOCK(bno_cur->bc_bufs[0]);
389 cnt_cur->bc_nlevels == 1) { 390 cntblock = XFS_BUF_TO_BLOCK(cnt_cur->bc_bufs[0]);
390 bnoblock = XFS_BUF_TO_ALLOC_BLOCK(bno_cur->bc_bufs[0]); 391
391 cntblock = XFS_BUF_TO_ALLOC_BLOCK(cnt_cur->bc_bufs[0]); 392 XFS_WANT_CORRUPTED_RETURN(
392 XFS_WANT_CORRUPTED_RETURN( 393 bnoblock->bb_numrecs == cntblock->bb_numrecs);
393 be16_to_cpu(bnoblock->bb_numrecs) ==
394 be16_to_cpu(cntblock->bb_numrecs));
395 }
396 } 394 }
397#endif 395#endif
396
398 /* 397 /*
399 * Deal with all four cases: the allocated record is contained 398 * Deal with all four cases: the allocated record is contained
400 * within the freespace record, so we can have new freespace 399 * within the freespace record, so we can have new freespace
diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c
index 72c083f62a94..733cb75a8c5d 100644
--- a/fs/xfs/xfs_alloc_btree.c
+++ b/fs/xfs/xfs_alloc_btree.c
@@ -490,7 +490,7 @@ xfs_allocbt_maxrecs(
490 int blocklen, 490 int blocklen,
491 int leaf) 491 int leaf)
492{ 492{
493 blocklen -= sizeof(struct xfs_btree_sblock); 493 blocklen -= XFS_ALLOC_BLOCK_LEN(mp);
494 494
495 if (leaf) 495 if (leaf)
496 return blocklen / sizeof(xfs_alloc_rec_t); 496 return blocklen / sizeof(xfs_alloc_rec_t);
diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h
index 579f9c7e0872..a6caa0022c9b 100644
--- a/fs/xfs/xfs_alloc_btree.h
+++ b/fs/xfs/xfs_alloc_btree.h
@@ -24,7 +24,6 @@
24 24
25struct xfs_buf; 25struct xfs_buf;
26struct xfs_btree_cur; 26struct xfs_btree_cur;
27struct xfs_btree_sblock;
28struct xfs_mount; 27struct xfs_mount;
29 28
30/* 29/*
@@ -50,10 +49,6 @@ typedef struct xfs_alloc_rec_incore {
50 49
51/* btree pointer type */ 50/* btree pointer type */
52typedef __be32 xfs_alloc_ptr_t; 51typedef __be32 xfs_alloc_ptr_t;
53/* btree block header type */
54typedef struct xfs_btree_sblock xfs_alloc_block_t;
55
56#define XFS_BUF_TO_ALLOC_BLOCK(bp) ((xfs_alloc_block_t *)XFS_BUF_PTR(bp))
57 52
58/* 53/*
59 * Minimum and maximum blocksize and sectorsize. 54 * Minimum and maximum blocksize and sectorsize.
@@ -77,6 +72,13 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t;
77#define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1)) 72#define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1))
78 73
79/* 74/*
75 * Btree block header size depends on a superblock flag.
76 *
77 * (not quite yet, but soon)
78 */
79#define XFS_ALLOC_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN
80
81/*
80 * Record, key, and pointer address macros for btree blocks. 82 * Record, key, and pointer address macros for btree blocks.
81 * 83 *
82 * (note that some of these may appear unused, but they are used in userspace) 84 * (note that some of these may appear unused, but they are used in userspace)
@@ -84,19 +86,19 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t;
84#define XFS_ALLOC_REC_ADDR(mp, block, index) \ 86#define XFS_ALLOC_REC_ADDR(mp, block, index) \
85 ((xfs_alloc_rec_t *) \ 87 ((xfs_alloc_rec_t *) \
86 ((char *)(block) + \ 88 ((char *)(block) + \
87 sizeof(struct xfs_btree_sblock) + \ 89 XFS_ALLOC_BLOCK_LEN(mp) + \
88 (((index) - 1) * sizeof(xfs_alloc_rec_t)))) 90 (((index) - 1) * sizeof(xfs_alloc_rec_t))))
89 91
90#define XFS_ALLOC_KEY_ADDR(mp, block, index) \ 92#define XFS_ALLOC_KEY_ADDR(mp, block, index) \
91 ((xfs_alloc_key_t *) \ 93 ((xfs_alloc_key_t *) \
92 ((char *)(block) + \ 94 ((char *)(block) + \
93 sizeof(struct xfs_btree_sblock) + \ 95 XFS_ALLOC_BLOCK_LEN(mp) + \
94 ((index) - 1) * sizeof(xfs_alloc_key_t))) 96 ((index) - 1) * sizeof(xfs_alloc_key_t)))
95 97
96#define XFS_ALLOC_PTR_ADDR(mp, block, index, maxrecs) \ 98#define XFS_ALLOC_PTR_ADDR(mp, block, index, maxrecs) \
97 ((xfs_alloc_ptr_t *) \ 99 ((xfs_alloc_ptr_t *) \
98 ((char *)(block) + \ 100 ((char *)(block) + \
99 sizeof(struct xfs_btree_sblock) + \ 101 XFS_ALLOC_BLOCK_LEN(mp) + \
100 (maxrecs) * sizeof(xfs_alloc_key_t) + \ 102 (maxrecs) * sizeof(xfs_alloc_key_t) + \
101 ((index) - 1) * sizeof(xfs_alloc_ptr_t))) 103 ((index) - 1) * sizeof(xfs_alloc_ptr_t)))
102 104
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
index 3dab937d4b85..7796a0c140eb 100644
--- a/fs/xfs/xfs_bmap.c
+++ b/fs/xfs/xfs_bmap.c
@@ -394,7 +394,7 @@ xfs_bmap_count_leaves(
394STATIC void 394STATIC void
395xfs_bmap_disk_count_leaves( 395xfs_bmap_disk_count_leaves(
396 struct xfs_mount *mp, 396 struct xfs_mount *mp,
397 xfs_bmbt_block_t *block, 397 struct xfs_btree_block *block,
398 int numrecs, 398 int numrecs,
399 int *count); 399 int *count);
400 400
@@ -3042,14 +3042,14 @@ xfs_bmap_btree_to_extents(
3042 int whichfork) /* data or attr fork */ 3042 int whichfork) /* data or attr fork */
3043{ 3043{
3044 /* REFERENCED */ 3044 /* REFERENCED */
3045 xfs_bmbt_block_t *cblock;/* child btree block */ 3045 struct xfs_btree_block *cblock;/* child btree block */
3046 xfs_fsblock_t cbno; /* child block number */ 3046 xfs_fsblock_t cbno; /* child block number */
3047 xfs_buf_t *cbp; /* child block's buffer */ 3047 xfs_buf_t *cbp; /* child block's buffer */
3048 int error; /* error return value */ 3048 int error; /* error return value */
3049 xfs_ifork_t *ifp; /* inode fork data */ 3049 xfs_ifork_t *ifp; /* inode fork data */
3050 xfs_mount_t *mp; /* mount point structure */ 3050 xfs_mount_t *mp; /* mount point structure */
3051 __be64 *pp; /* ptr to block address */ 3051 __be64 *pp; /* ptr to block address */
3052 xfs_bmbt_block_t *rblock;/* root btree block */ 3052 struct xfs_btree_block *rblock;/* root btree block */
3053 3053
3054 mp = ip->i_mount; 3054 mp = ip->i_mount;
3055 ifp = XFS_IFORK_PTR(ip, whichfork); 3055 ifp = XFS_IFORK_PTR(ip, whichfork);
@@ -3069,8 +3069,8 @@ xfs_bmap_btree_to_extents(
3069 if ((error = xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, 3069 if ((error = xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp,
3070 XFS_BMAP_BTREE_REF))) 3070 XFS_BMAP_BTREE_REF)))
3071 return error; 3071 return error;
3072 cblock = XFS_BUF_TO_BMBT_BLOCK(cbp); 3072 cblock = XFS_BUF_TO_BLOCK(cbp);
3073 if ((error = xfs_btree_check_lblock(cur, cblock, 0, cbp))) 3073 if ((error = xfs_btree_check_block(cur, cblock, 0, cbp)))
3074 return error; 3074 return error;
3075 xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp); 3075 xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp);
3076 ip->i_d.di_nblocks--; 3076 ip->i_d.di_nblocks--;
@@ -3450,11 +3450,11 @@ xfs_bmap_extents_to_btree(
3450 int *logflagsp, /* inode logging flags */ 3450 int *logflagsp, /* inode logging flags */
3451 int whichfork) /* data or attr fork */ 3451 int whichfork) /* data or attr fork */
3452{ 3452{
3453 xfs_bmbt_block_t *ablock; /* allocated (child) bt block */ 3453 struct xfs_btree_block *ablock; /* allocated (child) bt block */
3454 xfs_buf_t *abp; /* buffer for ablock */ 3454 xfs_buf_t *abp; /* buffer for ablock */
3455 xfs_alloc_arg_t args; /* allocation arguments */ 3455 xfs_alloc_arg_t args; /* allocation arguments */
3456 xfs_bmbt_rec_t *arp; /* child record pointer */ 3456 xfs_bmbt_rec_t *arp; /* child record pointer */
3457 xfs_bmbt_block_t *block; /* btree root block */ 3457 struct xfs_btree_block *block; /* btree root block */
3458 xfs_btree_cur_t *cur; /* bmap btree cursor */ 3458 xfs_btree_cur_t *cur; /* bmap btree cursor */
3459 xfs_bmbt_rec_host_t *ep; /* extent record pointer */ 3459 xfs_bmbt_rec_host_t *ep; /* extent record pointer */
3460 int error; /* error return value */ 3460 int error; /* error return value */
@@ -3474,6 +3474,7 @@ xfs_bmap_extents_to_btree(
3474 */ 3474 */
3475 xfs_iroot_realloc(ip, 1, whichfork); 3475 xfs_iroot_realloc(ip, 1, whichfork);
3476 ifp->if_flags |= XFS_IFBROOT; 3476 ifp->if_flags |= XFS_IFBROOT;
3477
3477 /* 3478 /*
3478 * Fill in the root. 3479 * Fill in the root.
3479 */ 3480 */
@@ -3481,8 +3482,9 @@ xfs_bmap_extents_to_btree(
3481 block->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); 3482 block->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC);
3482 block->bb_level = cpu_to_be16(1); 3483 block->bb_level = cpu_to_be16(1);
3483 block->bb_numrecs = cpu_to_be16(1); 3484 block->bb_numrecs = cpu_to_be16(1);
3484 block->bb_leftsib = cpu_to_be64(NULLDFSBNO); 3485 block->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
3485 block->bb_rightsib = cpu_to_be64(NULLDFSBNO); 3486 block->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
3487
3486 /* 3488 /*
3487 * Need a cursor. Can't allocate until bb_level is filled in. 3489 * Need a cursor. Can't allocate until bb_level is filled in.
3488 */ 3490 */
@@ -3534,11 +3536,11 @@ xfs_bmap_extents_to_btree(
3534 /* 3536 /*
3535 * Fill in the child block. 3537 * Fill in the child block.
3536 */ 3538 */
3537 ablock = XFS_BUF_TO_BMBT_BLOCK(abp); 3539 ablock = XFS_BUF_TO_BLOCK(abp);
3538 ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); 3540 ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC);
3539 ablock->bb_level = 0; 3541 ablock->bb_level = 0;
3540 ablock->bb_leftsib = cpu_to_be64(NULLDFSBNO); 3542 ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
3541 ablock->bb_rightsib = cpu_to_be64(NULLDFSBNO); 3543 ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
3542 arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); 3544 arp = XFS_BMBT_REC_ADDR(mp, ablock, 1);
3543 nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); 3545 nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3544 for (cnt = i = 0; i < nextents; i++) { 3546 for (cnt = i = 0; i < nextents; i++) {
@@ -3550,7 +3552,8 @@ xfs_bmap_extents_to_btree(
3550 } 3552 }
3551 } 3553 }
3552 ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork)); 3554 ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork));
3553 ablock->bb_numrecs = cpu_to_be16(cnt); 3555 xfs_btree_set_numrecs(ablock, cnt);
3556
3554 /* 3557 /*
3555 * Fill in the root key and pointer. 3558 * Fill in the root key and pointer.
3556 */ 3559 */
@@ -4533,7 +4536,7 @@ xfs_bmap_read_extents(
4533 xfs_inode_t *ip, /* incore inode */ 4536 xfs_inode_t *ip, /* incore inode */
4534 int whichfork) /* data or attr fork */ 4537 int whichfork) /* data or attr fork */
4535{ 4538{
4536 xfs_bmbt_block_t *block; /* current btree block */ 4539 struct xfs_btree_block *block; /* current btree block */
4537 xfs_fsblock_t bno; /* block # of "block" */ 4540 xfs_fsblock_t bno; /* block # of "block" */
4538 xfs_buf_t *bp; /* buffer for "block" */ 4541 xfs_buf_t *bp; /* buffer for "block" */
4539 int error; /* error return value */ 4542 int error; /* error return value */
@@ -4570,7 +4573,7 @@ xfs_bmap_read_extents(
4570 if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, 4573 if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp,
4571 XFS_BMAP_BTREE_REF))) 4574 XFS_BMAP_BTREE_REF)))
4572 return error; 4575 return error;
4573 block = XFS_BUF_TO_BMBT_BLOCK(bp); 4576 block = XFS_BUF_TO_BLOCK(bp);
4574 XFS_WANT_CORRUPTED_GOTO( 4577 XFS_WANT_CORRUPTED_GOTO(
4575 XFS_BMAP_SANITY_CHECK(mp, block, level), 4578 XFS_BMAP_SANITY_CHECK(mp, block, level),
4576 error0); 4579 error0);
@@ -4596,7 +4599,7 @@ xfs_bmap_read_extents(
4596 xfs_extnum_t start; 4599 xfs_extnum_t start;
4597 4600
4598 4601
4599 num_recs = be16_to_cpu(block->bb_numrecs); 4602 num_recs = xfs_btree_get_numrecs(block);
4600 if (unlikely(i + num_recs > room)) { 4603 if (unlikely(i + num_recs > room)) {
4601 ASSERT(i + num_recs <= room); 4604 ASSERT(i + num_recs <= room);
4602 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, 4605 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
@@ -4613,7 +4616,7 @@ xfs_bmap_read_extents(
4613 /* 4616 /*
4614 * Read-ahead the next leaf block, if any. 4617 * Read-ahead the next leaf block, if any.
4615 */ 4618 */
4616 nextbno = be64_to_cpu(block->bb_rightsib); 4619 nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib);
4617 if (nextbno != NULLFSBLOCK) 4620 if (nextbno != NULLFSBLOCK)
4618 xfs_btree_reada_bufl(mp, nextbno, 1); 4621 xfs_btree_reada_bufl(mp, nextbno, 1);
4619 /* 4622 /*
@@ -4650,7 +4653,7 @@ xfs_bmap_read_extents(
4650 if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, 4653 if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp,
4651 XFS_BMAP_BTREE_REF))) 4654 XFS_BMAP_BTREE_REF)))
4652 return error; 4655 return error;
4653 block = XFS_BUF_TO_BMBT_BLOCK(bp); 4656 block = XFS_BUF_TO_BLOCK(bp);
4654 } 4657 }
4655 ASSERT(i == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); 4658 ASSERT(i == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)));
4656 ASSERT(i == XFS_IFORK_NEXTENTS(ip, whichfork)); 4659 ASSERT(i == XFS_IFORK_NEXTENTS(ip, whichfork));
@@ -6175,7 +6178,7 @@ xfs_bmap_get_bp(
6175 6178
6176void 6179void
6177xfs_check_block( 6180xfs_check_block(
6178 xfs_bmbt_block_t *block, 6181 struct xfs_btree_block *block,
6179 xfs_mount_t *mp, 6182 xfs_mount_t *mp,
6180 int root, 6183 int root,
6181 short sz) 6184 short sz)
@@ -6187,7 +6190,7 @@ xfs_check_block(
6187 ASSERT(be16_to_cpu(block->bb_level) > 0); 6190 ASSERT(be16_to_cpu(block->bb_level) > 0);
6188 6191
6189 prevp = NULL; 6192 prevp = NULL;
6190 for( i = 1; i <= be16_to_cpu(block->bb_numrecs); i++) { 6193 for( i = 1; i <= xfs_btree_get_numrecs(block); i++) {
6191 dmxr = mp->m_bmap_dmxr[0]; 6194 dmxr = mp->m_bmap_dmxr[0];
6192 keyp = XFS_BMBT_KEY_ADDR(mp, block, i); 6195 keyp = XFS_BMBT_KEY_ADDR(mp, block, i);
6193 6196
@@ -6232,7 +6235,7 @@ xfs_bmap_check_leaf_extents(
6232 xfs_inode_t *ip, /* incore inode pointer */ 6235 xfs_inode_t *ip, /* incore inode pointer */
6233 int whichfork) /* data or attr fork */ 6236 int whichfork) /* data or attr fork */
6234{ 6237{
6235 xfs_bmbt_block_t *block; /* current btree block */ 6238 struct xfs_btree_block *block; /* current btree block */
6236 xfs_fsblock_t bno; /* block # of "block" */ 6239 xfs_fsblock_t bno; /* block # of "block" */
6237 xfs_buf_t *bp; /* buffer for "block" */ 6240 xfs_buf_t *bp; /* buffer for "block" */
6238 int error; /* error return value */ 6241 int error; /* error return value */
@@ -6282,7 +6285,7 @@ xfs_bmap_check_leaf_extents(
6282 if (!bp && (error = xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, 6285 if (!bp && (error = xfs_btree_read_bufl(mp, NULL, bno, 0, &bp,
6283 XFS_BMAP_BTREE_REF))) 6286 XFS_BMAP_BTREE_REF)))
6284 goto error_norelse; 6287 goto error_norelse;
6285 block = XFS_BUF_TO_BMBT_BLOCK(bp); 6288 block = XFS_BUF_TO_BLOCK(bp);
6286 XFS_WANT_CORRUPTED_GOTO( 6289 XFS_WANT_CORRUPTED_GOTO(
6287 XFS_BMAP_SANITY_CHECK(mp, block, level), 6290 XFS_BMAP_SANITY_CHECK(mp, block, level),
6288 error0); 6291 error0);
@@ -6317,13 +6320,13 @@ xfs_bmap_check_leaf_extents(
6317 xfs_extnum_t num_recs; 6320 xfs_extnum_t num_recs;
6318 6321
6319 6322
6320 num_recs = be16_to_cpu(block->bb_numrecs); 6323 num_recs = xfs_btree_get_numrecs(block);
6321 6324
6322 /* 6325 /*
6323 * Read-ahead the next leaf block, if any. 6326 * Read-ahead the next leaf block, if any.
6324 */ 6327 */
6325 6328
6326 nextbno = be64_to_cpu(block->bb_rightsib); 6329 nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib);
6327 6330
6328 /* 6331 /*
6329 * Check all the extents to make sure they are OK. 6332 * Check all the extents to make sure they are OK.
@@ -6367,7 +6370,7 @@ xfs_bmap_check_leaf_extents(
6367 if (!bp && (error = xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, 6370 if (!bp && (error = xfs_btree_read_bufl(mp, NULL, bno, 0, &bp,
6368 XFS_BMAP_BTREE_REF))) 6371 XFS_BMAP_BTREE_REF)))
6369 goto error_norelse; 6372 goto error_norelse;
6370 block = XFS_BUF_TO_BMBT_BLOCK(bp); 6373 block = XFS_BUF_TO_BLOCK(bp);
6371 } 6374 }
6372 if (bp_release) { 6375 if (bp_release) {
6373 bp_release = 0; 6376 bp_release = 0;
@@ -6397,7 +6400,7 @@ xfs_bmap_count_blocks(
6397 int whichfork, /* data or attr fork */ 6400 int whichfork, /* data or attr fork */
6398 int *count) /* out: count of blocks */ 6401 int *count) /* out: count of blocks */
6399{ 6402{
6400 xfs_bmbt_block_t *block; /* current btree block */ 6403 struct xfs_btree_block *block; /* current btree block */
6401 xfs_fsblock_t bno; /* block # of "block" */ 6404 xfs_fsblock_t bno; /* block # of "block" */
6402 xfs_ifork_t *ifp; /* fork structure */ 6405 xfs_ifork_t *ifp; /* fork structure */
6403 int level; /* btree level, for checking */ 6406 int level; /* btree level, for checking */
@@ -6454,24 +6457,24 @@ xfs_bmap_count_tree(
6454 __be64 *pp; 6457 __be64 *pp;
6455 xfs_fsblock_t bno = blockno; 6458 xfs_fsblock_t bno = blockno;
6456 xfs_fsblock_t nextbno; 6459 xfs_fsblock_t nextbno;
6457 xfs_bmbt_block_t *block, *nextblock; 6460 struct xfs_btree_block *block, *nextblock;
6458 int numrecs; 6461 int numrecs;
6459 6462
6460 if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF))) 6463 if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF)))
6461 return error; 6464 return error;
6462 *count += 1; 6465 *count += 1;
6463 block = XFS_BUF_TO_BMBT_BLOCK(bp); 6466 block = XFS_BUF_TO_BLOCK(bp);
6464 6467
6465 if (--level) { 6468 if (--level) {
6466 /* Not at node above leafs, count this level of nodes */ 6469 /* Not at node above leafs, count this level of nodes */
6467 nextbno = be64_to_cpu(block->bb_rightsib); 6470 nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib);
6468 while (nextbno != NULLFSBLOCK) { 6471 while (nextbno != NULLFSBLOCK) {
6469 if ((error = xfs_btree_read_bufl(mp, tp, nextbno, 6472 if ((error = xfs_btree_read_bufl(mp, tp, nextbno,
6470 0, &nbp, XFS_BMAP_BTREE_REF))) 6473 0, &nbp, XFS_BMAP_BTREE_REF)))
6471 return error; 6474 return error;
6472 *count += 1; 6475 *count += 1;
6473 nextblock = XFS_BUF_TO_BMBT_BLOCK(nbp); 6476 nextblock = XFS_BUF_TO_BLOCK(nbp);
6474 nextbno = be64_to_cpu(nextblock->bb_rightsib); 6477 nextbno = be64_to_cpu(nextblock->bb_u.l.bb_rightsib);
6475 xfs_trans_brelse(tp, nbp); 6478 xfs_trans_brelse(tp, nbp);
6476 } 6479 }
6477 6480
@@ -6489,7 +6492,7 @@ xfs_bmap_count_tree(
6489 } else { 6492 } else {
6490 /* count all level 1 nodes and their leaves */ 6493 /* count all level 1 nodes and their leaves */
6491 for (;;) { 6494 for (;;) {
6492 nextbno = be64_to_cpu(block->bb_rightsib); 6495 nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib);
6493 numrecs = be16_to_cpu(block->bb_numrecs); 6496 numrecs = be16_to_cpu(block->bb_numrecs);
6494 xfs_bmap_disk_count_leaves(mp, block, numrecs, count); 6497 xfs_bmap_disk_count_leaves(mp, block, numrecs, count);
6495 xfs_trans_brelse(tp, bp); 6498 xfs_trans_brelse(tp, bp);
@@ -6500,7 +6503,7 @@ xfs_bmap_count_tree(
6500 XFS_BMAP_BTREE_REF))) 6503 XFS_BMAP_BTREE_REF)))
6501 return error; 6504 return error;
6502 *count += 1; 6505 *count += 1;
6503 block = XFS_BUF_TO_BMBT_BLOCK(bp); 6506 block = XFS_BUF_TO_BLOCK(bp);
6504 } 6507 }
6505 } 6508 }
6506 return 0; 6509 return 0;
@@ -6531,7 +6534,7 @@ xfs_bmap_count_leaves(
6531STATIC void 6534STATIC void
6532xfs_bmap_disk_count_leaves( 6535xfs_bmap_disk_count_leaves(
6533 struct xfs_mount *mp, 6536 struct xfs_mount *mp,
6534 xfs_bmbt_block_t *block, 6537 struct xfs_btree_block *block,
6535 int numrecs, 6538 int numrecs,
6536 int *count) 6539 int *count)
6537{ 6540{
diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c
index 11137c042c94..e46e02b8e277 100644
--- a/fs/xfs/xfs_bmap_btree.c
+++ b/fs/xfs/xfs_bmap_btree.c
@@ -68,7 +68,7 @@ xfs_bmdr_to_bmbt(
68 struct xfs_mount *mp, 68 struct xfs_mount *mp,
69 xfs_bmdr_block_t *dblock, 69 xfs_bmdr_block_t *dblock,
70 int dblocklen, 70 int dblocklen,
71 xfs_bmbt_block_t *rblock, 71 struct xfs_btree_block *rblock,
72 int rblocklen) 72 int rblocklen)
73{ 73{
74 int dmxr; 74 int dmxr;
@@ -81,8 +81,8 @@ xfs_bmdr_to_bmbt(
81 rblock->bb_level = dblock->bb_level; 81 rblock->bb_level = dblock->bb_level;
82 ASSERT(be16_to_cpu(rblock->bb_level) > 0); 82 ASSERT(be16_to_cpu(rblock->bb_level) > 0);
83 rblock->bb_numrecs = dblock->bb_numrecs; 83 rblock->bb_numrecs = dblock->bb_numrecs;
84 rblock->bb_leftsib = cpu_to_be64(NULLDFSBNO); 84 rblock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
85 rblock->bb_rightsib = cpu_to_be64(NULLDFSBNO); 85 rblock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
86 dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); 86 dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0);
87 fkp = XFS_BMDR_KEY_ADDR(dblock, 1); 87 fkp = XFS_BMDR_KEY_ADDR(dblock, 1);
88 tkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1); 88 tkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1);
@@ -429,7 +429,7 @@ xfs_bmbt_set_state(
429void 429void
430xfs_bmbt_to_bmdr( 430xfs_bmbt_to_bmdr(
431 struct xfs_mount *mp, 431 struct xfs_mount *mp,
432 xfs_bmbt_block_t *rblock, 432 struct xfs_btree_block *rblock,
433 int rblocklen, 433 int rblocklen,
434 xfs_bmdr_block_t *dblock, 434 xfs_bmdr_block_t *dblock,
435 int dblocklen) 435 int dblocklen)
@@ -441,8 +441,8 @@ xfs_bmbt_to_bmdr(
441 __be64 *tpp; 441 __be64 *tpp;
442 442
443 ASSERT(be32_to_cpu(rblock->bb_magic) == XFS_BMAP_MAGIC); 443 ASSERT(be32_to_cpu(rblock->bb_magic) == XFS_BMAP_MAGIC);
444 ASSERT(be64_to_cpu(rblock->bb_leftsib) == NULLDFSBNO); 444 ASSERT(be64_to_cpu(rblock->bb_u.l.bb_leftsib) == NULLDFSBNO);
445 ASSERT(be64_to_cpu(rblock->bb_rightsib) == NULLDFSBNO); 445 ASSERT(be64_to_cpu(rblock->bb_u.l.bb_rightsib) == NULLDFSBNO);
446 ASSERT(be16_to_cpu(rblock->bb_level) > 0); 446 ASSERT(be16_to_cpu(rblock->bb_level) > 0);
447 dblock->bb_level = rblock->bb_level; 447 dblock->bb_level = rblock->bb_level;
448 dblock->bb_numrecs = rblock->bb_numrecs; 448 dblock->bb_numrecs = rblock->bb_numrecs;
@@ -906,7 +906,7 @@ xfs_bmbt_maxrecs(
906 int blocklen, 906 int blocklen,
907 int leaf) 907 int leaf)
908{ 908{
909 blocklen -= sizeof(struct xfs_btree_lblock); 909 blocklen -= XFS_BMBT_BLOCK_LEN(mp);
910 910
911 if (leaf) 911 if (leaf)
912 return blocklen / sizeof(xfs_bmbt_rec_t); 912 return blocklen / sizeof(xfs_bmbt_rec_t);
diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h
index 7f001072db47..735a42418c99 100644
--- a/fs/xfs/xfs_bmap_btree.h
+++ b/fs/xfs/xfs_bmap_btree.h
@@ -22,7 +22,6 @@
22 22
23struct xfs_btree_cur; 23struct xfs_btree_cur;
24struct xfs_btree_block; 24struct xfs_btree_block;
25struct xfs_btree_lblock;
26struct xfs_mount; 25struct xfs_mount;
27struct xfs_inode; 26struct xfs_inode;
28struct xfs_trans; 27struct xfs_trans;
@@ -147,27 +146,29 @@ typedef struct xfs_bmbt_key {
147/* btree pointer type */ 146/* btree pointer type */
148typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; 147typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
149 148
150/* btree block header type */ 149/*
151typedef struct xfs_btree_lblock xfs_bmbt_block_t; 150 * Btree block header size depends on a superblock flag.
152 151 *
153#define XFS_BUF_TO_BMBT_BLOCK(bp) ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp)) 152 * (not quite yet, but soon)
153 */
154#define XFS_BMBT_BLOCK_LEN(mp) XFS_BTREE_LBLOCK_LEN
154 155
155#define XFS_BMBT_REC_ADDR(mp, block, index) \ 156#define XFS_BMBT_REC_ADDR(mp, block, index) \
156 ((xfs_bmbt_rec_t *) \ 157 ((xfs_bmbt_rec_t *) \
157 ((char *)(block) + \ 158 ((char *)(block) + \
158 sizeof(struct xfs_btree_lblock) + \ 159 XFS_BMBT_BLOCK_LEN(mp) + \
159 ((index) - 1) * sizeof(xfs_bmbt_rec_t))) 160 ((index) - 1) * sizeof(xfs_bmbt_rec_t)))
160 161
161#define XFS_BMBT_KEY_ADDR(mp, block, index) \ 162#define XFS_BMBT_KEY_ADDR(mp, block, index) \
162 ((xfs_bmbt_key_t *) \ 163 ((xfs_bmbt_key_t *) \
163 ((char *)(block) + \ 164 ((char *)(block) + \
164 sizeof(struct xfs_btree_lblock) + \ 165 XFS_BMBT_BLOCK_LEN(mp) + \
165 ((index) - 1) * sizeof(xfs_bmbt_key_t))) 166 ((index) - 1) * sizeof(xfs_bmbt_key_t)))
166 167
167#define XFS_BMBT_PTR_ADDR(mp, block, index, maxrecs) \ 168#define XFS_BMBT_PTR_ADDR(mp, block, index, maxrecs) \
168 ((xfs_bmbt_ptr_t *) \ 169 ((xfs_bmbt_ptr_t *) \
169 ((char *)(block) + \ 170 ((char *)(block) + \
170 sizeof(struct xfs_btree_lblock) + \ 171 XFS_BMBT_BLOCK_LEN(mp) + \
171 (maxrecs) * sizeof(xfs_bmbt_key_t) + \ 172 (maxrecs) * sizeof(xfs_bmbt_key_t) + \
172 ((index) - 1) * sizeof(xfs_bmbt_ptr_t))) 173 ((index) - 1) * sizeof(xfs_bmbt_ptr_t)))
173 174
@@ -198,7 +199,7 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;
198 XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0)) 199 XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0))
199 200
200#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ 201#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \
201 (int)(sizeof(xfs_bmbt_block_t) + \ 202 (int)(XFS_BTREE_LBLOCK_LEN + \
202 ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) 203 ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
203 204
204#define XFS_BMAP_BROOT_SPACE(bb) \ 205#define XFS_BMAP_BROOT_SPACE(bb) \
@@ -223,7 +224,7 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;
223 * Prototypes for xfs_bmap.c to call. 224 * Prototypes for xfs_bmap.c to call.
224 */ 225 */
225extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int, 226extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int,
226 xfs_bmbt_block_t *, int); 227 struct xfs_btree_block *, int);
227extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); 228extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s);
228extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); 229extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r);
229extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r); 230extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r);
@@ -246,7 +247,7 @@ extern void xfs_bmbt_disk_set_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s);
246extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o, 247extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o,
247 xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); 248 xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v);
248 249
249extern void xfs_bmbt_to_bmdr(struct xfs_mount *, xfs_bmbt_block_t *, int, 250extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int,
250 xfs_bmdr_block_t *, int); 251 xfs_bmdr_block_t *, int);
251 252
252extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur *, int level); 253extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur *, int level);
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c
index 72a26bb76430..7ed59267420d 100644
--- a/fs/xfs/xfs_btree.c
+++ b/fs/xfs/xfs_btree.c
@@ -53,10 +53,10 @@ const __uint32_t xfs_magics[XFS_BTNUM_MAX] = {
53}; 53};
54 54
55 55
56int /* error (0 or EFSCORRUPTED) */ 56STATIC int /* error (0 or EFSCORRUPTED) */
57xfs_btree_check_lblock( 57xfs_btree_check_lblock(
58 struct xfs_btree_cur *cur, /* btree cursor */ 58 struct xfs_btree_cur *cur, /* btree cursor */
59 struct xfs_btree_lblock *block, /* btree long form block pointer */ 59 struct xfs_btree_block *block, /* btree long form block pointer */
60 int level, /* level of the btree block */ 60 int level, /* level of the btree block */
61 struct xfs_buf *bp) /* buffer for block, if any */ 61 struct xfs_buf *bp) /* buffer for block, if any */
62{ 62{
@@ -69,12 +69,14 @@ xfs_btree_check_lblock(
69 be16_to_cpu(block->bb_level) == level && 69 be16_to_cpu(block->bb_level) == level &&
70 be16_to_cpu(block->bb_numrecs) <= 70 be16_to_cpu(block->bb_numrecs) <=
71 cur->bc_ops->get_maxrecs(cur, level) && 71 cur->bc_ops->get_maxrecs(cur, level) &&
72 block->bb_leftsib && 72 block->bb_u.l.bb_leftsib &&
73 (be64_to_cpu(block->bb_leftsib) == NULLDFSBNO || 73 (be64_to_cpu(block->bb_u.l.bb_leftsib) == NULLDFSBNO ||
74 XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_leftsib))) && 74 XFS_FSB_SANITY_CHECK(mp,
75 block->bb_rightsib && 75 be64_to_cpu(block->bb_u.l.bb_leftsib))) &&
76 (be64_to_cpu(block->bb_rightsib) == NULLDFSBNO || 76 block->bb_u.l.bb_rightsib &&
77 XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_rightsib))); 77 (be64_to_cpu(block->bb_u.l.bb_rightsib) == NULLDFSBNO ||
78 XFS_FSB_SANITY_CHECK(mp,
79 be64_to_cpu(block->bb_u.l.bb_rightsib)));
78 if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, 80 if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp,
79 XFS_ERRTAG_BTREE_CHECK_LBLOCK, 81 XFS_ERRTAG_BTREE_CHECK_LBLOCK,
80 XFS_RANDOM_BTREE_CHECK_LBLOCK))) { 82 XFS_RANDOM_BTREE_CHECK_LBLOCK))) {
@@ -90,7 +92,7 @@ xfs_btree_check_lblock(
90STATIC int /* error (0 or EFSCORRUPTED) */ 92STATIC int /* error (0 or EFSCORRUPTED) */
91xfs_btree_check_sblock( 93xfs_btree_check_sblock(
92 struct xfs_btree_cur *cur, /* btree cursor */ 94 struct xfs_btree_cur *cur, /* btree cursor */
93 struct xfs_btree_sblock *block, /* btree short form block pointer */ 95 struct xfs_btree_block *block, /* btree short form block pointer */
94 int level, /* level of the btree block */ 96 int level, /* level of the btree block */
95 struct xfs_buf *bp) /* buffer containing block */ 97 struct xfs_buf *bp) /* buffer containing block */
96{ 98{
@@ -107,12 +109,12 @@ xfs_btree_check_sblock(
107 be16_to_cpu(block->bb_level) == level && 109 be16_to_cpu(block->bb_level) == level &&
108 be16_to_cpu(block->bb_numrecs) <= 110 be16_to_cpu(block->bb_numrecs) <=
109 cur->bc_ops->get_maxrecs(cur, level) && 111 cur->bc_ops->get_maxrecs(cur, level) &&
110 (be32_to_cpu(block->bb_leftsib) == NULLAGBLOCK || 112 (be32_to_cpu(block->bb_u.s.bb_leftsib) == NULLAGBLOCK ||
111 be32_to_cpu(block->bb_leftsib) < agflen) && 113 be32_to_cpu(block->bb_u.s.bb_leftsib) < agflen) &&
112 block->bb_leftsib && 114 block->bb_u.s.bb_leftsib &&
113 (be32_to_cpu(block->bb_rightsib) == NULLAGBLOCK || 115 (be32_to_cpu(block->bb_u.s.bb_rightsib) == NULLAGBLOCK ||
114 be32_to_cpu(block->bb_rightsib) < agflen) && 116 be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) &&
115 block->bb_rightsib; 117 block->bb_u.s.bb_rightsib;
116 if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, 118 if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp,
117 XFS_ERRTAG_BTREE_CHECK_SBLOCK, 119 XFS_ERRTAG_BTREE_CHECK_SBLOCK,
118 XFS_RANDOM_BTREE_CHECK_SBLOCK))) { 120 XFS_RANDOM_BTREE_CHECK_SBLOCK))) {
@@ -135,13 +137,10 @@ xfs_btree_check_block(
135 int level, /* level of the btree block */ 137 int level, /* level of the btree block */
136 struct xfs_buf *bp) /* buffer containing block, if any */ 138 struct xfs_buf *bp) /* buffer containing block, if any */
137{ 139{
138 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { 140 if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
139 return xfs_btree_check_lblock(cur, 141 return xfs_btree_check_lblock(cur, block, level, bp);
140 (struct xfs_btree_lblock *)block, level, bp); 142 else
141 } else { 143 return xfs_btree_check_sblock(cur, block, level, bp);
142 return xfs_btree_check_sblock(cur,
143 (struct xfs_btree_sblock *)block, level, bp);
144 }
145} 144}
146 145
147/* 146/*
@@ -326,8 +325,8 @@ xfs_btree_dup_cursor(
326static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) 325static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur)
327{ 326{
328 return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? 327 return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ?
329 sizeof(struct xfs_btree_lblock) : 328 XFS_BTREE_LBLOCK_LEN :
330 sizeof(struct xfs_btree_sblock); 329 XFS_BTREE_SBLOCK_LEN;
331} 330}
332 331
333/* 332/*
@@ -510,7 +509,7 @@ xfs_btree_islastblock(
510 xfs_btree_cur_t *cur, /* btree cursor */ 509 xfs_btree_cur_t *cur, /* btree cursor */
511 int level) /* level to check */ 510 int level) /* level to check */
512{ 511{
513 xfs_btree_block_t *block; /* generic btree block pointer */ 512 struct xfs_btree_block *block; /* generic btree block pointer */
514 xfs_buf_t *bp; /* buffer containing block */ 513 xfs_buf_t *bp; /* buffer containing block */
515 514
516 block = xfs_btree_get_block(cur, level, &bp); 515 block = xfs_btree_get_block(cur, level, &bp);
@@ -530,7 +529,7 @@ xfs_btree_firstrec(
530 xfs_btree_cur_t *cur, /* btree cursor */ 529 xfs_btree_cur_t *cur, /* btree cursor */
531 int level) /* level to change */ 530 int level) /* level to change */
532{ 531{
533 xfs_btree_block_t *block; /* generic btree block pointer */ 532 struct xfs_btree_block *block; /* generic btree block pointer */
534 xfs_buf_t *bp; /* buffer containing block */ 533 xfs_buf_t *bp; /* buffer containing block */
535 534
536 /* 535 /*
@@ -559,7 +558,7 @@ xfs_btree_lastrec(
559 xfs_btree_cur_t *cur, /* btree cursor */ 558 xfs_btree_cur_t *cur, /* btree cursor */
560 int level) /* level to change */ 559 int level) /* level to change */
561{ 560{
562 xfs_btree_block_t *block; /* generic btree block pointer */ 561 struct xfs_btree_block *block; /* generic btree block pointer */
563 xfs_buf_t *bp; /* buffer containing block */ 562 xfs_buf_t *bp; /* buffer containing block */
564 563
565 /* 564 /*
@@ -814,7 +813,7 @@ xfs_btree_setbuf(
814 int lev, /* level in btree */ 813 int lev, /* level in btree */
815 xfs_buf_t *bp) /* new buffer to set */ 814 xfs_buf_t *bp) /* new buffer to set */
816{ 815{
817 xfs_btree_block_t *b; /* btree block */ 816 struct xfs_btree_block *b; /* btree block */
818 xfs_buf_t *obp; /* old buffer pointer */ 817 xfs_buf_t *obp; /* old buffer pointer */
819 818
820 obp = cur->bc_bufs[lev]; 819 obp = cur->bc_bufs[lev];
@@ -1252,20 +1251,20 @@ xfs_btree_log_block(
1252 int first; /* first byte offset logged */ 1251 int first; /* first byte offset logged */
1253 int last; /* last byte offset logged */ 1252 int last; /* last byte offset logged */
1254 static const short soffsets[] = { /* table of offsets (short) */ 1253 static const short soffsets[] = { /* table of offsets (short) */
1255 offsetof(struct xfs_btree_sblock, bb_magic), 1254 offsetof(struct xfs_btree_block, bb_magic),
1256 offsetof(struct xfs_btree_sblock, bb_level), 1255 offsetof(struct xfs_btree_block, bb_level),
1257 offsetof(struct xfs_btree_sblock, bb_numrecs), 1256 offsetof(struct xfs_btree_block, bb_numrecs),
1258 offsetof(struct xfs_btree_sblock, bb_leftsib), 1257 offsetof(struct xfs_btree_block, bb_u.s.bb_leftsib),
1259 offsetof(struct xfs_btree_sblock, bb_rightsib), 1258 offsetof(struct xfs_btree_block, bb_u.s.bb_rightsib),
1260 sizeof(struct xfs_btree_sblock) 1259 XFS_BTREE_SBLOCK_LEN
1261 }; 1260 };
1262 static const short loffsets[] = { /* table of offsets (long) */ 1261 static const short loffsets[] = { /* table of offsets (long) */
1263 offsetof(struct xfs_btree_lblock, bb_magic), 1262 offsetof(struct xfs_btree_block, bb_magic),
1264 offsetof(struct xfs_btree_lblock, bb_level), 1263 offsetof(struct xfs_btree_block, bb_level),
1265 offsetof(struct xfs_btree_lblock, bb_numrecs), 1264 offsetof(struct xfs_btree_block, bb_numrecs),
1266 offsetof(struct xfs_btree_lblock, bb_leftsib), 1265 offsetof(struct xfs_btree_block, bb_u.l.bb_leftsib),
1267 offsetof(struct xfs_btree_lblock, bb_rightsib), 1266 offsetof(struct xfs_btree_block, bb_u.l.bb_rightsib),
1268 sizeof(struct xfs_btree_lblock) 1267 XFS_BTREE_LBLOCK_LEN
1269 }; 1268 };
1270 1269
1271 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); 1270 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY);
@@ -3018,7 +3017,7 @@ xfs_btree_kill_iroot(
3018 if (index) { 3017 if (index) {
3019 xfs_iroot_realloc(cur->bc_private.b.ip, index, 3018 xfs_iroot_realloc(cur->bc_private.b.ip, index,
3020 cur->bc_private.b.whichfork); 3019 cur->bc_private.b.whichfork);
3021 block = (struct xfs_btree_block *)ifp->if_broot; 3020 block = ifp->if_broot;
3022 } 3021 }
3023 3022
3024 be16_add_cpu(&block->bb_numrecs, index); 3023 be16_add_cpu(&block->bb_numrecs, index);
diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h
index d6120a749060..789fffdf8b2f 100644
--- a/fs/xfs/xfs_btree.h
+++ b/fs/xfs/xfs_btree.h
@@ -39,31 +39,16 @@ extern kmem_zone_t *xfs_btree_cur_zone;
39#define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) 39#define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi)
40 40
41/* 41/*
42 * Short form header: space allocation btrees. 42 * Generic btree header.
43 */ 43 *
44typedef struct xfs_btree_sblock { 44 * This is a comination of the actual format used on disk for short and long
45 __be32 bb_magic; /* magic number for block type */ 45 * format btrees. The first three fields are shared by both format, but
46 __be16 bb_level; /* 0 is a leaf */ 46 * the pointers are different and should be used with care.
47 __be16 bb_numrecs; /* current # of data records */ 47 *
48 __be32 bb_leftsib; /* left sibling block or NULLAGBLOCK */ 48 * To get the size of the actual short or long form headers please use
49 __be32 bb_rightsib; /* right sibling block or NULLAGBLOCK */ 49 * the size macros below. Never use sizeof(xfs_btree_block).
50} xfs_btree_sblock_t;
51
52/*
53 * Long form header: bmap btrees.
54 */
55typedef struct xfs_btree_lblock {
56 __be32 bb_magic; /* magic number for block type */
57 __be16 bb_level; /* 0 is a leaf */
58 __be16 bb_numrecs; /* current # of data records */
59 __be64 bb_leftsib; /* left sibling block or NULLDFSBNO */
60 __be64 bb_rightsib; /* right sibling block or NULLDFSBNO */
61} xfs_btree_lblock_t;
62
63/*
64 * Combined header and structure, used by common code.
65 */ 50 */
66typedef struct xfs_btree_block { 51struct xfs_btree_block {
67 __be32 bb_magic; /* magic number for block type */ 52 __be32 bb_magic; /* magic number for block type */
68 __be16 bb_level; /* 0 is a leaf */ 53 __be16 bb_level; /* 0 is a leaf */
69 __be16 bb_numrecs; /* current # of data records */ 54 __be16 bb_numrecs; /* current # of data records */
@@ -77,7 +62,11 @@ typedef struct xfs_btree_block {
77 __be64 bb_rightsib; 62 __be64 bb_rightsib;
78 } l; /* long form pointers */ 63 } l; /* long form pointers */
79 } bb_u; /* rest */ 64 } bb_u; /* rest */
80} xfs_btree_block_t; 65};
66
67#define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */
68#define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */
69
81 70
82/* 71/*
83 * Generic key, ptr and record wrapper structures. 72 * Generic key, ptr and record wrapper structures.
@@ -294,20 +283,8 @@ typedef struct xfs_btree_cur
294/* 283/*
295 * Convert from buffer to btree block header. 284 * Convert from buffer to btree block header.
296 */ 285 */
297#define XFS_BUF_TO_BLOCK(bp) ((xfs_btree_block_t *)XFS_BUF_PTR(bp)) 286#define XFS_BUF_TO_BLOCK(bp) ((struct xfs_btree_block *)XFS_BUF_PTR(bp))
298#define XFS_BUF_TO_LBLOCK(bp) ((xfs_btree_lblock_t *)XFS_BUF_PTR(bp))
299#define XFS_BUF_TO_SBLOCK(bp) ((xfs_btree_sblock_t *)XFS_BUF_PTR(bp))
300
301 287
302/*
303 * Check that long form block header is ok.
304 */
305int /* error (0 or EFSCORRUPTED) */
306xfs_btree_check_lblock(
307 struct xfs_btree_cur *cur, /* btree cursor */
308 struct xfs_btree_lblock *block, /* btree long form block pointer */
309 int level, /* level of the btree block */
310 struct xfs_buf *bp); /* buffer containing block, if any */
311 288
312/* 289/*
313 * Check that block header is ok. 290 * Check that block header is ok.
diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h
index 2a00fcc36d8e..d7cf392cc852 100644
--- a/fs/xfs/xfs_dinode.h
+++ b/fs/xfs/xfs_dinode.h
@@ -165,7 +165,7 @@ typedef enum xfs_dinode_fmt
165 */ 165 */
166#define XFS_LITINO(mp) ((mp)->m_litino) 166#define XFS_LITINO(mp) ((mp)->m_litino)
167#define XFS_BROOT_SIZE_ADJ \ 167#define XFS_BROOT_SIZE_ADJ \
168 (sizeof(xfs_bmbt_block_t) - sizeof(xfs_bmdr_block_t)) 168 (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t))
169 169
170/* 170/*
171 * Inode data & attribute fork sizes, per inode. 171 * Inode data & attribute fork sizes, per inode.
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
index 8ce72aba027f..f1d0585041b9 100644
--- a/fs/xfs/xfs_fsops.c
+++ b/fs/xfs/xfs_fsops.c
@@ -126,7 +126,7 @@ xfs_growfs_data_private(
126 xfs_extlen_t agsize; 126 xfs_extlen_t agsize;
127 xfs_extlen_t tmpsize; 127 xfs_extlen_t tmpsize;
128 xfs_alloc_rec_t *arec; 128 xfs_alloc_rec_t *arec;
129 xfs_btree_sblock_t *block; 129 struct xfs_btree_block *block;
130 xfs_buf_t *bp; 130 xfs_buf_t *bp;
131 int bucket; 131 int bucket;
132 int dpct; 132 int dpct;
@@ -251,13 +251,13 @@ xfs_growfs_data_private(
251 bp = xfs_buf_get(mp->m_ddev_targp, 251 bp = xfs_buf_get(mp->m_ddev_targp,
252 XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), 252 XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)),
253 BTOBB(mp->m_sb.sb_blocksize), 0); 253 BTOBB(mp->m_sb.sb_blocksize), 0);
254 block = XFS_BUF_TO_SBLOCK(bp); 254 block = XFS_BUF_TO_BLOCK(bp);
255 memset(block, 0, mp->m_sb.sb_blocksize); 255 memset(block, 0, mp->m_sb.sb_blocksize);
256 block->bb_magic = cpu_to_be32(XFS_ABTB_MAGIC); 256 block->bb_magic = cpu_to_be32(XFS_ABTB_MAGIC);
257 block->bb_level = 0; 257 block->bb_level = 0;
258 block->bb_numrecs = cpu_to_be16(1); 258 block->bb_numrecs = cpu_to_be16(1);
259 block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); 259 block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
260 block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); 260 block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
261 arec = XFS_ALLOC_REC_ADDR(mp, block, 1); 261 arec = XFS_ALLOC_REC_ADDR(mp, block, 1);
262 arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); 262 arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
263 arec->ar_blockcount = cpu_to_be32( 263 arec->ar_blockcount = cpu_to_be32(
@@ -272,13 +272,13 @@ xfs_growfs_data_private(
272 bp = xfs_buf_get(mp->m_ddev_targp, 272 bp = xfs_buf_get(mp->m_ddev_targp,
273 XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)), 273 XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)),
274 BTOBB(mp->m_sb.sb_blocksize), 0); 274 BTOBB(mp->m_sb.sb_blocksize), 0);
275 block = XFS_BUF_TO_SBLOCK(bp); 275 block = XFS_BUF_TO_BLOCK(bp);
276 memset(block, 0, mp->m_sb.sb_blocksize); 276 memset(block, 0, mp->m_sb.sb_blocksize);
277 block->bb_magic = cpu_to_be32(XFS_ABTC_MAGIC); 277 block->bb_magic = cpu_to_be32(XFS_ABTC_MAGIC);
278 block->bb_level = 0; 278 block->bb_level = 0;
279 block->bb_numrecs = cpu_to_be16(1); 279 block->bb_numrecs = cpu_to_be16(1);
280 block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); 280 block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
281 block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); 281 block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
282 arec = XFS_ALLOC_REC_ADDR(mp, block, 1); 282 arec = XFS_ALLOC_REC_ADDR(mp, block, 1);
283 arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); 283 arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
284 arec->ar_blockcount = cpu_to_be32( 284 arec->ar_blockcount = cpu_to_be32(
@@ -294,13 +294,13 @@ xfs_growfs_data_private(
294 bp = xfs_buf_get(mp->m_ddev_targp, 294 bp = xfs_buf_get(mp->m_ddev_targp,
295 XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)), 295 XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)),
296 BTOBB(mp->m_sb.sb_blocksize), 0); 296 BTOBB(mp->m_sb.sb_blocksize), 0);
297 block = XFS_BUF_TO_SBLOCK(bp); 297 block = XFS_BUF_TO_BLOCK(bp);
298 memset(block, 0, mp->m_sb.sb_blocksize); 298 memset(block, 0, mp->m_sb.sb_blocksize);
299 block->bb_magic = cpu_to_be32(XFS_IBT_MAGIC); 299 block->bb_magic = cpu_to_be32(XFS_IBT_MAGIC);
300 block->bb_level = 0; 300 block->bb_level = 0;
301 block->bb_numrecs = 0; 301 block->bb_numrecs = 0;
302 block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); 302 block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
303 block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); 303 block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
304 error = xfs_bwrite(mp, bp); 304 error = xfs_bwrite(mp, bp);
305 if (error) { 305 if (error) {
306 goto error0; 306 goto error0;
diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c
index 46aabb3fcbf3..99f2408e8d8e 100644
--- a/fs/xfs/xfs_ialloc_btree.c
+++ b/fs/xfs/xfs_ialloc_btree.c
@@ -375,7 +375,7 @@ xfs_inobt_maxrecs(
375 int blocklen, 375 int blocklen,
376 int leaf) 376 int leaf)
377{ 377{
378 blocklen -= sizeof(struct xfs_btree_sblock); 378 blocklen -= XFS_INOBT_BLOCK_LEN(mp);
379 379
380 if (leaf) 380 if (leaf)
381 return blocklen / sizeof(xfs_inobt_rec_t); 381 return blocklen / sizeof(xfs_inobt_rec_t);
diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h
index fa12c85db340..37e5dd01a577 100644
--- a/fs/xfs/xfs_ialloc_btree.h
+++ b/fs/xfs/xfs_ialloc_btree.h
@@ -24,7 +24,6 @@
24 24
25struct xfs_buf; 25struct xfs_buf;
26struct xfs_btree_cur; 26struct xfs_btree_cur;
27struct xfs_btree_sblock;
28struct xfs_mount; 27struct xfs_mount;
29 28
30/* 29/*
@@ -70,11 +69,6 @@ typedef struct xfs_inobt_key {
70/* btree pointer type */ 69/* btree pointer type */
71typedef __be32 xfs_inobt_ptr_t; 70typedef __be32 xfs_inobt_ptr_t;
72 71
73/* btree block header type */
74typedef struct xfs_btree_sblock xfs_inobt_block_t;
75
76#define XFS_BUF_TO_INOBT_BLOCK(bp) ((xfs_inobt_block_t *)XFS_BUF_PTR(bp))
77
78/* 72/*
79 * Bit manipulations for ir_free. 73 * Bit manipulations for ir_free.
80 */ 74 */
@@ -96,6 +90,13 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t;
96#define XFS_PREALLOC_BLOCKS(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) 90#define XFS_PREALLOC_BLOCKS(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1))
97 91
98/* 92/*
93 * Btree block header size depends on a superblock flag.
94 *
95 * (not quite yet, but soon)
96 */
97#define XFS_INOBT_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN
98
99/*
99 * Record, key, and pointer address macros for btree blocks. 100 * Record, key, and pointer address macros for btree blocks.
100 * 101 *
101 * (note that some of these may appear unused, but they are used in userspace) 102 * (note that some of these may appear unused, but they are used in userspace)
@@ -103,19 +104,19 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t;
103#define XFS_INOBT_REC_ADDR(mp, block, index) \ 104#define XFS_INOBT_REC_ADDR(mp, block, index) \
104 ((xfs_inobt_rec_t *) \ 105 ((xfs_inobt_rec_t *) \
105 ((char *)(block) + \ 106 ((char *)(block) + \
106 sizeof(struct xfs_btree_sblock) + \ 107 XFS_INOBT_BLOCK_LEN(mp) + \
107 (((index) - 1) * sizeof(xfs_inobt_rec_t)))) 108 (((index) - 1) * sizeof(xfs_inobt_rec_t))))
108 109
109#define XFS_INOBT_KEY_ADDR(mp, block, index) \ 110#define XFS_INOBT_KEY_ADDR(mp, block, index) \
110 ((xfs_inobt_key_t *) \ 111 ((xfs_inobt_key_t *) \
111 ((char *)(block) + \ 112 ((char *)(block) + \
112 sizeof(struct xfs_btree_sblock) + \ 113 XFS_INOBT_BLOCK_LEN(mp) + \
113 ((index) - 1) * sizeof(xfs_inobt_key_t))) 114 ((index) - 1) * sizeof(xfs_inobt_key_t)))
114 115
115#define XFS_INOBT_PTR_ADDR(mp, block, index, maxrecs) \ 116#define XFS_INOBT_PTR_ADDR(mp, block, index, maxrecs) \
116 ((xfs_inobt_ptr_t *) \ 117 ((xfs_inobt_ptr_t *) \
117 ((char *)(block) + \ 118 ((char *)(block) + \
118 sizeof(struct xfs_btree_sblock) + \ 119 XFS_INOBT_BLOCK_LEN(mp) + \
119 (maxrecs) * sizeof(xfs_inobt_key_t) + \ 120 (maxrecs) * sizeof(xfs_inobt_key_t) + \
120 ((index) - 1) * sizeof(xfs_inobt_ptr_t))) 121 ((index) - 1) * sizeof(xfs_inobt_ptr_t)))
121 122
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 7b4f13c710d6..bc33762abc49 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2352,7 +2352,7 @@ xfs_iroot_realloc(
2352 struct xfs_mount *mp = ip->i_mount; 2352 struct xfs_mount *mp = ip->i_mount;
2353 int cur_max; 2353 int cur_max;
2354 xfs_ifork_t *ifp; 2354 xfs_ifork_t *ifp;
2355 xfs_bmbt_block_t *new_broot; 2355 struct xfs_btree_block *new_broot;
2356 int new_max; 2356 int new_max;
2357 size_t new_size; 2357 size_t new_size;
2358 char *np; 2358 char *np;
@@ -2373,8 +2373,7 @@ xfs_iroot_realloc(
2373 */ 2373 */
2374 if (ifp->if_broot_bytes == 0) { 2374 if (ifp->if_broot_bytes == 0) {
2375 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); 2375 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff);
2376 ifp->if_broot = (xfs_bmbt_block_t*)kmem_alloc(new_size, 2376 ifp->if_broot = kmem_alloc(new_size, KM_SLEEP);
2377 KM_SLEEP);
2378 ifp->if_broot_bytes = (int)new_size; 2377 ifp->if_broot_bytes = (int)new_size;
2379 return; 2378 return;
2380 } 2379 }
@@ -2388,9 +2387,7 @@ xfs_iroot_realloc(
2388 cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); 2387 cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0);
2389 new_max = cur_max + rec_diff; 2388 new_max = cur_max + rec_diff;
2390 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); 2389 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
2391 ifp->if_broot = (xfs_bmbt_block_t *) 2390 ifp->if_broot = kmem_realloc(ifp->if_broot, new_size,
2392 kmem_realloc(ifp->if_broot,
2393 new_size,
2394 (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ 2391 (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */
2395 KM_SLEEP); 2392 KM_SLEEP);
2396 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, 2393 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
@@ -2418,11 +2415,11 @@ xfs_iroot_realloc(
2418 else 2415 else
2419 new_size = 0; 2416 new_size = 0;
2420 if (new_size > 0) { 2417 if (new_size > 0) {
2421 new_broot = (xfs_bmbt_block_t *)kmem_alloc(new_size, KM_SLEEP); 2418 new_broot = kmem_alloc(new_size, KM_SLEEP);
2422 /* 2419 /*
2423 * First copy over the btree block header. 2420 * First copy over the btree block header.
2424 */ 2421 */
2425 memcpy(new_broot, ifp->if_broot, sizeof(xfs_bmbt_block_t)); 2422 memcpy(new_broot, ifp->if_broot, XFS_BTREE_LBLOCK_LEN);
2426 } else { 2423 } else {
2427 new_broot = NULL; 2424 new_broot = NULL;
2428 ifp->if_flags &= ~XFS_IFBROOT; 2425 ifp->if_flags &= ~XFS_IFBROOT;
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
index 55d50b888b68..6fd20fc179a4 100644
--- a/fs/xfs/xfs_inode.h
+++ b/fs/xfs/xfs_inode.h
@@ -63,7 +63,7 @@ typedef struct xfs_ext_irec {
63typedef struct xfs_ifork { 63typedef struct xfs_ifork {
64 int if_bytes; /* bytes in if_u1 */ 64 int if_bytes; /* bytes in if_u1 */
65 int if_real_bytes; /* bytes allocated in if_u1 */ 65 int if_real_bytes; /* bytes allocated in if_u1 */
66 xfs_bmbt_block_t *if_broot; /* file's incore btree root */ 66 struct xfs_btree_block *if_broot; /* file's incore btree root */
67 short if_broot_bytes; /* bytes allocated for root */ 67 short if_broot_bytes; /* bytes allocated for root */
68 unsigned char if_flags; /* per-fork flags */ 68 unsigned char if_flags; /* per-fork flags */
69 unsigned char if_ext_max; /* max # of extent records */ 69 unsigned char if_ext_max; /* max # of extent records */
@@ -213,7 +213,6 @@ struct ktrace;
213struct xfs_buf; 213struct xfs_buf;
214struct xfs_bmap_free; 214struct xfs_bmap_free;
215struct xfs_bmbt_irec; 215struct xfs_bmbt_irec;
216struct xfs_bmbt_block;
217struct xfs_inode_log_item; 216struct xfs_inode_log_item;
218struct xfs_mount; 217struct xfs_mount;
219struct xfs_trans; 218struct xfs_trans;
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 23c3a782a9e7..199c8ea36474 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -2452,8 +2452,8 @@ xlog_recover_do_inode_trans(
2452 break; 2452 break;
2453 2453
2454 case XFS_ILOG_DBROOT: 2454 case XFS_ILOG_DBROOT:
2455 xfs_bmbt_to_bmdr(mp, (xfs_bmbt_block_t *)src, len, 2455 xfs_bmbt_to_bmdr(mp, (struct xfs_btree_block *)src, len,
2456 &(dip->di_u.di_bmbt), 2456 &dip->di_u.di_bmbt,
2457 XFS_DFORK_DSIZE(dip, mp)); 2457 XFS_DFORK_DSIZE(dip, mp));
2458 break; 2458 break;
2459 2459
@@ -2490,8 +2490,8 @@ xlog_recover_do_inode_trans(
2490 2490
2491 case XFS_ILOG_ABROOT: 2491 case XFS_ILOG_ABROOT:
2492 dest = XFS_DFORK_APTR(dip); 2492 dest = XFS_DFORK_APTR(dip);
2493 xfs_bmbt_to_bmdr(mp, (xfs_bmbt_block_t *)src, len, 2493 xfs_bmbt_to_bmdr(mp, (struct xfs_btree_block *)src,
2494 (xfs_bmdr_block_t*)dest, 2494 len, (xfs_bmdr_block_t*)dest,
2495 XFS_DFORK_ASIZE(dip, mp)); 2495 XFS_DFORK_ASIZE(dip, mp));
2496 break; 2496 break;
2497 2497