From: Dave Chinner <david@fromorbit.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/2] xfs: trylock underlying buffer on dquot flush
Date: Tue, 31 Mar 2020 11:04:09 +1100 [thread overview]
Message-ID: <20200331000409.GY10776@dread.disaster.area> (raw)
In-Reply-To: <20200330121544.GA45961@bfoster>
On Mon, Mar 30, 2020 at 08:15:44AM -0400, Brian Foster wrote:
> On Mon, Mar 30, 2020 at 09:46:02AM +1100, Dave Chinner wrote:
> > On Thu, Mar 26, 2020 at 09:17:02AM -0400, Brian Foster wrote:
> > > A dquot flush currently blocks on the buffer lock for the underlying
> > > dquot buffer. In turn, this causes xfsaild to block rather than
> > > continue processing other items in the meantime. Update
> > > xfs_qm_dqflush() to trylock the buffer, similar to how inode buffers
> > > are handled, and return -EAGAIN if the lock fails. Fix up any
> > > callers that don't currently handle the error properly.
> > >
> > > Signed-off-by: Brian Foster <bfoster@redhat.com>
> > > ---
> > > fs/xfs/xfs_dquot.c | 6 +++---
> > > fs/xfs/xfs_dquot_item.c | 3 ++-
> > > fs/xfs/xfs_qm.c | 14 +++++++++-----
> > > 3 files changed, 14 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c
> > > index 711376ca269f..af2c8e5ceea0 100644
> > > --- a/fs/xfs/xfs_dquot.c
> > > +++ b/fs/xfs/xfs_dquot.c
> > > @@ -1105,8 +1105,8 @@ xfs_qm_dqflush(
> > > * Get the buffer containing the on-disk dquot
> > > */
> > > error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
> > > - mp->m_quotainfo->qi_dqchunklen, 0, &bp,
> > > - &xfs_dquot_buf_ops);
> > > + mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK,
> > > + &bp, &xfs_dquot_buf_ops);
> > > if (error)
> > > goto out_unlock;
> > >
> > > @@ -1177,7 +1177,7 @@ xfs_qm_dqflush(
> > >
> > > out_unlock:
> > > xfs_dqfunlock(dqp);
> > > - return -EIO;
> > > + return error;
> > > }
> > >
> > > /*
> > > diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c
> > > index cf65e2e43c6e..baad1748d0d1 100644
> > > --- a/fs/xfs/xfs_dquot_item.c
> > > +++ b/fs/xfs/xfs_dquot_item.c
> > > @@ -189,7 +189,8 @@ xfs_qm_dquot_logitem_push(
> > > if (!xfs_buf_delwri_queue(bp, buffer_list))
> > > rval = XFS_ITEM_FLUSHING;
> > > xfs_buf_relse(bp);
> > > - }
> > > + } else if (error == -EAGAIN)
> > > + rval = XFS_ITEM_LOCKED;
> >
> > Doesn't xfs_inode_item_push() also have this problem in that it
> > doesn't handle -EAGAIN properly?
> >
> > Also, we can get -EIO, -EFSCORRUPTED, etc here. They probably
> > shouldn't return XFS_ITEM_SUCCESS, either....
> >
>
> Good point. I'm actually not sure what we should return in that case
> given the item return codes all seem to assume a valid state. We could
> define an XFS_ITEM_ERROR return, but I'm not sure it's worth it for what
> is currently stat/tracepoint logic in the caller. Perhaps a broader
> rework of error handling in this context is in order that would lift
> generic (fatal) error handling into xfsaild.
Yeah, that's where my thoughts were heading as well.
> E.g., I see that
> xfs_qm_dqflush() is inconsistent by itself in that the item is removed
> from the AIL if we're already shut down, but not if that function
> invokes the shutdown; we shutdown if the direct xfs_dqblk_verify() call
> fails but not if the read verifier (which also looks like it calls
> xfs_dqblk_verify() on every on-disk dquot) returns -EFSCORRUPTED, etc.
> It might make some sense to let iop_push() return negative error codes
> if that facilitates consistent error handling...
Yes, it's a bit of a mess. I suspect that what we should be doing
here is pulling the failed buffer write retry code up into the main
push loop. That is, we can set LI_FAILED on log items that fail to
flush, either directly at submit time, or at IO completion for write
errors.
Then we can have the main AIL loop set LI_FAILED on push failures,
and also the main loop detect LI_FAILED directly and call a new
->iop_resubmit() function rather than having to handle that the
resubmit cases as special cases in every ->iop_push() path.
That seems like a much cleaner way of handling submission failure
and retries for all log item types that need it compared to the way
we currently handle it for buffers...
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2020-03-31 0:04 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-26 13:17 [PATCH 0/2] xfs: a couple AIL pushing trylock fixes Brian Foster
2020-03-26 13:17 ` [PATCH 1/2] xfs: trylock underlying buffer on dquot flush Brian Foster
2020-03-27 12:59 ` Christoph Hellwig
2020-03-27 15:45 ` Darrick J. Wong
2020-03-27 16:44 ` Brian Foster
2020-03-27 16:46 ` Brian Foster
2020-03-27 17:04 ` Darrick J. Wong
2020-03-27 16:50 ` Darrick J. Wong
2020-03-29 22:46 ` Dave Chinner
2020-03-29 23:01 ` Dave Chinner
2020-03-30 12:15 ` Brian Foster
2020-03-31 0:04 ` Dave Chinner [this message]
2020-03-31 11:46 ` Brian Foster
2020-03-26 13:17 ` [PATCH 2/2] xfs: return locked status of inode buffer on xfsaild push Brian Foster
2020-03-27 13:00 ` Christoph Hellwig
2020-03-27 15:39 ` Darrick J. Wong
2020-03-27 15:32 ` [PATCH 0/2] xfs: a couple AIL pushing trylock fixes Darrick J. Wong
2020-03-27 16:44 ` Brian Foster
2020-03-29 16:43 ` Darrick J. Wong
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=20200331000409.GY10776@dread.disaster.area \
--to=david@fromorbit.com \
--cc=bfoster@redhat.com \
--cc=linux-xfs@vger.kernel.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.