if (!ca)
return ERR_PTR(-EINVAL);
} else {
- struct block_device *bdev;
char *path;
- unsigned i;
path = strndup_user((const char __user *)
(unsigned long) dev, PATH_MAX);
if (IS_ERR(path))
return ERR_CAST(path);
- bdev = lookup_bdev(path);
+ ca = bch2_dev_lookup(c, path);
kfree(path);
- if (IS_ERR(bdev))
- return ERR_CAST(bdev);
-
- for_each_member_device(ca, c, i)
- if (ca->disk_sb.bdev == bdev)
- goto found;
-
- ca = ERR_PTR(-ENOENT);
-found:
- bdput(bdev);
}
return ca;
}
+#if 0
static long bch2_ioctl_assemble(struct bch_ioctl_assemble __user *user_arg)
{
struct bch_ioctl_assemble arg;
return 0;
}
+#endif
static long bch2_global_ioctl(unsigned cmd, void __user *arg)
{
switch (cmd) {
+#if 0
case BCH_IOCTL_ASSEMBLE:
return bch2_ioctl_assemble(arg);
case BCH_IOCTL_INCREMENTAL:
return bch2_ioctl_incremental(arg);
+#endif
default:
return -ENOTTY;
}
sizeof(c->sb.user_uuid));
}
+#if 0
static long bch2_ioctl_start(struct bch_fs *c, struct bch_ioctl_start arg)
{
if (arg.flags || arg.pad)
bch2_fs_stop(c);
return 0;
}
+#endif
static long bch2_ioctl_disk_add(struct bch_fs *c, struct bch_ioctl_disk arg)
{
{
struct bch_data_ctx *ctx = file->private_data;
struct bch_fs *c = ctx->c;
- struct bch_ioctl_data_progress p = {
- .data_type = ctx->stats.data_type,
- .btree_id = ctx->stats.iter.btree_id,
- .pos = ctx->stats.iter.pos,
- .sectors_done = atomic64_read(&ctx->stats.sectors_seen),
- .sectors_total = bch2_fs_sectors_used(c, bch2_fs_usage_read(c)),
+ struct bch_ioctl_data_event e = {
+ .type = BCH_DATA_EVENT_PROGRESS,
+ .p.data_type = ctx->stats.data_type,
+ .p.btree_id = ctx->stats.iter.btree_id,
+ .p.pos = ctx->stats.iter.pos,
+ .p.sectors_done = atomic64_read(&ctx->stats.sectors_seen),
+ .p.sectors_total = bch2_fs_sectors_used(c, bch2_fs_usage_read(c)),
};
- if (len != sizeof(p))
+ if (len < sizeof(e))
return -EINVAL;
- return copy_to_user(buf, &p, sizeof(p)) ?: sizeof(p);
+ return copy_to_user(buf, &e, sizeof(e)) ?: sizeof(e);
}
static const struct file_operations bcachefs_data_ops = {
unsigned i, j;
int ret;
+ if (!test_bit(BCH_FS_STARTED, &c->flags))
+ return -EINVAL;
+
if (copy_from_user(&arg, user_arg, sizeof(arg)))
return -EFAULT;
if (ca->dev_idx >= arg.nr_devices) {
percpu_ref_put(&ca->ref);
- return -ENOSPC;
+ return -ERANGE;
}
if (percpu_ref_tryget(&ca->io_ref)) {
sb = ca->disk_sb.sb;
} else {
- sb = c->disk_sb;
+ sb = c->disk_sb.sb;
}
if (vstruct_bytes(sb) > arg.size) {
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
- /* ioctls that do require admin cap: */
switch (cmd) {
+#if 0
case BCH_IOCTL_START:
BCH_IOCTL(start, struct bch_ioctl_start);
case BCH_IOCTL_STOP:
return bch2_ioctl_stop(c);
+#endif
+ case BCH_IOCTL_READ_SUPER:
+ BCH_IOCTL(read_super, struct bch_ioctl_read_super);
+ case BCH_IOCTL_DISK_GET_IDX:
+ BCH_IOCTL(disk_get_idx, struct bch_ioctl_disk_get_idx);
+ }
+
+ if (!test_bit(BCH_FS_STARTED, &c->flags))
+ return -EINVAL;
+ /* ioctls that do require admin cap: */
+ switch (cmd) {
case BCH_IOCTL_DISK_ADD:
BCH_IOCTL(disk_add, struct bch_ioctl_disk);
case BCH_IOCTL_DISK_REMOVE:
BCH_IOCTL(disk_set_state, struct bch_ioctl_disk_set_state);
case BCH_IOCTL_DATA:
BCH_IOCTL(data, struct bch_ioctl_data);
- case BCH_IOCTL_READ_SUPER:
- BCH_IOCTL(read_super, struct bch_ioctl_read_super);
- case BCH_IOCTL_DISK_GET_IDX:
- BCH_IOCTL(disk_get_idx, struct bch_ioctl_disk_get_idx);
case BCH_IOCTL_DISK_RESIZE:
BCH_IOCTL(disk_resize, struct bch_ioctl_disk_resize);