<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:\5B8B\4F53;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:\5B8B\4F53;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@\5B8B\4F53";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"\6279\6CE8\6846\6587\672C Char";
        margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:9.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.Char
        {mso-style-name:"\6279\6CE8\6846\6587\672C Char";
        mso-style-priority:99;
        mso-style-link:\6279\6CE8\6846\6587\672C;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="blue" vlink="purple" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">It is inconvenient to add blacklist exception to conf without restart multipath service or perform reconfigure command.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Suffering storage path failure, either performing reconfigure or restarting multipathd daemon will flush the map with path failure.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">With this patch, blacklist exception will be added dynamically without restarting multipathd daemon, hence, no map will be flushed.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">From: gechangwei <ge.changwei@h3c.com><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Date: Tue, 17 May 2016 14:13:25 +0800<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Subject: [PATCH] Dynamic blacklist exception addition<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Signed-off-by: gechangwei <ge.changwei@h3c.com><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">---<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/libmultipath/structs.c    |  20 +++++<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/libmultipath/structs.h    |   1 +<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/multipathd/cli.c          |   6 ++<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/multipathd/cli.h          |   9 +-<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/multipathd/cli_handlers.c | 105 ++++++++++++++++++++++++<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/multipathd/cli_handlers.h |   4 +<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">multipath-tools-0.5.0/multipathd/main.c         |   3 +<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">7 files changed, 147 insertions(+), 1 deletion(-)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/libmultipath/structs.c b/multipath-tools-0.5.0/libmultipath/structs.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 0538327..2750ef9 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/libmultipath/structs.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/libmultipath/structs.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -424,6 +424,26 @@ find_path_by_devt (vector pathvec, char * dev_t)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       return NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+struct blentry *<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+find_wwid_in_elist (vector wwid_vector, char * wwid)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       int i;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       struct blentry *ele = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if (!wwid_vector)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                condlog(0, "wwid vector is NULL while finding wwid");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                return NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       vector_foreach_slot (wwid_vector, ele, i)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                if (!strcmp(ele->str, wwid))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                          return ele;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       condlog(3, "not found in wwid vecotr");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       return NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">extern int<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">pathcountgr (struct pathgroup * pgp, int state)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/libmultipath/structs.h b/multipath-tools-0.5.0/libmultipath/structs.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index ab7dc25..75a39cd 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/libmultipath/structs.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/libmultipath/structs.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -332,6 +332,7 @@ struct multipath * find_mp_by_minor (vector mp, int minor);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">struct path * find_path_by_devt (vector pathvec, char * devt);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">struct path * find_path_by_dev (vector pathvec, char * dev);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">struct path * first_path (struct multipath * mpp);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+struct blentry * find_wwid_in_elist (vector wwid_vector, char * wwid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> int pathcountgr (struct pathgroup *, int);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int pathcount (struct multipath *, int);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/multipathd/cli.c b/multipath-tools-0.5.0/multipathd/cli.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 6a5c6db..0c2e026 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/multipathd/cli.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/multipathd/cli.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -188,6 +188,9 @@ load_keys (void)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       r += add_key(keys, "getprstatus", GETPRSTATUS, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       r += add_key(keys, "setprstatus", SETPRSTATUS, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       r += add_key(keys, "unsetprstatus", UNSETPRSTATUS, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       r += add_key(keys, "elist", ELIST, 1);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       r += add_key(keys, "discover", DISCOVER, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       r += add_key(keys, "newpath", NEWPATH, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       r += add_key(keys, "format", FMT, 1);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        if (r) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -504,6 +507,9 @@ cli_init (void) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       add_handler(UNSETPRSTATUS+MAP, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       add_handler(FORCEQ+DAEMON, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       add_handler(RESTOREQ+DAEMON, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       add_handler(ADD+ELIST, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       add_handler(DEL+ELIST, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       add_handler(DISCOVER+NEWPATH, NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        return 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/multipathd/cli.h b/multipath-tools-0.5.0/multipathd/cli.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index f6d2726..c410ed4 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/multipathd/cli.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/multipathd/cli.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -33,6 +33,10 @@ enum {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       __GETPRSTATUS,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       __SETPRSTATUS,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       __UNSETPRSTATUS,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       __ELIST,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       __DISCOVER,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       __NEWPATH,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       __MAPPATH,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       __FMT,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">};<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -71,7 +75,10 @@ enum {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#define GETPRSTATUS   (1UL << __GETPRSTATUS)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#define SETPRSTATUS    (1UL << __SETPRSTATUS)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">#define UNSETPRSTATUS       (1UL << __UNSETPRSTATUS)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-#define FMT             (1UL << __FMT)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define ELIST       (1UL << __ELIST)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define DISCOVER    (1UL << __DISCOVER)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define NEWPATH     (1UL << __NEWPATH)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+#define FMT                (1UL << __FMT)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> #define INITIAL_REPLY_LEN 1200<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/multipathd/cli_handlers.c b/multipath-tools-0.5.0/multipathd/cli_handlers.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 3d39acf..4b2db06 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/multipathd/cli_handlers.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/multipathd/cli_handlers.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -517,6 +517,111 @@ cli_del_path (void * v, char ** reply, int * len, void * data)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> int<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+cli_add_elist(void * v, char ** reply, int * len, void * data)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       char *param         = get_keyparam(v, ELIST);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       struct blentry *ele = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       char *elist_wwid    = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       condlog(2, "%s: add elist (operator)", param);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if(find_wwid_in_elist(conf->elist_wwid, param))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                condlog(0, "elist already contains wwid(%s)", param);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                goto out;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       elist_wwid = MALLOC(WWID_SIZE);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if (!elist_wwid)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                condlog(0, "malloc temporary wwid space failed.");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                goto out;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       strncpy(elist_wwid, param, WWID_SIZE);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       elist_wwid[WWID_SIZE - 1] = '\0';<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       ele = MALLOC(sizeof(struct blentry));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if (!ele)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                condlog(0, "malloc black list exception entry failed.");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                goto out;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if (regcomp(&ele->regex, param, REG_EXTENDED|REG_NOSUB))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                goto out;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       ele->origin = ORIGIN_CONFIG;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       ele->str    = elist_wwid;       <o:p>
</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if (!vector_alloc_slot(conf->elist_wwid))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                condlog(0, "malloc black list exception entry failed.");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                goto out;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       vector_set_slot(conf->elist_wwid, ele);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       return 0;;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+out:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       *len = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       FREE(elist_wwid);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       FREE(ele);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       return 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+int<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+cli_del_elist(void * v, char ** reply, int * len, void * data)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       int i;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       struct blentry *ele = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       char *param = get_keyparam(v, ELIST);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       *len = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       condlog(2, "%s: del elist (operator)", param);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       vector_foreach_slot (conf->elist_wwid, ele, i)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                if (ele->str && !strcmp(ele->str, param))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                          vector_del_slot(conf->elist_wwid, i);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                          FREE(ele->str);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                          FREE(ele);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                          return 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       condlog(0, "specific wwid(%s) is not found!", param);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       return 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+int<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+cli_discover_new_path(void * v, char ** reply, int * len, void * data)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       int ret = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       struct vectors *vecs = (struct vectors *)data;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       vector pathvec = vecs->pathvec;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       condlog(2, "discover new paths, this could update current paths' state (operator)");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       if (path_discovery(pathvec, conf, DI_ALL) < 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                condlog(0, "discover new paths failed.");<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                ret = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       struct path *pp;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       int i;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       vector_foreach_slot(pathvec, pp, i)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                if(0 == pp->checkint)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+                          pp->checkint = conf->checkint;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       *len = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       return ret;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+int<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">cli_add_map (void * v, char ** reply, int * len, void * data)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       struct vectors * vecs = (struct vectors *)data;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/multipathd/cli_handlers.h b/multipath-tools-0.5.0/multipathd/cli_handlers.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 799f8da..2bf8b60 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/multipathd/cli_handlers.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/multipathd/cli_handlers.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -39,4 +39,8 @@ int cli_reassign (void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int cli_getprstatus(void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int cli_setprstatus(void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int cli_unsetprstatus(void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+int cli_add_elist(void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+int cli_del_elist(void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+int cli_discover_new_path(void * v, char ** reply, int * len, void * data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/multipath-tools-0.5.0/multipathd/main.c b/multipath-tools-0.5.0/multipathd/main.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 626f703..566c920 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/multipath-tools-0.5.0/multipathd/main.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/multipath-tools-0.5.0/multipathd/main.c<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -1013,6 +1013,9 @@ uxlsnrloop (void * ap)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       set_handler_callback(UNSETPRSTATUS+MAP, cli_unsetprstatus);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       set_handler_callback(FORCEQ+DAEMON, cli_force_no_daemon_q);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       set_handler_callback(RESTOREQ+DAEMON, cli_restore_no_daemon_q);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       set_handler_callback(ADD+ELIST, cli_add_elist);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       set_handler_callback(DEL+ELIST, cli_del_elist);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+       set_handler_callback(DISCOVER+NEWPATH, cli_discover_new_path);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        umask(077);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">       uxsock_listen(&uxsock_trigger, ap);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">-- <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2.7.2.windows.1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
<span style="font-size:7.5pt;font-family:华文细黑;color:gray"><span lang="EN-US">-------------------------------------------------------------------------------------------------------------------------------------<br>
</span>本邮件及其附件含有杭州华三通信技术有限公司的保密信息,仅限于发送给上面地址中列出<span lang="EN-US"><br>
</span>的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、<span lang="EN-US"><br>
</span>或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本<span lang="EN-US"><br>
</span>邮件!<span lang="EN-US"><br>
</span></span><span lang="EN-US" style="font-size:7.5pt;font-family:"Arial","sans-serif";color:gray">This e-mail and its attachments contain confidential information from H3C, which is
<br>
intended only for the person or entity whose address is listed above. Any use of the
<br>
information contained herein in any way (including, but not limited to, total or partial
<br>
disclosure, reproduction, or dissemination) by persons other than the intended <br>
recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender
<br>
by phone or email immediately and delete it!</span>
</body>
</html>