fuse: get rid of fuse_mount refcount
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>
This commit is contained in:
parent
b19d3d00d6
commit
514b5e3ff4
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue