From: Anton Vorontsov No need to get_device(driverfs_dev), because it's already gotten by add_disk(). And no function will call put_device() second time. This is the source of deadlock[1] in IDE layer. SCSI workaround it by calling put_device() themself after put_disk(), thus it should reflect this change by removing put_device(). [1] deadlock in ide_unregister() at wait_for_completion(&drive->gendev_rel_comp) after device_unregister(&drive->gendev). That happens by reason of ide-probe.c:drive_release_dev() not called because of driverfs_dev (which is drive->gendev) still referenced by add_disk(). Index: fs/partitions/check.c =================================================================== RCS file: /cvs/linux/kernel26/fs/partitions/check.c,v retrieving revision 1.17 diff -u -p -b -B -r1.17 check.c --- fs/partitions/check.c 23 Aug 2006 18:40:39 -0000 1.17 +++ fs/partitions/check.c 18 Oct 2006 21:13:26 -0000 @@ -389,7 +389,7 @@ static char *make_block_name(struct gend static void disk_sysfs_symlinks(struct gendisk *disk) { - struct device *target = get_device(disk->driverfs_dev); + struct device *target = disk->driverfs_dev; if (target) { char *disk_name = make_block_name(disk); sysfs_create_link(&disk->kobj,&target->kobj,"device"); Index: drivers/scsi/sd.c =================================================================== RCS file: /cvs/linux/kernel26/drivers/scsi/sd.c,v retrieving revision 1.18 diff -u -p -b -B -r1.18 sd.c --- drivers/scsi/sd.c 23 Aug 2006 18:38:06 -0000 1.18 +++ drivers/scsi/sd.c 18 Oct 2006 21:14:54 -0000 @@ -1756,7 +1756,6 @@ static void scsi_disk_release(struct cla disk->private_data = NULL; put_disk(disk); - put_device(&sdkp->device->sdev_gendev); kfree(sdkp); }