]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/chardev.c
Update bcachefs sources to 9abf628c70 bcachefs: Fix a spurious error in fsck
[bcachefs-tools-debian] / libbcachefs / chardev.c
index 5ff90cc0015fca9e13afbfde0dd6dd649ebac4b6..5593b9a1de27cc7a737cb46a88fd7b204d5f4da9 100644 (file)
@@ -40,32 +40,21 @@ static struct bch_dev *bch2_device_lookup(struct bch_fs *c, u64 dev,
                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;
@@ -139,14 +128,17 @@ static long bch2_ioctl_incremental(struct bch_ioctl_incremental __user *user_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;
        }
@@ -160,6 +152,7 @@ static long bch2_ioctl_query_uuid(struct bch_fs *c,
                            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)
@@ -173,6 +166,7 @@ static long bch2_ioctl_stop(struct bch_fs *c)
        bch2_fs_stop(c);
        return 0;
 }
+#endif
 
 static long bch2_ioctl_disk_add(struct bch_fs *c, struct bch_ioctl_disk arg)
 {
@@ -306,18 +300,19 @@ static ssize_t bch2_data_job_read(struct file *file, char __user *buf,
 {
        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 = {
@@ -384,6 +379,9 @@ static long bch2_ioctl_usage(struct bch_fs *c,
        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;
 
@@ -428,7 +426,7 @@ static long bch2_ioctl_usage(struct bch_fs *c,
 
                if (ca->dev_idx >= arg.nr_devices) {
                        percpu_ref_put(&ca->ref);
-                       return -ENOSPC;
+                       return -ERANGE;
                }
 
                if (percpu_ref_tryget(&ca->io_ref)) {
@@ -472,7 +470,7 @@ static long bch2_ioctl_read_super(struct bch_fs *c,
 
                sb = ca->disk_sb.sb;
        } else {
-               sb = c->disk_sb;
+               sb = c->disk_sb.sb;
        }
 
        if (vstruct_bytes(sb) > arg.size) {
@@ -547,13 +545,24 @@ long bch2_fs_ioctl(struct bch_fs *c, unsigned cmd, void __user *arg)
        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:
@@ -566,10 +575,6 @@ long bch2_fs_ioctl(struct bch_fs *c, unsigned cmd, void __user *arg)
                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);