Skip to content

Commit 0f45353

Browse files
committed
Merge tag 'nvme-6.19-2025-12-04' of git://git.infradead.org/nvme into block-6.19
Pull NVMe updates from Keith: "- Subsystem usage cleanups (Max) - Endpoint device fixes (Shin'ichiro) - Debug statements (Gerd) - FC fabrics cleanups and fixes (Daniel) - Consistent alloc API usages (Israel) - Code comment updates (Chu) - Authentication retry fix (Justin)" * tag 'nvme-6.19-2025-12-04' of git://git.infradead.org/nvme: nvme-fabrics: add ENOKEY to no retry criteria for authentication failures nvme-auth: use kvfree() for memory allocated with kvcalloc() nvmet-tcp: use kvcalloc for commands array nvmet-rdma: use kvcalloc for commands and responses arrays nvme: fix typo error in nvme target nvmet-fc: use pr_* print macros instead of dev_* nvmet-fcloop: remove unused lsdir member. nvmet-fcloop: check all request and response have been processed nvme-fc: check all request and response have been processed nvme-fc: don't hold rport lock when putting ctrl nvme-pci: add debug message on fail to read CSTS nvme-pci: print error message on failure in nvme_probe nvmet: pci-epf: fix DMA channel debug print nvmet: pci-epf: move DMA initialization to EPC init callback nvmet: remove redundant subsysnqn field from ctrl nvmet: add sanity checks when freeing subsystem
2 parents f7e3f85 + 1398920 commit 0f45353

14 files changed

Lines changed: 69 additions & 62 deletions

File tree

