Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Hannes Reinecke <hare@suse.com>
Tested-by: Zhangguanghui <zhang.guanghui@h3c.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Hannes Reinecke and committed by
Martin K. Petersen
20122994 5578257c

+6 -1
+6 -1
drivers/scsi/device_handler/scsi_dh_alua.c
··· 40 40 #define ALUA_FAILOVER_TIMEOUT 60 41 41 #define ALUA_FAILOVER_RETRIES 5 42 42 #define ALUA_RTPG_DELAY_MSECS 5 43 + #define ALUA_RTPG_RETRY_DELAY 2 43 44 44 45 /* device handler flags */ 45 46 #define ALUA_OPTIMIZE_STPG 0x01 ··· 683 682 case SCSI_ACCESS_STATE_TRANSITIONING: 684 683 if (time_before(jiffies, pg->expiry)) { 685 684 /* State transition, retry */ 686 - pg->interval = 2; 685 + pg->interval = ALUA_RTPG_RETRY_DELAY; 687 686 err = SCSI_DH_RETRY; 688 687 } else { 689 688 struct alua_dh_data *h; ··· 808 807 spin_lock_irqsave(&pg->lock, flags); 809 808 pg->flags &= ~ALUA_PG_RUNNING; 810 809 pg->flags |= ALUA_PG_RUN_RTPG; 810 + if (!pg->interval) 811 + pg->interval = ALUA_RTPG_RETRY_DELAY; 811 812 spin_unlock_irqrestore(&pg->lock, flags); 812 813 queue_delayed_work(kaluad_wq, &pg->rtpg_work, 813 814 pg->interval * HZ); ··· 821 818 spin_lock_irqsave(&pg->lock, flags); 822 819 if (err == SCSI_DH_RETRY || pg->flags & ALUA_PG_RUN_RTPG) { 823 820 pg->flags &= ~ALUA_PG_RUNNING; 821 + if (!pg->interval && !(pg->flags & ALUA_PG_RUN_RTPG)) 822 + pg->interval = ALUA_RTPG_RETRY_DELAY; 824 823 pg->flags |= ALUA_PG_RUN_RTPG; 825 824 spin_unlock_irqrestore(&pg->lock, flags); 826 825 queue_delayed_work(kaluad_wq, &pg->rtpg_work,