|
@@ -805,16 +805,18 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
|
|
int err;
|
|
int err;
|
|
int is_bdev = sb->s_bdev != NULL;
|
|
int is_bdev = sb->s_bdev != NULL;
|
|
|
|
|
|
|
|
+ err = -EINVAL;
|
|
if (sb->s_flags & MS_MANDLOCK)
|
|
if (sb->s_flags & MS_MANDLOCK)
|
|
- return -EINVAL;
|
|
|
|
|
|
+ goto err;
|
|
|
|
|
|
if (!parse_fuse_opt((char *) data, &d, is_bdev))
|
|
if (!parse_fuse_opt((char *) data, &d, is_bdev))
|
|
- return -EINVAL;
|
|
|
|
|
|
+ goto err;
|
|
|
|
|
|
if (is_bdev) {
|
|
if (is_bdev) {
|
|
#ifdef CONFIG_BLOCK
|
|
#ifdef CONFIG_BLOCK
|
|
|
|
+ err = -EINVAL;
|
|
if (!sb_set_blocksize(sb, d.blksize))
|
|
if (!sb_set_blocksize(sb, d.blksize))
|
|
- return -EINVAL;
|
|
|
|
|
|
+ goto err;
|
|
#endif
|
|
#endif
|
|
} else {
|
|
} else {
|
|
sb->s_blocksize = PAGE_CACHE_SIZE;
|
|
sb->s_blocksize = PAGE_CACHE_SIZE;
|
|
@@ -826,25 +828,22 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
|
|
sb->s_export_op = &fuse_export_operations;
|
|
sb->s_export_op = &fuse_export_operations;
|
|
|
|
|
|
file = fget(d.fd);
|
|
file = fget(d.fd);
|
|
|
|
+ err = -EINVAL;
|
|
if (!file)
|
|
if (!file)
|
|
- return -EINVAL;
|
|
|
|
|
|
+ goto err;
|
|
|
|
|
|
- if (file->f_op != &fuse_dev_operations) {
|
|
|
|
- fput(file);
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
|
|
+ if (file->f_op != &fuse_dev_operations)
|
|
|
|
+ goto err_fput;
|
|
|
|
|
|
fc = kmalloc(sizeof(*fc), GFP_KERNEL);
|
|
fc = kmalloc(sizeof(*fc), GFP_KERNEL);
|
|
- if (!fc) {
|
|
|
|
- fput(file);
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
|
|
+ err = -ENOMEM;
|
|
|
|
+ if (!fc)
|
|
|
|
+ goto err_fput;
|
|
|
|
|
|
err = fuse_conn_init(fc, sb);
|
|
err = fuse_conn_init(fc, sb);
|
|
if (err) {
|
|
if (err) {
|
|
- fput(file);
|
|
|
|
kfree(fc);
|
|
kfree(fc);
|
|
- return err;
|
|
|
|
|
|
+ goto err_fput;
|
|
}
|
|
}
|
|
|
|
|
|
fc->release = fuse_free_conn;
|
|
fc->release = fuse_free_conn;
|
|
@@ -859,12 +858,12 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
|
|
err = -ENOMEM;
|
|
err = -ENOMEM;
|
|
root = fuse_get_root_inode(sb, d.rootmode);
|
|
root = fuse_get_root_inode(sb, d.rootmode);
|
|
if (!root)
|
|
if (!root)
|
|
- goto err;
|
|
|
|
|
|
+ goto err_put_conn;
|
|
|
|
|
|
root_dentry = d_alloc_root(root);
|
|
root_dentry = d_alloc_root(root);
|
|
if (!root_dentry) {
|
|
if (!root_dentry) {
|
|
iput(root);
|
|
iput(root);
|
|
- goto err;
|
|
|
|
|
|
+ goto err_put_conn;
|
|
}
|
|
}
|
|
|
|
|
|
init_req = fuse_request_alloc();
|
|
init_req = fuse_request_alloc();
|
|
@@ -908,9 +907,11 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
|
|
fuse_request_free(init_req);
|
|
fuse_request_free(init_req);
|
|
err_put_root:
|
|
err_put_root:
|
|
dput(root_dentry);
|
|
dput(root_dentry);
|
|
- err:
|
|
|
|
- fput(file);
|
|
|
|
|
|
+ err_put_conn:
|
|
fuse_conn_put(fc);
|
|
fuse_conn_put(fc);
|
|
|
|
+ err_fput:
|
|
|
|
+ fput(file);
|
|
|
|
+ err:
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|