On 3/17/26 13:06, John Garry wrote:
Add a function to run stpg and handle error codes - it does equivalent
handling as in alua_rtpg_work() from scsi_dh_alua.c

Signed-off-by: John Garry <[email protected]>
---
  drivers/scsi/scsi_alua.c | 20 +++++++++++++++++++-
  include/scsi/scsi_alua.h |  5 +++++
  2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_alua.c b/drivers/scsi/scsi_alua.c
index e4cb43ba645fa..4e20a537a4ad6 100644
--- a/drivers/scsi/scsi_alua.c
+++ b/drivers/scsi/scsi_alua.c
@@ -428,7 +428,6 @@ EXPORT_SYMBOL_GPL(scsi_alua_rtpg_run);
   * a re-evaluation of the target group state or SCSI_DH_OK
   * if no further action needs to be taken.
   */
-__maybe_unused
  static int scsi_alua_stpg(struct scsi_device *sdev, bool optimize)
  {
        struct alua_data *alua = sdev->alua;
@@ -480,6 +479,25 @@ static int scsi_alua_stpg(struct scsi_device *sdev, bool 
optimize)
        return -EAGAIN;//SCSI_DH_RETRY;
  }
+int scsi_alua_stpg_run(struct scsi_device *sdev, bool optimize)
+{
+       struct alua_data *alua = sdev->alua;
+       unsigned long flags;
+       int err;
+
+       err = scsi_alua_stpg(sdev, optimize);
+       spin_lock_irqsave(&alua->lock, flags);
+       if (err == EAGAIN) {
+               alua->interval = 0;
+               spin_unlock_irqrestore(&alua->lock, flags);
+               return -EAGAIN;
+       }
+       spin_unlock_irqrestore(&alua->lock, flags);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(scsi_alua_stpg_run);
+
  int scsi_alua_sdev_init(struct scsi_device *sdev)
  {
        int rel_port, ret, tpgs;
diff --git a/include/scsi/scsi_alua.h b/include/scsi/scsi_alua.h
index 1eb5481f40bd4..6e4f262bbfbc0 100644
--- a/include/scsi/scsi_alua.h
+++ b/include/scsi/scsi_alua.h
@@ -31,6 +31,7 @@ int scsi_alua_sdev_init(struct scsi_device *sdev);
  void scsi_alua_sdev_exit(struct scsi_device *sdev);
int scsi_alua_rtpg_run(struct scsi_device *sdev);
+int scsi_alua_stpg_run(struct scsi_device *sdev, bool optimize);
int scsi_alua_init(void);
  void scsi_exit_alua(void);
@@ -40,6 +41,10 @@ static inline int scsi_alua_rtpg_run(struct scsi_device 
*sdev)
  {
        return 0;
  }
+static inline int scsi_alua_stpg_run(struct scsi_device *sdev, bool optimize)
+{
+       return 0;
+}
  static inline int scsi_alua_sdev_init(struct scsi_device *sdev)
  {
        return 0;

No. STPG handling should be done in scsi_dh_alua _only_. We really
should not attempt this in the scsi core.

Cheers,

Hannes
--
Dr. Hannes Reinecke                  Kernel Storage Architect
[email protected]                                +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich

Reply via email to