]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/core/ucm.c
Add "no BKL needed" comments to several drivers
[linux-2.6-omap-h63xx.git] / drivers / infiniband / core / ucm.c
index 424983f5b1ee249f5685907d6f695c03c20d4c4a..3e6a8ff6d76cbc47019160a58a17e1e023f3ff26 100644 (file)
@@ -58,8 +58,8 @@ MODULE_LICENSE("Dual BSD/GPL");
 
 struct ib_ucm_device {
        int                     devnum;
-       struct cdev             dev;
-       struct class_device     class_dev;
+       struct cdev             cdev;
+       struct device           dev;
        struct ib_device        *ib_dev;
 };
 
@@ -106,6 +106,9 @@ enum {
        IB_UCM_MAX_DEVICES = 32
 };
 
+/* ib_cm and ib_user_cm modules share /sys/class/infiniband_cm */
+extern struct class cm_class;
+
 #define IB_UCM_BASE_DEV MKDEV(IB_UCM_MAJOR, IB_UCM_BASE_MINOR)
 
 static void ib_ucm_add_one(struct ib_device *device);
@@ -1152,6 +1155,7 @@ static unsigned int ib_ucm_poll(struct file *filp,
        return mask;
 }
 
+/* No BKL needed here: no global resources used */
 static int ib_ucm_open(struct inode *inode, struct file *filp)
 {
        struct ib_ucm_file *file;
@@ -1168,7 +1172,7 @@ static int ib_ucm_open(struct inode *inode, struct file *filp)
 
        filp->private_data = file;
        file->filp = filp;
-       file->device = container_of(inode->i_cdev, struct ib_ucm_device, dev);
+       file->device = container_of(inode->i_cdev, struct ib_ucm_device, cdev);
 
        return 0;
 }
@@ -1199,14 +1203,14 @@ static int ib_ucm_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static void ib_ucm_release_class_dev(struct class_device *class_dev)
+static void ib_ucm_release_dev(struct device *dev)
 {
-       struct ib_ucm_device *dev;
+       struct ib_ucm_device *ucm_dev;
 
-       dev = container_of(class_dev, struct ib_ucm_device, class_dev);
-       cdev_del(&dev->dev);
-       clear_bit(dev->devnum, dev_map);
-       kfree(dev);
+       ucm_dev = container_of(dev, struct ib_ucm_device, dev);
+       cdev_del(&ucm_dev->cdev);
+       clear_bit(ucm_dev->devnum, dev_map);
+       kfree(ucm_dev);
 }
 
 static const struct file_operations ucm_fops = {
@@ -1217,19 +1221,15 @@ static const struct file_operations ucm_fops = {
        .poll    = ib_ucm_poll,
 };
 
-static struct class ucm_class = {
-       .name    = "infiniband_cm",
-       .release = ib_ucm_release_class_dev
-};
-
-static ssize_t show_ibdev(struct class_device *class_dev, char *buf)
+static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr,
+                         char *buf)
 {
-       struct ib_ucm_device *dev;
+       struct ib_ucm_device *ucm_dev;
 
-       dev = container_of(class_dev, struct ib_ucm_device, class_dev);
-       return sprintf(buf, "%s\n", dev->ib_dev->name);
+       ucm_dev = container_of(dev, struct ib_ucm_device, dev);
+       return sprintf(buf, "%s\n", ucm_dev->ib_dev->name);
 }
