diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index b0d2542fd317..dc45df819c42 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -4268,7 +4268,15 @@ static void sd_remove(struct scsi_device *sdp) struct device *dev = &sdp->sdev_gendev; struct scsi_disk *sdkp = dev_get_drvdata(dev); - scsi_autopm_get_device(sdkp->device); + /* + * If runtime resume fails, e.g. because the device was unplugged + * while runtime suspended, the request queue stays in the pm-only + * state and any I/O submitted by del_gendisk(), e.g. from + * sync_filesystem(), would wait forever in __bio_queue_enter(). + * Prevent this by marking the disk dead. + */ + if (scsi_autopm_get_device(sdkp->device) < 0) + blk_mark_disk_dead(sdkp->disk); device_del(&sdkp->disk_dev); del_gendisk(sdkp->disk);