File 0017-connect-all-add-m-matching-option.patch of Package nvme-cli.20931

From: Martin Wilck <mwilck@suse.com>
Date: Wed, 29 Apr 2020 19:03:57 +0200
Subject: connect-all: add -m/--matching option
References: bsc#1186719
Git-commit: a58556cc3022ec443f0db4a5218d8e2bfb3be481

Discovery controllers often return discovery records that belong
to a different traddr than the discovery controller itself, like here:

nvme discover -t fc \
   --host-traddr=nn-0x20000090fae06325:pn-0x10000090fae06325 \
   --traddr=nn-0x200900a09890f5bf:pn-0x200a00a09890f5bf

Discovery Log Number of Records 2, Generation counter 25
=====Discovery Log Entry 0======
trtype:  fc
adrfam:  fibre-channel
subtype: nvme subsystem
treq:    not specified
portid:  0
trsvcid: none
subnqn:  nqn...
traddr:  nn-0x200900a09890f5bf:pn-0x200b00a09890f5bf
=====Discovery Log Entry 1======
trtype:  fc
adrfam:  fibre-channel
subtype: nvme subsystem
treq:    not specified
portid:  1
trsvcid: none
subnqn:  nqn...
traddr:  nn-0x200900a09890f5bf:pn-0x200a00a09890f5bf

Note that the traddr of record 0 matches the traddr used for the
discovery, while that of record 1 does not.

For NVMeoF-autoconnect, this means that connection attempts will
be made multiple times (the two records above will also be returned
for a discovery on nn-0x200900a09890f5bf:pn-0x200b00a09890f5bf),
which is unnecessary and leads to lots of confusing error messages
in the system log.

Add an option "-m / --matching" to the "nvme connect-all" command
that causes nvme to connect only those discovery entries that match
the traddr given on the command line.
---
 fabrics.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

--- a/fabrics.c
+++ b/fabrics.c
@@ -80,6 +80,7 @@ static struct config {
 	int  data_digest;
 	bool persistent;
 	bool quiet;
+	bool matching_only;
 } cfg = { NULL };
 
 struct connect_args {
@@ -1117,6 +1118,17 @@ static int connect_ctrl(struct nvmf_disc
 	return ret;
 }
 
+static bool should_connect(struct nvmf_disc_rsp_page_entry *entry)
+{
+	int len;
+
+	if (!cfg.matching_only || !cfg.traddr)
+		return true;
+
+	len = space_strip_len(NVMF_TRADDR_SIZE, entry->traddr);
+	return !strncmp(cfg.traddr, entry->traddr, len);
+}
+
 static int connect_ctrls(struct nvmf_disc_rsp_page_hdr *log, int numrec)
 {
 	int i;
@@ -1124,6 +1136,9 @@ static int connect_ctrls(struct nvmf_dis
 	int ret = 0;
 
 	for (i = 0; i < numrec; i++) {
+		if (!should_connect(&log->entries[i]))
+			continue;
+
 		instance = connect_ctrl(&log->entries[i]);
 
 		/* clean success */
@@ -1322,6 +1337,7 @@ int discover(const char *desc, int argc,
 		OPT_INT("queue-size",      'Q', &cfg.queue_size,      "number of io queue elements to use (default 128)"),
 		OPT_FLAG("persistent",     'p', &cfg.persistent,      "persistent discovery connection"),
 		OPT_FLAG("quiet",          'S', &cfg.quiet,           "suppress already connected errors"),
+		OPT_FLAG("matching",       'm', &cfg.matching_only,   "connect only records matching the traddr"),
 		OPT_END()
 	};
 
openSUSE Build Service is sponsored by