diff options
Diffstat (limited to 'fs/xfs/xfs_da_btree.c')
-rw-r--r-- | fs/xfs/xfs_da_btree.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 2925726529f8..ee9d5427fcd4 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c | |||
@@ -692,6 +692,24 @@ xfs_da_join(xfs_da_state_t *state) | |||
692 | return(error); | 692 | return(error); |
693 | } | 693 | } |
694 | 694 | ||
695 | #ifdef DEBUG | ||
696 | static void | ||
697 | xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) | ||
698 | { | ||
699 | __be16 magic = blkinfo->magic; | ||
700 | |||
701 | if (level == 1) { | ||
702 | ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || | ||
703 | magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); | ||
704 | } else | ||
705 | ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); | ||
706 | ASSERT(!blkinfo->forw); | ||
707 | ASSERT(!blkinfo->back); | ||
708 | } | ||
709 | #else /* !DEBUG */ | ||
710 | #define xfs_da_blkinfo_onlychild_validate(blkinfo, level) | ||
711 | #endif /* !DEBUG */ | ||
712 | |||
695 | /* | 713 | /* |
696 | * We have only one entry in the root. Copy the only remaining child of | 714 | * We have only one entry in the root. Copy the only remaining child of |
697 | * the old root to block 0 as the new root node. | 715 | * the old root to block 0 as the new root node. |
@@ -700,8 +718,6 @@ STATIC int | |||
700 | xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) | 718 | xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) |
701 | { | 719 | { |
702 | xfs_da_intnode_t *oldroot; | 720 | xfs_da_intnode_t *oldroot; |
703 | /* REFERENCED */ | ||
704 | xfs_da_blkinfo_t *blkinfo; | ||
705 | xfs_da_args_t *args; | 721 | xfs_da_args_t *args; |
706 | xfs_dablk_t child; | 722 | xfs_dablk_t child; |
707 | xfs_dabuf_t *bp; | 723 | xfs_dabuf_t *bp; |
@@ -732,15 +748,9 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) | |||
732 | if (error) | 748 | if (error) |
733 | return(error); | 749 | return(error); |
734 | ASSERT(bp != NULL); | 750 | ASSERT(bp != NULL); |
735 | blkinfo = bp->data; | 751 | xfs_da_blkinfo_onlychild_validate(bp->data, |
736 | if (be16_to_cpu(oldroot->hdr.level) == 1) { | 752 | be16_to_cpu(oldroot->hdr.level)); |
737 | ASSERT(blkinfo->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || | 753 | |
738 | blkinfo->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); | ||
739 | } else { | ||
740 | ASSERT(blkinfo->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); | ||
741 | } | ||
742 | ASSERT(!blkinfo->forw); | ||
743 | ASSERT(!blkinfo->back); | ||
744 | memcpy(root_blk->bp->data, bp->data, state->blocksize); | 754 | memcpy(root_blk->bp->data, bp->data, state->blocksize); |
745 | xfs_da_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); | 755 | xfs_da_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); |
746 | error = xfs_da_shrink_inode(args, child, bp); | 756 | error = xfs_da_shrink_inode(args, child, bp); |
@@ -2040,7 +2050,7 @@ xfs_da_do_buf( | |||
2040 | case 0: | 2050 | case 0: |
2041 | bp = xfs_trans_get_buf(trans, mp->m_ddev_targp, | 2051 | bp = xfs_trans_get_buf(trans, mp->m_ddev_targp, |
2042 | mappedbno, nmapped, 0); | 2052 | mappedbno, nmapped, 0); |
2043 | error = bp ? XFS_BUF_GETERROR(bp) : XFS_ERROR(EIO); | 2053 | error = bp ? bp->b_error : XFS_ERROR(EIO); |
2044 | break; | 2054 | break; |
2045 | case 1: | 2055 | case 1: |
2046 | case 2: | 2056 | case 2: |
@@ -2258,7 +2268,7 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bps) | |||
2258 | dabuf->nbuf = 1; | 2268 | dabuf->nbuf = 1; |
2259 | bp = bps[0]; | 2269 | bp = bps[0]; |
2260 | dabuf->bbcount = (short)BTOBB(XFS_BUF_COUNT(bp)); | 2270 | dabuf->bbcount = (short)BTOBB(XFS_BUF_COUNT(bp)); |
2261 | dabuf->data = XFS_BUF_PTR(bp); | 2271 | dabuf->data = bp->b_addr; |
2262 | dabuf->bps[0] = bp; | 2272 | dabuf->bps[0] = bp; |
2263 | } else { | 2273 | } else { |
2264 | dabuf->nbuf = nbuf; | 2274 | dabuf->nbuf = nbuf; |
@@ -2269,7 +2279,7 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bps) | |||
2269 | dabuf->data = kmem_alloc(BBTOB(dabuf->bbcount), KM_SLEEP); | 2279 | dabuf->data = kmem_alloc(BBTOB(dabuf->bbcount), KM_SLEEP); |
2270 | for (i = off = 0; i < nbuf; i++, off += XFS_BUF_COUNT(bp)) { | 2280 | for (i = off = 0; i < nbuf; i++, off += XFS_BUF_COUNT(bp)) { |
2271 | bp = bps[i]; | 2281 | bp = bps[i]; |
2272 | memcpy((char *)dabuf->data + off, XFS_BUF_PTR(bp), | 2282 | memcpy((char *)dabuf->data + off, bp->b_addr, |
2273 | XFS_BUF_COUNT(bp)); | 2283 | XFS_BUF_COUNT(bp)); |
2274 | } | 2284 | } |
2275 | } | 2285 | } |
@@ -2292,8 +2302,8 @@ xfs_da_buf_clean(xfs_dabuf_t *dabuf) | |||
2292 | for (i = off = 0; i < dabuf->nbuf; | 2302 | for (i = off = 0; i < dabuf->nbuf; |
2293 | i++, off += XFS_BUF_COUNT(bp)) { | 2303 | i++, off += XFS_BUF_COUNT(bp)) { |
2294 | bp = dabuf->bps[i]; | 2304 | bp = dabuf->bps[i]; |
2295 | memcpy(XFS_BUF_PTR(bp), (char *)dabuf->data + off, | 2305 | memcpy(bp->b_addr, dabuf->data + off, |
2296 | XFS_BUF_COUNT(bp)); | 2306 | XFS_BUF_COUNT(bp)); |
2297 | } | 2307 | } |
2298 | } | 2308 | } |
2299 | } | 2309 | } |
@@ -2330,7 +2340,7 @@ xfs_da_log_buf(xfs_trans_t *tp, xfs_dabuf_t *dabuf, uint first, uint last) | |||
2330 | 2340 | ||
2331 | ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); | 2341 | ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); |
2332 | if (dabuf->nbuf == 1) { | 2342 | if (dabuf->nbuf == 1) { |
2333 | ASSERT(dabuf->data == (void *)XFS_BUF_PTR(dabuf->bps[0])); | 2343 | ASSERT(dabuf->data == dabuf->bps[0]->b_addr); |
2334 | xfs_trans_log_buf(tp, dabuf->bps[0], first, last); | 2344 | xfs_trans_log_buf(tp, dabuf->bps[0], first, last); |
2335 | return; | 2345 | return; |
2336 | } | 2346 | } |