diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-03-14 19:50:41 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-03-14 19:50:41 -0400 |
commit | 571209b9fa002b5ab5c2f6e21cca83c8000228a0 (patch) | |
tree | 7308f9cf69e9c5a1309862f372cadcd26b147e44 | |
parent | e7e06f12a9aa44c493b0c2e2dc34a483a75d0751 (diff) |
Revert "bcachefs: fix BCH_IOCTL_ASSEMBLE"
This reverts commit e7e06f12a9aa44c493b0c2e2dc34a483a75d0751.
-rw-r--r-- | fs/bcachefs/chardev.c | 42 | ||||
-rw-r--r-- | fs/bcachefs/fs.c | 9 |
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 = { |