]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcache/chardev.c
Delete more unused shim code, update bcache code
[bcachefs-tools-debian] / libbcache / chardev.c
index b361b0928416afebd32399952c6008856108165d..b142d7b27a291eb622b919aef7fc9a7691dfc25d 100644 (file)
@@ -53,9 +53,7 @@ static long bch_ioctl_assemble(struct bch_ioctl_assemble __user *user_arg)
                }
        }
 
-       err = bch_register_cache_set(devs, arg.nr_devs,
-                                    cache_set_opts_empty(),
-                                    NULL);
+       err = bch_fs_open(devs, arg.nr_devs, bch_opts_empty(), NULL);
        if (err) {
                pr_err("Could not register cache set: %s", err);
                ret = -EINVAL;
@@ -84,7 +82,7 @@ static long bch_ioctl_incremental(struct bch_ioctl_incremental __user *user_arg)
        if (!path)
                return -ENOMEM;
 
-       err = bch_register_one(path);
+       err = bch_fs_open_incremental(path);
        kfree(path);
 
        if (err) {
@@ -109,7 +107,7 @@ static long bch_global_ioctl(unsigned cmd, void __user *arg)
 
 static long bch_ioctl_stop(struct cache_set *c)
 {
-       bch_cache_set_stop(c);
+       bch_fs_stop(c);
        return 0;
 }
 
@@ -127,7 +125,7 @@ static long bch_ioctl_disk_add(struct cache_set *c,
        if (!path)
                return -ENOMEM;
 
-       ret = bch_cache_set_add_cache(c, path);
+       ret = bch_dev_add(c, path);
        kfree(path);
 
        return ret;
@@ -175,7 +173,7 @@ static long bch_ioctl_disk_remove(struct cache_set *c,
        if (IS_ERR(ca))
                return PTR_ERR(ca);
 
-       ret = bch_cache_remove(ca, arg.flags & BCH_FORCE_IF_DATA_MISSING)
+       ret = bch_dev_remove(ca, arg.flags & BCH_FORCE_IF_DATA_MISSING)
                ? 0 : -EBUSY;
 
        percpu_ref_put(&ca->ref);
@@ -197,7 +195,7 @@ static long bch_ioctl_disk_fail(struct cache_set *c,
                return PTR_ERR(ca);
 
        /* XXX: failed not actually implemented yet */
-       ret = bch_cache_remove(ca, true);
+       ret = bch_dev_remove(ca, true);
 
        percpu_ref_put(&ca->ref);
        return ret;
@@ -268,7 +266,7 @@ static long bch_ioctl_query_uuid(struct cache_set *c,
                            sizeof(c->sb.user_uuid));
 }
 
-long bch_cache_set_ioctl(struct cache_set *c, unsigned cmd, void __user *arg)
+long bch_fs_ioctl(struct cache_set *c, unsigned cmd, void __user *arg)
 {
        /* ioctls that don't require admin cap: */
        switch (cmd) {
@@ -309,12 +307,71 @@ static long bch_chardev_ioctl(struct file *filp, unsigned cmd, unsigned long v)
        void __user *arg = (void __user *) v;
 
        return c
-               ? bch_cache_set_ioctl(c, cmd, arg)
+               ? bch_fs_ioctl(c, cmd, arg)
                : bch_global_ioctl(cmd, arg);
 }
 
-const struct file_operations bch_chardev_fops = {
+static const struct file_operations bch_chardev_fops = {
        .owner          = THIS_MODULE,
        .unlocked_ioctl = bch_chardev_ioctl,
        .open           = nonseekable_open,
 };
+
+static int bch_chardev_major;
+static struct class *bch_chardev_class;
+static struct device *bch_chardev;
+static DEFINE_IDR(bch_chardev_minor);
+
+void bch_fs_chardev_exit(struct cache_set *c)
+{
+       if (!IS_ERR_OR_NULL(c->chardev))
+               device_unregister(c->chardev);
+       if (c->minor >= 0)
+               idr_remove(&bch_chardev_minor, c->minor);
+}
+
+int bch_fs_chardev_init(struct cache_set *c)
+{
+       c->minor = idr_alloc(&bch_chardev_minor, c, 0, 0, GFP_KERNEL);
+       if (c->minor < 0)
+               return c->minor;
+
+       c->chardev = device_create(bch_chardev_class, NULL,
+                                  MKDEV(bch_chardev_major, c->minor), NULL,
+                                  "bcache%u-ctl", c->minor);
+       if (IS_ERR(c->chardev))
+               return PTR_ERR(c->chardev);
+
+       return 0;
+}
+
+void bch_chardev_exit(void)
+{
+       if (!IS_ERR_OR_NULL(bch_chardev_class))
+               device_destroy(bch_chardev_class,
+                              MKDEV(bch_chardev_major, 0));
+       if (!IS_ERR_OR_NULL(bch_chardev_class))
+               class_destroy(bch_chardev_class);
+       if (bch_chardev_major > 0)
+               unregister_chrdev(bch_chardev_major, "bcache");
+
+}
+
+int __init bch_chardev_init(void)
+{
+       bch_chardev_major = register_chrdev(0, "bcache-ctl", &bch_chardev_fops);
+       if (bch_chardev_major < 0)
+               return bch_chardev_major;
+
+       bch_chardev_class = class_create(THIS_MODULE, "bcache");
+       if (IS_ERR(bch_chardev_class))
+               return PTR_ERR(bch_chardev_class);
+
+       bch_chardev = device_create(bch_chardev_class, NULL,
+                                   MKDEV(bch_chardev_major, 255),
+                                   NULL, "bcache-ctl");
+       if (IS_ERR(bch_chardev))
+               return PTR_ERR(bch_chardev);
+
+       return 0;
+}