dm - adjust use of minor numbers to new reality
authorAlex Hornung <ahornung@gmail.com>
Thu, 4 Nov 2010 20:31:54 +0000 (20:31 +0000)
committerAlex Hornung <ahornung@gmail.com>
Thu, 4 Nov 2010 20:31:54 +0000 (20:31 +0000)
* Allocate (theoretical) minor numbers using the devfs_clone_bitmap
  facility instead of an ever-increasing int64.

* Set the actual minor of the dm-specific device information to the
  minor returned by the disk subsystem.

* Undo some of the dkunit() uses as they only covered very specific use
  cases.

sys/dev/disk/dm/device-mapper.c
sys/dev/disk/dm/dm_ioctl.c

index b3efa3f..4764d36 100644 (file)
@@ -39,6 +39,7 @@
 #include <sys/buf.h>
 #include <sys/conf.h>
 #include <sys/device.h>
+#include <sys/devfs.h>
 #include <sys/disk.h>
 #include <sys/disklabel.h>
 #include <sys/dtype.h>
@@ -71,6 +72,8 @@ static int dm_ioctl_switch(u_long);
 static void dmminphys(struct buf *);
 #endif
 
+struct devfs_bitmap dm_minor_bitmap;
+
 /* ***Variable-definitions*** */
 struct dev_ops dm_ops = {
        { "dm", 0, D_DISK | D_MPSAFE },
@@ -140,6 +143,7 @@ dm_modcmd(module_t mod, int cmd, void *unused)
 
        switch (cmd) {
        case MOD_LOAD:
+               devfs_clone_bitmap_init(&dm_minor_bitmap);
                dm_doinit();
                kprintf("Device Mapper version %d.%d.%d loaded\n",
                    DM_VERSION_MAJOR, DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL);
@@ -178,6 +182,8 @@ dm_modcmd(module_t mod, int cmd, void *unused)
 int
 dm_detach(dm_dev_t *dmv)
 {
+       int minor;
+
        disable_dev(dmv);
 
        /* Destroy active table first.  */
@@ -188,8 +194,10 @@ dm_detach(dm_dev_t *dmv)
 
        dm_table_head_destroy(&dmv->table_head);
 
+       minor = dkunit(dmv->devt);
        disk_destroy(dmv->diskp);
        devstat_remove_entry(&dmv->stats);
+       devfs_clone_bitmap_put(&dm_minor_bitmap, minor);
 
        /* Destroy device */
        (void)dm_dev_free(dmv);
@@ -406,7 +414,7 @@ dmstrategy(struct dev_strategy_args *ap)
        dev_type = 0;
        issued_len = 0;
 
-       if ((dmv = dm_dev_lookup(NULL, NULL, dkunit(dev))) == NULL) {
+       if ((dmv = dm_dev_lookup(NULL, NULL, minor(dev))) == NULL) {
                bp->b_error = EIO;
                bp->b_resid = bp->b_bcount;
                biodone(bio);
index 1f21bac..ea83b6e 100644 (file)
@@ -83,6 +83,7 @@
 
 #include <sys/device.h>
 #include <sys/devicestat.h>
+#include <sys/devfs.h>
 #include <sys/disk.h>
 #include <sys/disklabel.h>
 #include <sys/malloc.h>
@@ -94,6 +95,7 @@
 
 static uint64_t sc_minor_num;
 extern struct dev_ops dm_ops;
+extern struct devfs_bitmap dm_minor_bitmap;
 uint64_t dm_dev_counter;
 
 #if 0
@@ -203,7 +205,7 @@ dm_dev_create_ioctl(prop_dictionary_t dm_dict)
        dm_dev_t *dmv;
        const char *name, *uuid;
        char name_buf[MAXPATHLEN];
-       int r, flags;
+       int r, flags, dm_minor;
 
        r = 0;
        flags = 0;
@@ -240,7 +242,7 @@ dm_dev_create_ioctl(prop_dictionary_t dm_dict)
        if (name)
                strlcpy(dmv->name, name, DM_NAME_LEN);
 
-       dmv->minor = ++sc_minor_num; /* XXX: was atomic 64 */
+       dm_minor = devfs_clone_bitmap_get(&dm_minor_bitmap, 0);
        dmv->flags = 0;         /* device flags are set when needed */
        dmv->ref_cnt = 0;
        dmv->event_nr = 0;
@@ -255,8 +257,6 @@ dm_dev_create_ioctl(prop_dictionary_t dm_dict)
        if (flags & DM_READONLY_FLAG)
                dmv->flags |= DM_READONLY_FLAG;
 
-       prop_dictionary_set_uint32(dm_dict, DM_IOCTL_MINOR, dmv->minor);
-
        aprint_debug("Creating device dm/%s\n", name);
        ksnprintf(name_buf, sizeof(name_buf), "mapper/%s", dmv->name);
 
@@ -265,7 +265,9 @@ dm_dev_create_ioctl(prop_dictionary_t dm_dict)
            DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER,
            DEVSTAT_PRIORITY_DISK);
 
-       dmv->devt = disk_create_named(name_buf, dmv->minor, dmv->diskp, &dm_ops);
+       dmv->devt = disk_create_named(name_buf, dm_minor, dmv->diskp, &dm_ops);
+       dmv->minor = minor(dmv->devt);
+       prop_dictionary_set_uint32(dm_dict, DM_IOCTL_MINOR, dmv->minor);
        udev_dict_set_cstr(dmv->devt, "subsystem", "disk");
 
        if ((r = dm_dev_insert(dmv)) != 0)