[libmultipath] blacklist exceptions issues
authorChristophe Varoqui <christophe.varoqui@free.fr>
Sat, 10 Nov 2007 01:22:26 +0000 (02:22 +0100)
committerChristophe Varoqui <christophe.varoqui@free.fr>
Sat, 10 Nov 2007 01:22:26 +0000 (02:22 +0100)
the current situation is fishy. Ben pointed a true braino in the
code I introduced when restructuring the blacklist lib :

in _filter_path(), I test each _filter_*() for r!=0 , where I intented
to check for r>0.

r==0 implements  : "exit on first blacklist or exception match".
 r>0 implements  : "exit on first blacklist match".

With this later behaviour I can set things like that for max safety and
efficiency :

blacklist {
        devnode .*
        device {
                vendor .*
                product .*
        }
        wwid .*
}
blacklist_exceptions {
        devnode sd.*
        device {
                vendor IET.*
                product .*
        }
        wwid "1646561646265.*"
}

or pragmatically :

blacklist {
        devnode .*
        wwid .*
}
blacklist_exceptions {
        devnode sd.*
        wwid "1646561646265.*"
}

Working that out, I also realized there may be another small
misbehaviour :

First, a little background on path discovery operations :

1) /sys/block parsing shows devnode names
2) devnode names examination shows device identification strings
3) these strings help us choose a getuid helper, which finally shows
wwids

Meaning we want the devnode blacklisting to prevail over device and
wwid, in case we know we don't have device strings available (loop, dm-,
raw, ...)

Similarily, we want the device blacklist to prevail over wwid, in case
we know we don't have getuid callout available. I have no example for
this case though, so it shouldn't be as important as the previous one.

Problem is we challenge _filter_device() after _filter_wwid().
This can be easily shufled around.

libmultipath/blacklist.c
multipathd/main.c

index 9a058f7..6297516 100644 (file)
@@ -297,16 +297,14 @@ _filter_path (struct config * conf, struct path * pp)
        int r;
 
        r = _filter_devnode(conf->blist_devnode, conf->elist_devnode,pp->dev);
-       if (r)
-               return r;
-       r = _filter_wwid(conf->blist_wwid, conf->elist_wwid, pp->wwid);
-       if (r)
+       if (r > 0)
                return r;
        r = _filter_device(conf->blist_device, conf->elist_device,
                           pp->vendor_id, pp->product_id);
-       if (r)
+       if (r > 0)
                return r;
-       return 0;
+       r = _filter_wwid(conf->blist_wwid, conf->elist_wwid, pp->wwid);
+       return r;
 }
 
 int
index f887ad0..e65834a 100644 (file)
@@ -368,7 +368,7 @@ ev_add_path (char * devname, struct vectors * vecs)
                condlog(0, "%s: failed to get path uid", devname);
                return 1; /* leave path added to pathvec */
        }
-       if (filter_path(conf, pp)){
+       if (filter_path(conf, pp) > 0){
                int i = find_slot(vecs->pathvec, (void *)pp);
                if (i != -1)
                        vector_del_slot(vecs->pathvec, i);
@@ -1062,7 +1062,7 @@ configure (struct vectors * vecs, int start_waiters)
        path_discovery(vecs->pathvec, conf, DI_ALL);
 
        vector_foreach_slot (vecs->pathvec, pp, i){
-               if (filter_path(conf, pp)){
+               if (filter_path(conf, pp) > 0){
                        vector_del_slot(vecs->pathvec, i);
                        free_path(pp);
                        i--;