[dm-devel] [PATCH v2] multipath: remove duplicates from multipath configuration
Hannes Reinecke
hare at suse.de
Fri Jan 11 07:15:35 UTC 2013
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 at 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 at 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)
More information about the dm-devel
mailing list