]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: core: Fix the unit attention counter implementation
authorBart Van Assche <bvanassche@acm.org>
Tue, 14 Oct 2025 22:02:43 +0000 (15:02 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 22 Oct 2025 01:09:36 +0000 (21:09 -0400)
scsi_decide_disposition() may call scsi_check_sense().
scsi_decide_disposition() calls are not serialized. Hence, counter
updates by scsi_check_sense() must be serialized. Hence this patch that
makes the counters updated by scsi_check_sense() atomic.

Cc: Kai Mäkisara <Kai.Makisara@kolumbus.fi>
Fixes: a5d518cd4e3e ("scsi: core: Add counters for New Media and Power On/Reset UNIT ATTENTIONs")
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Link: https://patch.msgid.link/20251014220244.3689508-1-bvanassche@acm.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_error.c
include/scsi/scsi_device.h

index 746ff6a1f309a33bc50e44cc8cea198f7b734fea..1c13812a3f03583f0e392ac86c558bb540ea5c6c 100644 (file)
@@ -554,9 +554,9 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
                 * happened, even if someone else gets the sense data.
                 */
                if (sshdr.asc == 0x28)
-                       scmd->device->ua_new_media_ctr++;
+                       atomic_inc(&sdev->ua_new_media_ctr);
                else if (sshdr.asc == 0x29)
-                       scmd->device->ua_por_ctr++;
+                       atomic_inc(&sdev->ua_por_ctr);
        }
 
        if (scsi_sense_is_deferred(&sshdr))
index 6d6500148c4b746c3b364bc8ed4adce649c12233..993008cdea65f880564ae43ceeb49cfb4f4d9b76 100644 (file)
@@ -252,8 +252,8 @@ struct scsi_device {
        unsigned int queue_stopped;     /* request queue is quiesced */
        bool offline_already;           /* Device offline message logged */
 
-       unsigned int ua_new_media_ctr;  /* Counter for New Media UNIT ATTENTIONs */
-       unsigned int ua_por_ctr;        /* Counter for Power On / Reset UAs */
+       atomic_t ua_new_media_ctr;      /* Counter for New Media UNIT ATTENTIONs */
+       atomic_t ua_por_ctr;            /* Counter for Power On / Reset UAs */
 
        atomic_t disk_events_disable_depth; /* disable depth for disk events */
 
@@ -693,10 +693,8 @@ static inline int scsi_device_busy(struct scsi_device *sdev)
 }
 
 /* Macros to access the UNIT ATTENTION counters */
-#define scsi_get_ua_new_media_ctr(sdev) \
-       ((const unsigned int)(sdev->ua_new_media_ctr))
-#define scsi_get_ua_por_ctr(sdev) \
-       ((const unsigned int)(sdev->ua_por_ctr))
+#define scsi_get_ua_new_media_ctr(sdev)        atomic_read(&sdev->ua_new_media_ctr)
+#define scsi_get_ua_por_ctr(sdev)      atomic_read(&sdev->ua_por_ctr)
 
 #define MODULE_ALIAS_SCSI_DEVICE(type) \
        MODULE_ALIAS("scsi:t-" __stringify(type) "*")