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

scsi: scsi_dh_alua: always use a 2 second delay before retrying RTPG

Retrying immediately after we've received a 'transitioning' sense code is
pretty much pointless, we should always use a delay before retrying.  So
ensure the default delay is applied before retrying.
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Tested-by: default avatarZhangguanghui <zhang.guanghui@h3c.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5578257c
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#define ALUA_FAILOVER_TIMEOUT 60 #define ALUA_FAILOVER_TIMEOUT 60
#define ALUA_FAILOVER_RETRIES 5 #define ALUA_FAILOVER_RETRIES 5
#define ALUA_RTPG_DELAY_MSECS 5 #define ALUA_RTPG_DELAY_MSECS 5
#define ALUA_RTPG_RETRY_DELAY 2
/* device handler flags */ /* device handler flags */
#define ALUA_OPTIMIZE_STPG 0x01 #define ALUA_OPTIMIZE_STPG 0x01
...@@ -682,7 +683,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg) ...@@ -682,7 +683,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
case SCSI_ACCESS_STATE_TRANSITIONING: case SCSI_ACCESS_STATE_TRANSITIONING:
if (time_before(jiffies, pg->expiry)) { if (time_before(jiffies, pg->expiry)) {
/* State transition, retry */ /* State transition, retry */
pg->interval = 2; pg->interval = ALUA_RTPG_RETRY_DELAY;
err = SCSI_DH_RETRY; err = SCSI_DH_RETRY;
} else { } else {
struct alua_dh_data *h; struct alua_dh_data *h;
...@@ -807,6 +808,8 @@ static void alua_rtpg_work(struct work_struct *work) ...@@ -807,6 +808,8 @@ static void alua_rtpg_work(struct work_struct *work)
spin_lock_irqsave(&pg->lock, flags); spin_lock_irqsave(&pg->lock, flags);
pg->flags &= ~ALUA_PG_RUNNING; pg->flags &= ~ALUA_PG_RUNNING;
pg->flags |= ALUA_PG_RUN_RTPG; pg->flags |= ALUA_PG_RUN_RTPG;
if (!pg->interval)
pg->interval = ALUA_RTPG_RETRY_DELAY;
spin_unlock_irqrestore(&pg->lock, flags); spin_unlock_irqrestore(&pg->lock, flags);
queue_delayed_work(kaluad_wq, &pg->rtpg_work, queue_delayed_work(kaluad_wq, &pg->rtpg_work,
pg->interval * HZ); pg->interval * HZ);
...@@ -818,6 +821,8 @@ static void alua_rtpg_work(struct work_struct *work) ...@@ -818,6 +821,8 @@ static void alua_rtpg_work(struct work_struct *work)
spin_lock_irqsave(&pg->lock, flags); spin_lock_irqsave(&pg->lock, flags);
if (err == SCSI_DH_RETRY || pg->flags & ALUA_PG_RUN_RTPG) { if (err == SCSI_DH_RETRY || pg->flags & ALUA_PG_RUN_RTPG) {
pg->flags &= ~ALUA_PG_RUNNING; pg->flags &= ~ALUA_PG_RUNNING;
if (!pg->interval && !(pg->flags & ALUA_PG_RUN_RTPG))
pg->interval = ALUA_RTPG_RETRY_DELAY;
pg->flags |= ALUA_PG_RUN_RTPG; pg->flags |= ALUA_PG_RUN_RTPG;
spin_unlock_irqrestore(&pg->lock, flags); spin_unlock_irqrestore(&pg->lock, flags);
queue_delayed_work(kaluad_wq, &pg->rtpg_work, queue_delayed_work(kaluad_wq, &pg->rtpg_work,
......
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