diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_refcount_btree.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_refcount_btree.c | 78 | 
1 files changed, 28 insertions, 50 deletions
diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index 0d80bd99147c..ca59f6c89f3e 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -16,6 +16,7 @@  #include "xfs_refcount.h"  #include "xfs_alloc.h"  #include "xfs_error.h" +#include "xfs_health.h"  #include "xfs_trace.h"  #include "xfs_trans.h"  #include "xfs_bit.h" @@ -77,8 +78,6 @@ xfs_refcountbt_alloc_block(  					xfs_refc_block(args.mp)));  	if (error)  		goto out_error; -	trace_xfs_refcountbt_alloc_block(cur->bc_mp, cur->bc_ag.pag->pag_agno, -			args.agbno, 1);  	if (args.fsbno == NULLFSBLOCK) {  		*stat = 0;  		return 0; @@ -107,8 +106,6 @@ xfs_refcountbt_free_block(  	struct xfs_agf		*agf = agbp->b_addr;  	xfs_fsblock_t		fsbno = XFS_DADDR_TO_FSB(mp, xfs_buf_daddr(bp)); -	trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_ag.pag->pag_agno, -			XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1);  	be32_add_cpu(&agf->agf_refcount_blocks, -1);  	xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS);  	return xfs_free_extent_later(cur->bc_tp, fsbno, 1, @@ -220,7 +217,7 @@ xfs_refcountbt_verify(  	if (!xfs_has_reflink(mp))  		return __this_address; -	fa = xfs_btree_sblock_v5hdr_verify(bp); +	fa = xfs_btree_agblock_v5hdr_verify(bp);  	if (fa)  		return fa; @@ -242,7 +239,7 @@ xfs_refcountbt_verify(  	} else if (level >= mp->m_refc_maxlevels)  		return __this_address; -	return xfs_btree_sblock_verify(bp, mp->m_refc_mxr[level != 0]); +	return xfs_btree_agblock_verify(bp, mp->m_refc_mxr[level != 0]);  }  STATIC void @@ -251,7 +248,7 @@ xfs_refcountbt_read_verify(  {  	xfs_failaddr_t	fa; -	if (!xfs_btree_sblock_verify_crc(bp)) +	if (!xfs_btree_agblock_verify_crc(bp))  		xfs_verifier_error(bp, -EFSBADCRC, __this_address);  	else {  		fa = xfs_refcountbt_verify(bp); @@ -275,7 +272,7 @@ xfs_refcountbt_write_verify(  		xfs_verifier_error(bp, -EFSCORRUPTED, fa);  		return;  	} -	xfs_btree_sblock_calc_crc(bp); +	xfs_btree_agblock_calc_crc(bp);  } @@ -321,9 +318,17 @@ xfs_refcountbt_keys_contiguous(  				 be32_to_cpu(key2->refc.rc_startblock));  } -static const struct xfs_btree_ops xfs_refcountbt_ops = { +const struct xfs_btree_ops xfs_refcountbt_ops = { +	.name			= "refcount", +	.type			= XFS_BTREE_TYPE_AG, +  	.rec_len		= sizeof(struct xfs_refcount_rec),  	.key_len		= sizeof(struct xfs_refcount_key), +	.ptr_len		= XFS_BTREE_SHORT_PTR_LEN, + +	.lru_refs		= XFS_REFC_BTREE_REF, +	.statoff		= XFS_STATS_CALC_INDEX(xs_refcbt_2), +	.sick_mask		= XFS_SICK_AG_REFCNTBT,  	.dup_cursor		= xfs_refcountbt_dup_cursor,  	.set_root		= xfs_refcountbt_set_root, @@ -344,59 +349,32 @@ static const struct xfs_btree_ops xfs_refcountbt_ops = {  };  /* - * Initialize a new refcount btree cursor. + * Create a new refcount btree cursor. + * + * For staging cursors tp and agbp are NULL.   */ -static struct xfs_btree_cur * -xfs_refcountbt_init_common( +struct xfs_btree_cur * +xfs_refcountbt_init_cursor(  	struct xfs_mount	*mp,  	struct xfs_trans	*tp, +	struct xfs_buf		*agbp,  	struct xfs_perag	*pag)  {  	struct xfs_btree_cur	*cur;  	ASSERT(pag->pag_agno < mp->m_sb.sb_agcount); -	cur = xfs_btree_alloc_cursor(mp, tp, XFS_BTNUM_REFC, +	cur = xfs_btree_alloc_cursor(mp, tp, &xfs_refcountbt_ops,  			mp->m_refc_maxlevels, xfs_refcountbt_cur_cache); -	cur->bc_statoff = XFS_STATS_CALC_INDEX(xs_refcbt_2); - -	cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; -  	cur->bc_ag.pag = xfs_perag_hold(pag); -	cur->bc_ag.refc.nr_ops = 0; -	cur->bc_ag.refc.shape_changes = 0; -	cur->bc_ops = &xfs_refcountbt_ops; -	return cur; -} - -/* Create a btree cursor. */ -struct xfs_btree_cur * -xfs_refcountbt_init_cursor( -	struct xfs_mount	*mp, -	struct xfs_trans	*tp, -	struct xfs_buf		*agbp, -	struct xfs_perag	*pag) -{ -	struct xfs_agf		*agf = agbp->b_addr; -	struct xfs_btree_cur	*cur; - -	cur = xfs_refcountbt_init_common(mp, tp, pag); -	cur->bc_nlevels = be32_to_cpu(agf->agf_refcount_level); +	cur->bc_refc.nr_ops = 0; +	cur->bc_refc.shape_changes = 0;  	cur->bc_ag.agbp = agbp; -	return cur; -} +	if (agbp) { +		struct xfs_agf		*agf = agbp->b_addr; -/* Create a btree cursor with a fake root for staging. */ -struct xfs_btree_cur * -xfs_refcountbt_stage_cursor( -	struct xfs_mount	*mp, -	struct xbtree_afakeroot	*afake, -	struct xfs_perag	*pag) -{ -	struct xfs_btree_cur	*cur; - -	cur = xfs_refcountbt_init_common(mp, NULL, pag); -	xfs_btree_stage_afakeroot(cur, afake); +		cur->bc_nlevels = be32_to_cpu(agf->agf_refcount_level); +	}  	return cur;  } @@ -421,7 +399,7 @@ xfs_refcountbt_commit_staged_btree(  	xfs_alloc_log_agf(tp, agbp, XFS_AGF_REFCOUNT_BLOCKS |  				    XFS_AGF_REFCOUNT_ROOT |  				    XFS_AGF_REFCOUNT_LEVEL); -	xfs_btree_commit_afakeroot(cur, tp, agbp, &xfs_refcountbt_ops); +	xfs_btree_commit_afakeroot(cur, tp, agbp);  }  /* Calculate number of records in a refcount btree block. */  | 
