s390/cio: use device_lock to synchronize calls to the ccwgroup driver
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 16 Dec 2013 09:56:46 +0000 (10:56 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 16 Dec 2013 13:38:03 +0000 (14:38 +0100)
When calling set_{on,off}line of a ccwgroup device driver we hold
the module reference of the owner. This is pretty useless - we don't
want to prevent module unloading but driver unbinding. Use the
driver core's device_lock instead.

Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/ccwgroup.c

index 959135a01847940a5ecee33ae902b83cf8ecfe44..fd3367a1dc7a0bc59cca626e5b7ada39a56bb39c 100644 (file)
@@ -128,14 +128,14 @@ static ssize_t ccwgroup_online_store(struct device *dev,
                                     const char *buf, size_t count)
 {
        struct ccwgroup_device *gdev = to_ccwgroupdev(dev);
-       struct ccwgroup_driver *gdrv = to_ccwgroupdrv(dev->driver);
        unsigned long value;
        int ret;
 
-       if (!dev->driver)
-               return -EINVAL;
-       if (!try_module_get(gdrv->driver.owner))
-               return -EINVAL;
+       device_lock(dev);
+       if (!dev->driver) {
+               ret = -EINVAL;
+               goto out;
+       }
 
        ret = kstrtoul(buf, 0, &value);
        if (ret)
@@ -148,7 +148,7 @@ static ssize_t ccwgroup_online_store(struct device *dev,
        else
                ret = -EINVAL;
 out:
-       module_put(gdrv->driver.owner);
+       device_unlock(dev);
        return (ret == 0) ? count : ret;
 }