All of lore.kernel.org
 help / color / mirror / Atom feed
From: Catherine Hoang <catherine.hoang@oracle.com>
To: linux-xfs@vger.kernel.org
Subject: [PATCH 6.6 CANDIDATE v2 14/21] xfs: up(ic_sema) if flushing data device fails
Date: Mon,  5 Feb 2024 14:20:04 -0800	[thread overview]
Message-ID: <20240205222011.95476-15-catherine.hoang@oracle.com> (raw)
In-Reply-To: <20240205222011.95476-1-catherine.hoang@oracle.com>

From: Leah Rumancik <leah.rumancik@gmail.com>

commit 471de20303dda0b67981e06d59cc6c4a83fd2a3c upstream.

We flush the data device cache before we issue external log IO. If
the flush fails, we shut down the log immediately and return. However,
the iclog->ic_sema is left in a decremented state so let's add an up().
Prior to this patch, xfs/438 would fail consistently when running with
an external log device:

sync
  -> xfs_log_force
  -> xlog_write_iclog
      -> down(&iclog->ic_sema)
      -> blkdev_issue_flush (fail causes us to intiate shutdown)
          -> xlog_force_shutdown
          -> return

unmount
  -> xfs_log_umount
      -> xlog_wait_iclog_completion
          -> down(&iclog->ic_sema) --------> HANG

There is a second early return / shutdown. Make sure the up() happens
for it as well. Also make sure we cleanup the iclog state,
xlog_state_done_syncing, before dropping the iclog lock.

Fixes: b5d721eaae47 ("xfs: external logs need to flush data device")
Fixes: 842a42d126b4 ("xfs: shutdown on failure to add page to log bio")
Fixes: 7d839e325af2 ("xfs: check return codes when flushing block devices")
Signed-off-by: Leah Rumancik <leah.rumancik@gmail.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
Signed-off-by: Catherine Hoang <catherine.hoang@oracle.com>
---
 fs/xfs/xfs_log.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 51c100c86177..ee206facf0dc 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1893,9 +1893,7 @@ xlog_write_iclog(
 		 * the buffer manually, the code needs to be kept in sync
 		 * with the I/O completion path.
 		 */
-		xlog_state_done_syncing(iclog);
-		up(&iclog->ic_sema);
-		return;
+		goto sync;
 	}
 
 	/*
@@ -1925,20 +1923,17 @@ xlog_write_iclog(
 		 * avoid shutdown re-entering this path and erroring out again.
 		 */
 		if (log->l_targ != log->l_mp->m_ddev_targp &&
-		    blkdev_issue_flush(log->l_mp->m_ddev_targp->bt_bdev)) {
-			xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
-			return;
-		}
+		    blkdev_issue_flush(log->l_mp->m_ddev_targp->bt_bdev))
+			goto shutdown;
 	}
 	if (iclog->ic_flags & XLOG_ICL_NEED_FUA)
 		iclog->ic_bio.bi_opf |= REQ_FUA;
 
 	iclog->ic_flags &= ~(XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA);
 
-	if (xlog_map_iclog_data(&iclog->ic_bio, iclog->ic_data, count)) {
-		xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
-		return;
-	}
+	if (xlog_map_iclog_data(&iclog->ic_bio, iclog->ic_data, count))
+		goto shutdown;
+
 	if (is_vmalloc_addr(iclog->ic_data))
 		flush_kernel_vmap_range(iclog->ic_data, count);
 
@@ -1959,6 +1954,12 @@ xlog_write_iclog(
 	}
 
 	submit_bio(&iclog->ic_bio);
+	return;
+shutdown:
+	xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
+sync:
+	xlog_state_done_syncing(iclog);
+	up(&iclog->ic_sema);
 }
 
 /*
-- 
2.39.3


  parent reply	other threads:[~2024-02-05 22:20 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-05 22:19 [PATCH 6.6 CANDIDATE v2 00/21] xfs backports for 6.6.y (from v6.7) Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 01/21] MAINTAINERS: add Catherine as xfs maintainer for 6.6.y Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 02/21] xfs: bump max fsgeom struct version Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 03/21] xfs: hoist freeing of rt data fork extent mappings Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 04/21] xfs: prevent rt growfs when quota is enabled Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 05/21] xfs: rt stubs should return negative errnos when rt disabled Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 06/21] xfs: fix units conversion error in xfs_bmap_del_extent_delay Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 07/21] xfs: make sure maxlen is still congruent with prod when rounding down Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 08/21] xfs: introduce protection for drop nlink Catherine Hoang
2024-02-05 22:19 ` [PATCH 6.6 CANDIDATE v2 09/21] xfs: handle nimaps=0 from xfs_bmapi_write in xfs_alloc_file_space Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 10/21] xfs: allow read IO and FICLONE to run concurrently Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 11/21] xfs: factor out xfs_defer_pending_abort Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 12/21] xfs: abort intent items when recovery intents fail Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 13/21] xfs: only remap the written blocks in xfs_reflink_end_cow_extent Catherine Hoang
2024-02-05 22:20 ` Catherine Hoang [this message]
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 15/21] xfs: fix internal error from AGFL exhaustion Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 16/21] xfs: fix again select in kconfig XFS_ONLINE_SCRUB_STATS Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 17/21] xfs: inode recovery does not validate the recovered inode Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 18/21] xfs: clean up dqblk extraction Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 19/21] xfs: dquot recovery does not validate the recovered dquot Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 20/21] xfs: clean up FS_XFLAG_REALTIME handling in xfs_ioctl_setattr_xflags Catherine Hoang
2024-02-05 22:20 ` [PATCH 6.6 CANDIDATE v2 21/21] xfs: respect the stable writes flag on the RT device Catherine Hoang
2024-02-06  5:23 ` [PATCH 6.6 CANDIDATE v2 00/21] xfs backports for 6.6.y (from v6.7) Chandan Babu R

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=20240205222011.95476-15-catherine.hoang@oracle.com \
    --to=catherine.hoang@oracle.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.