mirror of https://gitee.com/openkylin/linux.git
[SCSI] Fix DVD burning issues.
Some pioneer DVDs are apparently returning odd "not ready" status codes that the mid-layer doesn't recognise and so passes back to the user as errors. This patch overhauls our not-ready handling and adds transparent retries for: format in progress rebuild in progress recalculation in progress operation in progress Long write in progress self test in progress The Pioneer was actually returning "long write in progress" Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
4a6fae1d9c
commit
f3e93f7353
|
@ -1067,16 +1067,29 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes,
|
|||
break;
|
||||
case NOT_READY:
|
||||
/*
|
||||
* If the device is in the process of becoming ready,
|
||||
* retry.
|
||||
* If the device is in the process of becoming
|
||||
* ready, or has a temporary blockage, retry.
|
||||
*/
|
||||
if (sshdr.asc == 0x04 && sshdr.ascq == 0x01) {
|
||||
scsi_requeue_command(q, cmd);
|
||||
return;
|
||||
if (sshdr.asc == 0x04) {
|
||||
switch (sshdr.ascq) {
|
||||
case 0x01: /* becoming ready */
|
||||
case 0x04: /* format in progress */
|
||||
case 0x05: /* rebuild in progress */
|
||||
case 0x06: /* recalculation in progress */
|
||||
case 0x07: /* operation in progress */
|
||||
case 0x08: /* Long write in progress */
|
||||
case 0x09: /* self test in progress */
|
||||
scsi_requeue_command(q, cmd);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!(req->flags & REQ_QUIET))
|
||||
if (!(req->flags & REQ_QUIET)) {
|
||||
scmd_printk(KERN_INFO, cmd,
|
||||
"Device not ready.\n");
|
||||
"Device not ready: ");
|
||||
scsi_print_sense_hdr("", &sshdr);
|
||||
}
|
||||
scsi_end_request(cmd, 0, this_count, 1);
|
||||
return;
|
||||
case VOLUME_OVERFLOW:
|
||||
|
|
Loading…
Reference in New Issue