From: "Darrick J. Wong" <djwong@kernel.org>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/2] xfs: check return codes when flushing block devices
Date: Thu, 4 Aug 2022 16:17:34 -0700 [thread overview]
Message-ID: <YuxTjm9vUQ31oOMH@magnolia> (raw)
In-Reply-To: <20220804230438.GE3600936@dread.disaster.area>
On Fri, Aug 05, 2022 at 09:04:38AM +1000, Dave Chinner wrote:
> On Thu, Aug 04, 2022 at 11:06:28AM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> >
> > If a blkdev_issue_flush fails, fsync needs to report that to upper
> > levels. Modify xfs_file_fsync to capture the errors, while trying to
> > flush as much data and log updates to disk as possible.
> >
> > If log writes cannot flush the data device, we need to shut down the log
> > immediately because we've violated a log invariant. Modify this code to
> > check the return value of blkdev_issue_flush as well.
> >
> > This behavior seems to go back to about 2.6.15 or so, which makes this
> > fixes tag a bit misleading.
> >
> > Link: https://elixir.bootlin.com/linux/v2.6.15/source/fs/xfs/xfs_vnodeops.c#L1187
> > Fixes: b5071ada510a ("xfs: remove xfs_blkdev_issue_flush")
> > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > ---
> > fs/xfs/xfs_file.c | 22 ++++++++++++++--------
> > fs/xfs/xfs_log.c | 11 +++++++++--
> > 2 files changed, 23 insertions(+), 10 deletions(-)
>
> Looks good, couple of minor nits you can take or leave.
>
> Reviewed-by: Dave Chinner <dchinner@redhat.com>
>
> > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> > index 5a171c0b244b..a02000be931b 100644
> > --- a/fs/xfs/xfs_file.c
> > +++ b/fs/xfs/xfs_file.c
> > @@ -142,7 +142,7 @@ xfs_file_fsync(
> > {
> > struct xfs_inode *ip = XFS_I(file->f_mapping->host);
> > struct xfs_mount *mp = ip->i_mount;
> > - int error = 0;
> > + int error, err2;
> > int log_flushed = 0;
> >
> > trace_xfs_file_fsync(ip);
> > @@ -163,18 +163,21 @@ xfs_file_fsync(
> > * inode size in case of an extending write.
> > */
> > if (XFS_IS_REALTIME_INODE(ip))
> > - blkdev_issue_flush(mp->m_rtdev_targp->bt_bdev);
> > + error = blkdev_issue_flush(mp->m_rtdev_targp->bt_bdev);
> > else if (mp->m_logdev_targp != mp->m_ddev_targp)
> > - blkdev_issue_flush(mp->m_ddev_targp->bt_bdev);
> > + error = blkdev_issue_flush(mp->m_ddev_targp->bt_bdev);
> >
> > /*
> > * Any inode that has dirty modifications in the log is pinned. The
> > - * racy check here for a pinned inode while not catch modifications
> > + * racy check here for a pinned inode will not catch modifications
> > * that happen concurrently to the fsync call, but fsync semantics
> > * only require to sync previously completed I/O.
> > */
> > - if (xfs_ipincount(ip))
> > - error = xfs_fsync_flush_log(ip, datasync, &log_flushed);
> > + if (xfs_ipincount(ip)) {
> > + err2 = xfs_fsync_flush_log(ip, datasync, &log_flushed);
> > + if (!error && err2)
> > + error = err2;
>
> This is better done as
>
> if (err2 && !error)
> .....
>
> Because we only care about the value of error if err2 is non zero.
> Hence for normal operation where there are no errors, checking err2
> first is less code to execute as error never needs to be checked...
Ok, fixed.
> > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
> > index 4b1c0a9c6368..15d7cdc7a632 100644
> > --- a/fs/xfs/xfs_log.c
> > +++ b/fs/xfs/xfs_log.c
> > @@ -1925,9 +1925,16 @@ xlog_write_iclog(
> > * device cache first to ensure all metadata writeback covered
> > * by the LSN in this iclog is on stable storage. This is slow,
> > * but it *must* complete before we issue the external log IO.
> > + *
> > + * If the flush fails, we cannot conclude that past metadata
> > + * writeback from the log succeeded, which is effectively a
>
> * writeback from the log succeeded, and repeating
> * the flush from iclog IO is not possible. Hence we have to
> * shut down with log IO error to avoid shutdown
> * re-entering this path and erroring out here again.
> */
I decided to tweak the paragraph a little:
/*
* If the flush fails, we cannot conclude that past metadata
* writeback from the log succeeded. Repeating the flush is
* not possible, hence we must shut down with log IO error to
* avoid shutdown re-entering this path and erroring out
* again.
*/
Thanks for reviewing! :)
--D
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com
next prev parent reply other threads:[~2022-08-04 23:17 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-04 18:06 [PATCHSET 0/2] xfs: random fixes for 6.0 Darrick J. Wong
2022-08-04 18:06 ` [PATCH 1/2] xfs: check return codes when flushing block devices Darrick J. Wong
2022-08-04 23:04 ` Dave Chinner
2022-08-04 23:17 ` Darrick J. Wong [this message]
2022-08-04 18:06 ` [PATCH 2/2] xfs: fix intermittent hang during quotacheck Darrick J. Wong
2022-08-05 1:57 ` Dave Chinner
2022-08-05 5:46 ` Darrick J. Wong
2022-08-07 22:33 ` 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=YuxTjm9vUQ31oOMH@magnolia \
--to=djwong@kernel.org \
--cc=david@fromorbit.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox