[SCSI] libfc: fixed a read IO data integrity issue when a IO data frame lost
The fc_fcp_complete_locked detected data underrun in this case and set the FC_DATA_UNDRUN but that was ignored by fc_io_compl for all cases including read underrun. Added code to not to ignore FC_DATA_UNDRUN for read IO and instead suggested scsi-ml to retry cmd to recover from lost data frame. Not sure if it is okay to ignore FC_DATA_UNDRUN for other case, so let code as is for other cases but removed or-ing with zero valued fsp->cdb_status for those cases. Signed-off-by: Vasu Dev <vasu.dev@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
6755db1cd4
commit
26d9cab558
|
@ -1810,12 +1810,12 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
|
|||
sc_cmd->result = DID_ERROR << 16;
|
||||
break;
|
||||
case FC_DATA_UNDRUN:
|
||||
if (fsp->cdb_status == 0) {
|
||||
if ((fsp->cdb_status == 0) && !(fsp->req_flags & FC_SRB_READ)) {
|
||||
/*
|
||||
* scsi status is good but transport level
|
||||
* underrun. for read it should be an error??
|
||||
* underrun.
|
||||
*/
|
||||
sc_cmd->result = (DID_OK << 16) | fsp->cdb_status;
|
||||
sc_cmd->result = DID_OK << 16;
|
||||
} else {
|
||||
/*
|
||||
* scsi got underrun, this is an error
|
||||
|
|
Loading…
Reference in New Issue