Commit d54c676d authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen
Browse files

scsi: core: Fix the unit attention counter implementation



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: a5d518cd ("scsi: core: Add counters for New Media and Power On/Reset UNIT ATTENTIONs")
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Reviewed-by: default avatarEwan D. Milne <emilne@redhat.com>
Link: https://patch.msgid.link/20251014220244.3689508-1-bvanassche@acm.org


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 35bc3c8e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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))
+4 −6
Original line number Diff line number Diff line
@@ -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) "*")