]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
fuse: clean up fuse_mount destruction
authorMiklos Szeredi <mszeredi@redhat.com>
Thu, 21 Oct 2021 08:01:39 +0000 (10:01 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 21 Oct 2021 08:01:39 +0000 (10:01 +0200)
1. call fuse_mount_destroy() for open coded variants

2. before deactivate_locked_super() don't need fuse_mount destruction since
that will now be done (if ->s_fs_info is not cleared)

3. rearrange fuse_mount setup in fuse_get_tree_submount() so that the
regular pattern can be used

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/inode.c
fs/fuse/virtio_fs.c

index 30ca1f71d7776061161d24285c022a199e4778b6..308daee54c127cc75b13358978159d53d9449f7d 100644 (file)
@@ -1415,20 +1415,17 @@ static int fuse_get_tree_submount(struct fs_context *fsc)
        if (!fm)
                return -ENOMEM;
 
+       fm->fc = fuse_conn_get(fc);
        fsc->s_fs_info = fm;
        sb = sget_fc(fsc, NULL, set_anon_super_fc);
-       if (IS_ERR(sb)) {
-               kfree(fm);
+       if (fsc->s_fs_info)
+               fuse_mount_destroy(fm);
+       if (IS_ERR(sb))
                return PTR_ERR(sb);
-       }
-       fm->fc = fuse_conn_get(fc);
 
        /* Initialize superblock, making @mp_fi its root */
        err = fuse_fill_super_submount(sb, mp_fi);
        if (err) {
-               fuse_conn_put(fc);
-               kfree(fm);
-               sb->s_fs_info = NULL;
                deactivate_locked_super(sb);
                return err;
        }
@@ -1595,16 +1592,12 @@ static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
 
        err = fuse_fill_super_common(sb, ctx);
        if (err)
-               goto err_put_conn;
+               goto err;
        /* file->private_data shall be visible on all CPUs after this */
        smp_mb();
        fuse_send_init(get_fuse_mount_super(sb));
        return 0;
 
- err_put_conn:
-       fuse_conn_put(fc);
-       kfree(fm);
-       sb->s_fs_info = NULL;
  err:
        return err;
 }
index fa80d250c802a6e7ae4c6c4591955e43e52900f9..94fc874f5de7f833390c16405d2671ea52a52da6 100644 (file)
@@ -1456,19 +1456,14 @@ static int virtio_fs_get_tree(struct fs_context *fsc)
 
        fsc->s_fs_info = fm;
        sb = sget_fc(fsc, virtio_fs_test_super, set_anon_super_fc);
-       if (fsc->s_fs_info) {
-               fuse_conn_put(fc);
-               kfree(fm);
-       }
+       if (fsc->s_fs_info)
+               fuse_mount_destroy(fm);
        if (IS_ERR(sb))
                return PTR_ERR(sb);
 
        if (!sb->s_root) {
                err = virtio_fs_fill_super(sb, fsc);
                if (err) {
-                       fuse_conn_put(fc);
-                       kfree(fm);
-                       sb->s_fs_info = NULL;
                        deactivate_locked_super(sb);
                        return err;
                }