From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/2] xfs: check return codes when flushing block devices
Date: Fri, 5 Aug 2022 09:04:38 +1000 [thread overview]
Message-ID: <20220804230438.GE3600936@dread.disaster.area> (raw)
In-Reply-To: <165963638822.1272632.5382210082462983546.stgit@magnolia>
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...
> 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.
*/
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2022-08-04 23:04 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 [this message]
2022-08-04 23:17 ` Darrick J. Wong
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=20220804230438.GE3600936@dread.disaster.area \
--to=david@fromorbit.com \
--cc=djwong@kernel.org \
--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