drivers/nvme/host/auth.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,7 @@ void nvme_auth_free(struct nvme_ctrl *ctrl)
11221122
if (ctrl->dhchap_ctxs) {
11231123
for (i = 0; i < ctrl_max_dhchaps(ctrl); i++)
11241124
nvme_auth_free_dhchap(&ctrl->dhchap_ctxs[i]);
1125-
kfree(ctrl->dhchap_ctxs);
1125+
kvfree(ctrl->dhchap_ctxs);
11261126
}
11271127
if (ctrl->host_key) {
11281128
nvme_auth_free_key(ctrl->host_key);

drivers/nvme/host/fabrics.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ bool nvmf_should_reconnect(struct nvme_ctrl *ctrl, int status)
592592
if (status > 0 && (status & NVME_STATUS_DNR))
593593
return false;
594594

595-
if (status == -EKEYREJECTED)
595+
if (status == -EKEYREJECTED || status == -ENOKEY)
596596
return false;
597597

598598
if (ctrl->opts->max_reconnects == -1 ||

drivers/nvme/host/fc.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,8 @@ nvme_fc_free_rport(struct kref *ref)
520520

521521
WARN_ON(rport->remoteport.port_state != FC_OBJSTATE_DELETED);
522522
WARN_ON(!list_empty(&rport->ctrl_list));
523+
WARN_ON(!list_empty(&rport->ls_req_list));
524+
WARN_ON(!list_empty(&rport->ls_rcv_list));
523525

524526
/* remove from lport list */
525527
spin_lock_irqsave(&nvme_fc_lock, flags);
@@ -1468,14 +1470,14 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport,
14681470
{
14691471
struct fcnvme_ls_disconnect_assoc_rqst *rqst =
14701472
&lsop->rqstbuf->rq_dis_assoc;
1471-
struct nvme_fc_ctrl *ctrl, *ret = NULL;
1473+
struct nvme_fc_ctrl *ctrl, *tmp, *ret = NULL;
14721474
struct nvmefc_ls_rcv_op *oldls = NULL;
14731475
u64 association_id = be64_to_cpu(rqst->associd.association_id);
14741476
unsigned long flags;
14751477

14761478
spin_lock_irqsave(&rport->lock, flags);
14771479

1478-
list_for_each_entry(ctrl, &rport->ctrl_list, ctrl_list) {
1480+
list_for_each_entry_safe(ctrl, tmp, &rport->ctrl_list, ctrl_list) {
14791481
if (!nvme_fc_ctrl_get(ctrl))
14801482
continue;
14811483
spin_lock(&ctrl->lock);
@@ -1488,7 +1490,9 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport,
14881490
if (ret)
14891491
/* leave the ctrl get reference */
14901492
break;
1493+
spin_unlock_irqrestore(&rport->lock, flags);
14911494
nvme_fc_ctrl_put(ctrl);
1495+
spin_lock_irqsave(&rport->lock, flags);
14921496
}
14931497

14941498
spin_unlock_irqrestore(&rport->lock, flags);

drivers/nvme/host/pci.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2984,6 +2984,7 @@ static int nvme_pci_enable(struct nvme_dev *dev)
29842984
pci_set_master(pdev);
29852985

29862986
if (readl(dev->bar + NVME_REG_CSTS) == -1) {
2987+
dev_dbg(dev->ctrl.device, "reading CSTS register failed\n");
29872988
result = -ENODEV;
29882989
goto disable;
29892990
}
@@ -3609,6 +3610,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
36093610
nvme_uninit_ctrl(&dev->ctrl);
36103611
out_put_ctrl:
36113612
nvme_put_ctrl(&dev->ctrl);
3613+
dev_err_probe(&pdev->dev, result, "probe failed\n");
36123614
return result;
36133615
}
36143616

drivers/nvme/target/admin-cmd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,7 @@ static void nvmet_execute_identify_ctrl(struct nvmet_req *req)
708708

709709
/*
710710
* We don't really have a practical limit on the number of abort
711-
* comands. But we don't do anything useful for abort either, so
711+
* commands. But we don't do anything useful for abort either, so
712712
* no point in allowing more abort commands than the spec requires.
713713
*/
714714
id->acl = 3;

drivers/nvme/target/auth.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,8 @@ int nvmet_auth_host_hash(struct nvmet_req *req, u8 *response,
381381
ret = crypto_shash_update(shash, buf, 1);
382382
if (ret)
383383
goto out;
384-
ret = crypto_shash_update(shash, ctrl->subsysnqn,
385-
strlen(ctrl->subsysnqn));
384+
ret = crypto_shash_update(shash, ctrl->subsys->subsysnqn,
385+
strlen(ctrl->subsys->subsysnqn));
386386
if (ret)
387387
goto out;
388388
ret = crypto_shash_final(shash, response);
@@ -429,7 +429,7 @@ int nvmet_auth_ctrl_hash(struct nvmet_req *req, u8 *response,
429429
}
430430

431431
transformed_key = nvme_auth_transform_key(ctrl->ctrl_key,
432-
ctrl->subsysnqn);
432+
ctrl->subsys->subsysnqn);
433433
if (IS_ERR(transformed_key)) {
434434
ret = PTR_ERR(transformed_key);
435435
goto out_free_tfm;
@@ -484,8 +484,8 @@ int nvmet_auth_ctrl_hash(struct nvmet_req *req, u8 *response,
484484
ret = crypto_shash_update(shash, "Controller", 10);
485485
if (ret)
486486
goto out;
487-
ret = crypto_shash_update(shash, ctrl->subsysnqn,
488-
strlen(ctrl->subsysnqn));
487+
ret = crypto_shash_update(shash, ctrl->subsys->subsysnqn,
488+
strlen(ctrl->subsys->subsysnqn));
489489
if (ret)
490490
goto out;
491491
ret = crypto_shash_update(shash, buf, 1);
@@ -575,7 +575,7 @@ void nvmet_auth_insert_psk(struct nvmet_sq *sq)
575575
return;
576576
}
577577
ret = nvme_auth_generate_digest(sq->ctrl->shash_id, psk, psk_len,
578-
sq->ctrl->subsysnqn,
578+
sq->ctrl->subsys->subsysnqn,
579579
sq->ctrl->hostnqn, &digest);
580580
if (ret) {
581581
pr_warn("%s: ctrl %d qid %d failed to generate digest, error %d\n",
@@ -590,8 +590,10 @@ void nvmet_auth_insert_psk(struct nvmet_sq *sq)
590590
goto out_free_digest;
591591
}
592592
#ifdef CONFIG_NVME_TARGET_TCP_TLS
593-
tls_key = nvme_tls_psk_refresh(NULL, sq->ctrl->hostnqn, sq->ctrl->subsysnqn,
594-
sq->ctrl->shash_id, tls_psk, psk_len, digest);
593+
tls_key = nvme_tls_psk_refresh(NULL, sq->ctrl->hostnqn,
594+
sq->ctrl->subsys->subsysnqn,
595+
sq->ctrl->shash_id, tls_psk, psk_len,
596+
digest);
595597
if (IS_ERR(tls_key)) {
596598
pr_warn("%s: ctrl %d qid %d failed to refresh key, error %ld\n",
597599
__func__, sq->ctrl->cntlid, sq->qid, PTR_ERR(tls_key));

drivers/nvme/target/core.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ EXPORT_SYMBOL_GPL(nvmet_wq);
4040
* - the nvmet_transports array
4141
*
4242
* When updating any of those lists/structures write lock should be obtained,
43-
* while when reading (popolating discovery log page or checking host-subsystem
43+
* while when reading (populating discovery log page or checking host-subsystem
4444
* link) read lock is obtained to allow concurrent reads.
4545
*/
4646
DECLARE_RWSEM(nvmet_config_sem);
@@ -1628,7 +1628,6 @@ struct nvmet_ctrl *nvmet_alloc_ctrl(struct nvmet_alloc_ctrl_args *args)
16281628
INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler);
16291629
INIT_DELAYED_WORK(&ctrl->ka_work, nvmet_keep_alive_timer);
16301630

1631-
memcpy(ctrl->subsysnqn, args->subsysnqn, NVMF_NQN_SIZE);
16321631
memcpy(ctrl->hostnqn, args->hostnqn, NVMF_NQN_SIZE);
16331632

16341633
kref_init(&ctrl->ref);
@@ -1903,6 +1902,8 @@ static void nvmet_subsys_free(struct kref *ref)
19031902
struct nvmet_subsys *subsys =
19041903
container_of(ref, struct nvmet_subsys, ref);
19051904

1905+
WARN_ON_ONCE(!list_empty(&subsys->ctrls));
1906+
WARN_ON_ONCE(!list_empty(&subsys->hosts));
19061907
WARN_ON_ONCE(!xa_empty(&subsys->namespaces));
19071908

19081909
nvmet_debugfs_subsys_free(subsys);

drivers/nvme/target/fc.c

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,7 @@ nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc)
490490
sizeof(*discon_rqst) + sizeof(*discon_acc) +
491491
tgtport->ops->lsrqst_priv_sz), GFP_KERNEL);
492492
if (!lsop) {
493-
dev_info(tgtport->dev,
494-
"{%d:%d} send Disconnect Association failed: ENOMEM\n",
493+
pr_info("{%d:%d}: send Disconnect Association failed: ENOMEM\n",
495494
tgtport->fc_target_port.port_num, assoc->a_id);
496495
return;
497496
}
@@ -513,8 +512,7 @@ nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc)
513512
ret = nvmet_fc_send_ls_req_async(tgtport, lsop,
514513
nvmet_fc_disconnect_assoc_done);
515514
if (ret) {
516-
dev_info(tgtport->dev,
517-
"{%d:%d} XMT Disconnect Association failed: %d\n",
515+
pr_info("{%d:%d}: XMT Disconnect Association failed: %d\n",
518516
tgtport->fc_target_port.port_num, assoc->a_id, ret);
519517
kfree(lsop);
520518
}
@@ -1187,8 +1185,7 @@ nvmet_fc_target_assoc_free(struct kref *ref)
11871185
if (oldls)
11881186
nvmet_fc_xmt_ls_rsp(tgtport, oldls);
11891187
ida_free(&tgtport->assoc_cnt, assoc->a_id);
1190-
dev_info(tgtport->dev,
1191-
"{%d:%d} Association freed\n",
1188+
pr_info("{%d:%d}: Association freed\n",
11921189
tgtport->fc_target_port.port_num, assoc->a_id);
11931190
kfree(assoc);
11941191
}
@@ -1224,8 +1221,7 @@ nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc)
12241221
flush_workqueue(assoc->queues[i]->work_q);
12251222
}
12261223

1227-
dev_info(tgtport->dev,
1228-
"{%d:%d} Association deleted\n",
1224+
pr_info("{%d:%d}: Association deleted\n",
12291225
tgtport->fc_target_port.port_num, assoc->a_id);
12301226

12311227
nvmet_fc_tgtport_put(tgtport);
@@ -1716,9 +1712,9 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
17161712
}
17171713

17181714
if (ret) {
1719-
dev_err(tgtport->dev,
1720-
"Create Association LS failed: %s\n",
1721-
validation_errors[ret]);
1715+
pr_err("{%d}: Create Association LS failed: %s\n",
1716+
tgtport->fc_target_port.port_num,
1717+
validation_errors[ret]);
17221718
iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
17231719
sizeof(*acc), rqst->w0.ls_cmd,
17241720
FCNVME_RJT_RC_LOGIC,
@@ -1730,8 +1726,7 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
17301726
atomic_set(&queue->connected, 1);
17311727
queue->sqhd = 0; /* best place to init value */
17321728

1733-
dev_info(tgtport->dev,
1734-
"{%d:%d} Association created\n",
1729+
pr_info("{%d:%d}: Association created\n",
17351730
tgtport->fc_target_port.port_num, iod->assoc->a_id);
17361731

17371732
/* format a response */
@@ -1809,9 +1804,9 @@ nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport,
18091804
}
18101805

18111806
if (ret) {
1812-
dev_err(tgtport->dev,
1813-
"Create Connection LS failed: %s\n",
1814-
validation_errors[ret]);
1807+
pr_err("{%d}: Create Connection LS failed: %s\n",
1808+
tgtport->fc_target_port.port_num,
1809+
validation_errors[ret]);
18151810
iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
18161811
sizeof(*acc), rqst->w0.ls_cmd,
18171812
(ret == VERR_NO_ASSOC) ?
@@ -1871,9 +1866,9 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
18711866
}
18721867

18731868
if (ret || !assoc) {
1874-
dev_err(tgtport->dev,
1875-
"Disconnect LS failed: %s\n",
1876-
validation_errors[ret]);
1869+
pr_err("{%d}: Disconnect LS failed: %s\n",
1870+
tgtport->fc_target_port.port_num,
1871+
validation_errors[ret]);
18771872
iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
18781873
sizeof(*acc), rqst->w0.ls_cmd,
18791874
(ret == VERR_NO_ASSOC) ?
@@ -1907,8 +1902,7 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
19071902
spin_unlock_irqrestore(&tgtport->lock, flags);
19081903

19091904
if (oldls) {
1910-
dev_info(tgtport->dev,
1911-
"{%d:%d} Multiple Disconnect Association LS's "
1905+
pr_info("{%d:%d}: Multiple Disconnect Association LS's "
19121906
"received\n",
19131907
tgtport->fc_target_port.port_num, assoc->a_id);
19141908
/* overwrite good response with bogus failure */
@@ -2051,26 +2045,26 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
20512045
struct fcnvme_ls_rqst_w0 *w0 = (struct fcnvme_ls_rqst_w0 *)lsreqbuf;
20522046

20532047
if (lsreqbuf_len > sizeof(union nvmefc_ls_requests)) {
2054-
dev_info(tgtport->dev,
2055-
"RCV %s LS failed: payload too large (%d)\n",
2048+
pr_info("{%d}: RCV %s LS failed: payload too large (%d)\n",
2049+
tgtport->fc_target_port.port_num,
20562050
(w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
20572051
nvmefc_ls_names[w0->ls_cmd] : "",
20582052
lsreqbuf_len);
20592053
return -E2BIG;
20602054
}
20612055

20622056
if (!nvmet_fc_tgtport_get(tgtport)) {
2063-
dev_info(tgtport->dev,
2064-
"RCV %s LS failed: target deleting\n",
2057+
pr_info("{%d}: RCV %s LS failed: target deleting\n",
2058+
tgtport->fc_target_port.port_num,
20652059
(w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
20662060
nvmefc_ls_names[w0->ls_cmd] : "");
20672061
return -ESHUTDOWN;
20682062
}
20692063

20702064
iod = nvmet_fc_alloc_ls_iod(tgtport);
20712065
if (!iod) {
2072-
dev_info(tgtport->dev,
2073-
"RCV %s LS failed: context allocation failed\n",
2066+
pr_info("{%d}: RCV %s LS failed: context allocation failed\n",
2067+
tgtport->fc_target_port.port_num,
20742068
(w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
20752069
nvmefc_ls_names[w0->ls_cmd] : "");
20762070
nvmet_fc_tgtport_put(tgtport);

drivers/nvme/target/fcloop.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,6 @@ struct fcloop_nport {
254254
struct fcloop_lsreq {
255255
struct nvmefc_ls_req *lsreq;
256256
struct nvmefc_ls_rsp ls_rsp;
257-
int lsdir; /* H2T or T2H */
258257
int status;
259258
struct list_head ls_list; /* fcloop_rport->ls_list */
260259
};
@@ -1111,8 +1110,10 @@ fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport)
11111110
rport->nport->rport = NULL;
11121111
spin_unlock_irqrestore(&fcloop_lock, flags);
11131112

1114-
if (put_port)
1113+
if (put_port) {
1114+
WARN_ON(!list_empty(&rport->ls_list));
11151115
fcloop_nport_put(rport->nport);
1116+
}
11161117
}
11171118

11181119
static void
@@ -1130,8 +1131,10 @@ fcloop_targetport_delete(struct nvmet_fc_target_port *targetport)
11301131
tport->nport->tport = NULL;
11311132
spin_unlock_irqrestore(&fcloop_lock, flags);
11321133

1133-
if (put_port)
1134+
if (put_port) {
1135+
WARN_ON(!list_empty(&tport->ls_list));
11341136
fcloop_nport_put(tport->nport);
1137+
}
11351138
}
11361139

11371140
#define FCLOOP_HW_QUEUES 4

drivers/nvme/target/nvmet.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,6 @@ struct nvmet_ctrl {
285285
__le32 *changed_ns_list;
286286
u32 nr_changed_ns;
287287

288-
char subsysnqn[NVMF_NQN_FIELD_LEN];
289288
char hostnqn[NVMF_NQN_FIELD_LEN];
290289

291290
struct device *p2p_client;

0 commit comments

Comments
 (0)