summaryrefslogtreecommitdiffstats
path: root/fs/fuse
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@redhat.com>2020-11-11 17:22:31 +0100
committerMiklos Szeredi <mszeredi@redhat.com>2020-11-11 17:22:31 +0100
commitb19d3d00d662cfb8bfdc809ec90344ec58b0bf31 (patch)
tree2fe986c5dd9b1e29120a3fcbe1333222754a4002 /fs/fuse
parentvirtiofs fix leak in setup (diff)
downloadlinux-b19d3d00d662cfb8bfdc809ec90344ec58b0bf31.tar.xz
linux-b19d3d00d662cfb8bfdc809ec90344ec58b0bf31.zip
virtiofs: simplify sb setup
Currently when acquiring an sb for virtiofs fuse_mount_get() is being called from virtio_fs_set_super() if a new sb is being filled and fuse_mount_put() is called unconditionally after sget_fc() returns. The exact same result can be obtained by checking whether fs_contex->s_fs_info was set to NULL (ref trasferred to sb->s_fs_info) and only calling fuse_mount_put() if the ref wasn't transferred (error or matching sb found). This allows getting rid of virtio_fs_set_super() and fuse_mount_get(). Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/fuse')
-rw-r--r--fs/fuse/fuse_i.h5
-rw-r--r--fs/fuse/inode.c7
-rw-r--r--fs/fuse/virtio_fs.c17
3 files changed, 3 insertions, 26 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index d51598017d13..c036c4dc714a 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -1025,11 +1025,6 @@ void fuse_conn_init(struct fuse_conn *fc, struct fuse_mount *fm,
void fuse_conn_put(struct fuse_conn *fc);
/**
- * Acquire reference to fuse_mount
- */
-struct fuse_mount *fuse_mount_get(struct fuse_mount *fm);
-
-/**
* Release reference to fuse_mount
*/
void fuse_mount_put(struct fuse_mount *fm);
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 1a47afc95f80..654708574d5e 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -742,13 +742,6 @@ void fuse_mount_put(struct fuse_mount *fm)
}
EXPORT_SYMBOL_GPL(fuse_mount_put);
-struct fuse_mount *fuse_mount_get(struct fuse_mount *fm)
-{
- refcount_inc(&fm->count);
- return fm;
-}
-EXPORT_SYMBOL_GPL(fuse_mount_get);
-
static struct inode *fuse_get_root_inode(struct super_block *sb, unsigned mode)
{
struct fuse_attr attr;
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index d2c0e58c6416..14d65db47778 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -1402,18 +1402,6 @@ static int virtio_fs_test_super(struct super_block *sb,
return fsc_fm->fc->iq.priv == sb_fm->fc->iq.priv;
}
-static int virtio_fs_set_super(struct super_block *sb,
- struct fs_context *fsc)
-{
- int err;
-
- err = get_anon_bdev(&sb->s_dev);
- if (!err)
- fuse_mount_get(fsc->s_fs_info);
-
- return err;
-}
-
static int virtio_fs_get_tree(struct fs_context *fsc)
{
struct virtio_fs *fs;
@@ -1456,8 +1444,9 @@ static int virtio_fs_get_tree(struct fs_context *fsc)
fc->auto_submounts = true;
fsc->s_fs_info = fm;
- sb = sget_fc(fsc, virtio_fs_test_super, virtio_fs_set_super);
- fuse_mount_put(fm);
+ sb = sget_fc(fsc, virtio_fs_test_super, set_anon_super_fc);
+ if (fsc->s_fs_info)
+ fuse_mount_put(fm);
if (IS_ERR(sb))
return PTR_ERR(sb);