Alternative fix for MMC oops on unmount after removal
authorLinus Torvalds <torvalds@g5.osdl.org>
Sat, 13 May 2006 01:42:09 +0000 (18:42 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sat, 13 May 2006 01:42:09 +0000 (18:42 -0700)
Make sure to clear the driverfs_dev pointer when we do del_gendisk() (on
disk removal), so that other users that may still have a ref to the disk
won't try to use the stale pointer.

Also move the KOBJ_REMOVE uevent handler up, so that the uevent still
has access to the driverfs_dev data.

This all should hopefully fix the problems with MMC umounts after device
removals that caused commit 56cf6504fc1c0c221b82cebc16a444b684140fb7 and
its reversal (1a2acc9e9214699a99389e323e6686e9e0e2ca67).

Original problem reported by Todd Blumer and others.

Acked-by: Greg KH <gregkh@suse.de>
Cc: Russell King <rmk+lkml@arm.linux.org.uk>
Cc: James Bottomley <James.Bottomley@SteelEye.com>
Cc: Erik Mouw <erik@harddisk-recovery.com>
Cc: Andrew Vasquez <andrew.vasquez@qlogic.com>
Cc: Todd Blumer <todd@sdgsystems.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/partitions/check.c

index 45ae7dd3c650399baafe5c8d20cc3b6734181d7a..7ef1f094de911998a88fe76bda393f136d60ec3c 100644 (file)
@@ -533,6 +533,7 @@ void del_gendisk(struct gendisk *disk)
 
        devfs_remove_disk(disk);
 
+       kobject_uevent(&disk->kobj, KOBJ_REMOVE);
        if (disk->holder_dir)
                kobject_unregister(disk->holder_dir);
        if (disk->slave_dir)
@@ -545,7 +546,7 @@ void del_gendisk(struct gendisk *disk)
                        kfree(disk_name);
                }
                put_device(disk->driverfs_dev);
+               disk->driverfs_dev = NULL;
        }
-       kobject_uevent(&disk->kobj, KOBJ_REMOVE);
        kobject_del(&disk->kobj);
 }