[PATCH 3/3] nvmet: include all configured ports in the discovery log page
Hannes Reinecke
hare at suse.de
Thu Apr 7 03:48:08 PDT 2022
When a per-port discovery subsystem is used we should include
all configured ports in the discovery log page, not just that one
through which the controller was connected.
Signed-off-by: Hannes Reinecke <hare at suse.de>
---
drivers/nvme/target/discovery.c | 52 ++++++++++++++++++++++++++-------
1 file changed, 41 insertions(+), 11 deletions(-)
diff --git a/drivers/nvme/target/discovery.c b/drivers/nvme/target/discovery.c
index e3d8cc407a94..6d414096d09a 100644
--- a/drivers/nvme/target/discovery.c
+++ b/drivers/nvme/target/discovery.c
@@ -152,10 +152,19 @@ static size_t discovery_log_entries(struct nvmet_req *req)
if (req->port->disc_subsys == nvmet_disc_subsys)
entries++;
- list_for_each_entry(p, &req->port->subsystems, entry) {
- if (!nvmet_host_allowed(p->subsys, ctrl->hostnqn))
- continue;
- entries++;
+ list_for_each_entry(r, nvmet_ports, global_entry) {
+ if (req->port->disc_subsys == nvmet_disc_subsys) {
+ if (r != req->port)
+ continue;
+ } else {
+ if (ctrl->subsys != r->disc_subsys)
+ continue;
+ }
+ list_for_each_entry(p, &r->subsystems, entry) {
+ if (!nvmet_host_allowed(p->subsys, ctrl->hostnqn))
+ continue;
+ entries++;
+ }
}
list_for_each_entry(r, &req->port->referrals, entry)
entries++;
@@ -219,14 +228,35 @@ static void nvmet_execute_disc_get_log_page(struct nvmet_req *req)
numrec++;
}
- list_for_each_entry(p, &req->port->subsystems, entry) {
- if (!nvmet_host_allowed(p->subsys, ctrl->hostnqn))
- continue;
+ list_for_each_entry(r, nvmet_ports, global_entry) {
+ nvmet_set_disc_traddr(req, r, traddr);
- nvmet_format_discovery_entry(hdr, req->port,
- p->subsys->subsysnqn, traddr,
- p->subsys->type, numrec);
- numrec++;
+ if (req->port->disc_subsys == nvmet_disc_subsys) {
+ /*
+ * Present information about the port to which
+ * the controller is connected.
+ */
+ if (r != req->port)
+ continue;
+ } else {
+ /*
+ * If a per-port discovery subsystem is used present
+ * information about all ports into which the
+ * same discovery subsystem is linked.
+ */
+ if (ctrl->subsys != r->disc_subsys)
+ continue;
+ }
+
+ list_for_each_entry(p, &r->subsystems, entry) {
+ if (!nvmet_host_allowed(p->subsys, ctrl->hostnqn))
+ continue;
+
+ nvmet_format_discovery_entry(hdr, r,
+ p->subsys->subsysnqn, traddr,
+ p->subsys->type, numrec);
+ numrec++;
+ }
}
list_for_each_entry(r, &req->port->referrals, entry) {
--
2.29.2
More information about the Linux-nvme
mailing list