From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Carlos Maiolino <cem@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Luc Van Oostenryck <luc.vanoostenryck@gmail.com>,
Chris Li <sparse@chrisli.org>,
linux-sparse@vger.kernel.org, linux-xfs@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] xfs: move some code out of xfs_iget_recycle
Date: Fri, 14 Nov 2025 09:04:02 -0800 [thread overview]
Message-ID: <20251114170402.GJ196370@frogsfrogsfrogs> (raw)
In-Reply-To: <20251114055249.1517520-3-hch@lst.de>
On Fri, Nov 14, 2025 at 06:52:24AM +0100, Christoph Hellwig wrote:
> Having a function drop locks, reacquire them and release them again
> seems to confuse the clang lock analysis even more than it confuses
> humans. Keep the humans and machines sanity by moving a chunk of
> code into the caller to simplify the lock tracking.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/xfs/xfs_icache.c | 31 +++++++++++++------------------
> 1 file changed, 13 insertions(+), 18 deletions(-)
>
> diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
> index e44040206851..546efa6cec72 100644
> --- a/fs/xfs/xfs_icache.c
> +++ b/fs/xfs/xfs_icache.c
> @@ -358,7 +358,7 @@ xfs_reinit_inode(
> static int
> xfs_iget_recycle(
> struct xfs_perag *pag,
> - struct xfs_inode *ip) __releases(&ip->i_flags_lock)
> + struct xfs_inode *ip)
> {
> struct xfs_mount *mp = ip->i_mount;
> struct inode *inode = VFS_I(ip);
> @@ -366,20 +366,6 @@ xfs_iget_recycle(
>
> trace_xfs_iget_recycle(ip);
>
> - if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL))
> - return -EAGAIN;
> -
> - /*
> - * We need to make it look like the inode is being reclaimed to prevent
> - * the actual reclaim workers from stomping over us while we recycle
> - * the inode. We can't clear the radix tree tag yet as it requires
> - * pag_ici_lock to be held exclusive.
> - */
> - ip->i_flags |= XFS_IRECLAIM;
> -
> - spin_unlock(&ip->i_flags_lock);
> - rcu_read_unlock();
> -
> ASSERT(!rwsem_is_locked(&inode->i_rwsem));
> error = xfs_reinit_inode(mp, inode);
> xfs_iunlock(ip, XFS_ILOCK_EXCL);
> @@ -576,10 +562,19 @@ xfs_iget_cache_hit(
>
> /* The inode fits the selection criteria; process it. */
> if (ip->i_flags & XFS_IRECLAIMABLE) {
> - /* Drops i_flags_lock and RCU read lock. */
> - error = xfs_iget_recycle(pag, ip);
> - if (error == -EAGAIN)
> + /*
> + * We need to make it look like the inode is being reclaimed to
> + * prevent the actual reclaim workers from stomping over us
> + * while we recycle the inode. We can't clear the radix tree
> + * tag yet as it requires pag_ici_lock to be held exclusive.
> + */
> + if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL))
> goto out_skip;
> + ip->i_flags |= XFS_IRECLAIM;
> + spin_unlock(&ip->i_flags_lock);
> + rcu_read_unlock();
I wonder, does sparse get confused by rcu_read_lock having been taken by
the caller but unlocked here?
The code move looks correct though.
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> +
> + error = xfs_iget_recycle(pag, ip);
> if (error)
> return error;
> } else {
> --
> 2.47.3
>
>
next prev parent reply other threads:[~2025-11-14 17:04 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-14 5:52 make xfs sparse-warning free Christoph Hellwig
2025-11-14 5:52 ` [PATCH 1/3] lockref: add a __cond_lock annotation for lockref_put_or_lock Christoph Hellwig
2025-11-14 18:18 ` Linus Torvalds
2025-11-18 5:58 ` Christoph Hellwig
2025-11-14 5:52 ` [PATCH 2/3] xfs: move some code out of xfs_iget_recycle Christoph Hellwig
2025-11-14 17:04 ` Darrick J. Wong [this message]
2025-11-14 17:28 ` Linus Torvalds
2025-11-18 5:59 ` Christoph Hellwig
2025-11-14 5:52 ` [PATCH 3/3] xfs: work around sparse context tracking in xfs_qm_dquot_isolate Christoph Hellwig
2025-11-14 17:06 ` Darrick J. Wong
2025-11-18 6:00 ` Christoph Hellwig
2025-11-14 17:56 ` make xfs sparse-warning free Linus Torvalds
2025-11-18 5:57 ` Christoph Hellwig
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=20251114170402.GJ196370@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=cem@kernel.org \
--cc=hch@lst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sparse@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=luc.vanoostenryck@gmail.com \
--cc=sparse@chrisli.org \
/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.