From: Anton Vorontsov Because add_disk() getting driverfs_dev twice but putting it only once, ide-{disk,cd,floppy} should put_device() themselfs. This is workaround for the bug found in genhd, which causes 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(). diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index bddfebd..59121a3 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -3307,6 +3307,7 @@ static void ide_cd_release(struct kref * blk_queue_prep_rq(drive->queue, NULL); g->private_data = NULL; put_disk(g); + put_device(&drive->gendev); kfree(info); } diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 0a05a37..d5d02a1 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -1020,6 +1020,7 @@ static void ide_disk_release(struct kref drive->driver_data = NULL; g->private_data = NULL; put_disk(g); + put_device(&drive->gendev); kfree(idkp); } diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 8ccee9c..7a60d8c 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -1887,6 +1887,7 @@ static void ide_floppy_release(struct kr drive->driver_data = NULL; g->private_data = NULL; put_disk(g); + put_device(&drive->gendev); kfree(floppy); }