pktcdvd: fix BUG caused by sysfs module reference semantics change
authorTejun Heo <htejun@gmail.com>
Thu, 8 Nov 2007 07:00:24 +0000 (08:00 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Thu, 8 Nov 2007 07:00:24 +0000 (08:00 +0100)
pkt_setup_dev() expects module reference to be held on invocation.
This used to be true for sysfs callbacks but not anymore.  Test and
grab module reference around pkt_setup_dev() in
class_pktcdvd_store_add().

Signed-off-by: Tejun Heo <htejun@gmail.com>
Acked-by: Peter Osterlund <petero2@telia.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
drivers/block/pktcdvd.c

index a8130a4..a5ee213 100644 (file)
@@ -358,10 +358,19 @@ static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf,
                                        size_t count)
 {
        unsigned int major, minor;
+
        if (sscanf(buf, "%u:%u", &major, &minor) == 2) {
+               /* pkt_setup_dev() expects caller to hold reference to self */
+               if (!try_module_get(THIS_MODULE))
+                       return -ENODEV;
+
                pkt_setup_dev(MKDEV(major, minor), NULL);
+
+               module_put(THIS_MODULE);
+
                return count;
        }
+
        return -EINVAL;
 }