Resubmitting as my previous post had format issues and did not go linux-scsi. This patch fixes the host byte settings DID_TARGET_FAILURE and DID_NEXUS_FAILURE. The function __scsi_error_from_host_byte, tries to reset the host byte to DID_OK. But that does not happen because of the OR operation. Here is the flow. scsi_softirq_done-> scsi_decide_disposition -> __scsi_error_from_host_byte Let's take an example with DID_NEXUS_FAILURE. In scsi_decide_disposition, result will be set as DID_NEXUS_FAILURE (=0x11). Then in __scsi_error_from_host_byte, when we do OR with DID_OK. Purpose is to reset it back to DID_OK. But that does not happen. This patch fixes this issue. Signed-off-by: Babu Moger <babu.moger@xxxxxxxxxx> --- diff -uprN -X linux-3.3-rc1/Documentation/dontdiff linux-3.3-rc1//drivers/scsi/scsi_error.c linux-3.3-rc1-new//drivers/scsi/scsi_error.c --- linux-3.3-rc1//drivers/scsi/scsi_error.c 2012-01-19 17:04:48.000000000 -0600 +++ linux-3.3-rc1-new//drivers/scsi/scsi_error.c 2012-01-23 11:55:26.000000000 -0600 @@ -1540,7 +1540,7 @@ int scsi_decide_disposition(struct scsi_ * Need to modify host byte to signal a * permanent target failure */ - scmd->result |= (DID_TARGET_FAILURE << 16); + set_host_byte(scmd, DID_TARGET_FAILURE); rtn = SUCCESS; } /* if rtn == FAILED, we have no sense information; @@ -1560,7 +1560,7 @@ int scsi_decide_disposition(struct scsi_ case RESERVATION_CONFLICT: sdev_printk(KERN_INFO, scmd->device, "reservation conflict\n"); - scmd->result |= (DID_NEXUS_FAILURE << 16); + set_host_byte(scmd, DID_NEXUS_FAILURE); return SUCCESS; /* causes immediate i/o error */ default: return FAILED; diff -uprN -X linux-3.3-rc1/Documentation/dontdiff linux-3.3-rc1//drivers/scsi/scsi_lib.c linux-3.3-rc1-new//drivers/scsi/scsi_lib.c --- linux-3.3-rc1//drivers/scsi/scsi_lib.c 2012-01-19 17:04:48.000000000 -0600 +++ linux-3.3-rc1-new//drivers/scsi/scsi_lib.c 2012-01-23 11:50:25.000000000 -0600 @@ -682,11 +682,11 @@ static int __scsi_error_from_host_byte(s error = -ENOLINK; break; case DID_TARGET_FAILURE: - cmd->result |= (DID_OK << 16); + set_host_byte(cmd, DID_OK); error = -EREMOTEIO; break; case DID_NEXUS_FAILURE: - cmd->result |= (DID_OK << 16); + set_host_byte(cmd, DID_OK); error = -EBADE; break; default: -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel