dasd: fix sysfs cleanup in dasd_generic_remove
authorStefan Weinhuber <wein@de.ibm.com>
Mon, 4 Feb 2013 12:10:35 +0000 (13:10 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 14 Feb 2013 14:55:17 +0000 (15:55 +0100)
When the DASD devices are detached from the driver, then the
dasd_generic_remove function is called. One of the things this
function should do is to remove the DASD specific sysfs attributes,
but this is not done in all cases. This is likely to cause an oops
when at a later point sysfs stumbles over the stale pointers. In
particular this happens when when the modules are unloaded and loaded
again.

Signed-off-by: Stefan Weinhuber <wein@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/block/dasd.c

index e1d96344d7336a269168cf1e1cc09ff9107a1958..f1b7fdc58a5f366ffe054576e8755851f60b2beb 100644 (file)
@@ -3042,12 +3042,15 @@ void dasd_generic_remove(struct ccw_device *cdev)
        cdev->handler = NULL;
 
        device = dasd_device_from_cdev(cdev);
-       if (IS_ERR(device))
+       if (IS_ERR(device)) {
+               dasd_remove_sysfs_files(cdev);
                return;
+       }
        if (test_and_set_bit(DASD_FLAG_OFFLINE, &device->flags) &&
            !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) {
                /* Already doing offline processing */
                dasd_put_device(device);
+               dasd_remove_sysfs_files(cdev);
                return;
        }
        /*