Re: [PATCH v11 02/16] xfs: only call xfs_setsize_buftarg once per buffer target

From: John Garry
Date: Mon May 05 2025 - 06:05:37 EST


On 05/05/2025 06:40, Christoph Hellwig wrote:
+/*
+ * Flush and invalidate all devices' pagecaches before reading any metadata
+ * because XFS doesn't use the bdev pagecache.
+ */
+STATIC int
+xfs_preflush_devices(
+ struct xfs_mount *mp)
+{
+ int error;
+
+ error = xfs_buftarg_sync(mp->m_ddev_targp);
+ if (error)
+ return error;
+
+ if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
+ error = xfs_buftarg_sync(mp->m_ddev_targp);
+ if (error)
+ return error;
+ }
Why does this duplicate all the logic instead of being folded into
xfs_open_devices?

So you mean an additive change like:

diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index 64fbd089ef55..9fa538938e07 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -488,6 +488,9 @@ xfs_open_devices(
mp->m_ddev_targp = xfs_alloc_buftarg(mp, sb->s_bdev_file);
if (!mp->m_ddev_targp)
goto out_close_rtdev;
+ error = sync_blockdev(mp->m_ddev_targp->bt_bdev);
+ if (error)
+ goto out_close_rtdev;

if (rtdev_file) {
@@ -495,6 +498,9 @@ xfs_open_devices(
mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev_file);
if (!mp->m_rtdev_targp)
goto out_free_ddev_targ;
+ error = sync_blockdev(mp->m_rtdev_targp->bt_bdev);
+ if (error)
+ goto out_free_ddev_targ;
}

if (logdev_file && file_bdev(logdev_file) != ddev) {
@@ -503,6 +509,9 @@ xfs_open_devices(
mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev_file);
if (!mp->m_logdev_targp)
goto out_free_rtdev_targ;
+ error = sync_blockdev(mp->m_logdev_targp->bt_bdev);
+ if (error)
+ goto out_free_rtdev_targ;
} else {
mp->m_logdev_targp = mp->m_ddev_targp;
/* Handle won't be used, drop it */


Right?