aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_da_btree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_da_btree.c')
-rw-r--r--fs/xfs/xfs_da_btree.c44
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
696static void
697xfs_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
700xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) 718xfs_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 }