diff mbox series

[02/16] xfs: rename xfs_has_attr()

Message ID 20210810052451.41578-3-david@fromorbit.com (mailing list archive)
State Superseded
Headers show
Series xfs: rework feature flags | expand

Commit Message

Dave Chinner Aug. 10, 2021, 5:24 a.m. UTC
From: Dave Chinner <dchinner@redhat.com>

xfs_has_attr() is poorly named. It has global scope as it is defined
in a header file, but it has no namespace scope that tells us what
it is checking has attributes. It's not even clear what "has_attr"
means, because what it is actually doing is an attribute fork lookup
to see if the attribute exists.

Upcoming patches use this "xfs_has_<foo>" namespace for global
filesystem features, which conflicts with this function.

Rename xfs_has_attr() to xfs_attr_lookup() and make it a static
function, freeing up the "xfs_has_" namespace for global scope
usage.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/libxfs/xfs_attr.c | 8 ++++----
 fs/xfs/libxfs/xfs_attr.h | 1 -
 2 files changed, 4 insertions(+), 5 deletions(-)

Comments

Christoph Hellwig Aug. 12, 2021, 8:03 a.m. UTC | #1
On Tue, Aug 10, 2021 at 03:24:37PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> xfs_has_attr() is poorly named. It has global scope as it is defined
> in a header file, but it has no namespace scope that tells us what
> it is checking has attributes. It's not even clear what "has_attr"
> means, because what it is actually doing is an attribute fork lookup
> to see if the attribute exists.
> 
> Upcoming patches use this "xfs_has_<foo>" namespace for global
> filesystem features, which conflicts with this function.
> 
> Rename xfs_has_attr() to xfs_attr_lookup() and make it a static
> function, freeing up the "xfs_has_" namespace for global scope
> usage.

Why not kill this function entirely as I suggested last time?

---
From 154d64990a9f410200a117729149dc1febb02458 Mon Sep 17 00:00:00 2001
From: Christoph Hellwig <hch@lst.de>
Date: Thu, 12 Aug 2021 10:01:08 +0200
Subject: xfs: remove xfs_has_attr

xfs_has_attr() is poorly named. It has global scope as it is defined
in a header file, but it has no namespace scope that tells us what
it is checking has attributes. It's not even clear what "has_attr"
means, because what it is actually doing is an attribute fork lookup
to see if the attribute exists.

Fold it into the only caller.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/libxfs/xfs_attr.c | 46 ++++++++++++----------------------------
 fs/xfs/libxfs/xfs_attr.h |  1 -
 2 files changed, 14 insertions(+), 33 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index 010d499b237c55..939afdcec634be 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c
@@ -638,36 +638,6 @@ xfs_attr_set_iter(
 	return error;
 }
 
-
-/*
- * Return EEXIST if attr is found, or ENOATTR if not
- */
-int
-xfs_has_attr(
-	struct xfs_da_args	*args)
-{
-	struct xfs_inode	*dp = args->dp;
-	struct xfs_buf		*bp = NULL;
-	int			error;
-
-	if (!xfs_inode_hasattr(dp))
-		return -ENOATTR;
-
-	if (dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL)
-		return xfs_attr_sf_findname(args, NULL, NULL);
-
-	if (xfs_attr_is_leaf(dp)) {
-		error = xfs_attr_leaf_hasname(args, &bp);
-
-		if (bp)
-			xfs_trans_brelse(args->trans, bp);
-
-		return error;
-	}
-
-	return xfs_attr_node_hasname(args, NULL);
-}
-
 /*
  * Remove the attribute specified in @args.
  */
@@ -780,8 +750,21 @@ xfs_attr_set(
 			goto out_trans_cancel;
 	}
 
