Skip to content

Commit 4fc98fe

Browse files
darkfiberiruclaude
andcommitted
nvme: apply user-specified timeout to all admin passthru commands
The --timeout / -t flag is parsed into nvme_args.timeout but was only applied to format-nvm and admin-passthru. All other commands that use nvme_init_*() helpers followed by libnvme_submit_admin_passthru() had their timeout_ms left at 0 (memset by the init functions), silently falling back to the kernel's admin_timeout (60s). This meant commands like delete-ns, create-ns, attach-ns, detach-ns, sanitize, fw-download, fw-commit, device-self-test, security-send, security-receive, capacity-mgmt, and all identify passthru commands ignored the user-supplied timeout. Set cmd.timeout_ms = nvme_args.timeout after every nvme_init_*() call and before submission. When -t is not given, nvme_args.timeout is NVME_DEFAULT_IOCTL_TIMEOUT (0), preserving the existing kernel-default behavior. Signed-off-by: Nick Wolff <[email protected]> Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
1 parent 80d8492 commit 4fc98fe

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

nvme.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,7 @@ static int get_effects_log(int argc, char **argv, struct command *acmd, struct p
11091109
munmap_registers(bar);
11101110
} else {
11111111
nvme_init_get_property(&cmd, NVME_REG_CAP);
1112+
cmd.timeout_ms = nvme_args.timeout;
11121113
err = libnvme_submit_admin_passthru(hdl, &cmd);
11131114
if (err)
11141115
goto cleanup_list;
@@ -2679,6 +2680,7 @@ static int list_ctrl(int argc, char **argv, struct command *acmd, struct plugin
26792680
nvme_init_identify_ns_ctrl_list(&cmd, cfg.namespace_id,
26802681
cfg.cntid, cntlist);
26812682

2683+
cmd.timeout_ms = nvme_args.timeout;
26822684
err = libnvme_submit_admin_passthru(hdl, &cmd);
26832685
if (err) {
26842686
nvme_show_err(err, "id controller list");
@@ -2862,6 +2864,7 @@ static int id_endurance_grp_list(int argc, char **argv, struct command *acmd,
28622864

28632865
nvme_init_identify_endurance_group_id(&cmd, cfg.endgrp_id,
28642866
endgrp_list);
2867+
cmd.timeout_ms = nvme_args.timeout;
28652868
err = libnvme_submit_admin_passthru(hdl, &cmd);
28662869
if (err) {
28672870
nvme_show_err(err, "Id endurance group list");
@@ -2959,6 +2962,7 @@ static int delete_ns(int argc, char **argv, struct command *acmd, struct plugin
29592962
}
29602963

29612964
nvme_init_ns_mgmt_delete(&cmd, cfg.namespace_id);
2965+
cmd.timeout_ms = nvme_args.timeout;
29622966
if (cfg.ish) {
29632967
if (libnvme_transport_handle_is_mi(hdl))
29642968
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -3053,6 +3057,7 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s
30533057
else
30543058
nvme_init_ns_detach_ctrls(&cmd, cfg.nsid, cntlist);
30553059

3060+
cmd.timeout_ms = nvme_args.timeout;
30563061
if (cfg.ish) {
30573062
if (libnvme_transport_handle_is_mi(hdl))
30583063
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -3420,6 +3425,7 @@ static int create_ns(int argc, char **argv, struct command *acmd, struct plugin
34203425
data->phndl[i] = cpu_to_le16(phndl[i]);
34213426

34223427
nvme_init_ns_mgmt_create(&cmd, cfg.csi, data);
3428+
cmd.timeout_ms = nvme_args.timeout;
34233429
if (cfg.ish) {
34243430
if (libnvme_transport_handle_is_mi(hdl))
34253431
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -3676,6 +3682,7 @@ static int nvm_id_ctrl(int argc, char **argv, struct command *acmd,
36763682
return -ENOMEM;
36773683

36783684
nvme_init_identify_csi_ctrl(&cmd, NVME_CSI_NVM, ctrl_nvm);
3685+
cmd.timeout_ms = nvme_args.timeout;
36793686
err = libnvme_submit_admin_passthru(hdl, &cmd);
36803687
if (err) {
36813688
nvme_show_err(err, "nvm identify controller");
@@ -3968,6 +3975,7 @@ static int id_ns(int argc, char **argv, struct command *acmd, struct plugin *plu
39683975

39693976
if (cfg.force) {
39703977
nvme_init_identify_allocated_ns(&cmd, cfg.namespace_id, ns);
3978+
cmd.timeout_ms = nvme_args.timeout;
39713979
err = libnvme_submit_admin_passthru(hdl, &cmd);
39723980
} else {
39733981
err = nvme_identify_ns(hdl, cfg.namespace_id, ns);
@@ -4044,6 +4052,7 @@ static int cmd_set_independent_id_ns(int argc, char **argv, struct command *acmd
40444052

40454053
nvme_init_identify_csi_independent_identify_id_ns(&cmd,
40464054
cfg.namespace_id, ns);
4055+
cmd.timeout_ms = nvme_args.timeout;
40474056
err = libnvme_submit_admin_passthru(hdl, &cmd);
40484057
if (err) {
40494058
nvme_show_err(err,
@@ -4137,6 +4146,7 @@ static int id_nvmset(int argc, char **argv, struct command *acmd, struct plugin
41374146

41384147
nvme_init_identify_nvmset_list(&cmd, NVME_NSID_NONE,
41394148
cfg.nvmset_id, nvmset);
4149+
cmd.timeout_ms = nvme_args.timeout;
41404150
err = libnvme_submit_admin_passthru(hdl, &cmd);
41414151
if (err) {
41424152
nvme_show_err(err, "identify nvm set list");
@@ -4250,6 +4260,7 @@ static int id_iocs(int argc, char **argv, struct command *acmd, struct plugin *p
42504260
return -ENOMEM;
42514261

42524262
nvme_init_identify_command_set_structure(&cmd, cfg.cntid, iocs);
4263+
cmd.timeout_ms = nvme_args.timeout;
42534264
err = libnvme_submit_admin_passthru(hdl, &cmd);
42544265
if (err) {
42554266
nvme_show_err(err, "NVMe Identify I/O Command Set");
@@ -4302,6 +4313,7 @@ static int id_domain(int argc, char **argv, struct command *acmd, struct plugin
43024313
return -ENOMEM;
43034314

43044315
nvme_init_identify_domain_list(&cmd, cfg.dom_id, id_domain);
4316+
cmd.timeout_ms = nvme_args.timeout;
43054317
err = libnvme_submit_admin_passthru(hdl, &cmd);
43064318
if (err) {
43074319
nvme_show_err(err, "NVMe Identify Domain List");
@@ -4396,6 +4408,7 @@ static int virtual_mgmt(int argc, char **argv, struct command *acmd, struct plug
43964408
return err;
43974409

43984410
nvme_init_virtual_mgmt(&cmd, cfg.act, cfg.rt, cfg.cntlid, cfg.nr);
4411+
cmd.timeout_ms = nvme_args.timeout;
43994412
err = libnvme_submit_admin_passthru(hdl, &cmd);
44004413
if (err) {
44014414
nvme_show_err(err, "virt-mgmt");
@@ -4454,6 +4467,7 @@ static int primary_ctrl_caps(int argc, char **argv, struct command *acmd, struct
44544467
return -ENOMEM;
44554468

44564469
nvme_init_identify_primary_ctrl_cap(&cmd, cfg.cntlid, caps);
4470+
cmd.timeout_ms = nvme_args.timeout;
44574471
err = libnvme_submit_admin_passthru(hdl, &cmd);
44584472
if (err) {
44594473
nvme_show_err(err, "identify primary controller capabilities");
@@ -4513,6 +4527,7 @@ static int list_secondary_ctrl(int argc, char **argv, struct command *acmd, stru
45134527
return -ENOMEM;
45144528

45154529
nvme_init_identify_secondary_ctrl_list(&cmd, cfg.cntid, sc_list);
4530+
cmd.timeout_ms = nvme_args.timeout;
45164531
err = libnvme_submit_admin_passthru(hdl, &cmd);
45174532
if (err) {
45184533
nvme_show_err(err, "id secondary controller list");
@@ -4609,6 +4624,7 @@ static void abort_self_test(struct libnvme_transport_handle *hdl, bool ish,
46094624
int err;
46104625

46114626
nvme_init_dev_self_test(&cmd, nsid, NVME_DST_STC_ABORT);
4627+
cmd.timeout_ms = nvme_args.timeout;
46124628
if (ish) {
46134629
if (libnvme_transport_handle_is_mi(hdl))
46144630
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -4702,6 +4718,7 @@ static int device_self_test(int argc, char **argv, struct command *acmd, struct
47024718
}
47034719

47044720
nvme_init_dev_self_test(&cmd, cfg.namespace_id, cfg.stc);
4721+
cmd.timeout_ms = nvme_args.timeout;
47054722
if (cfg.ish) {
47064723
if (libnvme_transport_handle_is_mi(hdl))
47074724
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -5042,6 +5059,7 @@ static int fw_download_single(struct libnvme_transport_handle *hdl, void *fw_buf
50425059
if (err)
50435060
return err;
50445061

5062+
cmd.timeout_ms = nvme_args.timeout;
50455063
err = libnvme_submit_admin_passthru(hdl, &cmd);
50465064
if (!err)
50475065
return 0;
@@ -5400,6 +5418,7 @@ static int fw_commit(int argc, char **argv, struct command *acmd, struct plugin
54005418
}
54015419

54025420
nvme_init_fw_commit(&cmd, cfg.slot, cfg.action, cfg.bpid);
5421+
cmd.timeout_ms = nvme_args.timeout;
54035422
if (cfg.ish) {
54045423
if (libnvme_transport_handle_is_mi(hdl))
54055424
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -5621,6 +5640,7 @@ static int sanitize_cmd(int argc, char **argv, struct command *acmd, struct plug
56215640

56225641
nvme_init_sanitize_nvm(&cmd, cfg.sanact, cfg.ause, cfg.owpass,
56235642
cfg.oipbp, cfg.no_dealloc, cfg.emvs, cfg.ovrpat);
5643+
cmd.timeout_ms = nvme_args.timeout;
56245644
if (cfg.ish) {
56255645
if (libnvme_transport_handle_is_mi(hdl))
56265646
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -5716,6 +5736,7 @@ static int sanitize_ns_cmd(int argc, char **argv, struct command *acmd,
57165736
}
57175737

57185738
nvme_init_sanitize_ns(&cmd, cfg.sanact, cfg.ause, cfg.emvs);
5739+
cmd.timeout_ms = nvme_args.timeout;
57195740
if (cfg.ish) {
57205741
if (libnvme_transport_handle_is_mi(hdl))
57215742
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -5738,6 +5759,7 @@ static int nvme_get_single_property(struct libnvme_transport_handle *hdl,
57385759
int err;
57395760

57405761
nvme_init_get_property(&cmd, cfg->offset);
5762+
cmd.timeout_ms = nvme_args.timeout;
57415763
err = libnvme_submit_admin_passthru(hdl, &cmd);
57425764
if (!err) {
57435765
*value = cmd.result;
@@ -5992,6 +6014,7 @@ static int get_register_properties(struct libnvme_transport_handle *hdl, void **
59926014
continue;
59936015

59946016
nvme_init_get_property(&cmd, offset);
6017+
cmd.timeout_ms = nvme_args.timeout;
59956018
err = libnvme_submit_admin_passthru(hdl, &cmd);
59966019
if (nvme_status_equals(err, NVME_STATUS_TYPE_NVME, NVME_SC_INVALID_FIELD)) {
59976020
value = -1;
@@ -6192,6 +6215,7 @@ static int nvme_set_single_property(struct libnvme_transport_handle *hdl, int of
61926215
int err;
61936216

61946217
nvme_init_set_property(&cmd, offset, value);
6218+
cmd.timeout_ms = nvme_args.timeout;
61956219
err = libnvme_submit_admin_passthru(hdl, &cmd);
61966220
if (err) {
61976221
nvme_show_err(err, "set-property");
@@ -7092,6 +7116,7 @@ static int sec_send(int argc, char **argv, struct command *acmd, struct plugin *
70927116

70937117
nvme_init_security_send(&cmd, cfg.namespace_id, cfg.nssf, cfg.spsp,
70947118
cfg.secp, cfg.tl, sec_buf, cfg.tl);
7119+
cmd.timeout_ms = nvme_args.timeout;
70957120
if (cfg.ish) {
70967121
if (libnvme_transport_handle_is_mi(hdl))
70977122
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -7223,6 +7248,7 @@ static int dir_send(int argc, char **argv, struct command *acmd, struct plugin *
72237248
nvme_init_directive_send(&cmd, cfg.namespace_id, cfg.doper, cfg.dtype,
72247249
cfg.dspec, buf, cfg.data_len);
72257250
cmd.cdw12 = dw12;
7251+
cmd.timeout_ms = nvme_args.timeout;
72267252
err = libnvme_submit_admin_passthru(hdl, &cmd);
72277253
if (err) {
72287254
nvme_show_err(err, "dir-send");
@@ -8837,6 +8863,7 @@ static int sec_recv(int argc, char **argv, struct command *acmd, struct plugin *
88378863

88388864
nvme_init_security_receive(&cmd, cfg.namespace_id, cfg.nssf, cfg.spsp,
88398865
cfg.secp, cfg.al, sec_buf, cfg.size);
8866+
cmd.timeout_ms = nvme_args.timeout;
88408867
err = libnvme_submit_admin_passthru(hdl, &cmd);
88418868
if (err) {
88428869
nvme_show_err(err, "security receive");
@@ -8921,6 +8948,7 @@ static int get_lba_status(int argc, char **argv, struct command *acmd,
89218948

89228949
nvme_init_get_lba_status(&cmd, cfg.namespace_id, cfg.slba, cfg.mndw,
89238950
cfg.atype, cfg.rl, buf);
8951+
cmd.timeout_ms = nvme_args.timeout;
89248952
if (cfg.ish) {
89258953
if (libnvme_transport_handle_is_mi(hdl))
89268954
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -8998,6 +9026,7 @@ static int capacity_mgmt(int argc, char **argv, struct command *acmd, struct plu
89989026

89999027
nvme_init_capacity_mgmt(&cmd, cfg.operation, cfg.element_id,
90009028
(__u64)cfg.dw12 << 32 | cfg.dw11);
9029+
cmd.timeout_ms = nvme_args.timeout;
90019030
if (cfg.ish) {
90029031
if (libnvme_transport_handle_is_mi(hdl))
90039032
nvme_init_mi_cmd_flags(&cmd, ish);
@@ -9121,6 +9150,7 @@ static int dir_receive(int argc, char **argv, struct command *acmd, struct plugi
91219150
nvme_init_directive_recv(&cmd, cfg.namespace_id, cfg.doper, cfg.dtype,
91229151
cfg.dspec, buf, cfg.data_len);
91239152
cmd.cdw12 = dw12;
9153+
cmd.timeout_ms = nvme_args.timeout;
91249154
err = libnvme_submit_admin_passthru(hdl, &cmd);
91259155
if (err) {
91269156
nvme_show_err(err, "dir-receive");
@@ -9213,6 +9243,7 @@ static int lockdown_cmd(int argc, char **argv, struct command *acmd, struct plug
92139243

92149244
nvme_init_lockdown(&cmd, cfg.scp, cfg.prhbt, cfg.ifc, cfg.ofi,
92159245
cfg.uuid);
9246+
cmd.timeout_ms = nvme_args.timeout;
92169247
err = libnvme_submit_admin_passthru(hdl, &cmd);
92179248
if (err) {
92189249
nvme_show_err(err, "lockdown");
@@ -10515,6 +10546,7 @@ static int libnvme_mi(int argc, char **argv, __u8 admin_opcode, const char *desc
1051510546
.cdw13 = cfg.nmd1,
1051610547
.addr = (__u64)(uintptr_t)data,
1051710548
.data_len = cfg.data_len,
10549+
.timeout_ms = nvme_args.timeout,
1051810550
};
1051910551

1052010552
err = libnvme_submit_admin_passthru(hdl, &cmd);

0 commit comments

Comments
 (0)