[multipathd] add failback keyword handling
authorroot <root@xa-s05.(none)>
Wed, 25 May 2005 09:53:18 +0000 (11:53 +0200)
committerroot <root@xa-s05.(none)>
Wed, 25 May 2005 09:53:18 +0000 (11:53 +0200)
The failback keyword can be set in the default section, or in a hardware
entry, or in a multipath entry. Its value can be "manual", "immediate" or
an integer delay expressed in seconds.

libmultipath/config.c
libmultipath/config.h
libmultipath/dict.c
libmultipath/propsel.c
libmultipath/propsel.h
libmultipath/structs.c
libmultipath/structs.h
multipath.conf.annotated
multipath.conf.synthetic
multipathd/main.c

index 58dfd04..e11bc25 100644 (file)
@@ -192,10 +192,20 @@ free_mptable (vector mptable)
        vector_free(mptable);
 }
 
+struct mpentry *
+alloc_mpe (void)
+{
+       struct mpentry * mpe = MALLOC(sizeof(struct mpentry));
+
+       return mpe;
+}
+
 static struct hwentry *
 alloc_hwe (void)
 {
-       return (struct hwentry *)MALLOC(sizeof(struct hwentry));
+       struct hwentry * hwe = MALLOC(sizeof(struct hwentry));
+
+       return hwe;
 }
 
 static char *
