Re: [PATCH] scsi: Add ALUA state change UA handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2015-06-11 at 13:07 +0200, Hannes Reinecke wrote:
> Log the ALUA state change unit attention correctly with
> the message log and emit an event to allow user-space
> tools to react to it.
> 
> Signed-off-by: Hannes Reinecke <hare@xxxxxxx>
> ---
>  drivers/scsi/scsi_error.c  | 4 ++++
>  drivers/scsi/scsi_lib.c    | 4 ++++
>  include/scsi/scsi_device.h | 1 +
>  3 files changed, 9 insertions(+)
> 
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index c95a4e9..ad32bc0 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -421,6 +421,10 @@ static void scsi_report_sense(struct scsi_device *sdev,
>  			evt_type = SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED;
>  			sdev_printk(KERN_WARNING, sdev,
>  				    "Mode parameters changed");
> +		} else if (sshdr->asc == 0x2a && sshdr->ascq == 0x06) {
> +			evt_type = SDEV_EVT_ALUA_STATE_CHANGE_REPORTED;
> +			sdev_printk(KERN_WARNING, sdev,
> +				    "ALUA state has changed");

Would you mind changing this to "Asymmetic access state changed",
since that is the actual text in the T10 spec?

>  		} else if (sshdr->asc == 0x2a && sshdr->ascq == 0x09) {
>  			evt_type = SDEV_EVT_CAPACITY_CHANGE_REPORTED;
>  			sdev_printk(KERN_WARNING, sdev,
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index b1a2631..2428d96 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -2698,6 +2698,9 @@ static void scsi_evt_emit(struct scsi_device *sdev, struct scsi_event *evt)
>  	case SDEV_EVT_CAPACITY_CHANGE_REPORTED:
>  		envp[idx++] = "SDEV_UA=CAPACITY_DATA_HAS_CHANGED";
>  		break;
> +	case SDEV_EVT_ALUA_STATE_CHANGE_REPORTED:
> +		envp[idx++] = "SDEV_UA=ALUA_STATE_HAS_CHANGED";

And could you change this to "ASYMMETRIC_ACCESS_STATE_HAS_CHANGED"?

> +		break;
>  	case SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED:
>  	       envp[idx++] = "SDEV_UA=THIN_PROVISIONING_SOFT_THRESHOLD_REACHED";
>  		break;
> @@ -2807,6 +2810,7 @@ struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type,
>  	case SDEV_EVT_MEDIA_CHANGE:
>  	case SDEV_EVT_INQUIRY_CHANGE_REPORTED:
>  	case SDEV_EVT_CAPACITY_CHANGE_REPORTED:
> +	case SDEV_EVT_ALUA_STATE_CHANGE_REPORTED:
>  	case SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED:
>  	case SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED:
>  	case SDEV_EVT_LUN_CHANGE_REPORTED:
> diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
> index a4c9336..5d7553f 100644
> --- a/include/scsi/scsi_device.h
> +++ b/include/scsi/scsi_device.h
> @@ -53,6 +53,7 @@ enum scsi_device_state {
>  enum scsi_device_event {
>  	SDEV_EVT_MEDIA_CHANGE	= 1,	/* media has changed */
>  	SDEV_EVT_INQUIRY_CHANGE_REPORTED,		/* 3F 03  UA reported */
> +	SDEV_EVT_ALUA_STATE_CHANGE_REPORTED,		/* 2A 06  UA reported */
>  	SDEV_EVT_CAPACITY_CHANGE_REPORTED,		/* 2A 09  UA reported */
>  	SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED,	/* 38 07  UA reported */
>  	SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED,	/* 2A 01  UA reported */

Seems like a good idea.  As I mentioned yesterday, I have a patch set
that rescans the device when the ALUA state transitions to an ACTIVE
state, if the capacity could not be obtained when the device was
previously probed.  This could be made more generalized, too.
But I don't have the HW to test it, and I'm waiting for the vendor
to get back to me.

Reviewed-by: Ewan D. Milne <emilne@xxxxxxxxxx>


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux