fuse: clean up fuse_mount destruction
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>
This commit is contained in:
@@ -1415,20 +1415,17 @@ static int fuse_get_tree_submount(struct fs_context *fsc)
|
|||||||
if (!fm)
|
if (!fm)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
fm->fc = fuse_conn_get(fc);
|
||||||
fsc->s_fs_info = fm;
|
fsc->s_fs_info = fm;
|
||||||
sb = sget_fc(fsc, NULL, set_anon_super_fc);
|
sb = sget_fc(fsc, NULL, set_anon_super_fc);
|
||||||
if (IS_ERR(sb)) {
|
if (fsc->s_fs_info)
|
||||||
kfree(fm);
|
fuse_mount_destroy(fm);
|
||||||
|
if (IS_ERR(sb))
|
||||||
return PTR_ERR(sb);
|
return PTR_ERR(sb);
|
||||||
}
|
|
||||||
fm->fc = fuse_conn_get(fc);
|
|
||||||
|
|
||||||
/* Initialize superblock, making @mp_fi its root */
|
/* Initialize superblock, making @mp_fi its root */
|
||||||
err = fuse_fill_super_submount(sb, mp_fi);
|
err = fuse_fill_super_submount(sb, mp_fi);
|
||||||
if (err) {
|
if (err) {
|
||||||
fuse_conn_put(fc);
|
|
||||||
kfree(fm);
|
|
||||||
sb->s_fs_info = NULL;
|
|
||||||
deactivate_locked_super(sb);
|
deactivate_locked_super(sb);
|
||||||
return err;
|
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);
|
err = fuse_fill_super_common(sb, ctx);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_put_conn;
|
goto err;
|
||||||
/* file->private_data shall be visible on all CPUs after this */
|
/* file->private_data shall be visible on all CPUs after this */
|
||||||
smp_mb();
|
smp_mb();
|
||||||
fuse_send_init(get_fuse_mount_super(sb));
|
fuse_send_init(get_fuse_mount_super(sb));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_put_conn:
|
|
||||||
fuse_conn_put(fc);
|
|
||||||
kfree(fm);
|
|
||||||
sb->s_fs_info = NULL;
|
|
||||||
err:
|
err:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1456,19 +1456,14 @@ static int virtio_fs_get_tree(struct fs_context *fsc)
|
|||||||
|
|
||||||
fsc->s_fs_info = fm;
|
fsc->s_fs_info = fm;
|
||||||
sb = sget_fc(fsc, virtio_fs_test_super, set_anon_super_fc);
|
sb = sget_fc(fsc, virtio_fs_test_super, set_anon_super_fc);
|
||||||
if (fsc->s_fs_info) {
|
if (fsc->s_fs_info)
|
||||||
fuse_conn_put(fc);
|
fuse_mount_destroy(fm);
|
||||||
kfree(fm);
|
|
||||||
}
|
|
||||||
if (IS_ERR(sb))
|
if (IS_ERR(sb))
|
||||||
return PTR_ERR(sb);
|
return PTR_ERR(sb);
|
||||||
|
|
||||||
if (!sb->s_root) {
|
if (!sb->s_root) {
|
||||||
err = virtio_fs_fill_super(sb, fsc);
|
err = virtio_fs_fill_super(sb, fsc);
|
||||||
if (err) {
|
if (err) {
|
||||||
fuse_conn_put(fc);
|
|
||||||
kfree(fm);
|
|
||||||
sb->s_fs_info = NULL;
|
|
||||||
deactivate_locked_super(sb);
|
deactivate_locked_super(sb);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user