[POWERPC] 85xx: Added needed MPC85xx PCI device IDs
[powerpc.git] / block / bsg.c
index 4e0be1b..b571869 100644 (file)
@@ -932,24 +932,34 @@ void bsg_unregister_queue(struct request_queue *q)
 {
        struct bsg_class_device *bcd = &q->bsg_dev;
 
-       WARN_ON(!bcd->class_dev);
+       if (!bcd->class_dev)
+               return;
 
        mutex_lock(&bsg_mutex);
        sysfs_remove_link(&q->kobj, "bsg");
-       class_device_destroy(bsg_class, MKDEV(bsg_major, bcd->minor));
+       class_device_unregister(bcd->class_dev);
+       put_device(bcd->dev);
        bcd->class_dev = NULL;
+       bcd->dev = NULL;
        list_del_init(&bcd->list);
        bsg_device_nr--;
        mutex_unlock(&bsg_mutex);
 }
 EXPORT_SYMBOL_GPL(bsg_unregister_queue);
 
-int bsg_register_queue(struct request_queue *q, const char *name)
+int bsg_register_queue(struct request_queue *q, struct device *gdev,
+                      const char *name)
 {
        struct bsg_class_device *bcd, *__bcd;
        dev_t dev;
        int ret = -EMFILE;
        struct class_device *class_dev = NULL;
+       const char *devname;
+
+       if (name)
+               devname = name;
+       else
+               devname = gdev->bus_id;
 
        /*
         * we need a proper transport to send commands, not a stacked device
@@ -982,18 +992,20 @@ retry:
                bsg_minor_idx = 0;
 
        bcd->queue = q;
+       bcd->dev = get_device(gdev);
        dev = MKDEV(bsg_major, bcd->minor);
-       class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", name);
+       class_dev = class_device_create(bsg_class, NULL, dev, gdev, "%s",
+                                       devname);
        if (IS_ERR(class_dev)) {
                ret = PTR_ERR(class_dev);
-               goto err;
+               goto err_put;
        }
        bcd->class_dev = class_dev;
 
        if (q->kobj.sd) {
                ret = sysfs_create_link(&q->kobj, &bcd->class_dev->kobj, "bsg");
                if (ret)
-                       goto err;
+                       goto err_unregister;
        }
 
        list_add_tail(&bcd->list, &bsg_class_list);
@@ -1001,9 +1013,12 @@ retry:
 
        mutex_unlock(&bsg_mutex);
        return 0;
+
+err_unregister:
+       class_device_unregister(class_dev);
+err_put:
+       put_device(gdev);
 err:
-       if (class_dev)
-               class_device_destroy(bsg_class, MKDEV(bsg_major, bcd->minor));
        mutex_unlock(&bsg_mutex);
        return ret;
 }
@@ -1020,7 +1035,7 @@ static int __init bsg_init(void)
        dev_t devid;
 
        bsg_cmd_cachep = kmem_cache_create("bsg_cmd",
-                               sizeof(struct bsg_command), 0, 0, NULL, NULL);
+                               sizeof(struct bsg_command), 0, 0, NULL);
        if (!bsg_cmd_cachep) {
                printk(KERN_ERR "bsg: failed creating slab cache\n");
                return -ENOMEM;