All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: Christophe Varoqui <christophe.varoqui@gmail.com>
Cc: Hannes Reinecke <hare@suse.com>, dm-devel@redhat.com
Subject: [PATCH 26/26] libmultipath: Allocate keywords directly
Date: Mon, 20 Jun 2016 10:09:13 +0200	[thread overview]
Message-ID: <1466410153-23896-27-git-send-email-hare@suse.de> (raw)
In-Reply-To: <1466410153-23896-1-git-send-email-hare@suse.de>

There is no valid reason why we cannot allocate the keywords
structure within the configuration data directly.
So drop this weird pointer dance and use it directly.

Signed-off-by: Hannes Reinecke <hare@suse.com>
---
 libmultipath/config.c     |  5 ++---
 libmultipath/dict.c       |  2 +-
 libmultipath/dict.h       |  2 +-
 libmultipath/parser.c     | 39 +++++----------------------------
 libmultipath/parser.h     | 13 +++++------
 libmultipath/print.c      | 56 +++++++++++++++++++++++------------------------
 libmultipath/print.h      |  6 ++---
 multipath/main.c          |  7 +++---
 multipathd/cli_handlers.c |  8 ++++---
 9 files changed, 56 insertions(+), 82 deletions(-)

diff --git a/libmultipath/config.c b/libmultipath/config.c
index 216ca22..9a75b4e 100644
--- a/libmultipath/config.c
+++ b/libmultipath/config.c
@@ -632,9 +632,8 @@ load_config (char * file)
 	/*
 	 * read the config file
 	 */
