Commit 26d9cab5 authored by Vasu Dev's avatar Vasu Dev Committed by James Bottomley

[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: default avatarVasu Dev <vasu.dev@intel.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 6755db1c
...@@ -1810,12 +1810,12 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp) ...@@ -1810,12 +1810,12 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
sc_cmd->result = DID_ERROR << 16; sc_cmd->result = DID_ERROR << 16;
break; break;
case FC_DATA_UNDRUN: 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 * 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 { } else {
/* /*
* scsi got underrun, this is an error * scsi got underrun, this is an error
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment