fuse: get rid of fuse_mount refcount
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 11 Nov 2020 16:22:32 +0000 (17:22 +0100)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 11 Nov 2020 16:22:32 +0000 (17:22 +0100)
Fuse mount now only ever has a refcount of one (before being freed) so the
count field is unnecessary.

Remove the refcounting and fold fuse_mount_put() into callers.  The only
caller of fuse_mount_put() where fm->fc was NULL is fuse_dentry_automount()
and here the fuse_conn_put() can simply be omitted.

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

index ff7dbeb..e9c2445 100644 (file)
@@ -328,12 +328,11 @@ static struct vfsmount *fuse_dentry_automount(struct path *path)
        if (!fm)
                goto out_put_fsc;
 
-       refcount_set(&fm->count, 1);
        fsc->s_fs_info = fm;
        sb = sget_fc(fsc, NULL, set_anon_super_fc);
        if (IS_ERR(sb)) {
                err = PTR_ERR(sb);
-               fuse_mount_put(fm);
+               kfree(fm);
                goto out_put_fsc;
        }
        fm->fc = fuse_conn_get(fc);
index c036c4d..919aaf1 100644 (file)
@@ -801,9 +801,6 @@ struct fuse_mount {
        /* Underlying (potentially shared) connection to the FUSE server */
        struct fuse_conn *fc;
 
-       /* Refcount */
-       refcount_t count;
-
        /*
         * Super block for this connection (fc->killsb must be held when
         * accessing this).
@@ -1024,11 +1021,6 @@ void fuse_conn_init(struct fuse_conn *fc, struct fuse_mount *fm,
  */
 void fuse_conn_put(struct fuse_conn *fc);
 
-/**
- * Release reference to fuse_mount
- */
-void fuse_mount_put(struct fuse_mount *fm);
-
 struct fuse_dev *fuse_dev_alloc_install(struct fuse_conn *fc);
 struct fuse_dev *fuse_dev_alloc(void);
 void fuse_dev_install(struct fuse_dev *fud, struct fuse_conn *fc);
index 6547085..dd45dec 100644 (file)
@@ -452,7 +452,8 @@ static void fuse_put_super(struct super_block *sb)
 {
        struct fuse_mount *fm = get_fuse_mount_super(sb);
 
-       fuse_mount_put(fm);
+       fuse_conn_put(fm->fc);
+       kfree(fm);
 }
 
 static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr)
@@ -705,7 +706,6 @@ void fuse_conn_init(struct fuse_conn *fc, struct fuse_mount *fm,
        INIT_LIST_HEAD(&fc->mounts);
        list_add(&fm->fc_entry, &fc->mounts);
        fm->fc = fc;
-       refcount_set(&fm->count, 1);
 }
 EXPORT_SYMBOL_GPL(fuse_conn_init);
 
@@ -732,16 +732,6 @@ struct fuse_conn *fuse_conn_get(struct fuse_conn *fc)
 }
 EXPORT_SYMBOL_GPL(fuse_conn_get);
 
-void fuse_mount_put(struct fuse_mount *fm)
-{
-       if (refcount_dec_and_test(&fm->count)) {
-               if (fm->fc)
-                       fuse_conn_put(fm->fc);
-               kfree(fm);
-       }
-}
-EXPORT_SYMBOL_GPL(fuse_mount_put);
-
 static struct inode *fuse_get_root_inode(struct super_block *sb, unsigned mode)
 {
        struct fuse_attr attr;
@@ -1458,7 +1448,8 @@ static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
        return 0;
 
  err_put_conn:
-       fuse_mount_put(fm);
+       fuse_conn_put(fc);
+       kfree(fm);
        sb->s_fs_info = NULL;
  err_fput:
        fput(file);
index 14d65db..62d89b9 100644 (file)
@@ -1445,15 +1445,18 @@ 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_mount_put(fm);
+       if (fsc->s_fs_info) {
+               fuse_conn_put(fc);
+               kfree(fm);
+       }
        if (IS_ERR(sb))
                return PTR_ERR(sb);
 
        if (!sb->s_root) {
                err = virtio_fs_fill_super(sb, fsc);
                if (err) {
-                       fuse_mount_put(fm);
+                       fuse_conn_put(fc);
+                       kfree(fm);
                        sb->s_fs_info = NULL;
                        deactivate_locked_super(sb);
                        return err;