Linux Device Mapper development
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: dm-devel@redhat.com
Subject: Re: [PATCH v2] multipath: remove duplicates from multipath configuration
Date: Fri, 11 Jan 2013 08:15:35 +0100	[thread overview]
Message-ID: <50EFBC17.1070401@suse.de> (raw)
In-Reply-To: <20130110201022.GR19059@ether.msp.redhat.com>

On 01/10/2013 09:10 PM, Benjamin Marzinski wrote:
> Added code to remove duplcate entries in the devices section, and the
> blacklist devices section of the builtin configuration table. The only
> change to setup_default_blist is the addition of _blacklist_device()
> to check if the device's bl_product entry already exists.
>
> Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
> ---
>   libmultipath/blacklist.c |   91 ++++++++++++++++++++++++-----------------------
>   libmultipath/config.c    |   16 ++++++--
>   2 files changed, 60 insertions(+), 47 deletions(-)
>
> Index: multipath-tools-120821/libmultipath/blacklist.c
> ===================================================================
> --- multipath-tools-120821.orig/libmultipath/blacklist.c
> +++ multipath-tools-120821/libmultipath/blacklist.c
> @@ -96,50 +96,6 @@ set_ble_device (vector blist, char * ven
>   }
>
>   int
> -setup_default_blist (struct config * conf)
> -{
> -	struct blentry * ble;
> -	struct hwentry *hwe;
> -	char * str;
> -	int i;
> -
> -	str = STRDUP("^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*");
> -	if (!str)
> -		return 1;
> -	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
> -		return 1;
> -
> -	str = STRDUP("^hd[a-z]");
> -	if (!str)
> -		return 1;
> -	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
> -		return 1;
> -
> -	str = STRDUP("^dcssblk[0-9]*");
> -	if (!str)
> -		return 1;
> -	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
> -		return 1;
> -
> -	vector_foreach_slot (conf->hwtable, hwe, i) {
> -		if (hwe->bl_product) {
> -			if (alloc_ble_device(conf->blist_device))
> -				return 1;
> -			ble = VECTOR_SLOT(conf->blist_device,
> -					  VECTOR_SIZE(conf->blist_device) -1);
> -			if (set_ble_device(conf->blist_device,
> -					   STRDUP(hwe->vendor),
> -					   STRDUP(hwe->bl_product),
> -					   ORIGIN_DEFAULT)) {
> -				FREE(ble);
> -				return 1;
> -			}
> -		}
> -	}
> -	return 0;
> -}
> -
> -int
>   _blacklist_exceptions (vector elist, char * str)
>   {
>   	int i;
> @@ -192,6 +148,53 @@ _blacklist_device (vector blist, char *
>   	}
>   	return 0;
>   }
> +
> +int
> +setup_default_blist (struct config * conf)
> +{
> +	struct blentry * ble;
> +	struct hwentry *hwe;
> +	char * str;
> +	int i;
> +
> +	str = STRDUP("^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*");
> +	if (!str)
> +		return 1;
> +	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
> +		return 1;
> +
> +	str = STRDUP("^hd[a-z]");
> +	if (!str)
> +		return 1;
> +	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
> +		return 1;
> +
> +	str = STRDUP("^dcssblk[0-9]*");
> +	if (!str)
> +		return 1;
> +	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
> +		return 1;
> +
> +	vector_foreach_slot (conf->hwtable, hwe, i) {
> +		if (hwe->bl_product) {
> +			if (_blacklist_device(conf->blist_device, hwe->vendor,
> +					      hwe->bl_product))
> +				continue;
> +			if (alloc_ble_device(conf->blist_device))
> +				return 1;
> +			ble = VECTOR_SLOT(conf->blist_device,
> +					  VECTOR_SIZE(conf->blist_device) -1);
> +			if (set_ble_device(conf->blist_device,
> +					   STRDUP(hwe->vendor),
> +					   STRDUP(hwe->bl_product),
> +					   ORIGIN_DEFAULT)) {
> +				FREE(ble);
> +				return 1;
> +			}
> +		}
> +	}
> +	return 0;
> +}
>
>   #define LOG_BLIST(M) \
>   	if (vendor && product)						 \
> Index: multipath-tools-120821/libmultipath/config.c
> ===================================================================
> --- multipath-tools-120821.orig/libmultipath/config.c
> +++ multipath-tools-120821/libmultipath/config.c
> @@ -25,13 +25,16 @@
>   static int
>   hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2)
>   {
> -	if (hwe1->vendor && hwe2->vendor && strcmp(hwe1->vendor, hwe2->vendor))
> +	if ((!!(hwe1->vendor) != !!(hwe2->vendor)) ||
> +	    (hwe1->vendor && strcmp(hwe1->vendor, hwe2->vendor)))
>   		return 1;
>
> -	if (hwe1->product && hwe2->product && strcmp(hwe1->product, hwe2->product))
> +	if ((!!(hwe1->product) != !!(hwe2->product)) ||
> +	    (hwe1->product && strcmp(hwe1->product, hwe2->product)))
>   		return 1;
>
> -	if (hwe1->revision && hwe2->revision && strcmp(hwe1->revision, hwe2->revision))
> +	if ((!!(hwe1->revision) != !!(hwe2->revision)) ||
> +	    (hwe1->revision && strcmp(hwe1->revision, hwe2->revision)))
>   		return 1;
>
>   	return 0;
I hate the '!!' constructs.

> @@ -416,6 +419,13 @@ factorize_hwtable (vector hw, int n)
>   				continue;
>   			/* dup */
>   			merge_hwe(hwe2, hwe1);
> +			if (hwe_strmatch(hwe2, hwe1) == 0) {
> +				vector_del_slot(hw, i);
> +				free_hwe(hwe1);
> +				n -= 1;
> +				i -= 1;
> +				j -= 1;
> +			}
>   		}
>   	}
>   	return 0;
>
Is the 'hwe_strmatch' required here?
Also I'm not sure if just decrementing the indices is the correct
way of doing things; I had a version which just restarted
the outer loop if we encountered a duplicate.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)

  reply	other threads:[~2013-01-11  7:15 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-10 20:10 [PATCH v2] multipath: remove duplicates from multipath configuration Benjamin Marzinski
2013-01-11  7:15 ` Hannes Reinecke [this message]
2013-01-11 17:52   ` Benjamin Marzinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50EFBC17.1070401@suse.de \
    --to=hare@suse.de \
    --cc=dm-devel@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox