diff options
author | Lan Tianyu <tianyu.lan@intel.com> | 2012-03-15 11:11:31 +0800 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-03-19 11:34:18 +0000 |
commit | 4e2247b2bd289f079349d6c69755f8cff4e31f2b (patch) | |
tree | 49f7824b1b09a6c3402d84b2173963eecdfce418 /drivers/scsi/sd.c | |
parent | cd8df932d894f3128c884e3ae1b2b484540513db (diff) | |
download | linux-4e2247b2bd289f079349d6c69755f8cff4e31f2b.tar.bz2 |
[SCSI] sd: Add runtime pm in the sd_check_events()
The sd_check_event() will be called periodly even when the device is in the
suspended status to check media event. The scsi_test_unit_ready() in the
sd_check_event() will issue scsi cmd request. Issuing scsi request when the
device is in the suspeneded status will cause problem. For example, when a usb
flash disk in the suspended status, scsi_test_unit_ready() issues a scsi
request. The request will be returned as failed because the usb device is not
active. The patch adds scsi_autopm_get_device() and scsi_autopm_put_device()
around scsi_test_unit_ready() in the sd_check_event() to resolve such problem.
Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index bd17cf8af013..367635045880 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1212,9 +1212,14 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) retval = -ENODEV; if (scsi_block_when_processing_errors(sdp)) { + retval = scsi_autopm_get_device(sdp); + if (retval) + goto out; + sshdr = kzalloc(sizeof(*sshdr), GFP_KERNEL); retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES, sshdr); + scsi_autopm_put_device(sdp); } /* failed to execute TUR, assume media not present */ |