File 0012-fabrics-move-connect_args-extraction-to-a-dedicated-.patch of Package nvme-cli.22025

From: Sagi Grimberg <sagi@grimberg.me>
Date: Fri, 14 Aug 2020 13:42:38 -0700
Subject: [PATCH] fabrics: move connect_args extraction to a dedicated routin
References: bsc#1179825
Git-commit: 1ca2593ee13a052b038ee3d4a16af14ccb9e578b

We will need it to track controllers as we are iterating over
nested discovery log pages recursion.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Keith Busch <kbusch@kernel.org>
---
 fabrics.c |   46 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 14 deletions(-)

--- a/fabrics.c
+++ b/fabrics.c
@@ -354,6 +354,31 @@ static char *find_ctrl_with_connectargs(
 	return devname;
 }
 
+static struct connect_args *extract_connect_args(char *argstr)
+{
+	struct connect_args *cargs;
+
+	cargs = calloc(1, sizeof(*cargs));
+	if (!cargs)
+		return NULL;
+	cargs->subsysnqn = parse_conn_arg(argstr, ',', conarg_nqn);
+	cargs->transport = parse_conn_arg(argstr, ',', conarg_transport);
+	cargs->traddr = parse_conn_arg(argstr, ',', conarg_traddr);
+	cargs->trsvcid = parse_conn_arg(argstr, ',', conarg_trsvcid);
+	cargs->host_traddr = parse_conn_arg(argstr, ',', conarg_host_traddr);
+	return cargs;
+}
+
+static void free_connect_args(struct connect_args *cargs)
+{
+	free(cargs->subsysnqn);
+	free(cargs->transport);
+	free(cargs->traddr);
+	free(cargs->trsvcid);
+	free(cargs->host_traddr);
+	free(cargs);
+}
+
 static int add_ctrl(const char *argstr)
 {
 	substring_t args[MAX_OPT_ARGS];
@@ -1113,14 +1138,11 @@ static int do_discover(char *argstr, boo
 	int status = 0;
 
 	if (cfg.device) {
-		struct connect_args cargs;
+		struct connect_args *cargs;
 
-		memset(&cargs, 0, sizeof(cargs));
-		cargs.subsysnqn = parse_conn_arg(argstr, '.', conarg_nqn);
-		cargs.transport = parse_conn_arg(argstr, '.', conarg_transport);
-		cargs.traddr = parse_conn_arg(argstr, '.', conarg_traddr);
-		cargs.trsvcid = parse_conn_arg(argstr, '.', conarg_trsvcid);
-		cargs.host_traddr = parse_conn_arg(argstr, '.', conarg_host_traddr);
+		cargs = extract_connect_args(argstr);
+		if (!cargs)
+			return -ENOMEM;
 
 		/*
 		 * if the cfg.device passed in matches the connect args
@@ -1133,14 +1155,10 @@ static int do_discover(char *argstr, boo
 		 *    create a new ctrl.
 		 * endif
 		 */
-		if (!ctrl_matches_connectargs(cfg.device, &cargs))
-			cfg.device = find_ctrl_with_connectargs(&cargs);
+		if (!ctrl_matches_connectargs(cfg.device, cargs))
+			cfg.device = find_ctrl_with_connectargs(cargs);
 
-		free(cargs.subsysnqn);
-		free(cargs.transport);
-		free(cargs.traddr);
-		free(cargs.trsvcid);
-		free(cargs.host_traddr);
+		free_connect_args(cargs);
 	}
 
 	if (!cfg.device)
openSUSE Build Service is sponsored by