index 6858026..f71852b 100644 (file)
@@ -16,6 +16,7 @@ struct hwentry {
        int selector_args;
        int pgpolicy;
        int checker_index;
+       int pgfailback;
 
        char * vendor;
        char * product;
@@ -29,6 +30,7 @@ struct hwentry {
 struct mpentry {
        int selector_args;
        int pgpolicy;
+       int pgfailback;
 
        char * wwid;
        char * selector;
@@ -48,6 +50,7 @@ struct config {
        int minio;
        int checkint;
        int max_checkint;
+       int pgfailback;
 
        char * dev;
        char * multipath;
@@ -72,6 +75,8 @@ struct hwentry * find_hwe (vector hwtable, char * vendor, char * product);
 struct mpentry * find_mpe (char * wwid);
 char * get_mpe_wwid (char * alias);
 
+struct mpentry * alloc_mpe (void);
+
 void free_hwe (struct hwentry * hwe);
 void free_hwtable (vector hwtable);
 void free_mpe (struct mpentry * mpe);
index 684e6ca..9aa1846 100644 (file)
@@ -129,6 +129,25 @@ def_minio_handler(vector strvec)
        return 0;
 }
 
+static int
+default_failback_handler(vector strvec)
+{
+       char * buff;
+
+       buff = set_value(strvec);
+
+       if (!strncmp(buff, "manual", 6))
+               conf->pgfailback = FAILBACK_MANUAL;
+       else if (!strncmp(buff, "immediate", 9))
+               conf->pgfailback = FAILBACK_IMMEDIATE;
+       else
+               conf->pgfailback = atoi(buff);
+
+       FREE(buff);
+
+       return 0;
+}
+
 /*
  * blacklist block handlers
  */
@@ -345,6 +364,29 @@ prio_callout_handler(vector strvec)
        return push_callout(hwe->getprio);
 }
 
+static int
+hw_failback_handler(vector strvec)
+{
+       struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
+       char * buff;
+
+       if (!hwe)
+               return 1;
+
+       buff = set_value(strvec);
+
+       if (!strncmp(buff, "manual", 6))
+               hwe->pgfailback = FAILBACK_MANUAL;
+       else if (!strncmp(buff, "immediate", 9))
+               hwe->pgfailback = FAILBACK_IMMEDIATE;
+       else
+               hwe->pgfailback = atoi(buff);
+
+       FREE(buff);
+
+       return 0;
+}
+
 /*
  * multipaths block handlers
  */
@@ -446,6 +488,29 @@ mp_selector_handler(vector strvec)
        return 0;
 }
 
+static int
+mp_failback_handler(vector strvec)
+{
+       struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable);
+       char * buff;
+
+       if (!mpe)
+               return 1;
+
+       buff = set_value(strvec);
+
+       if (!strncmp(buff, "manual", 6))
+               mpe->pgfailback = FAILBACK_MANUAL;
+       else if (!strncmp(buff, "immediate", 9))
+               mpe->pgfailback = FAILBACK_IMMEDIATE;
+       else
+               mpe->pgfailback = atoi(buff);
+
+       FREE(buff);
+
+       return 0;
+}
+
 vector
 init_keywords(void)
 {
@@ -460,6 +525,7 @@ init_keywords(void)
        install_keyword("default_getuid_callout", &def_getuid_callout_handler);
        install_keyword("default_prio_callout", &def_prio_callout_handler);
        install_keyword("default_features", &def_features_handler);
+       install_keyword("failback", &default_failback_handler);
        install_keyword("rr_min_io", &def_minio_handler);
        
        install_keyword_root("devnode_blacklist", &blacklist_handler);
@@ -478,6 +544,7 @@ init_keywords(void)
        install_keyword("features", &hw_features_handler);
        install_keyword("hardware_handler", &hw_handler_handler);
        install_keyword("prio_callout", &prio_callout_handler);
+       install_keyword("failback", &hw_failback_handler);
        install_sublevel_end();
 
        install_keyword_root("multipaths", &multipaths_handler);
@@ -487,6 +554,7 @@ init_keywords(void)
        install_keyword("alias", &alias_handler);
        install_keyword("path_grouping_policy", &mp_pgpolicy_handler);
        install_keyword("path_selector", &mp_selector_handler);
+       install_keyword("failback", &mp_failback_handler);
        install_sublevel_end();
 
        return keywords;
index ce2409b..22536f8 100644 (file)
  * stop at first explicit setting found
  */
 extern int
+select_pgfailback (struct multipath * mp)
+{
+condlog(3, "mpe = %i", mp->mpe->pgfailback);
+       if (mp->mpe && mp->mpe->pgfailback != FAILBACK_UNDEF) {
+               mp->pgfailback = mp->mpe->pgfailback;
+               condlog(3, "pgfailback = %i (LUN setting)", mp->pgfailback);
+               return 0;
+       }
+       if (mp->hwe && mp->hwe->pgfailback != FAILBACK_UNDEF) {
+               mp->pgfailback = mp->hwe->pgfailback;
+               condlog(3, "pgfailback = %i (controler setting)", mp->pgfailback);
+               return 0;
+       }
+       if (conf->pgfailback != FAILBACK_UNDEF) {
+               mp->pgfailback = conf->pgfailback;
+               condlog(3, "pgfailback = %i (config file default)", mp->pgfailback);
+               return 0;
+       }
+       mp->pgpolicy = FAILBACK_MANUAL;
+       condlog(3, "pgfailover = %s (internal default)", mp->pgfailback);
+       return 0;
+}
+
+extern int
 select_pgpolicy (struct multipath * mp)
 {
        struct path * pp;
index 9d5366e..11d585b 100644 (file)
@@ -1,3 +1,4 @@
+int select_pgfailback (struct multipath * mp);
 int select_pgpolicy (struct multipath * mp);
 int select_selector (struct multipath * mp);
 int select_alias (struct multipath * mp);
index 993288d..82761d8 100644 (file)
@@ -106,7 +106,6 @@ alloc_multipath (void)
        mpp = (struct multipath *)MALLOC(sizeof(struct multipath));
 
        if (mpp) {
-               mpp->pgfailback = FAILBACK_IMMEDIATE;
                mpp->nextpg = 1;
        }
        return mpp;
index bef6409..49ed507 100644 (file)
@@ -17,8 +17,9 @@
 #define KEEP_PATHS             0
 #define FREE_PATHS             1
 
+#define FAILBACK_UNDEF         0
 #define FAILBACK_MANUAL                -1
-#define FAILBACK_IMMEDIATE     0
+#define FAILBACK_IMMEDIATE     -2
 
 enum pathstates {
        PSTATE_RESERVED,
index 6dc4cdc..8444332 100644 (file)
 #      # default : 1000
 #      #
 #      r_min_io        100
+#
+#      #
+#      # name    : failback
+#      # scope   : multipathd
+#      # desc    : tell the daemon to manage path group failback, or not to.
+#      #           0 means immediate failback, values >0 means deffered failback
+#      #           expressed in seconds.
+#      # values  : manual|immediate|n > 0
+#      # default : immediate
+#      #
+#      failback        manual
 #}
 #      
 ##
 #              # default : "round-robin 0"
 #              #
 #              path_selector           "round-robin 0"
+#
+#              #
+#              # name    : failback
+#              # scope   : multipathd
+#              # desc    : tell the daemon to manage path group failback, or not to.
+#              #           0 means immediate failback, values >0 means deffered failback
+#              #           expressed in seconds.
+#              # values  : manual|immediate|n > 0
+#              # default : immediate
+#              #
+#              failback                manual
 #      }
 #      multipath {
 #              wwid    1DEC_____321816758474
 #              # default : "round-robin 0"
 #              #
 #              path_selector           "round-robin 0"
+#
+#              #
+#              # name    : failback
+#              # scope   : multipathd
+#              # desc    : tell the daemon to manage path group failback, or not to.
+#              #           0 means immediate failback, values >0 means deffered failback
+#              #           expressed in seconds.
+#              # values  : manual|immediate|n > 0
+#              # default : immediate
+#              #
+#              failback                15
 #      }
 #      device {
 #              vendor                  "COMPAQ  "
index 7dbbb33..3a018bd 100644 (file)
@@ -12,6 +12,7 @@
 #      default_prio_callout    "/bin/true"
 #      default_features        "0"
 #      rr_wmin_io              100
+#      failback                immediate
 #}
 #devnode_blacklist {
 #        wwid 26353900f02796769
@@ -26,6 +27,7 @@
 #              path_grouping_policy    multibus
 #              path_checker            readsector0
 #              path_selector           "round-robin 0"
+#              failback                manual
 #      }
 #      multipath {
 #              wwid    1DEC_____321816758474
@@ -42,6 +44,7 @@
 #              path_selector           "round-robin 0"
 #              features                "1 queue_if_no_path"
 #              hardware_handler        "0"
+#              failback                15
 #      }
 #      device {
 #              vendor                  "COMPAQ  "
index 4cd351f..428910e 100644 (file)
@@ -153,6 +153,9 @@ setup_multipath (struct paths * allpaths, struct multipath * mpp)
                goto out;
 
        set_paths_owner(allpaths, mpp);
+       mpp->mpe = find_mpe(mpp->wwid);
+       select_pgfailback(mpp);
+
        return 0;
 out:
        free_multipath(mpp, KEEP_PATHS);