summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-03-14 19:50:41 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-03-14 19:50:41 -0400
commit571209b9fa002b5ab5c2f6e21cca83c8000228a0 (patch)
tree7308f9cf69e9c5a1309862f372cadcd26b147e44
parente7e06f12a9aa44c493b0c2e2dc34a483a75d0751 (diff)
Revert "bcachefs: fix BCH_IOCTL_ASSEMBLE"
This reverts commit e7e06f12a9aa44c493b0c2e2dc34a483a75d0751.
-rw-r--r--fs/bcachefs/chardev.c42
-rw-r--r--fs/bcachefs/fs.c9
2 files changed, 27 insertions, 24 deletions
diff --git a/fs/bcachefs/chardev.c b/fs/bcachefs/chardev.c
index fc53d4691d4d..ab6dc665186e 100644
--- a/fs/bcachefs/chardev.c
+++ b/fs/bcachefs/chardev.c
@@ -58,6 +58,7 @@ static long bch2_ioctl_assemble(struct bch_ioctl_assemble __user *user_arg)
{
struct bch_ioctl_assemble arg;
struct bch_fs *c;
+ u64 *user_devs = NULL;
char **devs = NULL;
unsigned i;
int ret = -EFAULT;
@@ -68,31 +69,30 @@ static long bch2_ioctl_assemble(struct bch_ioctl_assemble __user *user_arg)
if (arg.flags || arg.pad)
return -EINVAL;
- devs = kcalloc(arg.nr_devs, sizeof(char *), GFP_KERNEL);
- if (!devs)
+ user_devs = kmalloc_array(arg.nr_devs, sizeof(u64), GFP_KERNEL);
+ if (!user_devs)
return -ENOMEM;
- for (i = 0; i < arg.nr_devs; i++) {
- u64 user_dev;
- char *s;
+ devs = kcalloc(arg.nr_devs, sizeof(char *), GFP_KERNEL);
- ret = get_user(user_dev, &user_arg->devs[i]);
- if (ret) {
- goto err;
- }
+ if (copy_from_user(user_devs, user_arg->devs,
+ sizeof(u64) * arg.nr_devs))
+ goto err;
- s = strndup_user((const char __user *)(unsigned long)
- user_dev, PATH_MAX);
- if (IS_ERR(s)) {
- ret = PTR_ERR(s);
+ for (i = 0; i < arg.nr_devs; i++) {
+ devs[i] = strndup_user((const char __user *)(unsigned long)
+ user_devs[i],
+ PATH_MAX);
+ if (!devs[i]) {
+ ret = -ENOMEM;
goto err;
}
-
- devs[i] = s;
}
c = bch2_fs_open(devs, arg.nr_devs, bch2_opts_empty());
ret = PTR_ERR_OR_ZERO(c);
+ if (!ret)
+ closure_put(&c->cl);
err:
if (devs)
for (i = 0; i < arg.nr_devs; i++)
@@ -114,8 +114,8 @@ static long bch2_ioctl_incremental(struct bch_ioctl_incremental __user *user_arg
return -EINVAL;
path = strndup_user((const char __user *)(unsigned long) arg.dev, PATH_MAX);
- if (IS_ERR(path))
- return PTR_ERR(path);
+ if (!path)
+ return -ENOMEM;
err = bch2_fs_open_incremental(path);
kfree(path);
@@ -171,8 +171,8 @@ static long bch2_ioctl_disk_add(struct bch_fs *c, struct bch_ioctl_disk arg)
return -EINVAL;
path = strndup_user((const char __user *)(unsigned long) arg.dev, PATH_MAX);
- if (IS_ERR(path))
- return PTR_ERR(path);
+ if (!path)
+ return -ENOMEM;
ret = bch2_dev_add(c, path);
kfree(path);
@@ -207,8 +207,8 @@ static long bch2_ioctl_disk_online(struct bch_fs *c, struct bch_ioctl_disk arg)
return -EINVAL;
path = strndup_user((const char __user *)(unsigned long) arg.dev, PATH_MAX);
- if (IS_ERR(path))
- return PTR_ERR(path);
+ if (!path)
+ return -ENOMEM;
ret = bch2_dev_online(c, path);
kfree(path);
diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index 83b2ec955b8d..c7e842ee8437 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -1177,10 +1177,9 @@ static struct bch_fs *__bch2_open_as_blockdevs(const char *dev_name, char * cons
mutex_lock(&c->state_lock);
- closure_put(&c->cl);
-
if (!bch2_fs_running(c)) {
mutex_unlock(&c->state_lock);
+ closure_put(&c->cl);
pr_err("err mounting %s: incomplete filesystem", dev_name);
return ERR_PTR(-EINVAL);
}
@@ -1420,7 +1419,11 @@ static void bch2_kill_sb(struct super_block *sb)
struct bch_fs *c = sb->s_fs_info;
generic_shutdown_super(sb);
- bch2_fs_stop(c);
+
+ if (test_bit(BCH_FS_BDEV_MOUNTED, &c->flags))
+ bch2_fs_stop(c);
+ else
+ closure_put(&c->cl);
}
static struct file_system_type bcache_fs_type = {