[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)
commitfa75d374cad8fa966dcf17dc18eee4ef5e70ff33
treef69800d8ea310727dc85f04770f4afc64fad8ece
parentea24bb081efe2564e680d501e4e4dda5daf9b43d
[libmultipath] blacklist exceptions issues

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