diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 22 | 
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index da36a3a81a9..9032e910bca 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -900,11 +900,23 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)  				action = ACTION_FAIL;  				error = -EILSEQ;  			/* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */ -			} else if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) && -				   (cmd->cmnd[0] == UNMAP || -				    cmd->cmnd[0] == WRITE_SAME_16 || -				    cmd->cmnd[0] == WRITE_SAME)) { -				description = "Discard failure"; +			} else if (sshdr.asc == 0x20 || sshdr.asc == 0x24) { +				switch (cmd->cmnd[0]) { +				case UNMAP: +					description = "Discard failure"; +					break; +				case WRITE_SAME: +				case WRITE_SAME_16: +					if (cmd->cmnd[1] & 0x8) +						description = "Discard failure"; +					else +						description = +							"Write same failure"; +					break; +				default: +					description = "Invalid command failure"; +					break; +				}  				action = ACTION_FAIL;  				error = -EREMOTEIO;  			} else  |