[PATCH nvme-7.3 3/4] nvme-fabrics: add helpers for subsystem and host identity options

raoxu <[email protected]>
Newsgroups org.kernel.vger.linux-kernel,org.infradead.lists.linux-nvme
Message-ID <[email protected]>
From: Xu Rao <[email protected]>

The nqn, hostnqn and hostid options also start with match_strdup(), but
unlike the direct string replacements handled by nvmf_parse_string_option()
they perform option-specific validation or conversion before parsing is
complete.

Move each lifetime into a helper whose name identifies the value being
parsed:

  nvmf_parse_subsysnqn() handles NVMF_OPT_NQN.  It replaces
  opts->subsysnqn, checks NVMF_NQN_SIZE and updates discovery_nqn.  Using
  subsysnqn in the helper name distinguishes the subsystem NQN from the
  host NQN at the call site.

  nvmf_parse_hostnqn() handles the hostnqn option.  It keeps the existing
  host-assignment check, validates the temporary NQN, copies it to the
  hostnqn buffer and frees the temporary allocation before returning.

  nvmf_parse_hostid() handles the hostid option.  It converts the temporary
  string to uuid_t and frees the duplicated string on both success and
  failure paths.

These three helpers are grouped because they parse non-sensitive identity
values that require validation or conversion rather than a simple owned
string replacement.  Preserve the existing validation and ownership
ordering while moving the code.

No functional change is intended.

Suggested-by: Christoph Hellwig <[email protected]>
Signed-off-by: Xu Rao <[email protected]>
---
 drivers/nvme/host/fabrics.c | 118 +++++++++++++++++++++---------------
 1 file changed, 69 insertions(+), 49 deletions(-)

diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
index aab3fd279d0e..120e57964cdd 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -725,13 +725,75 @@ static int nvmf_parse_string_option(substring_t *args, char **dst)
 	return 0;
 }
 
+static int nvmf_parse_subsysnqn(struct nvmf_ctrl_options *opts, substring_t *args)
+{
+	char *nqn;
+
+	nqn = match_strdup(args);
+	if (!nqn)
+		return -ENOMEM;
+
+	kfree(opts->subsysnqn);
+	opts->subsysnqn = nqn;
+	if (strlen(opts->subsysnqn) >= NVMF_NQN_SIZE) {
+		pr_err("%s needs to be < %d bytes\n",
+		       opts->subsysnqn, NVMF_NQN_SIZE);
+		return -EINVAL;
+	}
+
+	opts->discovery_nqn = !strcmp(opts->subsysnqn, NVME_DISC_SUBSYS_NAME);
+	return 0;
+}
+
+static int nvmf_parse_hostnqn(struct nvmf_ctrl_options *opts,
+			      substring_t *args, char *hostnqn)
+{
+	char *nqn;
+
+	if (opts->host) {
+		pr_err("hostnqn already user-assigned: %s\n", opts->host->nqn);
+		return -EADDRINUSE;
+	}
+
+	nqn = match_strdup(args);
+	if (!nqn)
+		return -ENOMEM;
+
+	if (strlen(nqn) >= NVMF_NQN_SIZE) {
+		pr_err("%s needs to be < %d bytes\n", nqn, NVMF_NQN_SIZE);
+		kfree(nqn);
+		return -EINVAL;
+	}
+
+	strscpy(hostnqn, nqn, NVMF_NQN_SIZE);
+	kfree(nqn);
+	return 0;
+}
+
+static int nvmf_parse_hostid(substring_t *args, uuid_t *hostid)
+{
+	char *id;
+	int ret;
+
+	id = match_strdup(args);
+	if (!id)
+		return -ENOMEM;
+
+	ret = uuid_parse(id, hostid);
+	if (ret) {
+		pr_err("Invalid hostid %s\n", id);
+		ret = -EINVAL;
+	}
+	kfree(id);
+	return ret;
+}
+
 static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
 		const char *buf)
 {
 	substring_t args[MAX_OPT_ARGS];
 	char *options, *o, *option, *p;
 	int token, ret = 0;
-	size_t nqnlen  = 0;
 	int ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO, key_id;
 	uuid_t hostid;
 	char hostnqn[NVMF_NQN_SIZE];
@@ -773,23 +835,9 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
 				goto out;
 			break;
 		case NVMF_OPT_NQN:
-			p = match_strdup(args);
-			if (!p) {
-				ret = -ENOMEM;
-				goto out;
-			}
-			kfree(opts->subsysnqn);
-			opts->subsysnqn = p;
-			nqnlen = strlen(opts->subsysnqn);
-			if (nqnlen >= NVMF_NQN_SIZE) {
-				pr_err("%s needs to be < %d bytes\n",
-					opts->subsysnqn, NVMF_NQN_SIZE);
-				ret = -EINVAL;
+			ret = nvmf_parse_subsysnqn(opts, args);
+			if (ret)
 				goto out;
-			}
-			opts->discovery_nqn =
-				!(strcmp(opts->subsysnqn,
-					 NVME_DISC_SUBSYS_NAME));
 			break;
 		case NVMF_OPT_TRADDR:
 			ret = nvmf_parse_string_option(args, &opts->traddr);
@@ -873,27 +921,9 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
 			opts->fast_io_fail_tmo = token;
 			break;
 		case NVMF_OPT_HOSTNQN:
-			if (opts->host) {
-				pr_err("hostnqn already user-assigned: %s\n",
-				       opts->host->nqn);
-				ret = -EADDRINUSE;
-				goto out;
-			}
-			p = match_strdup(args);
-			if (!p) {
-				ret = -ENOMEM;
-				goto out;
-			}
-			nqnlen = strlen(p);
-			if (nqnlen >= NVMF_NQN_SIZE) {
-				pr_err("%s needs to be < %d bytes\n",
-					p, NVMF_NQN_SIZE);
-				kfree(p);
-				ret = -EINVAL;
+			ret = nvmf_parse_hostnqn(opts, args, hostnqn);
+			if (ret)
 				goto out;
-			}
-			strscpy(hostnqn, p, NVMF_NQN_SIZE);
-			kfree(p);
 			break;
 		case NVMF_OPT_RECONNECT_DELAY:
 			if (match_int(args, &token)) {
@@ -918,19 +948,9 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
 				goto out;
 			break;
 		case NVMF_OPT_HOST_ID:
-			p = match_strdup(args);
-			if (!p) {
-				ret = -ENOMEM;
-				goto out;
-			}
-			ret = uuid_parse(p, &hostid);
-			if (ret) {
-				pr_err("Invalid hostid %s\n", p);
-				ret = -EINVAL;
-				kfree(p);
+			ret = nvmf_parse_hostid(args, &hostid);
+			if (ret)
 				goto out;
-			}
-			kfree(p);
 			break;
 		case NVMF_OPT_DUP_CONNECT:
 			opts->duplicate_connect = true;
-- 
2.50.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.