mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-28 15:13:55 +08:00
scsi: libfc: wait for E_D_TOV when out-of-order sequence is received
When detecting an out-of-order sequence we should be waiting for E_D_TOV before trying to abort the sequence. The response might still be stuck in the queue somewhere. Signed-off-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
ad3120cfe0
commit
87da3b832e
@ -459,6 +459,22 @@ static inline struct fc_frame *fc_fcp_frame_alloc(struct fc_lport *lport,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_fsp_rec_tov() - Helper function to get REC_TOV
|
||||||
|
* @fsp: the FCP packet
|
||||||
|
*
|
||||||
|
* Returns rec tov in jiffies as rpriv->e_d_tov + 1 second
|
||||||
|
*/
|
||||||
|
static inline unsigned int get_fsp_rec_tov(struct fc_fcp_pkt *fsp)
|
||||||
|
{
|
||||||
|
struct fc_rport_libfc_priv *rpriv = fsp->rport->dd_data;
|
||||||
|
unsigned int e_d_tov = FC_DEF_E_D_TOV;
|
||||||
|
|
||||||
|
if (rpriv && rpriv->e_d_tov > e_d_tov)
|
||||||
|
e_d_tov = rpriv->e_d_tov;
|
||||||
|
return msecs_to_jiffies(e_d_tov) + HZ;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fc_fcp_recv_data() - Handler for receiving SCSI-FCP data from a target
|
* fc_fcp_recv_data() - Handler for receiving SCSI-FCP data from a target
|
||||||
* @fsp: The FCP packet the data is on
|
* @fsp: The FCP packet the data is on
|
||||||
@ -562,8 +578,10 @@ crc_err:
|
|||||||
* and completes the transfer, call the completion handler.
|
* and completes the transfer, call the completion handler.
|
||||||
*/
|
*/
|
||||||
if (unlikely(fsp->state & FC_SRB_RCV_STATUS) &&
|
if (unlikely(fsp->state & FC_SRB_RCV_STATUS) &&
|
||||||
fsp->xfer_len == fsp->data_len - fsp->scsi_resid)
|
fsp->xfer_len == fsp->data_len - fsp->scsi_resid) {
|
||||||
|
FC_FCP_DBG( fsp, "complete out-of-order sequence\n" );
|
||||||
fc_fcp_complete_locked(fsp);
|
fc_fcp_complete_locked(fsp);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
err:
|
err:
|
||||||
fc_fcp_recovery(fsp, host_bcode);
|
fc_fcp_recovery(fsp, host_bcode);
|
||||||
@ -943,7 +961,7 @@ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
|
|||||||
"len %x, data len %x\n",
|
"len %x, data len %x\n",
|
||||||
fsp->rport->port_id,
|
fsp->rport->port_id,
|
||||||
fsp->xfer_len, expected_len, fsp->data_len);
|
fsp->xfer_len, expected_len, fsp->data_len);
|
||||||
fc_fcp_timer_set(fsp, 2);
|
fc_fcp_timer_set(fsp, get_fsp_rec_tov(fsp));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fsp->status_code = FC_DATA_OVRRUN;
|
fsp->status_code = FC_DATA_OVRRUN;
|
||||||
@ -1151,22 +1169,6 @@ static int fc_fcp_pkt_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* get_fsp_rec_tov() - Helper function to get REC_TOV
|
|
||||||
* @fsp: the FCP packet
|
|
||||||
*
|
|
||||||
* Returns rec tov in jiffies as rpriv->e_d_tov + 1 second
|
|
||||||
*/
|
|
||||||
static inline unsigned int get_fsp_rec_tov(struct fc_fcp_pkt *fsp)
|
|
||||||
{
|
|
||||||
struct fc_rport_libfc_priv *rpriv = fsp->rport->dd_data;
|
|
||||||
unsigned int e_d_tov = FC_DEF_E_D_TOV;
|
|
||||||
|
|
||||||
if (rpriv && rpriv->e_d_tov > e_d_tov)
|
|
||||||
e_d_tov = rpriv->e_d_tov;
|
|
||||||
return msecs_to_jiffies(e_d_tov) + HZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fc_fcp_cmd_send() - Send a FCP command
|
* fc_fcp_cmd_send() - Send a FCP command
|
||||||
* @lport: The local port to send the command on
|
* @lport: The local port to send the command on
|
||||||
|
Loading…
Reference in New Issue
Block a user