From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: cem@kernel.org, linux-xfs@vger.kernel.org, mark.tinguely@oracle.com
Subject: Re: [PATCH] xfs: remove xfs_attr_leaf_hasname
Date: Fri, 9 Jan 2026 08:29:11 -0800 [thread overview]
Message-ID: <20260109162911.GR15551@frogsfrogsfrogs> (raw)
In-Reply-To: <20260109151741.2376835-1-hch@lst.de>
On Fri, Jan 09, 2026 at 04:17:40PM +0100, Christoph Hellwig wrote:
> The calling convention of xfs_attr_leaf_hasname() is problematic, because
> it returns a NULL buffer when xfs_attr3_leaf_read fails, a valid buffer
> when xfs_attr3_leaf_lookup_int returns -ENOATTR or -EEXIST, and a
> non-NULL buffer pointer for an already released buffer when
> xfs_attr3_leaf_lookup_int fails with other error values.
>
> Fix this by simply open coding xfs_attr_leaf_hasname in the callers, so
> that the buffer release code is done by each caller of
> xfs_attr3_leaf_read.
>
> X-Cc: stable@vger.kernel.org # v5.19+
> Fixes: 07120f1abdff ("xfs: Add xfs_has_attr and subroutines")
> Reported-by: Mark Tinguely <mark.tinguely@oracle.com>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Blerrgh, xfs_attr3_leaf_lookup_int encoding results with error numbers
makes my brain hurt every time I look at the xattr code... but this
patch is (afaict) a correct way to avoid the **bp state confusion
presented by xfs_attr_leaf_hasname.
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> ---
> fs/xfs/libxfs/xfs_attr.c | 75 +++++++++++++---------------------------
> 1 file changed, 24 insertions(+), 51 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
> index 8c04acd30d48..b88e65c7e45d 100644
> --- a/fs/xfs/libxfs/xfs_attr.c
> +++ b/fs/xfs/libxfs/xfs_attr.c
> @@ -50,7 +50,6 @@ STATIC int xfs_attr_shortform_addname(xfs_da_args_t *args);
> */
> STATIC int xfs_attr_leaf_get(xfs_da_args_t *args);
> STATIC int xfs_attr_leaf_removename(xfs_da_args_t *args);
> -STATIC int xfs_attr_leaf_hasname(struct xfs_da_args *args, struct xfs_buf **bp);
>
> /*
> * Internal routines when attribute list is more than one block.
> @@ -979,11 +978,12 @@ xfs_attr_lookup(
> return error;
>
> if (xfs_attr_is_leaf(dp)) {
> - error = xfs_attr_leaf_hasname(args, &bp);
> -
> - if (bp)
> - xfs_trans_brelse(args->trans, bp);
> -
> + error = xfs_attr3_leaf_read(args->trans, args->dp, args->owner,
> + 0, &bp);
> + if (error)
> + return error;
> + error = xfs_attr3_leaf_lookup_int(bp, args);
> + xfs_trans_brelse(args->trans, bp);
> return error;
> }
>
> @@ -1222,27 +1222,6 @@ xfs_attr_shortform_addname(
> * External routines when attribute list is one block
> *========================================================================*/
>
> -/*
> - * Return EEXIST if attr is found, or ENOATTR if not
> - */
> -STATIC int
> -xfs_attr_leaf_hasname(
> - struct xfs_da_args *args,
> - struct xfs_buf **bp)
> -{
> - int error = 0;
> -
> - error = xfs_attr3_leaf_read(args->trans, args->dp, args->owner, 0, bp);
> - if (error)
> - return error;
> -
> - error = xfs_attr3_leaf_lookup_int(*bp, args);
> - if (error != -ENOATTR && error != -EEXIST)
> - xfs_trans_brelse(args->trans, *bp);
> -
> - return error;
> -}
> -
> /*
> * Remove a name from the leaf attribute list structure
> *
> @@ -1253,25 +1232,22 @@ STATIC int
> xfs_attr_leaf_removename(
> struct xfs_da_args *args)
> {
> - struct xfs_inode *dp;
> - struct xfs_buf *bp;
> + struct xfs_inode *dp = args->dp;
> int error, forkoff;
> + struct xfs_buf *bp;
>
> trace_xfs_attr_leaf_removename(args);
>
> - /*
> - * Remove the attribute.
> - */
> - dp = args->dp;
> -
> - error = xfs_attr_leaf_hasname(args, &bp);
> - if (error == -ENOATTR) {
> + error = xfs_attr3_leaf_read(args->trans, args->dp, args->owner, 0, &bp);
> + if (error)
> + return error;
> + error = xfs_attr3_leaf_lookup_int(bp, args);
> + if (error != -EEXIST) {
> xfs_trans_brelse(args->trans, bp);
> - if (args->op_flags & XFS_DA_OP_RECOVERY)
> + if (error == -ENOATTR && (args->op_flags & XFS_DA_OP_RECOVERY))
> return 0;
> return error;
> - } else if (error != -EEXIST)
> - return error;
> + }
>
> xfs_attr3_leaf_remove(bp, args);
>
> @@ -1295,23 +1271,20 @@ xfs_attr_leaf_removename(
> * Returns 0 on successful retrieval, otherwise an error.
> */
> STATIC int
> -xfs_attr_leaf_get(xfs_da_args_t *args)
> +xfs_attr_leaf_get(
> + struct xfs_da_args *args)
> {
> - struct xfs_buf *bp;
> - int error;
> + struct xfs_buf *bp;
> + int error;
>
> trace_xfs_attr_leaf_get(args);
>
> - error = xfs_attr_leaf_hasname(args, &bp);
> -
> - if (error == -ENOATTR) {
> - xfs_trans_brelse(args->trans, bp);
> - return error;
> - } else if (error != -EEXIST)
> + error = xfs_attr3_leaf_read(args->trans, args->dp, args->owner, 0, &bp);
> + if (error)
> return error;
> -
> -
> - error = xfs_attr3_leaf_getvalue(bp, args);
> + error = xfs_attr3_leaf_lookup_int(bp, args);
> + if (error == -EEXIST)
> + error = xfs_attr3_leaf_getvalue(bp, args);
> xfs_trans_brelse(args->trans, bp);
> return error;
> }
> --
> 2.47.3
>
>
next prev parent reply other threads:[~2026-01-09 16:29 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-09 15:17 [PATCH] xfs: remove xfs_attr_leaf_hasname Christoph Hellwig
2026-01-09 16:29 ` Darrick J. Wong [this message]
2026-01-09 16:37 ` Christoph Hellwig
2026-01-09 17:41 ` Darrick J. Wong
2026-01-13 9:38 ` Carlos Maiolino
2026-01-13 13:26 ` Christoph Hellwig
2026-01-13 13:36 ` Niklas Cassel
2026-01-21 12:23 ` Carlos Maiolino
-- strict thread matches above, loose matches on Subject: below --
2026-03-01 1:33 FAILED: Patch "xfs: remove xfs_attr_leaf_hasname" failed to apply to 6.6-stable tree Sasha Levin
2026-06-05 1:36 ` [PATCH] xfs: remove xfs_attr_leaf_hasname Jiping Ma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260109162911.GR15551@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=cem@kernel.org \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
--cc=mark.tinguely@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.