Patch "xfs: up(ic_sema) if flushing data device fails" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    xfs: up(ic_sema) if flushing data device fails

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     xfs-up-ic_sema-if-flushing-data-device-fails.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 69c011d2a20e37461246216ade0501eff863e090
Author: Leah Rumancik <leah.rumancik@xxxxxxxxx>
Date:   Thu Feb 8 15:20:47 2024 -0800

    xfs: up(ic_sema) if flushing data device fails
    
    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@xxxxxxxxx>
    Reviewed-by: "Darrick J. Wong" <djwong@xxxxxxxxxx>
    Signed-off-by: Chandan Babu R <chandanbabu@xxxxxxxxxx>
    Signed-off-by: Catherine Hoang <catherine.hoang@xxxxxxxxxx>
    Acked-by: Chandan Babu R <chandanbabu@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

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);
 }
 
 /*




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux