diff mbox series

[1/5] xfs: consolidate the xfs_attr_defer_* helpers

Message ID 20231213090633.231707-2-hch@lst.de (mailing list archive)
State Deferred, archived
Headers show
Series [1/5] xfs: consolidate the xfs_attr_defer_* helpers | expand

Commit Message

Christoph Hellwig Dec. 13, 2023, 9:06 a.m. UTC
Consolidate the xfs_attr_defer_* helpers into a single xfs_attr_defer_add
one that picks the right dela_state based on the passed in operation.
Also move to a single trace point as the actual operation is visible
through the flags in the delta_state passed to the trace point.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/libxfs/xfs_attr.c | 90 ++++++++++------------------------------
 fs/xfs/xfs_trace.h       |  2 -
 2 files changed, 21 insertions(+), 71 deletions(-)

Comments

Darrick J. Wong Dec. 13, 2023, 6:10 p.m. UTC | #1
On Wed, Dec 13, 2023 at 10:06:29AM +0100, Christoph Hellwig wrote:
> Consolidate the xfs_attr_defer_* helpers into a single xfs_attr_defer_add
> one that picks the right dela_state based on the passed in operation.
> Also move to a single trace point as the actual operation is visible
> through the flags in the delta_state passed to the trace point.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Heh, I had been thinking about the same consolidation...
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  fs/xfs/libxfs/xfs_attr.c | 90 ++++++++++------------------------------
>  fs/xfs/xfs_trace.h       |  2 -
>  2 files changed, 21 insertions(+), 71 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
> index e28d93d232de49..4fed0c87a968ab 100644
> --- a/fs/xfs/libxfs/xfs_attr.c
> +++ b/fs/xfs/libxfs/xfs_attr.c
> @@ -880,11 +880,10 @@ xfs_attr_lookup(
>  	return error;
>  }
>  
> -static int
> -xfs_attr_intent_init(
> +static void
> +xfs_attr_defer_add(
>  	struct xfs_da_args	*args,
> -	unsigned int		op_flags,	/* op flag (set or remove) */
> -	struct xfs_attr_intent	**attr)		/* new xfs_attr_intent */
> +	unsigned int		op_flags)
>  {
>  
>  	struct xfs_attr_intent	*new;
> @@ -893,66 +892,22 @@ xfs_attr_intent_init(
>  	new->xattri_op_flags = op_flags;
>  	new->xattri_da_args = args;
>  
> -	*attr = new;
> -	return 0;
> -}
> -
> -/* Sets an attribute for an inode as a deferred operation */
> -static int
> -xfs_attr_defer_add(
> -	struct xfs_da_args	*args)
> -{
> -	struct xfs_attr_intent	*new;
> -	int			error = 0;
> -
> -	error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_SET, &new);
> -	if (error)
> -		return error;
> +	switch (op_flags) {
> +	case XFS_ATTRI_OP_FLAGS_SET:
> +		new->xattri_dela_state = xfs_attr_init_add_state(args);
> +		break;
> +	case XFS_ATTRI_OP_FLAGS_REPLACE:
> +		new->xattri_dela_state = xfs_attr_init_replace_state(args);
> +		break;
> +	case XFS_ATTRI_OP_FLAGS_REMOVE:
> +		new->xattri_dela_state = xfs_attr_init_remove_state(args);
> +		break;
> +	default:
> +		ASSERT(0);
> +	}
>  
> -	new->xattri_dela_state = xfs_attr_init_add_state(args);
>  	xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list);
>  	trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp);
> -
> -	return 0;
> -}
> -
> -/* Sets an attribute for an inode as a deferred operation */
> -static int
> -xfs_attr_defer_replace(
> -	struct xfs_da_args	*args)
> -{
> -	struct xfs_attr_intent	*new;
> -	int			error = 0;
> -
> -	error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REPLACE, &new);
> -	if (error)
> -		return error;
> -
> -	new->xattri_dela_state = xfs_attr_init_replace_state(args);
> -	xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list);
> -	trace_xfs_attr_defer_replace(new->xattri_dela_state, args->dp);
> -
> -	return 0;
> -}
> -
> -/* Removes an attribute for an inode as a deferred operation */
> -static int
> -xfs_attr_defer_remove(
> -	struct xfs_da_args	*args)
> -{
> -
> -	struct xfs_attr_intent	*new;
> -	int			error;
> -
> -	error  = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REMOVE, &new);
> -	if (error)
> -		return error;
> -
> -	new->xattri_dela_state = xfs_attr_init_remove_state(args);
> -	xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list);
> -	trace_xfs_attr_defer_remove(new->xattri_dela_state, args->dp);
> -
> -	return 0;
>  }
>  
>  /*
> @@ -1038,16 +993,16 @@ xfs_attr_set(
>  	error = xfs_attr_lookup(args);
>  	switch (error) {
>  	case -EEXIST:
> -		/* if no value, we are performing a remove operation */
>  		if (!args->value) {
> -			error = xfs_attr_defer_remove(args);
> +			/* if no value, we are performing a remove operation */
> +			xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REMOVE);
>  			break;
>  		}
> +
>  		/* Pure create fails if the attr already exists */
>  		if (args->attr_flags & XATTR_CREATE)
>  			goto out_trans_cancel;
> -
> -		error = xfs_attr_defer_replace(args);
> +		xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REPLACE);
>  		break;
>  	case -ENOATTR:
>  		/* Can't remove what isn't there. */
> @@ -1057,14 +1012,11 @@ xfs_attr_set(
>  		/* Pure replace fails if no existing attr to replace. */
>  		if (args->attr_flags & XATTR_REPLACE)
>  			goto out_trans_cancel;
> -
> -		error = xfs_attr_defer_add(args);
> +		xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_SET);
>  		break;
>  	default:
>  		goto out_trans_cancel;
>  	}
> -	if (error)
> -		goto out_trans_cancel;
>  
>  	/*
>  	 * If this is a synchronous mount, make sure that the
> diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
> index 514095b6ba2bdb..516529c151ae1c 100644
> --- a/fs/xfs/xfs_trace.h
> +++ b/fs/xfs/xfs_trace.h
> @@ -4408,8 +4408,6 @@ DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return);
>  DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_alloc);
>  DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return);
>  DEFINE_DAS_STATE_EVENT(xfs_attr_defer_add);
> -DEFINE_DAS_STATE_EVENT(xfs_attr_defer_replace);
> -DEFINE_DAS_STATE_EVENT(xfs_attr_defer_remove);
>  
>  
>  TRACE_EVENT(xfs_force_shutdown,
> -- 
> 2.39.2
> 
>
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index e28d93d232de49..4fed0c87a968ab 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c
@@ -880,11 +880,10 @@  xfs_attr_lookup(
 	return error;
 }
 
-static int
-xfs_attr_intent_init(
+static void
+xfs_attr_defer_add(
 	struct xfs_da_args	*args,
-	unsigned int		op_flags,	/* op flag (set or remove) */
-	struct xfs_attr_intent	**attr)		/* new xfs_attr_intent */
+	unsigned int		op_flags)
 {
 
 	struct xfs_attr_intent	*new;
@@ -893,66 +892,22 @@  xfs_attr_intent_init(
 	new->xattri_op_flags = op_flags;
 	new->xattri_da_args = args;
 
-	*attr = new;
-	return 0;
-}
-
-/* Sets an attribute for an inode as a deferred operation */
-static int
-xfs_attr_defer_add(
-	struct xfs_da_args	*args)
-{
-	struct xfs_attr_intent	*new;
-	int			error = 0;
-
-	error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_SET, &new);
-	if (error)
-		return error;
+	switch (op_flags) {
+	case XFS_ATTRI_OP_FLAGS_SET:
+		new->xattri_dela_state = xfs_attr_init_add_state(args);
+		break;
+	case XFS_ATTRI_OP_FLAGS_REPLACE:
+		new->xattri_dela_state = xfs_attr_init_replace_state(args);
+		break;
+	case XFS_ATTRI_OP_FLAGS_REMOVE:
+		new->xattri_dela_state = xfs_attr_init_remove_state(args);
+		break;
+	default:
+		ASSERT(0);
+	}
 
-	new->xattri_dela_state = xfs_attr_init_add_state(args);
 	xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list);
 	trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp);