+	if (!xfs_inode_hasattr(dp)) {
+		error = -ENOATTR;
+	} else if (dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL) {
+		error = xfs_attr_sf_findname(args, NULL, NULL);
+	} else if (xfs_attr_is_leaf(dp)) {
+		struct xfs_buf		*bp = NULL;
+
+		error = xfs_attr_leaf_hasname(args, &bp);
+		if (bp)
+			xfs_trans_brelse(args->trans, bp);
+	} else {
+		error = xfs_attr_node_hasname(args, NULL);
+	}
+
 	if (args->value) {
-		error = xfs_has_attr(args);
 		if (error == -EEXIST && (args->attr_flags & XATTR_CREATE))
 			goto out_trans_cancel;
 		if (error == -ENOATTR && (args->attr_flags & XATTR_REPLACE))
@@ -796,7 +779,6 @@ xfs_attr_set(
 		if (!args->trans)
 			goto out_unlock;
 	} else {
-		error = xfs_has_attr(args);
 		if (error != -EEXIST)
 			goto out_trans_cancel;
 
diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h
index 8de5d1d2733ead..5e71f719bdd52b 100644
--- a/fs/xfs/libxfs/xfs_attr.h
+++ b/fs/xfs/libxfs/xfs_attr.h
@@ -490,7 +490,6 @@ int xfs_attr_get_ilocked(struct xfs_da_args *args);
 int xfs_attr_get(struct xfs_da_args *args);
 int xfs_attr_set(struct xfs_da_args *args);
 int xfs_attr_set_args(struct xfs_da_args *args);
-int xfs_has_attr(struct xfs_da_args *args);
 int xfs_attr_remove_args(struct xfs_da_args *args);
 int xfs_attr_remove_iter(struct xfs_delattr_context *dac);
 bool xfs_attr_namecheck(const void *name, size_t length);
Dave Chinner Aug. 18, 2021, 12:56 a.m. UTC | #2
On Thu, Aug 12, 2021 at 09:03:34AM +0100, Christoph Hellwig wrote:
> On Tue, Aug 10, 2021 at 03:24:37PM +1000, Dave Chinner wrote:
> > From: Dave Chinner <dchinner@redhat.com>
> > 
> > xfs_has_attr() is poorly named. It has global scope as it is defined
> > in a header file, but it has no namespace scope that tells us what
> > it is checking has attributes. It's not even clear what "has_attr"
> > means, because what it is actually doing is an attribute fork lookup
> > to see if the attribute exists.
> > 
> > Upcoming patches use this "xfs_has_<foo>" namespace for global
> > filesystem features, which conflicts with this function.
> > 
> > Rename xfs_has_attr() to xfs_attr_lookup() and make it a static
> > function, freeing up the "xfs_has_" namespace for global scope
> > usage.
> 
> Why not kill this function entirely as I suggested last time?

Because I think it's the wrong cleanup to apply to xfs_attr_set().
xfs_attr_set() needs to be split into two - a set() function and a
remove() function to get rid of all the conditional "if
(arg->value)" logic in it that separates set from remove. Most
of the code in the function is under such if/else clauses, and the
set() code is much more complex than the remove() case. Folding the
attr lookup into the xfs_attr_set() doesn't do anything to address
this high level badness, and to split it appropriately we need to
keep the common attr lookup code in it's own function.

I updated the patch to has a single xfs_attr_lookup() call instead
of one per branch, but I don't think removing the helper is the
right way to go here...

Cheers,

Dave.
Darrick J. Wong Aug. 18, 2021, 2:56 a.m. UTC | #3
On Wed, Aug 18, 2021 at 10:56:08AM +1000, Dave Chinner wrote:
> On Thu, Aug 12, 2021 at 09:03:34AM +0100, Christoph Hellwig wrote:
> > On Tue, Aug 10, 2021 at 03:24:37PM +1000, Dave Chinner wrote:
> > > From: Dave Chinner <dchinner@redhat.com>
> > > 
> > > xfs_has_attr() is poorly named. It has global scope as it is defined
> > > in a header file, but it has no namespace scope that tells us what
> > > it is checking has attributes. It's not even clear what "has_attr"
> > > means, because what it is actually doing is an attribute fork lookup
> > > to see if the attribute exists.
> > > 
> > > Upcoming patches use this "xfs_has_<foo>" namespace for global
> > > filesystem features, which conflicts with this function.
> > > 
> > > Rename xfs_has_attr() to xfs_attr_lookup() and make it a static
> > > function, freeing up the "xfs_has_" namespace for global scope
> > > usage.
> > 
> > Why not kill this function entirely as I suggested last time?
> 
> Because I think it's the wrong cleanup to apply to xfs_attr_set().
> xfs_attr_set() needs to be split into two - a set() function and a
> remove() function to get rid of all the conditional "if
> (arg->value)" logic in it that separates set from remove. Most
> of the code in the function is under such if/else clauses, and the
> set() code is much more complex than the remove() case. Folding the
> attr lookup into the xfs_attr_set() doesn't do anything to address
> this high level badness, and to split it appropriately we need to
> keep the common attr lookup code in it's own function.
> 
> I updated the patch to has a single xfs_attr_lookup() call instead
> of one per branch, but I don't think removing the helper is the
> right way to go here...

I prefer we leave the xattr code alone (renaming things to avoid name
conflicts is ok) and concentrated on helping Allison land xattr logging.
Once that's done, xfs_attr_set and xfs_attr_remove become trivial
frontends to a deferred operation.

--D

> Cheers,
> 
> Dave.
> -- 
> Dave Chinner
> david@fromorbit.com
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index 010d499b237c..6771bd700770 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c
@@ -642,8 +642,8 @@  xfs_attr_set_iter(
 /*
  * Return EEXIST if attr is found, or ENOATTR if not
  */
-int
-xfs_has_attr(
+static int
+xfs_attr_lookup(
 	struct xfs_da_args	*args)
 {
 	struct xfs_inode	*dp = args->dp;
@@ -781,7 +781,7 @@  xfs_attr_set(
 	}
 
 	if (args->value) {
-		error = xfs_has_attr(args);
+		error = xfs_attr_lookup(args);
 		if (error == -EEXIST && (args->attr_flags & XATTR_CREATE))
 			goto out_trans_cancel;
 		if (error == -ENOATTR && (args->attr_flags & XATTR_REPLACE))
@@ -796,7 +796,7 @@  xfs_attr_set(
 		if (!args->trans)
 			goto out_unlock;
 	} else {
-		error = xfs_has_attr(args);
+		error = xfs_attr_lookup(args);
 		if (error != -EEXIST)
 			goto out_trans_cancel;
 
diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h
index 8de5d1d2733e..5e71f719bdd5 100644
--- a/fs/xfs/libxfs/xfs_attr.h
+++ b/fs/xfs/libxfs/xfs_attr.h
@@ -490,7 +490,6 @@  int xfs_attr_get_ilocked(struct xfs_da_args *args);
 int xfs_attr_get(struct xfs_da_args *args);
 int xfs_attr_set(struct xfs_da_args *args);
 int xfs_attr_set_args(struct xfs_da_args *args);
-int xfs_has_attr(struct xfs_da_args *args);
 int xfs_attr_remove_args(struct xfs_da_args *args);
 int xfs_attr_remove_iter(struct xfs_delattr_context *dac);
 bool xfs_attr_namecheck(const void *name, size_t length);