Skip to content

Commit 22c96c0

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. The same issue existed across all vendor plugins (wdc, zns, scaleflux, micron, memblaze, lm, intel, solidigm, feat, sandisk, ocp, netapp, toshiba, transcend, innogrit, dera). 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 22c96c0

17 files changed

Lines changed: 103 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);

plugins/dera/dera-nvme.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ static int nvme_dera_get_device_status(struct libnvme_transport_handle *hdl, enu
108108
.cdw12 = 0x104,
109109
};
110110

111+
cmd.timeout_ms = nvme_args.timeout;
111112
err = libnvme_submit_admin_passthru(hdl, &cmd);
112113
if (!err && result)
113114
*result = cmd.result;

plugins/feat/feat-nvme.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ static int temp_thresh_set(struct libnvme_transport_handle *hdl, const __u8 fid,
405405
sel = NVME_GET_FEATURES_SEL_SAVED;
406406

407407
nvme_init_get_features_temp_thresh(&cmd, sel, cfg->tmpsel, cfg->thsel);
408+
cmd.timeout_ms = nvme_args.timeout;
408409
err = libnvme_submit_admin_passthru(hdl, &cmd);
409410
if (!err) {
410411
nvme_feature_decode_temp_threshold(cmd.result, &tmpth,
@@ -417,6 +418,7 @@ static int temp_thresh_set(struct libnvme_transport_handle *hdl, const __u8 fid,
417418

418419
nvme_init_set_features_temp_thresh(&cmd, sv, cfg->tmpth, cfg->tmpsel,
419420
cfg->thsel, cfg->tmpthh);
421+
cmd.timeout_ms = nvme_args.timeout;
420422
err = libnvme_submit_admin_passthru(hdl, &cmd);
421423
if (err) {
422424
nvme_show_err(err, "Set %s", temp_thresh_feat);
@@ -487,6 +489,7 @@ static int arbitration_set(struct libnvme_transport_handle *hdl, const __u8 fid,
487489
sel = NVME_GET_FEATURES_SEL_SAVED;
488490

489491
nvme_init_get_features_arbitration(&cmd, sel);
492+
cmd.timeout_ms = nvme_args.timeout;
490493
err = libnvme_submit_admin_passthru(hdl, &cmd);
491494
if (!err) {
492495
nvme_feature_decode_arbitration(cmd.result, &ab,
@@ -503,6 +506,7 @@ static int arbitration_set(struct libnvme_transport_handle *hdl, const __u8 fid,
503506

504507
nvme_init_set_features_arbitration(&cmd, sv, cfg->ab, cfg->lpw,
505508
cfg->mpw, cfg->hpw);
509+
cmd.timeout_ms = nvme_args.timeout;
506510
err = libnvme_submit_admin_passthru(hdl, &cmd);
507511
if (err) {
508512
nvme_show_err(err, "Set %s", arbitration_feat);
@@ -915,6 +919,7 @@ static int num_queues_set(struct libnvme_transport_handle *hdl, const __u8 fid,
915919
sel = NVME_GET_FEATURES_SEL_SAVED;
916920

917921
nvme_init_get_features_num_queues(&cmd, sel);
922+
cmd.timeout_ms = nvme_args.timeout;
918923
err = libnvme_submit_admin_passthru(hdl, &cmd);
919924
if (!err) {
920925
nvme_feature_decode_number_of_queues(cmd.result, &nsqr, &ncqr);

plugins/innogrit/innogrit-nvme.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ static int nvme_vucmd(struct libnvme_transport_handle *hdl, unsigned char opcode
3636
cmd.nsid = 0xffffffff;
3737
cmd.addr = (__u64)(__u64)(uintptr_t)data;
3838
cmd.data_len = data_len;
39+
cmd.timeout_ms = nvme_args.timeout;
3940
return libnvme_submit_admin_passthru(hdl, &cmd);
4041
}
4142

plugins/intel/intel-nvme.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,7 @@ static int read_entire_cmd(struct libnvme_passthru_cmd *cmd, int total_size,
12341234

12351235
dword_tfer = min(max_tfer, total_size);
12361236
while (total_size > 0) {
1237+
cmd->timeout_ms = nvme_args.timeout;
12371238
err = libnvme_submit_admin_passthru(hdl, cmd);
12381239
if (err) {
12391240
fprintf(stderr,

plugins/lm/lm-nvme.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ static int lm_create_cdq(int argc, char **argv, struct command *acmd, struct plu
109109

110110
nvme_init_lm_cdq_create(&cmd, NVME_SET(cfg.qt, LM_QT),
111111
cfg.cntlid, cfg.sz, queue);
112+
cmd.timeout_ms = nvme_args.timeout;
112113
err = libnvme_submit_admin_passthru(hdl, &cmd);
113114
if (err < 0)
114115
nvme_show_error("ERROR: nvme_lm_cdq() failed: %s", libnvme_strerror(errno));
@@ -147,6 +148,7 @@ static int lm_delete_cdq(int argc, char **argv, struct command *acmd, struct plu
147148
return err;
148149

149150
nvme_init_lm_cdq_delete(&cmd, 0, cfg.cdqid);
151+
cmd.timeout_ms = nvme_args.timeout;
150152
err = libnvme_submit_admin_passthru(hdl, &cmd);
151153
if (err < 0)
152154
nvme_show_error("ERROR: nvme_lm_cdq() failed: %s", libnvme_strerror(errno));
@@ -230,6 +232,7 @@ static int lm_track_send(int argc, char **argv, struct command *acmd, struct plu
230232
}
231233

232234
nvme_init_lm_track_send(&cmd, cfg.sel, cfg.mos, cfg.cdqid);
235+
cmd.timeout_ms = nvme_args.timeout;
233236
err = libnvme_submit_admin_passthru(hdl, &cmd);
234237
if (err < 0)
235238
nvme_show_error("ERROR: nvme_lm_track_send() failed %s", libnvme_strerror(errno));
@@ -377,6 +380,7 @@ static int lm_migration_send(int argc, char **argv, struct command *acmd, struct
377380
cfg.stype, cfg.dudmq, cfg.csvi, cfg.csuuidi,
378381
cfg.offset, cfg.uidx, data,
379382
(cfg.numd << 2));
383+
cmd.timeout_ms = nvme_args.timeout;
380384
err = libnvme_submit_admin_passthru(hdl, &cmd);
381385
if (err < 0)
382386
nvme_show_error("ERROR: nvme_lm_migration_send() failed %s", libnvme_strerror(errno));
@@ -485,6 +489,7 @@ static int lm_migration_recv(int argc, char **argv, struct command *acmd, struct
485489
nvme_init_lm_migration_recv(&cmd, cfg.offset, mos, cfg.cntlid,
486490
cfg.csuuidi, cfg.sel, cfg.uidx, 0, data,
487491
(cfg.numd + 1) << 2);
492+
cmd.timeout_ms = nvme_args.timeout;
488493
err = libnvme_submit_admin_passthru(hdl, &cmd);
489494
if (err < 0)
490495
nvme_show_error("ERROR: nvme_lm_migration_recv() failed %s", libnvme_strerror(errno));

plugins/memblaze/memblaze-nvme.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ static int memblaze_fw_commit(struct libnvme_transport_handle *hdl, int select)
736736
.cdw12 = select,
737737
};
738738

739+
cmd.timeout_ms = nvme_args.timeout;
739740
return libnvme_submit_admin_passthru(hdl, &cmd);
740741
}
741742

@@ -840,6 +841,7 @@ static int mb_selective_download(int argc, char **argv, struct command *acmd, st
840841
perror("fw-download");
841842
goto out_free;
842843
}
844+
cmd.timeout_ms = nvme_args.timeout;
843845
err = libnvme_submit_admin_passthru(hdl, &cmd);
844846
if (err < 0) {
845847
perror("fw-download");

0 commit comments

Comments
 (0)