]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: simplify device handling
authorChristian Brauner <brauner@kernel.org>
Tue, 24 Oct 2023 14:53:40 +0000 (16:53 +0200)
committerChristian Brauner <brauner@kernel.org>
Sat, 18 Nov 2023 13:59:24 +0000 (14:59 +0100)
We removed all codepaths where s_umount is taken beneath open_mutex and
bd_holder_lock so don't make things more complicated than they need to
be and hold s_umount over block device opening.

Link: https://lore.kernel.org/r/20231024-vfs-super-rework-v1-2-37a8aa697148@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_super.c

index 764304595e8b00b38c5a38e0673d88152a532e93..86e94654a92b5e2cb87643e1dff6ab1759eb139b 100644 (file)
@@ -438,19 +438,13 @@ xfs_open_devices(
        struct bdev_handle      *logdev_handle = NULL, *rtdev_handle = NULL;
        int                     error;
 
-       /*
-        * blkdev_put() can't be called under s_umount, see the comment
-        * in get_tree_bdev() for more details
-        */
-       up_write(&sb->s_umount);
-
        /*
         * Open real time and log devices - order is important.
         */
        if (mp->m_logname) {
                error = xfs_blkdev_get(mp, mp->m_logname, &logdev_handle);
                if (error)
-                       goto out_relock;
+                       return error;
        }
 
        if (mp->m_rtname) {
@@ -493,10 +487,7 @@ xfs_open_devices(
                        bdev_release(logdev_handle);
        }
 
-       error = 0;
-out_relock:
-       down_write(&sb->s_umount);
-       return error;
+       return 0;
 
  out_free_rtdev_targ:
        if (mp->m_rtdev_targp)
@@ -509,7 +500,7 @@ out_relock:
  out_close_logdev:
        if (logdev_handle)
                bdev_release(logdev_handle);
-       goto out_relock;
+       return error;
 }
 
 /*
@@ -759,10 +750,6 @@ static void
 xfs_mount_free(
        struct xfs_mount        *mp)
 {
-       /*
-        * Free the buftargs here because blkdev_put needs to be called outside
-        * of sb->s_umount, which is held around the call to ->put_super.
-        */
        if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
                xfs_free_buftarg(mp->m_logdev_targp);
        if (mp->m_rtdev_targp)