| From d9dc48733171532e16513ca9df716eca833b2f29 Mon Sep 17 00:00:00 2001 |
| From: Jinliang Wang <jinliangw@google.com> |
| Date: Thu, 5 Jan 2023 10:10:44 -0800 |
| Subject: [PATCH] mi: avoid changing default ep timeout during admin_passthru |
| |
| Before the fix, the timeout will only increase and will change the |
| default settings. After the fix, the timeout can be decrease and |
| also it won't change the default setttings. |
| |
| Also, we move nvme_mi_admin_admin_passthru to LIBNVME_MI_1_2 |
| In this way we can use "admin_passthru" in libnvme 1.2.0; |
| We can remove this change after upstream `libnvme` upgrades to 1.3.0 |
| |
| Signed-off-by: Jinliang Wang <jinliangw@google.com> |
| |
| Patch Tracking Bug: b/274912878 |
| Upstream info / review: N/A |
| Upstream-Status: Pending |
| Justification: bugfix |
| --- |
| src/libnvme-mi.map | 2 +- |
| src/nvme/mi.c | 19 ++++++++++++++----- |
| 2 files changed, 15 insertions(+), 6 deletions(-) |
| |
| diff --git a/src/libnvme-mi.map b/src/libnvme-mi.map |
| index 739f135..afee5a9 100644 |
| --- a/src/libnvme-mi.map |
| +++ b/src/libnvme-mi.map |
| @@ -1,7 +1,6 @@ |
| LIBNVME_MI_1_3 { |
| global: |
| nvme_mi_set_probe_enabled; |
| - nvme_mi_admin_admin_passthru; |
| }; |
| |
| LIBNVME_MI_1_2 { |
| @@ -15,6 +14,7 @@ LIBNVME_MI_1_2 { |
| nvme_mi_admin_fw_download; |
| nvme_mi_admin_fw_commit; |
| nvme_mi_status_to_string; |
| + nvme_mi_admin_admin_passthru; |
| }; |
| |
| LIBNVME_MI_1_1 { |
| diff --git a/src/nvme/mi.c b/src/nvme/mi.c |
| index 80330af..a41f786 100644 |
| --- a/src/nvme/mi.c |
| +++ b/src/nvme/mi.c |
| @@ -696,6 +696,7 @@ int nvme_mi_admin_admin_passthru(nvme_mi_ctrl_t ctrl, __u8 opcode, __u8 flags, |
| struct nvme_mi_admin_req_hdr req_hdr; |
| struct nvme_mi_resp resp; |
| struct nvme_mi_req req; |
| + unsigned int ori_timeout; |
| int rc; |
| int direction = opcode & 0x3; |
| bool has_write_data = false; |
| @@ -722,11 +723,6 @@ int nvme_mi_admin_admin_passthru(nvme_mi_ctrl_t ctrl, __u8 opcode, __u8 flags, |
| has_read_data = true; |
| } |
| |
| - if (timeout_ms > nvme_mi_ep_get_timeout(ctrl->ep)) { |
| - /* Set timeout if user needs a bigger timeout */ |
| - nvme_mi_ep_set_timeout(ctrl->ep, timeout_ms); |
| - } |
| - |
| nvme_mi_admin_init_req(&req, &req_hdr, ctrl->id, opcode); |
| req_hdr.cdw1 = cpu_to_le32(nsid); |
| req_hdr.cdw2 = cpu_to_le32(cdw2); |
| @@ -758,7 +754,20 @@ int nvme_mi_admin_admin_passthru(nvme_mi_ctrl_t ctrl, __u8 opcode, __u8 flags, |
| resp.data_len = data_len; |
| } |
| |
| + if (timeout_ms != 0) |
| + { |
| + /* User may forget to set timeout_ms, in this case |
| + * we will just use the default settings. |
| + */ |
| + ori_timeout = nvme_mi_ep_get_timeout(ctrl->ep); |
| + nvme_mi_ep_set_timeout(ctrl->ep, timeout_ms); |
| + } |
| rc = nvme_mi_submit(ctrl->ep, &req, &resp); |
| + if (timeout_ms != 0) |
| + { |
| + nvme_mi_ep_set_timeout(ctrl->ep, ori_timeout); |
| + } |
| + |
| if (rc) |
| return rc; |
| |
| -- |
| 2.42.0.283.g2d96d420d3-goog |
| |