From 46f6ef4afc14ae1426883a973c18735cfcd70d8f Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 17 Jul 2007 08:56:10 +0200 Subject: bsg: convert to dynamic major 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 --- block/bsg.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/block/bsg.c b/block/bsg.c index 26a9372..cdb00e5 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -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; } -- cgit v1.1