patch "[SCSI] Fix out of spec CD-ROM problem with media change"will cause usb disk resume fail.

From: Caizhiyong
Date: Sun Jan 26 2014 - 03:04:22 EST


> [SCSI] Fix out of spec CD-ROM problem with media change
>
> Some CD-ROMs fail to report a media change correctly. The specific
> one for this patch simply fails to respond to commands, then gives a
> UNIT ATTENTION after being reset which returns ASC/ASCQ 28/00. This
> is out of spec behaviour, but add a check in the eat CC/UA on reset
> path to catch this case so the CD-ROM will function somewhat properly.
>
> [jejb: fixed up white space and accepted without signoff]
> Signed-off-by: James Bottomley <JBottomley@xxxxxxxxxxxxx>
>
>diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
>index a4b9cdb..dc6131e 100644
>--- a/drivers/scsi/scsi_error.c
>+++ b/drivers/scsi/scsi_error.c
>@@ -293,8 +293,16 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
> * so that we can deal with it there.
> */
> if (scmd->device->expecting_cc_ua) {
>- scmd->device->expecting_cc_ua = 0;
>- return NEEDS_RETRY;
>+ /*
>+ * Because some device does not queue unit
>+ * attentions correctly, we carefully check
>+ * additional sense code and qualifier so as
>+ * not to squash media change unit attention.
>+ */
>+ if (sshdr.asc != 0x28 || sshdr.ascq != 0x00) {
>+ scmd->device->expecting_cc_ua = 0;
>+ return NEEDS_RETRY;
>+ }
> }

Consider this scene:

1. Insert usb disk.
2. System suspend, usb controller power off.
3. System resume, usb controller power on, reset the usb disk. When read/write usb disk, it will pass up "media changed" status to scsi layer.
this time need NEEDS_RETRY cmd,but this patch filter NEEDS_RETRY cmd, block layer report "IO ERRROR".


Looking forward to your feedback.
Best regards.
Cai Zhiyong.
http://www.huawei.com

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/