[PATCH 2/3] xfs: refactor xfs_refcountbt_alloc_block

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Split out a low level helper that we can use for enabling the reflink
btree at mount time.

Signed-off-by: Christoph Hellwig <hch@xxxxxx>
---
 fs/xfs/libxfs/xfs_refcount_btree.c | 54 +++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c
index f83cb4b..7ae3ad7 100644
--- a/fs/xfs/libxfs/xfs_refcount_btree.c
+++ b/fs/xfs/libxfs/xfs_refcount_btree.c
@@ -66,49 +66,61 @@ xfs_refcountbt_set_root(
 }
 
 STATIC int
-xfs_refcountbt_alloc_block(
-	struct xfs_btree_cur	*cur,
-	union xfs_btree_ptr	*start,
-	union xfs_btree_ptr	*new,
+__xfs_refcountbt_alloc_block(
+	struct xfs_trans	*tp,
+	xfs_agnumber_t		agno,
+	enum xfs_ag_resv_type	resv,
+	__be32			*agbno,
 	int			*stat)
 {
+	struct xfs_mount	*mp = tp->t_mountp;
 	struct xfs_alloc_arg	args;		/* block allocation args */
 	int			error;		/* error return value */
 
-	XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY);
-
 	memset(&args, 0, sizeof(args));
-	args.tp = cur->bc_tp;
-	args.mp = cur->bc_mp;
+	args.tp = tp;
+	args.mp = mp;
 	args.type = XFS_ALLOCTYPE_NEAR_BNO;
-	args.fsbno = XFS_AGB_TO_FSB(cur->bc_mp, cur->bc_private.a.agno,
-			xfs_refc_block(args.mp));
+	args.fsbno = XFS_AGB_TO_FSB(mp, agno, xfs_refc_block(mp));
 	args.firstblock = args.fsbno;
 	xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_REFC);
 	args.minlen = args.maxlen = args.prod = 1;
-	args.resv = XFS_AG_RESV_METADATA;
+	args.resv = resv;
 
 	error = xfs_alloc_vextent(&args);
 	if (error)
-		goto out_error;
-	trace_xfs_refcountbt_alloc_block(cur->bc_mp, cur->bc_private.a.agno,
-			args.agbno, 1);
+		return error;
+	trace_xfs_refcountbt_alloc_block(mp, agno, args.agbno, 1);
 	if (args.fsbno == NULLFSBLOCK) {
-		XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
 		*stat = 0;
 		return 0;
 	}
-	ASSERT(args.agno == cur->bc_private.a.agno);
+	ASSERT(args.agno == agno);
 	ASSERT(args.len == 1);
 
-	new->s = cpu_to_be32(args.agbno);
-
-	XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
+	*agbno = cpu_to_be32(args.agbno);
 	*stat = 1;
 	return 0;
+}
+
+STATIC int
+xfs_refcountbt_alloc_block(
+	struct xfs_btree_cur	*cur,
+	union xfs_btree_ptr	*start,
+	union xfs_btree_ptr	*new,
+	int			*stat)
+{
+	int			error;
+
+	XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY);
+
+	error = __xfs_refcountbt_alloc_block(cur->bc_tp, cur->bc_private.a.agno,
+			XFS_AG_RESV_METADATA, &new->s, stat);
+	if (error)
+		XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR);
+	else
+		XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
 
-out_error:
-	XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR);
 	return error;
 }
 
-- 
2.1.4

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs



[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux