libmultipath: allow dumping only "local" hwtable in snprint_config
authorMartin Wilck <mwilck@suse.com>
Fri, 8 Jun 2018 10:20:33 +0000 (12:20 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 21 Jun 2018 07:49:51 +0000 (09:49 +0200)
This change is key for allowing to dump the "local" multipath configuration
only, i.e. those entries of the hardware table that match existing devices
in the system. By passing the output of the new helper function
get_used_hwes() as the last argument for snprint_config(), only the local
entries will be dumped.

The rationale is that "multipath -t" output is overwhelmingly long for most
use cases; in particular it's not useful as a template for creating a local
configuration.

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/print.c
libmultipath/print.h
libmultipath/structs_vec.c
libmultipath/structs_vec.h
libmultipath/vector.c
libmultipath/vector.h
multipath/main.c
multipathd/cli_handlers.c
tests/hwtable.c

index 7d4e2ac..af4c00e 100644 (file)
@@ -1376,7 +1376,8 @@ snprint_hwentry (const struct config *conf,
 }
 
 static int snprint_hwtable(const struct config *conf,
-                          char *buff, int len, vector hwtable)
+                          char *buff, int len,
+                          const struct _vector *hwtable)
 {
        int fwd = 0;
        int i;
@@ -1781,7 +1782,8 @@ static int snprint_blacklist_except(const struct config *conf,
        return fwd;
 }
 
-char *snprint_config(const struct config *conf, int *len)
+char *snprint_config(const struct config *conf, int *len,
+                    const struct _vector *hwtable)
 {
        char *reply;
        /* built-in config is >20kB already */
@@ -1810,7 +1812,7 @@ char *snprint_config(const struct config *conf, int *len)
                        continue;
 
                c += snprint_hwtable(conf, c, reply + maxlen - c,
-                                    conf->hwtable);
+                                    hwtable ? hwtable : conf->hwtable);
                if ((c - reply) == maxlen)
                        continue;
 
index fed80d5..c63e054 100644 (file)
@@ -119,7 +119,8 @@ int _snprint_multipath_topology (const struct gen_multipath *, char *, int,
        _snprint_multipath_topology (dm_multipath_to_gen(mpp), buf, len, v)
 int snprint_multipath_topology_json (char * buff, int len,
                                const struct vectors * vecs);
-char *snprint_config(const struct config *conf, int *len);
+char *snprint_config(const struct config *conf, int *len,
+                    const struct _vector *hwtable);
 int snprint_multipath_map_json (char * buff, int len,
                                const struct multipath * mpp, int last);
 int snprint_blacklist_report (struct config *, char *, int);
index 38f0438..f87d69d 100644 (file)
@@ -445,3 +445,22 @@ void update_queue_mode_add_path(struct multipath *mpp)
        }
        condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
 }
+
+vector get_used_hwes(const struct _vector *pathvec)
+{
+       int i, j;
+       struct path *pp;
+       struct hwentry *hwe;
+       vector v = vector_alloc();
+
+       if (v == NULL)
+               return NULL;
+
+       vector_foreach_slot(pathvec, pp, i) {
+               vector_foreach_slot_backwards(pp->hwe, hwe, j) {
+                       vector_find_or_add_slot(v, hwe);
+               }
+       }
+
+       return v;
+}
index 4220ea3..f7777aa 100644 (file)
@@ -38,5 +38,6 @@ void update_queue_mode_add_path(struct multipath *mpp);
 int update_multipath_table (struct multipath *mpp, vector pathvec,
                            int is_daemon);
 int update_multipath_status (struct multipath *mpp);
+vector get_used_hwes(const struct _vector *pathvec);
 
 #endif /* _STRUCTS_VEC_H */
index f741ae0..501cf4c 100644 (file)
@@ -196,3 +196,15 @@ vector_set_slot(vector v, void *value)
        i = VECTOR_SIZE(v) - 1;
        v->slot[i] = value;
 }
+
+int vector_find_or_add_slot(vector v, void *value)
+{
+       int n = find_slot(v, value);
+
+       if (n >= 0)
+               return n;
+       if (vector_alloc_slot(v) == NULL)
+               return -1;
+       vector_set_slot(v, value);
+       return VECTOR_SIZE(v) - 1;
+}
index b9450ac..41d2b89 100644 (file)
@@ -82,6 +82,7 @@ extern void vector_set_slot(vector v, void *value);
 extern void vector_del_slot(vector v, int slot);
 extern void *vector_insert_slot(vector v, int slot, void *value);
 int find_slot(vector v, void * addr);
+int vector_find_or_add_slot(vector v, void *value);
 extern void vector_repack(vector v);
 extern void vector_dump(vector v);
 extern void dump_strvec(vector strvec);
index 288251c..87d80dd 100644 (file)
@@ -753,7 +753,7 @@ out:
 static int
 dump_config (struct config *conf)
 {
-       char * reply = snprint_config(conf, NULL);
+       char * reply = snprint_config(conf, NULL, NULL);
 
        if (reply != NULL) {
                printf("%s", reply);
index eccdf3d..184a4f0 100644 (file)
@@ -246,15 +246,15 @@ show_map_json (char ** r, int * len, struct multipath * mpp,
        return 0;
 }
 
-int
-show_config (char ** r, int * len)
+static int
+show_config (char ** r, int * len, const struct _vector *hwtable)
 {
        struct config *conf;
        char *reply;
 
        conf = get_multipath_config();
        pthread_cleanup_push(put_multipath_config, conf);
-       reply = snprint_config(conf, len);
+       reply = snprint_config(conf, len, hwtable);
        pthread_cleanup_pop(1);
        if (reply == NULL)
                return 1;
@@ -278,7 +278,7 @@ cli_list_config (void * v, char ** reply, int * len, void * data)
 {
        condlog(3, "list config (operator)");
 
-       return show_config(reply, len);
+       return show_config(reply, len, NULL);
 }
 
 int
index 85924fb..3c3cadd 100644 (file)
@@ -454,7 +454,7 @@ static void replicate_config(const struct hwt_state *hwt)
        condlog(1, "--- %s: replicating configuration", __func__);
 
        conf = get_multipath_config();
-       cfg1 = snprint_config(conf, NULL);
+       cfg1 = snprint_config(conf, NULL, NULL);
 
        assert_non_null(cfg1);
        put_multipath_config(conf);
@@ -462,7 +462,7 @@ static void replicate_config(const struct hwt_state *hwt)
        replace_config(hwt, cfg1);
 
        conf = get_multipath_config();
-       cfg2 = snprint_config(conf, NULL);
+       cfg2 = snprint_config(conf, NULL, NULL);
        assert_non_null(cfg2);
        put_multipath_config(conf);