diff -u multipath-tools-0.4.8/debian/changelog multipath-tools-0.4.8/debian/changelog --- multipath-tools-0.4.8/debian/changelog +++ multipath-tools-0.4.8/debian/changelog @@ -1,3 +1,16 @@ +multipath-tools (0.4.8-14ubuntu5) lucid; urgency=low + + * Fixes some return logic issues in the blacklist.c:_filter_path function + where using blacklist and blacklist_exceptions would cause multipathd to + improperly filter paths. (LP: #789229) + - The patch was created by Christophe Varoqui in 2007. + + http://www.redhat.com/archives/dm-devel/2007-November/msg00054.html + + 0013-libmultipath-filter_path-fix_blacklist_filter_exit.patch + - [serge-hallyn] swap in the whole upstream git commit and call it + 0013-blacklist_exception_issues.patch. + + -- Craig Magina Wed, 17 Aug 2011 18:29:31 -0400 + multipath-tools (0.4.8-14ubuntu4) lucid; urgency=low * debian/control: Move libreadline5-dev build dependency to libreadline-dev. diff -u multipath-tools-0.4.8/debian/patches/series multipath-tools-0.4.8/debian/patches/series --- multipath-tools-0.4.8/debian/patches/series +++ multipath-tools-0.4.8/debian/patches/series @@ -14,0 +15 @@ +0013-blacklist_exception_issues.patch only in patch2: unchanged: --- multipath-tools-0.4.8.orig/debian/patches/0013-blacklist_exception_issues.patch +++ multipath-tools-0.4.8/debian/patches/0013-blacklist_exception_issues.patch @@ -0,0 +1,113 @@ +From fa75d374cad8fa966dcf17dc18eee4ef5e70ff33 Mon Sep 17 00:00:00 2001 +From: Christophe Varoqui +Date: Sat, 10 Nov 2007 02:22:26 +0100 +Subject: [PATCH] [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 | 10 ++++------ + multipathd/main.c | 4 ++-- + 2 files changed, 6 insertions(+), 8 deletions(-) + +--- a/libmultipath/blacklist.c ++++ b/libmultipath/blacklist.c +@@ -303,16 +303,14 @@ + 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 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -368,7 +368,7 @@ + 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); +@@ -1054,7 +1054,7 @@ + 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--;