[dm-devel] [PATCH 1/1] libmultipath/propsel: Do not select sysfs prioritizer for RDAC arrays

Schremmer, Steven Steve.Schremmer at netapp.com
Fri Apr 14 16:00:30 UTC 2017


I know it just got merged, but

Reviewed-by: Steve Schremmer <steve.schremmer at netapp.com>

> -----Original Message-----
> From: dm-devel-bounces at redhat.com [mailto:dm-devel-bounces at redhat.com] On Behalf Of Martin Wilck
> Sent: Thursday, April 13, 2017 10:40 AM
> To: Christophe Varoqui <christophe.varoqui at opensvc.com>
> Cc: Martin Wilck <mwilck at suse.de>; dm-devel at redhat.com; Xose Vazquez Perez <xose.vazquez at gmail.com>
> Subject: [dm-devel] [PATCH 1/1] libmultipath/propsel: Do not select sysfs prioritizer for RDAC arrays
> 
> From: Hannes Reinecke <hare at suse.de>
> 
> Recent RDAC (NetApp E-Series) firmware implemented an internal load
> balancer and switched to implicit ALUA.
> Unfortunately the load balancer relies on periodic REPORT TARGET PORT
> GROUPS from the host, so we cannot use the sysfs prioritizer here.
> 
> References: bsc#1004858
> 
> Signed-off-by: Hannes Reinecke <hare at suse.com>
> ---
>  libmultipath/discovery.c |  2 +-
>  libmultipath/discovery.h |  1 +
>  libmultipath/propsel.c   | 24 ++++++++++++++++++++++--
>  3 files changed, 24 insertions(+), 3 deletions(-)
> 
> diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
> index 8c512545..663c8eaa 100644
> --- a/libmultipath/discovery.c
> +++ b/libmultipath/discovery.c
> @@ -1092,7 +1092,7 @@ get_vpd_sysfs (struct udev_device *parent, int pg, char * str, int maxlen)
>  	return len;
>  }
> 
> -static int
> +int
>  get_vpd_sgio (int fd, int pg, char * str, int maxlen)
>  {
>  	int len, buff_len;
> diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
> index 0563bfd9..51c23d6f 100644
> --- a/libmultipath/discovery.h
> +++ b/libmultipath/discovery.h
> @@ -35,6 +35,7 @@ int path_discovery (vector pathvec, int flag);
>  int do_tur (char *);
>  int path_offline (struct path *);
>  int get_state (struct path * pp, struct config * conf, int daemon);
> +int get_vpd_sgio (int fd, int pg, char * str, int maxlen);
>  int pathinfo (struct path * pp, struct config * conf, int mask);
>  int alloc_path_with_pathinfo (struct config *conf, struct udev_device *udevice,
>  			      char *wwid, int flag, struct path **pp_ptr);
> diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
> index dd10ceba..6dd8cb96 100644
> --- a/libmultipath/propsel.c
> +++ b/libmultipath/propsel.c
> @@ -370,6 +370,24 @@ out:
>  	return 0;
>  }
> 
> +/*
> + * Current RDAC (NetApp E-Series) firmware relies
> + * on periodic REPORT TARGET PORT GROUPS for
> + * internal load balancing.
> + * Using the sysfs priority checker defeats this purpose.
> + */
> +static int
> +check_rdac(struct path * pp)
> +{
> +	int len;
> +	char buff[44];
> +
> +	len = get_vpd_sgio(pp->fd, 0xC9, buff, 44);
> +	if (len <= 0)
> +		return 0;
> +	return !(memcmp(buff + 4, "vac1", 4));
> +}
> +
>  void
>  detect_prio(struct config *conf, struct path * pp)
>  {
> @@ -379,8 +397,10 @@ detect_prio(struct config *conf, struct path * pp)
> 
>  	if (pp->tpgs <= 0)
>  		return;
> -	if (sysfs_get_asymmetric_access_state(pp, buff, 512) >= 0)
> -		default_prio = PRIO_SYSFS;
> +	if (pp->tpgs == 2 && !check_rdac(pp)) {
> +		if (sysfs_get_asymmetric_access_state(pp, buff, 512) >= 0)
> +			default_prio = PRIO_SYSFS;
> +	}
>  	prio_get(conf->multipath_dir, p, default_prio, DEFAULT_PRIO_ARGS);
>  }
> 
> --
> 2.12.2
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list