-	set_current_keywords(&conf->keywords);
-	alloc_keywords();
-	init_keywords();
+	conf->keywords = vector_alloc();
+	init_keywords(conf->keywords);
 	if (filepresent(file)) {
 		int builtin_hwtable_size;
 
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
index ed0502a..7b92a91 100644
--- a/libmultipath/dict.c
+++ b/libmultipath/dict.c
@@ -1330,7 +1330,7 @@ snprint_deprecated (struct config *conf, char * buff, int len, void * data)
 #define __deprecated
 
 void
-init_keywords(void)
+init_keywords(vector keywords)
 {
 	install_keyword_root("defaults", NULL);
 	install_keyword("verbosity", &def_verbosity_handler, &snprint_def_verbosity);
diff --git a/libmultipath/dict.h b/libmultipath/dict.h
index 4fdd576..4cd03c5 100644
--- a/libmultipath/dict.h
+++ b/libmultipath/dict.h
@@ -5,7 +5,7 @@
 #include "vector.h"
 #endif
 
-void init_keywords(void);
+void init_keywords(vector keywords);
 int get_sys_max_fds(int *);
 int print_rr_weight (char * buff, int len, void *ptr);
 int print_pgfailback (char * buff, int len, void *ptr);
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
index 82ce01c..dd955f3 100644
--- a/libmultipath/parser.c
+++ b/libmultipath/parser.c
@@ -28,16 +28,8 @@
 
 /* local vars */
 static int sublevel = 0;
-static vector keywords = NULL;
-static vector *keywords_addr = NULL;
 static int line_nr;
 
-void set_current_keywords (vector *k)
-{
-	keywords_addr = k;
-	keywords = NULL;
-}
-
 int
 keyword_alloc(vector keywords, char *string,
 	      int (*handler) (struct config *, vector),
@@ -64,15 +56,6 @@ keyword_alloc(vector keywords, char *string,
 	return 0;
 }
 
-int
-install_keyword_root(char *string, int (*handler) (struct config *, vector))
-{
-	int r = keyword_alloc(keywords, string, handler, NULL, 1);
-	if (!r)
-		*keywords_addr = keywords;
-	return r;
-}
-
 void
 install_sublevel(void)
 {
@@ -86,7 +69,8 @@ install_sublevel_end(void)
 }
 
 int
-_install_keyword(char *string, int (*handler) (struct config *, vector),
+_install_keyword(vector keywords, char *string,
+		 int (*handler) (struct config *, vector),
 		 int (*print) (struct config *, char *, int, void *), int unique)
 {
 	int i = 0;
@@ -130,7 +114,7 @@ free_keywords(vector keywords)
 }
 
 struct keyword *
-find_keyword(vector v, char * name)
+find_keyword(vector keywords, vector v, char * name)
 {
 	struct keyword *keyword;
 	int i;
@@ -150,7 +134,7 @@ find_keyword(vector v, char * name)
 		    !strcmp(keyword->string, name))
 			return keyword;
 		if (keyword->sub) {
-			keyword = find_keyword(keyword->sub, name);
+			keyword = find_keyword(keywords, keyword->sub, name);
 			if (keyword)
 				return keyword;
 		}
@@ -555,17 +539,6 @@ out:
 	return r;
 }
 
-int alloc_keywords(void)
-{
-	if (!keywords)
-		keywords = vector_alloc();
-
-	if (!keywords)
-		return 1;
-
-	return 0;
-}
-
 /* Data initialization */
 int
 process_file(struct config *conf, char *file)
@@ -573,7 +546,7 @@ process_file(struct config *conf, char *file)
 	int r;
 	FILE *stream;
 
-	if (!keywords) {
+	if (!conf->keywords) {
 		condlog(0, "No keywords alocated");
 		return 1;
 	}
@@ -586,7 +559,7 @@ process_file(struct config *conf, char *file)
 
 	/* Stream handling */
 	line_nr = 0;
-	r = process_stream(conf, stream, keywords, file);
+	r = process_stream(conf, stream, conf->keywords, file);
 	fclose(stream);
 	//free_keywords(keywords);
 
diff --git a/libmultipath/parser.h b/libmultipath/parser.h
index 822b2b4..519b805 100644
--- a/libmultipath/parser.h
+++ b/libmultipath/parser.h
@@ -61,21 +61,20 @@ struct keyword {
 extern int keyword_alloc(vector keywords, char *string,
 			 int (*handler) (struct config *, vector),
 			 int (*print) (struct config *, char *, int, void *), int unique);
-extern int install_keyword_root(char *string, int (*handler) (struct config *, vector));
+#define install_keyword_root(str, h) keyword_alloc(keywords, str, h, NULL, 1)
 extern void install_sublevel(void);
 extern void install_sublevel_end(void);
-extern int _install_keyword(char *string, int (*handler) (struct config *, vector),
+extern int _install_keyword(vector keywords, char *string,
+			    int (*handler) (struct config *, vector),
 			    int (*print) (struct config *, char *, int, void *), int unique);
-#define install_keyword(str, vec, pri) _install_keyword(str, vec, pri, 1)
-#define install_keyword_multi(str, vec, pri) _install_keyword(str, vec, pri, 0)
+#define install_keyword(str, vec, pri) _install_keyword(keywords, str, vec, pri, 1)
+#define install_keyword_multi(str, vec, pri) _install_keyword(keywords, str, vec, pri, 0)
 extern void dump_keywords(vector keydump, int level);
 extern void free_keywords(vector keywords);
 extern vector alloc_strvec(char *string);
 extern void *set_value(vector strvec);
-extern int alloc_keywords(void);
 extern int process_file(struct config *conf, char *conf_file);
-extern struct keyword * find_keyword(vector v, char * name);
-void set_current_keywords (vector *k);
+extern struct keyword * find_keyword(vector keywords, vector v, char * name);
 int snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw,
 		    void *data);
 
diff --git a/libmultipath/print.c b/libmultipath/print.c
index fe3902f..196af61 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -1212,19 +1212,19 @@ snprint_multipath_topology_json (char * buff, int len, struct vectors * vecs)
 }
 
 static int
-snprint_hwentry (char * buff, int len, struct hwentry * hwe)
+snprint_hwentry (struct config *conf, char * buff, int len, struct hwentry * hwe)
 {
 	int i;
 	int fwd = 0;
 	struct keyword * kw;
 	struct keyword * rootkw;
 
-	rootkw = find_keyword(NULL, "devices");
+	rootkw = find_keyword(conf->keywords, NULL, "devices");
 
 	if (!rootkw || !rootkw->sub)
 		return 0;
 
-	rootkw = find_keyword(rootkw->sub, "device");
+	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
 
 	if (!rootkw)
 		return 0;
@@ -1245,14 +1245,14 @@ snprint_hwentry (char * buff, int len, struct hwentry * hwe)
 }
 
 extern int
-snprint_hwtable (char * buff, int len, vector hwtable)
+snprint_hwtable (struct config *conf, char * buff, int len, vector hwtable)
 {
 	int fwd = 0;
 	int i;
 	struct hwentry * hwe;
 	struct keyword * rootkw;
 
-	rootkw = find_keyword(NULL, "devices");
+	rootkw = find_keyword(conf->keywords, NULL, "devices");
 	if (!rootkw)
 		return 0;
 
@@ -1260,7 +1260,7 @@ snprint_hwtable (char * buff, int len, vector hwtable)
 	if (fwd > len)
 		return len;
 	vector_foreach_slot (hwtable, hwe, i) {
-		fwd += snprint_hwentry(buff + fwd, len - fwd, hwe);
+		fwd += snprint_hwentry(conf, buff + fwd, len - fwd, hwe);
 		if (fwd > len)
 			return len;
 	}
@@ -1271,14 +1271,14 @@ snprint_hwtable (char * buff, int len, vector hwtable)
 }
 
 static int
-snprint_mpentry (char * buff, int len, struct mpentry * mpe)
+snprint_mpentry (struct config *conf, char * buff, int len, struct mpentry * mpe)
 {
 	int i;
 	int fwd = 0;
 	struct keyword * kw;
 	struct keyword * rootkw;
 
-	rootkw = find_keyword(NULL, "multipath");
+	rootkw = find_keyword(conf->keywords, NULL, "multipath");
 	if (!rootkw)
 		return 0;
 
@@ -1298,14 +1298,14 @@ snprint_mpentry (char * buff, int len, struct mpentry * mpe)
 }
 
 extern int
-snprint_mptable (char * buff, int len, vector mptable)
+snprint_mptable (struct config *conf, char * buff, int len, vector mptable)
 {
 	int fwd = 0;
 	int i;
 	struct mpentry * mpe;
 	struct keyword * rootkw;
 
-	rootkw = find_keyword(NULL, "multipaths");
+	rootkw = find_keyword(conf->keywords, NULL, "multipaths");
 	if (!rootkw)
 		return 0;
 
@@ -1313,7 +1313,7 @@ snprint_mptable (char * buff, int len, vector mptable)
 	if (fwd > len)
 		return len;
 	vector_foreach_slot (mptable, mpe, i) {
-		fwd += snprint_mpentry(buff + fwd, len - fwd, mpe);
+		fwd += snprint_mpentry(conf, buff + fwd, len - fwd, mpe);
 		if (fwd > len)
 			return len;
 	}
@@ -1324,14 +1324,14 @@ snprint_mptable (char * buff, int len, vector mptable)
 }
 
 extern int
-snprint_overrides (char * buff, int len, struct hwentry *overrides)
+snprint_overrides (struct config *conf, char * buff, int len, struct hwentry *overrides)
 {
 	int fwd = 0;
 	int i;
 	struct keyword *rootkw;
 	struct keyword *kw;
 
-	rootkw = find_keyword(NULL, "overrides");
+	rootkw = find_keyword(conf->keywords, NULL, "overrides");
 	if (!rootkw)
 		return 0;
 
@@ -1361,7 +1361,7 @@ snprint_defaults (struct config *conf, char * buff, int len)
 	struct keyword *rootkw;
 	struct keyword *kw;
 
-	rootkw = find_keyword(NULL, "defaults");
+	rootkw = find_keyword(conf->keywords, NULL, "defaults");
 	if (!rootkw)
 		return 0;
 
@@ -1508,7 +1508,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 	struct keyword *rootkw;
 	struct keyword *kw;
 
-	rootkw = find_keyword(NULL, "blacklist");
+	rootkw = find_keyword(conf->keywords, NULL, "blacklist");
 	if (!rootkw)
 		return 0;
 
@@ -1517,7 +1517,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 		return len;
 
 	vector_foreach_slot (conf->blist_devnode, ble, i) {
-		kw = find_keyword(rootkw->sub, "devnode");
+		kw = find_keyword(conf->keywords, rootkw->sub, "devnode");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1526,7 +1526,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return len;
 	}
 	vector_foreach_slot (conf->blist_wwid, ble, i) {
-		kw = find_keyword(rootkw->sub, "wwid");
+		kw = find_keyword(conf->keywords, rootkw->sub, "wwid");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1535,7 +1535,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return len;
 	}
 	vector_foreach_slot (conf->blist_property, ble, i) {
-		kw = find_keyword(rootkw->sub, "property");
+		kw = find_keyword(conf->keywords, rootkw->sub, "property");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1543,7 +1543,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 		if (fwd > len)
 			return len;
 	}
-	rootkw = find_keyword(rootkw->sub, "device");
+	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
 	if (!rootkw)
 		return 0;
 
@@ -1551,14 +1551,14 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 		fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
 		if (fwd > len)
 			return len;
-		kw = find_keyword(rootkw->sub, "vendor");
+		kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, bled);
 		if (fwd > len)
 			return len;
-		kw = find_keyword(rootkw->sub, "product");
+		kw = find_keyword(conf->keywords, rootkw->sub, "product");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
@@ -1585,7 +1585,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 	struct keyword *rootkw;
 	struct keyword *kw;
 
-	rootkw = find_keyword(NULL, "blacklist_exceptions");
+	rootkw = find_keyword(conf->keywords, NULL, "blacklist_exceptions");
 	if (!rootkw)
 		return 0;
 
@@ -1594,7 +1594,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 		return len;
 
 	vector_foreach_slot (conf->elist_devnode, ele, i) {
-		kw = find_keyword(rootkw->sub, "devnode");
+		kw = find_keyword(conf->keywords, rootkw->sub, "devnode");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1603,7 +1603,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return len;
 	}
 	vector_foreach_slot (conf->elist_wwid, ele, i) {
-		kw = find_keyword(rootkw->sub, "wwid");
+		kw = find_keyword(conf->keywords, rootkw->sub, "wwid");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1612,7 +1612,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return len;
 	}
 	vector_foreach_slot (conf->elist_property, ele, i) {
-		kw = find_keyword(rootkw->sub, "property");
+		kw = find_keyword(conf->keywords, rootkw->sub, "property");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
@@ -1620,7 +1620,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 		if (fwd > len)
 			return len;
 	}
-	rootkw = find_keyword(rootkw->sub, "device");
+	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
 	if (!rootkw)
 		return 0;
 
@@ -1628,14 +1628,14 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 		fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
 		if (fwd > len)
 			return len;
-		kw = find_keyword(rootkw->sub, "vendor");
+		kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, eled);
 		if (fwd > len)
 			return len;
-		kw = find_keyword(rootkw->sub, "product");
+		kw = find_keyword(conf->keywords, rootkw->sub, "product");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
diff --git a/libmultipath/print.h b/libmultipath/print.h
index 023f520..b532f24 100644
--- a/libmultipath/print.h
+++ b/libmultipath/print.h
@@ -109,9 +109,9 @@ int snprint_blacklist_report (struct config *, char *, int);
 int snprint_wildcards (char *, int);
 int snprint_status (char *, int, struct vectors *);
 int snprint_devices (struct config *, char *, int, struct vectors *);
-int snprint_hwtable (char *, int, vector);
-int snprint_mptable (char *, int, vector);
-int snprint_overrides (char *, int, struct hwentry *);
+int snprint_hwtable (struct config *, char *, int, vector);
+int snprint_mptable (struct config *, char *, int, vector);
+int snprint_overrides (struct config *, char *, int, struct hwentry *);
 int snprint_host_wwnn (char *, size_t, struct path *);
 int snprint_host_wwpn (char *, size_t, struct path *);
 int snprint_tgt_wwnn (char *, size_t, struct path *);
diff --git a/multipath/main.c b/multipath/main.c
index 719d935..e7e35c0 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -458,20 +458,21 @@ dump_config (struct config *conf)
 			reply = REALLOC(reply, maxlen *= 2);
 			continue;
 		}
-		c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable);
+		c += snprint_hwtable(conf, c, reply + maxlen - c, conf->hwtable);
 		again = ((c - reply) == maxlen);
 		if (again) {
 			reply = REALLOC(reply, maxlen *= 2);
 			continue;
 		}
-		c += snprint_overrides(c, reply + maxlen - c, conf->overrides);
+		c += snprint_overrides(conf, c, reply + maxlen - c,
+				       conf->overrides);
 		again = ((c - reply) == maxlen);
 		if (again) {
 			reply = REALLOC(reply, maxlen *= 2);
 			continue;
 		}
 		if (VECTOR_SIZE(conf->mptable) > 0) {
-			c += snprint_mptable(c, reply + maxlen - c,
+			c += snprint_mptable(conf, c, reply + maxlen - c,
 					     conf->mptable);
 			again = ((c - reply) == maxlen);
 			if (again)
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 84f430c..2a54cba 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -252,18 +252,20 @@ show_config (char ** r, int * len)
 		REALLOC_REPLY(reply, again, maxlen);
 		if (again)
 			continue;
-		c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable);
+		c += snprint_hwtable(conf, c, reply + maxlen - c,
+				     conf->hwtable);
 		again = ((c - reply) == maxlen);
 		REALLOC_REPLY(reply, again, maxlen);
 		if (again)
 			continue;
-		c += snprint_overrides(c, reply + maxlen - c, conf->overrides);
+		c += snprint_overrides(conf, c, reply + maxlen - c,
+				       conf->overrides);
 		again = ((c - reply) == maxlen);
 		REALLOC_REPLY(reply, again, maxlen);
 		if (again)
 			continue;
 		if (VECTOR_SIZE(conf->mptable) > 0) {
-			c += snprint_mptable(c, reply + maxlen - c,
+			c += snprint_mptable(conf, c, reply + maxlen - c,
 					     conf->mptable);
 			again = ((c - reply) == maxlen);
 			REALLOC_REPLY(reply, again, maxlen);
-- 
2.6.6

  parent reply	other threads:[~2016-06-20  8:09 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-20  8:08 [PATCH 00/26] Userspace-RCU for config accesses Hannes Reinecke
2016-06-20  8:08 ` [PATCH 01/26] Revert patch 'move filter_devnode() under vector lock' Hannes Reinecke
2016-06-20  8:08 ` [PATCH 02/26] Use 'mptable' as argument for find_mpe() and get_mpe_wwid() Hannes Reinecke
2016-07-01 19:48   ` Benjamin Marzinski
2016-06-20  8:08 ` [PATCH 03/26] config: set 'deferred_remove' defaults at correct call Hannes Reinecke
2016-06-20  8:08 ` [PATCH 04/26] devmapper: explicit config settings Hannes Reinecke
2016-06-20  8:08 ` [PATCH 05/26] dmparser: use 'is_daemon' as argument for disassemble_map() Hannes Reinecke
2016-06-20  8:08 ` [PATCH 06/26] libmultipath: use 'is_daemon' as argument for domap() etc Hannes Reinecke
2016-06-20  8:08 ` [PATCH 07/26] libmultipath: drop 'daemon' configuration setting Hannes Reinecke
2016-06-20  8:08 ` [PATCH 08/26] libmultipath: Do not access 'conf->cmd' in domap() Hannes Reinecke
2016-06-20  8:08 ` [PATCH 09/26] libmultipath: add 'cmd' as argument for get_refwwid() Hannes Reinecke
2016-06-20  8:08 ` [PATCH 10/26] libmultipath: fallback to checking environment variable in get_udev_uid() Hannes Reinecke
2016-06-20  8:08 ` [PATCH 11/26] multipath: make 'cmd' internal to multipath program Hannes Reinecke
2016-06-20  8:08 ` [PATCH 12/26] multipath: make 'dev_type' internal to the " Hannes Reinecke
2016-06-20  8:09 ` [PATCH 13/26] multipath: make 'dev' " Hannes Reinecke
2016-06-20  8:09 ` [PATCH 14/26] libmultipath: separate out 'udev' config entry Hannes Reinecke
2016-06-20  8:09 ` [PATCH 15/26] libmultipath: use 'checkint' as argument for sysfs_set_scsi_tmo() Hannes Reinecke
2016-06-20  8:09 ` [PATCH 16/26] discovery: Pass in 'hwtable' for get_state() and scsi_sysfs_discovery() Hannes Reinecke
2016-06-20  8:09 ` [PATCH 17/26] libmultipath: use 'struct config' as argument for pathinfo() Hannes Reinecke
2016-07-01 20:25   ` Benjamin Marzinski
2016-07-04  5:49     ` Hannes Reinecke
2016-06-20  8:09 ` [PATCH 18/26] checkers: use 'multipath_dir' as argument Hannes Reinecke
2016-06-20  8:09 ` [PATCH 19/26] prio: " Hannes Reinecke
2016-06-20  8:09 ` [PATCH 20/26] libmultipath: use 'timeout' as argument for getprio() Hannes Reinecke
2016-06-20  8:09 ` [PATCH 21/26] libmultipath: use explicit 'config' argument for configuration file parsing Hannes Reinecke
2016-06-20  8:09 ` [PATCH 22/26] libmultipath: use (get, put)_multipath_config() accessors Hannes Reinecke
2016-06-20  8:09 ` [PATCH 23/26] multipathd: Fixup commandline argument handling Hannes Reinecke
2016-06-20  8:09 ` [PATCH 24/26] multipath: make 'struct config' a local variable Hannes Reinecke
2016-06-20  8:09 ` [PATCH 25/26] multipathd: use userspace RCU to access configuration Hannes Reinecke
2016-06-20  8:09 ` Hannes Reinecke [this message]
2016-07-01 20:44 ` [PATCH 00/26] Userspace-RCU for config accesses Benjamin Marzinski
2016-07-04  7:08 [PATCHv2 " Hannes Reinecke
2016-07-04  7:08 ` [PATCH 26/26] libmultipath: Allocate keywords directly Hannes Reinecke

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1466410153-23896-27-git-send-email-hare@suse.de \
    --to=hare@suse.de \
    --cc=christophe.varoqui@gmail.com \
    --cc=dm-devel@redhat.com \
    --cc=hare@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.