From nobody Mon Sep 28 14:48:01 2026 Received: from smtpbgeu1.qq.com (smtpbgeu1.qq.com [52.59.177.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A9B625B083 for ; Fri, 21 Aug 2026 06:26:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=52.59.177.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293591; cv=none; b=eX0P0HBLasYj214/swEg6NyIwwm5sK/cmNSL1Scf0cWjaWOonnGTqGcixX5lxhgihNKlSELwH1bmkW+tpDh8ealZZ0R+iMfILf+6ko9yH/RSSPbMh2W07Lxl7okyQUW7Y3F1AoPNc+7Jtzgs12Edul/OK8LAB103tpVJwrjFrxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293591; c=relaxed/simple; bh=RO6AofboxOn6YJ5HKfoSPbdBujKTu+0xX/gPMyGHF2w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nca6KC59uiNrSKFlXj5nEiQ+aSXdFr+CaH19HUjqpBe+X7TMJGGf9UULVX2sZRJDH69HcGn1mX5yLX5/pYOy3qmg9/K4ffaQX3A+JGGEo96+bTksL50l+cqPOikobuyHj/DmTiKKYrQCZpYLR+e21N+Un/c2l2ZqwSuTOmmnJts= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=qUTfUQh9; arc=none smtp.client-ip=52.59.177.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="qUTfUQh9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1787293518; bh=2Og0KyKIRcwcNWzL7sgxkQgCGnoXn4SlRvqhOs0v5iM=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=qUTfUQh9y+rxAjwZBz1Q6YNNKIdKdsu/jqwbiTPf6p/tiLRZcNvk22A0GUwKQwMJx aBqQaW/wkgB2dlyddRhXiWTtT7+ExWhdGtaCpgcFd+5z2v8iees9RieMTN3ikgjcyc t27+DoRBrymr0sM8zqStANQNn/Kzoy45QeLBHdwA= X-QQ-mid: esmtpsz17t1787293501taaa2b643 X-QQ-Originating-IP: x6gQ2AWWWCoMIIX1SqhM5VE9JlsgiE9nPNywn4B4ONw= Received: from PEN202512010004 ( [113.57.152.160]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 21 Aug 2026 14:24:59 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 12837760092603042325 EX-QQ-RecipientCnt: 7 From: raoxu To: raoxu@uniontech.com Cc: axboe@kernel.dk, hch@lst.de, kbusch@kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me Subject: [PATCH nvme-7.3 1/4] nvme-fabrics: separate option tokenizer pointer Date: Fri, 21 Aug 2026 14:24:57 +0800 Message-ID: <646894DADB73C91B+20260821062457.1936240-1-raoxu@uniontech.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> References: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:uniontech.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NY6OurWw+pG/6qFfGLuI/RXFs62eJn5XVz9UnMN0/wXnOhHD95P2Tfbu g1Z5gCedOvcQw1Q3BLka7R53wsV/nd9AjByiHawexro4SmXPwSz/os/BzNXFLEis8P1GELU DGrcgdJsq1Zuz7Kg99Cy2r80nCHekMZeSry2L99t6dslcLeMHzUesETNARjmB4/iyegAE/M UZjRz/xvworYZLZEcuEEY5PFmGTSckZhXfTLu+IUFN+x+fex5RN7udjUzbNy9+d4xfTqCVB Zg7oHO0O5bNzDuVYuBVNHUTnABQvxDxQ/9Ufyl2X0+e+xsvXU+9BlmtEPck7il0EgWpjEEW cBPF5T5hyb+KQQRQaSaixNv+CzbX8vDS25JHTReVlncGkIIZ1Dps4EUqkfiG0HFU1l7PtjD Nf6YY77gGLUnmBQfxFBJyth0ra0jRpZm7O5VML2fgqDB3oPsRr5IFvDemWSHkyOE9fZbJUg Usa/mxNuvOR5oY95vULPWXh2tNUkMdE4xwkDfpESFt278a19xhUz8NxRxSGr9fYT1A5cyCz NLa9dBVh510e1vAajuR+GaVM41QD+FxDrvt+vI/BVqdMk9GCVCYCuO0y4zxM77Ieq41Ppje HivdUaiKV6DMchSOChbHHmj8POg8wUOzPiBqYJ+DM+uUSmfyZjjh7xGbXH7pR99522sgU/n rCj/N3lb79h5wX6Ynv9hMRBPCxC2XCCYBq0yEHawHcGieWGg1hr2ZqN9Tc4ePjYuK8WtjqY rZAHpt06mMBM3Is6pa0aMdKKeRrCVwf2KQFEaIpmfszMoDu2m///JApLzMWDYZNjUXkYzdp s6LZPe4qUyi+idgnKOzPvai+S+BxEDC1t6u+Va21eTrmoJhToynLuimIKX1D3210ehQRKfy lNJ4eRzd3YAwHjpC/tOMvXBXLdVG1SskO7ZlwBK8/iXjxOTj5aAkbzuGq1qeiiwXW/AnWuu CTur47/cZJ8/iRgeQWcAjPDt02KNuyV/7cmZSGk1Q1l5WXbQWDSLqxixSopQmIB2rUwszSW S0j+zJjLA7o72fGemHH4ZxUocQ9BnFzvUFVhPZfQgMoIHE9CmJTgHD8ojPT7uWZXcqoth9u qGB2gFgWTCHddLf487ns0c= X-QQ-XMRINFO: Mp0Kj//9VHAxzExpfF+O8yhSrljjwrznVg== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" From: Xu Rao nvmf_parse_options() currently uses p both for the option returned by strsep() and for strings allocated by match_strdup(). The former points into the temporary options buffer while the latter owns a separate allocation, so the same variable represents two different lifetimes. Introduce option for the current string token passed to match_token(). The existing p variable is then used only for the duplicated string values in this intermediate step and is removed as those allocations move into helpers in the following patches. The name option is intentional: options remains the backing buffer for the full request, option is one comma/newline-delimited entry, and token names the integer result returned by match_token(). This is a mechanical preparation with no functional change. Suggested-by: Christoph Hellwig Signed-off-by: Xu Rao Reviewed-by: Christoph Hellwig --- drivers/nvme/host/fabrics.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c index 59f823dfbbcc..1ec6da49167d 100644 --- a/drivers/nvme/host/fabrics.c +++ b/drivers/nvme/host/fabrics.c @@ -716,7 +716,7 @@ static int nvmf_parse_options(struct nvmf_ctrl_options = *opts, const char *buf) { substring_t args[MAX_OPT_ARGS]; - char *options, *o, *p; + char *options, *o, *option, *p; int token, ret =3D 0; size_t nqnlen =3D 0; int ctrl_loss_tmo =3D NVMF_DEF_CTRL_LOSS_TMO, key_id; @@ -747,11 +747,11 @@ static int nvmf_parse_options(struct nvmf_ctrl_option= s *opts, uuid_copy(&hostid, &nvmf_default_host->id); strscpy(hostnqn, nvmf_default_host->nqn, NVMF_NQN_SIZE); =20 - while ((p =3D strsep(&o, ",\n")) !=3D NULL) { - if (!*p) + while ((option =3D strsep(&o, ",\n")) !=3D NULL) { + if (!*option) continue; =20 - token =3D match_token(p, opt_tokens, args); + token =3D match_token(option, opt_tokens, args); opts->mask |=3D token; switch (token) { case NVMF_OPT_TRANSPORT: @@ -1068,7 +1068,7 @@ static int nvmf_parse_options(struct nvmf_ctrl_option= s *opts, break; default: pr_warn("unknown parameter or missing value '%s' in ctrl creation reque= st\n", - p); + option); ret =3D -EINVAL; goto out; } --=20 2.50.1 From nobody Mon Sep 28 14:48:01 2026 Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F39E31F9B1 for ; Fri, 21 Aug 2026 06:26:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.243.244.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293594; cv=none; b=YWH5/ctC9HHBd/C9wdbvj3twirCj8MelxE7MTISqSFBN7qwQYDZpE+FBIXkfKmQpuMIu7Z7L7b0StQZTSo7pMpa6108p+AqDWX7q8QN50f6ysLwaNOUcL4bARf4TbVI76BDkWFWpCeXh7lj4oNrhRnaM8qB3GZ57sVocxO9gm30= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293594; c=relaxed/simple; bh=wdCsmnfy+hTSwk7KQoPxW7t5zjrTbhaZJxcMBCUq7LI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IdH8jYyCljwae6x1VVmSBn7zcPRFknfXU9nTp0qFouyYEcY68CcEjGfo71VRHzk/UqdV/fkWMeFHQkjdhlPuPO9M+cFGHdjTEfVm8TMvGu0865dFwME2OwOvWLfWjadG0dnOB/oF2qZeFotL89VSlZFl6a0M+Qwzv7BoDwlxDVw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=l1eYOg2U; arc=none smtp.client-ip=54.243.244.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="l1eYOg2U" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1787293535; bh=3QlqMNx60UTUxllJ+Qyp5NymPpAR4Smbf+ePyHffzkM=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=l1eYOg2U6Es3vbJNDBA08gsQkNn38qd+6awHMZb5JrxgO6PZbqhP1nCsCsMxH7dPv 1BLkxKZbZriTLn5U2XQJs9cnerk+o7q9VpluhBKm3cDgAKaSGqhaMK9AZLZbVWv+re rmn6DHdoBMXXVltlhqdJ3pgdgIwsKOCB2qSAL2Lo= X-QQ-mid: esmtpsz11t1787293516td79ba5f2 X-QQ-Originating-IP: 4j3zO0GJ1AxMpZbB6hYX+yEvIhfuHChHn+0GEtdWy3c= Received: from PEN202512010004 ( [113.57.152.160]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 21 Aug 2026 14:25:14 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 16397503040138716712 EX-QQ-RecipientCnt: 7 From: raoxu To: raoxu@uniontech.com Cc: axboe@kernel.dk, hch@lst.de, kbusch@kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me Subject: [PATCH nvme-7.3 2/4] nvme-fabrics: add helper for owned string options Date: Fri, 21 Aug 2026 14:25:12 +0800 Message-ID: <124D3A0A7C82160A+20260821062512.1936554-1-raoxu@uniontech.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> References: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:uniontech.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: MeGVnsUF9M9xoRzn6QXntqAjV64dtPA9iopAi1KVpl1DKfP1TIFnu6TU 3HHTAxrKsPY+78tLoIStY3K0Yw4tYkgRyUGMMshhQaMxe6uULC6MiBbrc6OVjzgXFTe9Avs ws1/apa26lI/LQl+AzeXn3scHZ5vxZKaU4JYzHPeFKHCtWhfIXTe9qGTLppTKzx9xBy3+5V qs1rZgx13b8hYm9F+5bD2esozufAPA8M+cwV7inNDr72Tx09OgcoNXgfKEe4rwkc7FK17c1 fXEylu8ZVIUe9zn6aujf2iH14V2FAMsFj/5tg6lZeJNfdZ4L7WEXuE12KVBvkyWSZFlvANB d9LDFHBXzu7J+1DZQ5g1St/PiNPHQfD6Va12k19IRKWkDFhaq4t0KvXPIctGJObw+RBEPIe YXkJWFrlsqCe2uCdKHawPmkMNb4PRhJQAwIUoySf55SmSC+5/H41dg0YQP28wNVoODW/EOE qXbqT63ZS9GlNZqu/KtwHAoTtfynJTIh39yqZ173YVaBnTKVx5Ms4NK5n2e8uepxHxV2kL6 FOJLbuSgEJDwzjTCdCQdxxHSZQed0Dt6LTriwvGJLpHYhVaZM7hMdL7K80eYf3AgD/ELy1u J6o3Il+5jcitMbOV/TQW3FsU/yybUJkYYTYup577hzKfDL2ZH+ee5/06yWZrNZAD4oc5NLz sCCYamdvs5na7xDZ0RZ2ahncsW1KVNroTtYdrq+zdA0tCuAC/5fKvDL6bHbKFYTnVW8qFh1 +JErPerR3VnyH7rVdnm2QA2U2FjJBNEixy3L2HGwvF+RdPHchQgxBrDuPmufhcFDzfXlCEw yAPckCOnLMPWff8eUHi9BWCitTrApQmZY0QNhOBlH92V+aecUJVXTJsvhzf+jDNst5r9yOI MT9o3Snrd0EnyzJApa/q459RTjBoEtkrBtVRGIrLF7rbTTUTAG7wzCSfO4DH8DqPhQjXXo4 iKzLOCnkbG1j73Pzlq/G6EGlLNU+nGlMTwHGuKqv0Lvh3NX53jL8kadeHQp7nGOsM+dKDOY eDmAvQqDtKQqunVSI+9NdszHScGOxdGG7gOmIkygEUaySyZ7cN/dY511Fx9V7r9rrV3AopL GflWhc1+5KeflVD5u0PABkdmsrCJSa0WzL/mger2d/5 X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" From: Xu Rao Five string options -- transport, traddr, trsvcid, host_traddr and host_iface -- have exactly the same parsing and ownership rule: duplicate the matched value, free the previously stored string, and transfer the new allocation to the corresponding struct nvmf_ctrl_options field. Add nvmf_parse_string_option() for that common operation. The helper owns the match_strdup() result until it either fails or stores the new pointer in the destination field, keeping this simple allocation lifetime in one scope and removing five copies of the same sequence from nvmf_parse_options(). The helper is intentionally limited to direct string replacement. Options that need validation, conversion, or sensitive cleanup have different lifetime rules and are handled separately in the following patches. No functional change is intended. Suggested-by: Christoph Hellwig Signed-off-by: Xu Rao Reviewed-by: Christoph Hellwig Reviewed-by: Sagi Grimberg --- drivers/nvme/host/fabrics.c | 53 ++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c index 1ec6da49167d..aab3fd279d0e 100644 --- a/drivers/nvme/host/fabrics.c +++ b/drivers/nvme/host/fabrics.c @@ -712,6 +712,19 @@ static const match_table_t opt_tokens =3D { { NVMF_OPT_ERR, NULL } }; =20 +static int nvmf_parse_string_option(substring_t *args, char **dst) +{ + char *value; + + value =3D match_strdup(args); + if (!value) + return -ENOMEM; + + kfree(*dst); + *dst =3D value; + return 0; +} + static int nvmf_parse_options(struct nvmf_ctrl_options *opts, const char *buf) { @@ -755,13 +768,9 @@ static int nvmf_parse_options(struct nvmf_ctrl_options= *opts, opts->mask |=3D token; switch (token) { case NVMF_OPT_TRANSPORT: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; + ret =3D nvmf_parse_string_option(args, &opts->transport); + if (ret) goto out; - } - kfree(opts->transport); - opts->transport =3D p; break; case NVMF_OPT_NQN: p =3D match_strdup(args); @@ -783,22 +792,14 @@ static int nvmf_parse_options(struct nvmf_ctrl_option= s *opts, NVME_DISC_SUBSYS_NAME)); break; case NVMF_OPT_TRADDR: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; + ret =3D nvmf_parse_string_option(args, &opts->traddr); + if (ret) goto out; - } - kfree(opts->traddr); - opts->traddr =3D p; break; case NVMF_OPT_TRSVCID: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; + ret =3D nvmf_parse_string_option(args, &opts->trsvcid); + if (ret) goto out; - } - kfree(opts->trsvcid); - opts->trsvcid =3D p; break; case NVMF_OPT_QUEUE_SIZE: if (match_int(args, &token)) { @@ -907,22 +908,14 @@ static int nvmf_parse_options(struct nvmf_ctrl_option= s *opts, opts->reconnect_delay =3D token; break; case NVMF_OPT_HOST_TRADDR: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; + ret =3D nvmf_parse_string_option(args, &opts->host_traddr); + if (ret) goto out; - } - kfree(opts->host_traddr); - opts->host_traddr =3D p; break; case NVMF_OPT_HOST_IFACE: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; + ret =3D nvmf_parse_string_option(args, &opts->host_iface); + if (ret) goto out; - } - kfree(opts->host_iface); - opts->host_iface =3D p; break; case NVMF_OPT_HOST_ID: p =3D match_strdup(args); --=20 2.50.1 From nobody Mon Sep 28 14:48:01 2026 Received: from smtpbgsg2.qq.com (smtpbgsg2.qq.com [54.254.200.128]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 14ED131F9B1 for ; Fri, 21 Aug 2026 06:26:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.254.200.128 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293608; cv=none; b=M/Q4pYylI7eVAOWjBjo6xvx2kQtkHoB22rUSNhZHL4DCWMphDMVVxOfCIZFdmyYzXRY4mRoMzTV2R/yU2lOcznPtlSypgn2Sws2JFxfdXh1XYLzmrNEvHetjSkQ2OKtnQx5NOu0R/JEMl5Rc/95O84AN5xuxqyOuIk+esARIXkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293608; c=relaxed/simple; bh=itL144c5Hoeb/IXWCVvfUlx6sZSGdVCpzWRNlH0wzk4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s7WJtWNWA0ov/xRMkKCi0xGRf4i91ngZvzsTn7VLxBFfVOKbFlrXilk1P1Rp8B9RcHnmnPu9cZM4/msBowYJ9qRjiCSveKkOx4zUbWraMUlclrqHmn/mAKB4AsNOk1r9zJMD436L5xmEfDLCJOqyU6NZJXJPIlUoDK7FLsZnMys= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=h/F6nGTT; arc=none smtp.client-ip=54.254.200.128 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="h/F6nGTT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1787293550; bh=oc0tsd/qnr+dthL6cOQcW19IpqD6NfIrrZqh8QhIXEg=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=h/F6nGTTnDlRfSwT99NSzb9mdHHCk5lGBw49aidB01WnkGJd2hGYRQOQAsT4gMkjp KO2D3toBpnZ4PMYGYY9cgaFIH7FWLOVbp487du1VZH/cMS5+AwBpebqdYat6nYNIVc l6FvQDgG5t2TRbqcoGX8MUB/OatzVlQU/2l4jmJ0= X-QQ-mid: zesmtpgz1t1787293533ta406d61f X-QQ-Originating-IP: uwIlmkkzJUjEBE79/V03SyRLT8QgDw41hxHM3xRMWb4= Received: from PEN202512010004 ( [113.57.152.160]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 21 Aug 2026 14:25:31 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 1572066740897638065 EX-QQ-RecipientCnt: 7 From: raoxu To: raoxu@uniontech.com Cc: axboe@kernel.dk, hch@lst.de, kbusch@kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me Subject: [PATCH nvme-7.3 3/4] nvme-fabrics: add helpers for subsystem and host identity options Date: Fri, 21 Aug 2026 14:25:28 +0800 Message-ID: <450E21059686C852+20260821062529.1936914-1-raoxu@uniontech.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> References: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:uniontech.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: NG63YEgwc4yzgqZn6HjyULnIgTGCKrRz7kjDzRkiN6Yw5Sg0YOGv6qGn 6rNill24PE1rocqkyceZrABwv7jS5mWZk638dAZpUZY75yunsDV06yFMr5NF4KePNCnKgaU p31z4+3YFRAjGR/53iY96Hi2uISL9QbdRA083164+NdXTXB1N0VuuR+8FwvvK0ah8AgKTyZ H/O576DExy1hiTnvouWXWXWwLcb2opNgvyELpGB3AiGnLLWxE7ocNMX1KM/XBUtwFTuMBoQ uswVgBUkBRN2VdGHsLC18BpsMn6HJ6WfnmELABSDcV43s9/1yDiSL3EGGqKIzR/hmQido1s 46sGvgSeoZFzcxhCJ2KYIF4JjPry6ujI17ycv3TW/kGEjuvyGH0qAVU1Ga4dhG4dNZ/Cqs4 I2YTWLecvpXFh/x+EFsuWnSuCOCCsdaSvnj0UdFZLGMcVGImv4TF29ZT+GAEDCUdF+en4hr q1AbJDEl8vbhOrKl2jI8KxV+NRSN9dcSbzqgOtyVxmNJND3RjJTEvl3XBR3wMueLwIhNNK8 IvwmQn4mrHS3JewuIs262/wr7z0Cf+khjLmAjaF5c4rN4Kbh/nkIB+gFsR8vLazxnC4/0QT NeIY+muW5k57pwzgVwWz9Nw8vW3MJuRxixUaimlgU/6QCveRUpQnb12Yvc7HhrD99MKMIce hgguQ5UF/iT/V5OKvgQlaRkL7h75LxGbmdrkJz3VlNHml/y33OHUWvhQlzbfgvd7Io1FH3U kYVzA+fvp1UB9XEVHxbYdN7/Vt3qNzKV3cwt+8hFoGJJoi/+N7IPooiRQflZLJ7Wl6aXHli S6WyXpd3DhW4lN7AbbOovRGmZOtMrhjtJtWmv68x7dj9wAnxEfp65RybjQAcgOxm0e5nJwz KedXnW4eLanuHWUVDsunCYcKdJIR7OD5AIvbwxaN0nDCYZIUBb8x8fmkbNgd0m4J8Afgw6p c8FMWo89IaUsVK95gC+Kc3aC1FX0DjAmg752qM+O1qogBpOuQ4dcvMVCZ7g27irYvAnrLzb LPhB6zt4r/NYilqSNkWRvEj3RmhjRO4Oce/lJKMrwccIxZIs590yci3MjEt8FXER93TrF+E g== X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" From: Xu Rao 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 Signed-off-by: Xu Rao --- 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; } =20 +static int nvmf_parse_subsysnqn(struct nvmf_ctrl_options *opts, substring_= t *args) +{ + char *nqn; + + nqn =3D match_strdup(args); + if (!nqn) + return -ENOMEM; + + kfree(opts->subsysnqn); + opts->subsysnqn =3D nqn; + if (strlen(opts->subsysnqn) >=3D NVMF_NQN_SIZE) { + pr_err("%s needs to be < %d bytes\n", + opts->subsysnqn, NVMF_NQN_SIZE); + return -EINVAL; + } + + opts->discovery_nqn =3D !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 =3D match_strdup(args); + if (!nqn) + return -ENOMEM; + + if (strlen(nqn) >=3D 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 =3D match_strdup(args); + if (!id) + return -ENOMEM; + + ret =3D uuid_parse(id, hostid); + if (ret) { + pr_err("Invalid hostid %s\n", id); + ret =3D -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 =3D 0; - size_t nqnlen =3D 0; int ctrl_loss_tmo =3D 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 =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; - goto out; - } - kfree(opts->subsysnqn); - opts->subsysnqn =3D p; - nqnlen =3D strlen(opts->subsysnqn); - if (nqnlen >=3D NVMF_NQN_SIZE) { - pr_err("%s needs to be < %d bytes\n", - opts->subsysnqn, NVMF_NQN_SIZE); - ret =3D -EINVAL; + ret =3D nvmf_parse_subsysnqn(opts, args); + if (ret) goto out; - } - opts->discovery_nqn =3D - !(strcmp(opts->subsysnqn, - NVME_DISC_SUBSYS_NAME)); break; case NVMF_OPT_TRADDR: ret =3D 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 =3D token; break; case NVMF_OPT_HOSTNQN: - if (opts->host) { - pr_err("hostnqn already user-assigned: %s\n", - opts->host->nqn); - ret =3D -EADDRINUSE; - goto out; - } - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; - goto out; - } - nqnlen =3D strlen(p); - if (nqnlen >=3D NVMF_NQN_SIZE) { - pr_err("%s needs to be < %d bytes\n", - p, NVMF_NQN_SIZE); - kfree(p); - ret =3D -EINVAL; + ret =3D 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 =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; - goto out; - } - ret =3D uuid_parse(p, &hostid); - if (ret) { - pr_err("Invalid hostid %s\n", p); - ret =3D -EINVAL; - kfree(p); + ret =3D nvmf_parse_hostid(args, &hostid); + if (ret) goto out; - } - kfree(p); break; case NVMF_OPT_DUP_CONNECT: opts->duplicate_connect =3D true; --=20 2.50.1 From nobody Mon Sep 28 14:48:01 2026 Received: from smtpbgeu1.qq.com (smtpbgeu1.qq.com [52.59.177.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 466FC413221 for ; Fri, 21 Aug 2026 06:27:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=52.59.177.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293625; cv=none; b=LwQUGE4qobAON7e1MwCv4Z4lHnFwEq1x3UvaAuNRuym0ePl+DKb7slEh2VYcUiRMUImUGf6ejAnNFdETy5ZinfqFg6s7dRPo6c7LSLSX+dELN2bakerqT0LWvHQQjxwI9yg9OtWg3jV1rH/VnQsvpEPVEkL7dQVg2awKps88+gY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787293625; c=relaxed/simple; bh=pnD9OYF7KtRDyki2mERQ1+hl829T67kt+d8WLcKRBzw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZSsshB4USALo3Cj5Yp+QOQIaSjhYpXGewZ+yar4+qNsW5NcMN5/EqEteZErpdRMT1JOPbk00k90RzIDUbiaDEAoLR2vASU1urvzIftKImcDgbSI9pFGg+TRoMA54mY7sK2Inb9KFELx3niaovQKt6mV+2JI0Of5nAGEuOxzgV60= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=UR+izRl7; arc=none smtp.client-ip=52.59.177.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="UR+izRl7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1787293567; bh=RWzGCrm7qwozn+BjRtmwbFoze9nSI/1rSh5OULkuuDM=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=UR+izRl7DBxkX4TvjHt+ozvUrECNTSfSB49sF9lhCaisHxOxxHkyDy8mgNYRPVdP7 x58pnsqamk5ia3bT0WhElAXvwLNwk5Un3sPJu6rIrjQztfN43zgREEPUNCu0kLe/X9 F1Qyo2MS6eDd2oKLJLA85S/aq65tVeOcMyzQd4oY= X-QQ-mid: esmtpsz11t1787293550t274c0705 X-QQ-Originating-IP: H9GmbDhSKjY/GbPN1KK9g9t4qWjKdRaBzchfeG9HLao= Received: from PEN202512010004 ( [113.57.152.160]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 21 Aug 2026 14:25:48 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 3144338888302720829 EX-QQ-RecipientCnt: 7 From: raoxu To: raoxu@uniontech.com Cc: axboe@kernel.dk, hch@lst.de, kbusch@kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me Subject: [PATCH nvme-7.3 4/4] nvme-fabrics: add helper for DH-CHAP secret options Date: Fri, 21 Aug 2026 14:25:45 +0800 Message-ID: X-Mailer: git-send-email 2.50.1 In-Reply-To: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> References: <29BB44C32FF06823+20260821062142.1932160-1-raoxu@uniontech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:uniontech.com:qybglogicsvrgz:qybglogicsvrgz6b-0 X-QQ-XMAILINFO: Mf+wQkWJ2TuY2H5GETP/gumjVOYOp/YPMvZ8+rPjXgQQ2Q0zlouit7CP HANefwQq8sHM4ug/0ZeY7+Ll7p5ebOHvlCboGywndXnQLWBgyC8w9XFDYAXpKBsHSEIum5e pnIPCp+WUf7Lcu+fj8fhRa7Sj5ku8AP+eAa4kh3YVUm1Gm6WdRJpqSSRFF200+MdOvTcHXF sOWe9os8hJ/k3Rexm4O6PtRaAqG6fjVBpRq2jfbCxM88dxex3n2mDQ5a39AQV1S7nE1Ttly 8btlm8t6paeesG8Fx+JZlybice+yctMMw8ZTII4KyCxFjYZ/arpYMjGgNyrAPPDmEhDpScB t5ZIWyzL69NhGDMghyPGD6GrHu9XcMjots/8zMWxq2DmKU6v6Sal+gQzPvD3NFVn4GNZfFd GuEzuUxrFVvfzxUxLaHI/6qRggAU729HQewzNjBPUrxAsq871h1d9rdLujl1qxa5rwGGD76 3h9+TGITMecNWCvf56f8d2XpnWlQOzXm+IfsePvKeQXgRB4Oq/Bc39fJhb7754aRcYvpH3P 2yKyxF3o/XTZRcoj91YjeYsMmzwRMbgUC3EjIhCrLMf98oW5W1KQ2oRSgDWURFM0DyMM1Q4 VFJTHKpw2hGa0mPGRcG03iYXM0jvZe/X6knMzu3SLefYfFE8Sw6X5ovi3iRNIHg9ikDjFm0 n9XnIFQLQt7FYJT4868OuJli9CSDh/3bqKXPHHZxlNQLY+uAzXJVsDpS4d/Bz+W0Z/LyCSD 8ByRCDbipCQCVS07skVWxF9b+bIoXn01bVcd7GB+pdd8JIj/ekaiQXNAh62hmXWYKHyHL3/ bZGoSnK2IjPrXsX+pJZX3P5QffEiVULgBfD4XP6G1msp4EgDFBCPt4Dt/ybRApCPcUPmsa8 QxDB7CEeuMqCj/Vaq1UlpLmOWR6+W6DEx8n5DJoscwr8E8YiITPk7RLGbLUzh6geUNydgUd jO8IWZdCFNOsjwCIJkHar45d6w89PYrrUBhZ9s07WN3+spQd1CKC61fXpZlQqXxaWm1kb+j B166q9SdpgvN5GuoOATjGxm/pwPrLL2+4EikVJyQlU19PyU5+Oh4SkNxGsn20= X-QQ-XMRINFO: NS+P29fieYNwqS3WCnRCOn9D1NpZuCnCRA== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" From: Xu Rao The dhchap_secret and dhchap_ctrl_secret options have a distinct string lifetime because their values are authentication material. The temporary string must be checked for the DHHC-1 representation and discarded with kfree_sensitive() when validation fails before ownership is transferred. Add nvmf_parse_dhchap_secret() to keep match_strdup(), DHHC-1 validation, failure cleanup, replacement of the old value and successful ownership transfer in one scope. Both secret options use the same helper because their parsing and ownership rules are identical. Keep the existing replacement semantics for an already stored valid secret; this patch only moves the parsing and temporary allocation lifetime into the helper. No functional change is intended. Suggested-by: Christoph Hellwig Signed-off-by: Xu Rao Reviewed-by: Christoph Hellwig Reviewed-by: Sagi Grimberg --- drivers/nvme/host/fabrics.c | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c index 120e57964cdd..c5ff03ab9e36 100644 --- a/drivers/nvme/host/fabrics.c +++ b/drivers/nvme/host/fabrics.c @@ -788,11 +788,30 @@ static int nvmf_parse_hostid(substring_t *args, uuid_= t *hostid) return ret; } =20 +static int nvmf_parse_dhchap_secret(substring_t *args, char **secret) +{ + char *value; + + value =3D match_strdup(args); + if (!value) + return -ENOMEM; + + if (strlen(value) < 11 || strncmp(value, "DHHC-1:", 7)) { + pr_err("Invalid DH-CHAP secret %s\n", value); + kfree_sensitive(value); + return -EINVAL; + } + + kfree(*secret); + *secret =3D value; + return 0; +} + static int nvmf_parse_options(struct nvmf_ctrl_options *opts, const char *buf) { substring_t args[MAX_OPT_ARGS]; - char *options, *o, *option, *p; + char *options, *o, *option; int token, ret =3D 0; int ctrl_loss_tmo =3D NVMF_DEF_CTRL_LOSS_TMO, key_id; uuid_t hostid; @@ -1034,34 +1053,15 @@ static int nvmf_parse_options(struct nvmf_ctrl_opti= ons *opts, opts->discovery_nqn =3D true; break; case NVMF_OPT_DHCHAP_SECRET: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; - goto out; - } - if (strlen(p) < 11 || strncmp(p, "DHHC-1:", 7)) { - pr_err("Invalid DH-CHAP secret %s\n", p); - kfree_sensitive(p); - ret =3D -EINVAL; + ret =3D nvmf_parse_dhchap_secret(args, &opts->dhchap_secret); + if (ret) goto out; - } - kfree(opts->dhchap_secret); - opts->dhchap_secret =3D p; break; case NVMF_OPT_DHCHAP_CTRL_SECRET: - p =3D match_strdup(args); - if (!p) { - ret =3D -ENOMEM; - goto out; - } - if (strlen(p) < 11 || strncmp(p, "DHHC-1:", 7)) { - pr_err("Invalid DH-CHAP secret %s\n", p); - kfree_sensitive(p); - ret =3D -EINVAL; + ret =3D nvmf_parse_dhchap_secret(args, + &opts->dhchap_ctrl_secret); + if (ret) goto out; - } - kfree(opts->dhchap_ctrl_secret); - opts->dhchap_ctrl_secret =3D p; break; case NVMF_OPT_TLS: if (!IS_ENABLED(CONFIG_NVME_TCP_TLS)) { --=20 2.50.1