scsi: core: Add counters for New Media and Power On/Reset UNIT ATTENTIONs

The purpose of the counters is to enable all ULDs attached to a device to
find out that a New Media or/and Power On/Reset Unit Attentions has/have
been set, even if another ULD catches the Unit Attention as response to a
SCSI command.

The ULDs can read the counters and see if the values have changed from the
previous check.

Signed-off-by: Kai Mäkisara <Kai.Makisara@kolumbus.fi>
Link: https://lore.kernel.org/r/20250120194925.44432-3-Kai.Makisara@kolumbus.fi
Reviewed-by: John Meneghini <jmeneghi@redhat.com>
Tested-by: John Meneghini <jmeneghi@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Kai Mäkisara
2025-01-20 21:49:23 +02:00
committed by Martin K. Petersen
parent 7081dc75df
commit a5d518cd4e
2 changed files with 15 additions and 0 deletions

View File

@@ -547,6 +547,18 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
scsi_report_sense(sdev, &sshdr);
if (sshdr.sense_key == UNIT_ATTENTION) {
/*
* Increment the counters for Power on/Reset or New Media so
* that all ULDs interested in these can see that those have
* happened, even if someone else gets the sense data.
*/
if (sshdr.asc == 0x28)
scmd->device->ua_new_media_ctr++;
else if (sshdr.asc == 0x29)
scmd->device->ua_por_ctr++;
}
if (scsi_sense_is_deferred(&sshdr))
return NEEDS_RETRY;

View File

@@ -247,6 +247,9 @@ 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 disk_events_disable_depth; /* disable depth for disk events */
DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */