multipath: remove duplicates from multipath
authorBenjamin Marzinski <bmarzins@redhat.com>
Sat, 12 Jan 2013 06:04:43 +0000 (00:04 -0600)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sat, 12 Jan 2013 12:18:20 +0000 (13:18 +0100)
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
libmultipath/config.c

index f369517..49a40f9 100644 (file)
@@ -95,50 +95,6 @@ set_ble_device (vector blist, char * vendor, char * product, int origin)
        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 (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)
 {
@@ -193,6 +149,53 @@ _blacklist_device (vector blist, char * vendor, char * product)
        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)                                           \
                condlog(3, "%s: (%s:%s) %s", dev, vendor, product, (M)); \
index 5b26298..50863b2 100644 (file)
 static int
 hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2)
 {
-       if (hwe1->vendor && hwe2->vendor && strcmp(hwe1->vendor, hwe2->vendor))
+       if ((hwe2->vendor && !hwe1->vendor) ||
+           (hwe1->vendor && (!hwe2->vendor ||
+                             strcmp(hwe1->vendor, hwe2->vendor))))
                return 1;
 
-       if (hwe1->product && hwe2->product && strcmp(hwe1->product, hwe2->product))
+       if ((hwe2->product && !hwe1->product) ||
+           (hwe1->product && (!hwe2->product ||
+                             strcmp(hwe1->product, hwe2->product))))
                return 1;
 
-       if (hwe1->revision && hwe2->revision && strcmp(hwe1->revision, hwe2->revision))
+       if ((hwe2->revision && !hwe1->revision) ||
+           (hwe1->revision && (!hwe2->revision ||
+                             strcmp(hwe1->revision, hwe2->revision))))
                return 1;
 
        return 0;
@@ -416,6 +422,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;
+                               break;
+                       }
                }
        }
        return 0;