From: Christoph Hellwig <hch@infradead.org>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 1/2] xfs: reclaim inodes under a write lock
Date: Fri, 8 Jan 2010 05:20:42 -0500 [thread overview]
Message-ID: <20100108102042.GA16640@infradead.org> (raw)
In-Reply-To: <1262819125-27083-2-git-send-email-david@fromorbit.com>
On Thu, Jan 07, 2010 at 10:05:24AM +1100, Dave Chinner wrote:
> Make the inode tree reclaim walk exclusive to avoid races with
> concurrent sync walkers and lookups. This is a version of
> a patch posted by Christoph Hellwig that avoids all the code
> duplication.
I don't like the write_lock flag very much, but given that the other
option is duplication we might have to live it.
> - /*
> - * If we can't get a reference on the inode, it must be in reclaim.
> - * Leave it for the reclaim code to flush. Also avoid inodes that
> - * haven't been fully initialised.
> - */
> + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */
> + if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) {
> + read_unlock(&pag->pag_ici_lock);
> + return ENOENT;
> + }
> +
> + /* If we can't get a reference on the inode, it must be in reclaim. */
> if (!igrab(inode)) {
> read_unlock(&pag->pag_ici_lock);
> return ENOENT;
> }
> read_unlock(&pag->pag_ici_lock);
>
> - if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) {
> + if (is_bad_inode(inode)) {
> IRELE(ip);
> return ENOENT;
That's an unrelated change and should be a separate patch.
> @@ -791,12 +779,22 @@ xfs_reclaim_inode_now(
> struct xfs_perag *pag,
> int flags)
> {
> + /*
> + * The radix tree lock here protects a thread in xfs_iget from racing
> + * with us starting reclaim on the inode. Once we have the
> + * XFS_IRECLAIM flag set it will not touch us.
> + */
> + spin_lock(&ip->i_flags_lock);
> + ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE));
> + if (__xfs_iflags_test(ip, XFS_IRECLAIM)) {
> + /* ignore as it is already under reclaim */
> + spin_unlock(&ip->i_flags_lock);
> + write_unlock(&pag->pag_ici_lock);
> return 0;
> }
> + __xfs_iflags_set(ip, XFS_IRECLAIM);
> + spin_unlock(&ip->i_flags_lock);
> + write_unlock(&pag->pag_ici_lock);
>
> return xfs_reclaim_inode(ip, flags);
Once you move things around please merge xfs_reclaim_inode_now and
xfs_reclaim_inode into a single function.
And yes, all this currently doesn't apply against the XFS tree or
mainline, but you know that already.
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2010-01-08 10:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-06 23:05 [PATCH 0/2] Fix inode reclaim problems (hopefully) Dave Chinner
2010-01-06 23:05 ` [PATCH 1/2] xfs: reclaim inodes under a write lock Dave Chinner
2010-01-08 10:20 ` Christoph Hellwig [this message]
2010-01-06 23:05 ` [PATCH 2/2] xfs: reclaim all inodes by background tree walks Dave Chinner
2010-01-08 10:24 ` Christoph Hellwig
2010-01-08 10:43 ` Dave Chinner
2010-01-07 10:49 ` [PATCH 0/2] Fix inode reclaim problems (hopefully) Dave Chinner
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=20100108102042.GA16640@infradead.org \
--to=hch@infradead.org \
--cc=david@fromorbit.com \
--cc=xfs@oss.sgi.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.