Commit ad3120cf authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen

scsi: libfc: reset timeout on queue full

When we're receiving a timeout we should be checking for queue
full status; if there are still some packets pending we should
be resetting the counter to ensure we're not missing out any
packets which are still queued.
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Acked-by: default avatarJohannes Thumshirn <jth@kernel.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 53db8fa8
...@@ -254,8 +254,10 @@ static inline void fc_fcp_unlock_pkt(struct fc_fcp_pkt *fsp) ...@@ -254,8 +254,10 @@ static inline void fc_fcp_unlock_pkt(struct fc_fcp_pkt *fsp)
*/ */
static void fc_fcp_timer_set(struct fc_fcp_pkt *fsp, unsigned long delay) static void fc_fcp_timer_set(struct fc_fcp_pkt *fsp, unsigned long delay)
{ {
if (!(fsp->state & FC_SRB_COMPL)) if (!(fsp->state & FC_SRB_COMPL)) {
mod_timer(&fsp->timer, jiffies + delay); mod_timer(&fsp->timer, jiffies + delay);
fsp->timer_delay = delay;
}
} }
static void fc_fcp_abort_done(struct fc_fcp_pkt *fsp) static void fc_fcp_abort_done(struct fc_fcp_pkt *fsp)
...@@ -932,6 +934,11 @@ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp) ...@@ -932,6 +934,11 @@ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
* Wait a at least one jiffy to see if it is delivered. * Wait a at least one jiffy to see if it is delivered.
* If this expires without data, we may do SRR. * If this expires without data, we may do SRR.
*/ */
if (fsp->lp->qfull) {
FC_FCP_DBG(fsp, "tgt %6.6x queue busy retry\n",
fsp->rport->port_id);
return;
}
FC_FCP_DBG(fsp, "tgt %6.6x xfer len %zx data underrun " FC_FCP_DBG(fsp, "tgt %6.6x xfer len %zx data underrun "
"len %x, data len %x\n", "len %x, data len %x\n",
fsp->rport->port_id, fsp->rport->port_id,
...@@ -1434,8 +1441,15 @@ static void fc_fcp_timeout(unsigned long data) ...@@ -1434,8 +1441,15 @@ static void fc_fcp_timeout(unsigned long data)
if (fsp->cdb_cmd.fc_tm_flags) if (fsp->cdb_cmd.fc_tm_flags)
goto unlock; goto unlock;
FC_FCP_DBG(fsp, "fcp timeout, flags %x state %x\n", if (fsp->lp->qfull) {
rpriv->flags, fsp->state); FC_FCP_DBG(fsp, "fcp timeout, resetting timer delay %d\n",
fsp->timer_delay);
setup_timer(&fsp->timer, fc_fcp_timeout, (unsigned long)fsp);
fc_fcp_timer_set(fsp, fsp->timer_delay);
goto unlock;
}
FC_FCP_DBG(fsp, "fcp timeout, delay %d flags %x state %x\n",
fsp->timer_delay, rpriv->flags, fsp->state);
fsp->state |= FC_SRB_FCP_PROCESSING_TMO; fsp->state |= FC_SRB_FCP_PROCESSING_TMO;
if (rpriv->flags & FC_RP_FLAGS_REC_SUPPORTED) if (rpriv->flags & FC_RP_FLAGS_REC_SUPPORTED)
......
...@@ -356,6 +356,7 @@ struct fc_fcp_pkt { ...@@ -356,6 +356,7 @@ struct fc_fcp_pkt {
/* Timeout/error related information */ /* Timeout/error related information */
struct timer_list timer; struct timer_list timer;
int wait_for_comp; int wait_for_comp;
int timer_delay;
u32 recov_retry; u32 recov_retry;
struct fc_seq *recov_seq; struct fc_seq *recov_seq;
struct completion tm_done; struct completion tm_done;
......
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