-
-	return 0;
-}
-
-/* Sets an attribute for an inode as a deferred operation */
-static int
-xfs_attr_defer_replace(
-	struct xfs_da_args	*args)
-{
-	struct xfs_attr_intent	*new;
-	int			error = 0;
-
-	error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REPLACE, &new);
-	if (error)
-		return error;
-
-	new->xattri_dela_state = xfs_attr_init_replace_state(args);
-	xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list);
-	trace_xfs_attr_defer_replace(new->xattri_dela_state, args->dp);
-
-	return 0;
-}
-
-/* Removes an attribute for an inode as a deferred operation */
-static int
-xfs_attr_defer_remove(
-	struct xfs_da_args	*args)
-{
-
-	struct xfs_attr_intent	*new;
-	int			error;
-
-	error  = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REMOVE, &new);
-	if (error)
-		return error;
-
-	new->xattri_dela_state = xfs_attr_init_remove_state(args);
-	xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list);
-	trace_xfs_attr_defer_remove(new->xattri_dela_state, args->dp);
-
-	return 0;
 }
 
 /*
@@ -1038,16 +993,16 @@  xfs_attr_set(
 	error = xfs_attr_lookup(args);
 	switch (error) {
 	case -EEXIST:
-		/* if no value, we are performing a remove operation */
 		if (!args->value) {
-			error = xfs_attr_defer_remove(args);
+			/* if no value, we are performing a remove operation */
+			xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REMOVE);
 			break;
 		}
+
 		/* Pure create fails if the attr already exists */
 		if (args->attr_flags & XATTR_CREATE)
 			goto out_trans_cancel;
-
-		error = xfs_attr_defer_replace(args);
+		xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REPLACE);
 		break;
 	case -ENOATTR:
 		/* Can't remove what isn't there. */
@@ -1057,14 +1012,11 @@  xfs_attr_set(
 		/* Pure replace fails if no existing attr to replace. */
 		if (args->attr_flags & XATTR_REPLACE)
 			goto out_trans_cancel;
-
-		error = xfs_attr_defer_add(args);
+		xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_SET);
 		break;
 	default:
 		goto out_trans_cancel;
 	}
-	if (error)
-		goto out_trans_cancel;
 
 	/*
 	 * If this is a synchronous mount, make sure that the
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
index 514095b6ba2bdb..516529c151ae1c 100644
--- a/fs/xfs/xfs_trace.h
+++ b/fs/xfs/xfs_trace.h
@@ -4408,8 +4408,6 @@  DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return);
 DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_alloc);
 DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return);
 DEFINE_DAS_STATE_EVENT(xfs_attr_defer_add);
-DEFINE_DAS_STATE_EVENT(xfs_attr_defer_replace);
-DEFINE_DAS_STATE_EVENT(xfs_attr_defer_remove);
 
 
 TRACE_EVENT(xfs_force_shutdown,