From: Chaitanya Kulkarni <kch@nvidia.com>
To: <hare@suse.de>
Cc: <hch@lst.de>, <sagi@grimberg.me>,
<linux-nvme@lists.infradead.org>, <kbusch@kernel.org>,
Chaitanya Kulkarni <kch@nvidia.com>
Subject: [PATCH V3 2/3] nvmet_auth: use common helper for buffer alloc
Date: Mon, 5 Jun 2023 02:19:19 -0700 [thread overview]
Message-ID: <20230605091920.34253-3-kch@nvidia.com> (raw)
In-Reply-To: <20230605091920.34253-1-kch@nvidia.com>
Add a common helper to factor out buffer allocation in
nvmet_execute_auth_send() and nvmet_execute_auth_receive() and call it
from nvmet_auth_common_prep() once we done with the secp/spsp0/spsp1
check.
Only functional change in this patch is transfer buffer allocation is
moved before nvmet_check_transfer_len() and it is freed if when
nvmet_check_transfer_len() fails. But similar allocation and free is
used in error unwind path in nvme code and it is not in fast path, so
it shuold be fine.
Signed-off-by: Chaitanya Kulkarni <kch@nvidia.com>
---
drivers/nvme/target/fabrics-cmd-auth.c | 37 ++++++++++++++------------
1 file changed, 20 insertions(+), 17 deletions(-)
diff --git a/drivers/nvme/target/fabrics-cmd-auth.c b/drivers/nvme/target/fabrics-cmd-auth.c
index 847aa12d2915..dbcae93bd25c 100644
--- a/drivers/nvme/target/fabrics-cmd-auth.c
+++ b/drivers/nvme/target/fabrics-cmd-auth.c
@@ -12,7 +12,20 @@
#include <crypto/kpp.h>
#include "nvmet.h"
-static u16 nvmet_auth_common_prep(struct nvmet_req *req)
+static u16 nvmet_auth_alloc_transfer_buffer(struct nvmet_req *req, void **buf,
+ u32 *len)
+{
+ *len = le32_to_cpu(req->cmd->auth_receive.al);
+ if (!*len) {
+ req->error_loc = offsetof(struct nvmf_auth_receive_command, al);
+ return NVME_SC_INVALID_FIELD | NVME_SC_DNR;
+ }
+ *buf = kmalloc(*len, GFP_KERNEL);
+ return *buf ? NVME_SC_SUCCESS : NVME_SC_INTERNAL;
+}
+
+static u16 nvmet_auth_common_prep(struct nvmet_req *req, void **buf,
+ u32 *len)
{
if (req->cmd->auth_send.secp != NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER) {
req->error_loc = offsetof(struct nvmf_auth_send_command, secp);
@@ -26,7 +39,8 @@ static u16 nvmet_auth_common_prep(struct nvmet_req *req)
req->error_loc = offsetof(struct nvmf_auth_send_command, spsp1);
return NVME_SC_INVALID_FIELD | NVME_SC_DNR;
}
- return NVME_SC_SUCCESS;
+
+ return nvmet_auth_alloc_transfer_buffer(req, buf, len);
}
static void nvmet_auth_expired_work(struct work_struct *work)
@@ -204,28 +218,16 @@ void nvmet_execute_auth_send(struct nvmet_req *req)
u32 tl;
u16 status;
- status = nvmet_auth_common_prep(req);
+ status = nvmet_auth_common_prep(req, &d, &tl);
if (status)
goto done;
- tl = le32_to_cpu(req->cmd->auth_send.tl);
- if (!tl) {
- status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
- req->error_loc =
- offsetof(struct nvmf_auth_send_command, tl);
- goto done;
- }
if (!nvmet_check_transfer_len(req, tl)) {
pr_debug("%s: transfer length mismatch (%u)\n", __func__, tl);
+ kfree(d);
return;
}
- d = kmalloc(tl, GFP_KERNEL);
- if (!d) {
- status = NVME_SC_INTERNAL;
- goto done;
- }
-
status = nvmet_copy_from_sgl(req, 0, d, tl);
if (status)
goto done_kfree;
@@ -437,7 +439,7 @@ void nvmet_execute_auth_receive(struct nvmet_req *req)
u32 al;
u16 status;
- status = nvmet_auth_common_prep(req);
+ status = nvmet_auth_common_prep(req, &d, &al);
if (status)
goto done;
al = le32_to_cpu(req->cmd->auth_receive.al);
@@ -449,6 +451,7 @@ void nvmet_execute_auth_receive(struct nvmet_req *req)
}
if (!nvmet_check_transfer_len(req, al)) {
pr_debug("%s: transfer length mismatch (%u)\n", __func__, al);
+ kfree(d);
return;
}
--
2.40.0
next prev parent reply other threads:[~2023-06-05 9:20 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-05 9:19 [PATCH V3 0/3] nvmet-auth: auth send / receive cleanup Chaitanya Kulkarni
2023-06-05 9:19 ` [PATCH V3 1/3] nvmet-auth: use common helper to check secp/spsp Chaitanya Kulkarni
2023-06-05 21:56 ` Sagi Grimberg
2023-06-07 10:59 ` Max Gurtovoy
2023-06-05 9:19 ` Chaitanya Kulkarni [this message]
2023-06-05 22:02 ` [PATCH V3 2/3] nvmet_auth: use common helper for buffer alloc Sagi Grimberg
2023-06-08 12:41 ` Max Gurtovoy
2023-06-05 9:19 ` [PATCH V3 3/3] nvmet-auth: use correct type for status variable Chaitanya Kulkarni
2023-06-05 22:27 ` Sagi Grimberg
2023-06-05 9:24 ` [PATCH V3 0/3] nvmet-auth: auth send / receive cleanup Chaitanya Kulkarni
2023-06-05 22:27 ` Sagi Grimberg
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=20230605091920.34253-3-kch@nvidia.com \
--to=kch@nvidia.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
/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.