bsg: convert to dynamic major
Jens Axboe [Tue, 17 Jul 2007 06:56:10 +0000 (08:56 +0200)]
240 was hardcoded, that was clearly a dumb mistake. Convert bsg
to use alloc_chrdev_region() to retrieve a dynamic major.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

block/bsg.c

index 26a9372..cdb00e5 100644 (file)
@@ -68,11 +68,6 @@ enum {
 #define dprintk(fmt, args...)
 #endif
 
-/*
- * just for testing
- */
-#define BSG_MAJOR      (240)
-
 static DEFINE_MUTEX(bsg_mutex);
 static int bsg_device_nr, bsg_minor_idx;
 
@@ -82,6 +77,7 @@ static struct hlist_head bsg_device_list[BSG_LIST_ARRAY_SIZE];
 
 static struct class *bsg_class;
 static LIST_HEAD(bsg_class_list);
+static int bsg_major;
 
 static struct kmem_cache *bsg_cmd_cachep;
 
@@ -943,7 +939,7 @@ void bsg_unregister_queue(struct request_queue *q)
 
        mutex_lock(&bsg_mutex);
        sysfs_remove_link(&q->kobj, "bsg");
-       class_device_destroy(bsg_class, MKDEV(BSG_MAJOR, bcd->minor));
+       class_device_destroy(bsg_class, MKDEV(bsg_major, bcd->minor));
        bcd->class_dev = NULL;
        list_del_init(&bcd->list);
        bsg_device_nr--;
@@ -989,7 +985,7 @@ retry:
                bsg_minor_idx = 0;
 
        bcd->queue = q;
-       dev = MKDEV(BSG_MAJOR, bcd->minor);
+       dev = MKDEV(bsg_major, bcd->minor);
        class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", name);
        if (IS_ERR(class_dev)) {
                ret = PTR_ERR(class_dev);
@@ -1010,7 +1006,7 @@ retry:
        return 0;
 err:
        if (class_dev)
-               class_device_destroy(bsg_class, MKDEV(BSG_MAJOR, bcd->minor));
+               class_device_destroy(bsg_class, MKDEV(bsg_major, bcd->minor));
        mutex_unlock(&bsg_mutex);
        return ret;
 }
@@ -1047,6 +1043,7 @@ static struct cdev bsg_cdev = {
 static int __init bsg_init(void)
 {
        int ret, i;
+       dev_t devid;
 
        bsg_cmd_cachep = kmem_cache_create("bsg_cmd",
                                sizeof(struct bsg_command), 0, 0, NULL, NULL);
@@ -1064,19 +1061,21 @@ static int __init bsg_init(void)
                return PTR_ERR(bsg_class);
        }
 
-       ret = register_chrdev_region(MKDEV(BSG_MAJOR, 0), BSG_MAX_DEVS, "bsg");
+       ret = alloc_chrdev_region(&devid, 0, BSG_MAX_DEVS, "bsg");
        if (ret) {
                kmem_cache_destroy(bsg_cmd_cachep);
                class_destroy(bsg_class);
                return ret;
        }
 
+       bsg_major = MAJOR(devid);
+
        cdev_init(&bsg_cdev, &bsg_fops);
-       ret = cdev_add(&bsg_cdev, MKDEV(BSG_MAJOR, 0), BSG_MAX_DEVS);
+       ret = cdev_add(&bsg_cdev, MKDEV(bsg_major, 0), BSG_MAX_DEVS);
        if (ret) {
                kmem_cache_destroy(bsg_cmd_cachep);
                class_destroy(bsg_class);
-               unregister_chrdev_region(MKDEV(BSG_MAJOR, 0), BSG_MAX_DEVS);
+               unregister_chrdev_region(MKDEV(bsg_major, 0), BSG_MAX_DEVS);
                return ret;
        }
 
@@ -1085,11 +1084,11 @@ static int __init bsg_init(void)
                printk(KERN_ERR "bsg: failed register scsi interface %d\n", ret);
                kmem_cache_destroy(bsg_cmd_cachep);
                class_destroy(bsg_class);
-               unregister_chrdev(BSG_MAJOR, "bsg");
+               unregister_chrdev(bsg_major, "bsg");
                return ret;
        }
 
-       printk(KERN_INFO "%s loaded\n", bsg_version);
+       printk(KERN_INFO "%s loaded (major %d)\n", bsg_version, bsg_major);
        return 0;
 }