[dm-devel] dm-multipath: multipathd blacklisting
Benjamin Marzinski
bmarzins at redhat.com
Tue Feb 14 23:01:14 UTC 2006
multipathd doesn't correctly blacklist devices by wwid, because the blacklist
check happens before the device information is known. This patch fixes that.
-Ben
-------------- next part --------------
diff -urpN mp-devel-clean/multipathd/cli_handlers.c mp-devel-patched/multipathd/cli_handlers.c
--- mp-devel-clean/multipathd/cli_handlers.c 2006-02-13 11:53:36.000000000 -0600
+++ mp-devel-patched/multipathd/cli_handlers.c 2006-02-14 17:37:05.000000000 -0600
@@ -274,16 +274,18 @@ cli_add_path (void * v, char ** reply, i
{
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, PATH);
+ int r;
condlog(2, "%s: add path (operator)", param);
- if (blacklist(conf->blist_devnode, param)) {
+ if (blacklist(conf->blist_devnode, param) ||
+ (r = ev_add_path(param, vecs)) == 2) {
*reply = strdup("blacklisted");
*len = strlen(*reply) + 1;
condlog(2, "%s: path blacklisted", param);
return 0;
}
- return ev_add_path(param, vecs);
+ return r;
}
int
diff -urpN mp-devel-clean/multipathd/main.c mp-devel-patched/multipathd/main.c
--- mp-devel-clean/multipathd/main.c 2006-02-13 11:53:36.000000000 -0600
+++ mp-devel-patched/multipathd/main.c 2006-02-14 17:37:18.000000000 -0600
@@ -622,9 +622,16 @@ static int
uev_add_path (char * devname, struct vectors * vecs)
{
condlog(2, "%s: add path (uevent)", devname);
- return ev_add_path(devname, vecs);
+ return (ev_add_path(devname, vecs) != 1)? 0 : 1;
}
+
+/*
+ * returns:
+ * 0: added
+ * 1: error
+ * 2: blacklisted
+ */
int
ev_add_path (char * devname, struct vectors * vecs)
{
@@ -661,7 +668,13 @@ ev_add_path (char * devname, struct vect
condlog(0, "%s: failed to get path uid", devname);
return 1; /* leave path added to pathvec */
}
-
+ if (blacklist_path(conf, pp)){
+ int i = find_slot(vecs->pathvec, (void *)pp);
+ if (i != -1)
+ vector_del_slot(vecs->pathvec, i);
+ free_path(pp);
+ return 2;
+ }
mpp = pp->mpp = find_mp_by_wwid(vecs->mpvec, pp->wwid);
rescan:
if (mpp) {
@@ -1299,9 +1312,15 @@ configure (struct vectors * vecs, int st
*/
path_discovery(vecs->pathvec, conf, DI_ALL);
- vector_foreach_slot (vecs->pathvec, pp, i)
- pp->checkint = conf->checkint;
-
+ vector_foreach_slot (vecs->pathvec, pp, i){
+ if (blacklist_path(conf, pp)){
+ vector_del_slot(vecs->pathvec, i);
+ free_path(pp);
+ i--;
+ }
+ else
+ pp->checkint = conf->checkint;
+ }
if (map_discovery(vecs))
return 1;
More information about the dm-devel
mailing list