-static CLASS_DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL);
+static DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL);
 
 static void ib_ucm_add_one(struct ib_device *device)
 {
@@ -1251,31 +1251,31 @@ static void ib_ucm_add_one(struct ib_device *device)
 
        set_bit(ucm_dev->devnum, dev_map);
 
-       cdev_init(&ucm_dev->dev, &ucm_fops);
-       ucm_dev->dev.owner = THIS_MODULE;
-       kobject_set_name(&ucm_dev->dev.kobj, "ucm%d", ucm_dev->devnum);
-       if (cdev_add(&ucm_dev->dev, IB_UCM_BASE_DEV + ucm_dev->devnum, 1))
+       cdev_init(&ucm_dev->cdev, &ucm_fops);
+       ucm_dev->cdev.owner = THIS_MODULE;
+       kobject_set_name(&ucm_dev->cdev.kobj, "ucm%d", ucm_dev->devnum);
+       if (cdev_add(&ucm_dev->cdev, IB_UCM_BASE_DEV + ucm_dev->devnum, 1))
                goto err;
 
-       ucm_dev->class_dev.class = &ucm_class;
-       ucm_dev->class_dev.dev = device->dma_device;
-       ucm_dev->class_dev.devt = ucm_dev->dev.dev;
-       snprintf(ucm_dev->class_dev.class_id, BUS_ID_SIZE, "ucm%d",
+       ucm_dev->dev.class = &cm_class;
+       ucm_dev->dev.parent = device->dma_device;
+       ucm_dev->dev.devt = ucm_dev->cdev.dev;
+       ucm_dev->dev.release = ib_ucm_release_dev;
+       snprintf(ucm_dev->dev.bus_id, BUS_ID_SIZE, "ucm%d",
                 ucm_dev->devnum);
-       if (class_device_register(&ucm_dev->class_dev))
+       if (device_register(&ucm_dev->dev))
                goto err_cdev;
 
-       if (class_device_create_file(&ucm_dev->class_dev,
-                                    &class_device_attr_ibdev))
-               goto err_class;
+       if (device_create_file(&ucm_dev->dev, &dev_attr_ibdev))
+               goto err_dev;
 
        ib_set_client_data(device, &ucm_client, ucm_dev);
        return;
 
-err_class:
-       class_device_unregister(&ucm_dev->class_dev);
+err_dev:
+       device_unregister(&ucm_dev->dev);
 err_cdev:
-       cdev_del(&ucm_dev->dev);
+       cdev_del(&ucm_dev->cdev);
        clear_bit(ucm_dev->devnum, dev_map);
 err:
        kfree(ucm_dev);
@@ -1289,7 +1289,7 @@ static void ib_ucm_remove_one(struct ib_device *device)
        if (!ucm_dev)
                return;
 
-       class_device_unregister(&ucm_dev->class_dev);
+       device_unregister(&ucm_dev->dev);
 }
 
 static ssize_t show_abi_version(struct class *class, char *buf)
@@ -1306,40 +1306,34 @@ static int __init ib_ucm_init(void)
                                     "infiniband_cm");
        if (ret) {
                printk(KERN_ERR "ucm: couldn't register device number\n");
-               goto err;
-       }
-
-       ret = class_register(&ucm_class);
-       if (ret) {
-               printk(KERN_ERR "ucm: couldn't create class infiniband_cm\n");
-               goto err_chrdev;
+               goto error1;
        }
 
-       ret = class_create_file(&ucm_class, &class_attr_abi_version);
+       ret = class_create_file(&cm_class, &class_attr_abi_version);
        if (ret) {
                printk(KERN_ERR "ucm: couldn't create abi_version attribute\n");
-               goto err_class;
+               goto error2;
        }
 
        ret = ib_register_client(&ucm_client);
        if (ret) {
                printk(KERN_ERR "ucm: couldn't register client\n");
-               goto err_class;
+               goto error3;
        }
        return 0;
 
-err_class:
-       class_unregister(&ucm_class);
-err_chrdev:
+error3:
+       class_remove_file(&cm_class, &class_attr_abi_version);
+error2:
        unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
-err:
+error1:
        return ret;
 }
 
 static void __exit ib_ucm_cleanup(void)
 {
        ib_unregister_client(&ucm_client);
-       class_unregister(&ucm_class);
+       class_remove_file(&cm_class, &class_attr_abi_version);
        unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
        idr_destroy(&ctx_id_table);
 }