xfs: free the xfs_mount in ->kill_sb
authorChristoph Hellwig <hch@lst.de>
Wed, 9 Aug 2023 22:05:35 +0000 (15:05 -0700)
committerChristian Brauner <brauner@kernel.org>
Thu, 10 Aug 2023 08:34:54 +0000 (10:34 +0200)
As a rule of thumb everything allocated to the fs_context and moved into
the super_block should be freed by ->kill_sb so that the teardown
handling doesn't need to be duplicated between the fill_super error
path and put_super.  Implement a XFS-specific kill_sb method to do that.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christian Brauner <brauner@kernel.org>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Message-Id: <20230809220545.1308228-4-hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_super.c

index e621e0d..31260fc 100644 (file)
@@ -1144,9 +1144,6 @@ xfs_fs_put_super(
        xfs_destroy_percpu_counters(mp);
        xfs_destroy_mount_workqueues(mp);
        xfs_close_devices(mp);
-
-       sb->s_fs_info = NULL;
-       xfs_mount_free(mp);
 }
 
 static long
@@ -1488,7 +1485,7 @@ xfs_fs_fill_super(
 
        error = xfs_fs_validate_params(mp);
        if (error)
-               goto out_free_names;
+               return error;
 
        sb_min_blocksize(sb, BBSIZE);
        sb->s_xattr = xfs_xattr_handlers;
@@ -1515,7 +1512,7 @@ xfs_fs_fill_super(
 
        error = xfs_open_devices(mp);
        if (error)
-               goto out_free_names;
+               return error;
 
        error = xfs_init_mount_workqueues(mp);
        if (error)
@@ -1735,9 +1732,6 @@ xfs_fs_fill_super(
        xfs_destroy_mount_workqueues(mp);
  out_close_devices:
        xfs_close_devices(mp);
- out_free_names:
-       sb->s_fs_info = NULL;
-       xfs_mount_free(mp);
        return error;
 
  out_unmount:
@@ -2000,12 +1994,20 @@ static int xfs_init_fs_context(
        return 0;
 }
 
+static void
+xfs_kill_sb(
+       struct super_block              *sb)
+{
+       kill_block_super(sb);
+       xfs_mount_free(XFS_M(sb));
+}
+
 static struct file_system_type xfs_fs_type = {
        .owner                  = THIS_MODULE,
        .name                   = "xfs",
        .init_fs_context        = xfs_init_fs_context,
        .parameters             = xfs_fs_parameters,
-       .kill_sb                = kill_block_super,
+       .kill_sb                = xfs_kill_sb,
        .fs_flags               = FS_REQUIRES_DEV | FS_ALLOW_IDMAP,
 };
 MODULE_ALIAS_FS("xfs");