diff options
Diffstat (limited to 'fs/xfs/xfs_alloc_btree.c')
| -rw-r--r-- | fs/xfs/xfs_alloc_btree.c | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index 3ce2645508a..60c121f1e81 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -2209,3 +2209,48 @@ xfs_alloc_update(  	}  	return 0;  } + +STATIC struct xfs_btree_cur * +xfs_allocbt_dup_cursor( +	struct xfs_btree_cur	*cur) +{ +	return xfs_allocbt_init_cursor(cur->bc_mp, cur->bc_tp, +			cur->bc_private.a.agbp, cur->bc_private.a.agno, +			cur->bc_btnum); +} + +static const struct xfs_btree_ops xfs_allocbt_ops = { +	.dup_cursor		= xfs_allocbt_dup_cursor, +}; + +/* + * Allocate a new allocation btree cursor. + */ +struct xfs_btree_cur *			/* new alloc btree cursor */ +xfs_allocbt_init_cursor( +	struct xfs_mount	*mp,		/* file system mount point */ +	struct xfs_trans	*tp,		/* transaction pointer */ +	struct xfs_buf		*agbp,		/* buffer for agf structure */ +	xfs_agnumber_t		agno,		/* allocation group number */ +	xfs_btnum_t		btnum)		/* btree identifier */ +{ +	struct xfs_agf		*agf = XFS_BUF_TO_AGF(agbp); +	struct xfs_btree_cur	*cur; + +	ASSERT(btnum == XFS_BTNUM_BNO || btnum == XFS_BTNUM_CNT); + +	cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_SLEEP); + +	cur->bc_tp = tp; +	cur->bc_mp = mp; +	cur->bc_nlevels = be32_to_cpu(agf->agf_levels[btnum]); +	cur->bc_btnum = btnum; +	cur->bc_blocklog = mp->m_sb.sb_blocklog; + +	cur->bc_ops = &xfs_allocbt_ops; + +	cur->bc_private.a.agbp = agbp; +	cur->bc_private.a.agno = agno; + +	return cur; +}  |