From: Daniel Wagner Date: Fri, 8 Apr 2022 15:21:07 +0000 (+0200) Subject: fabrics: Create persistent controller using unique subsystem NQN X-Git-Tag: v2.0~4^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=94a71597b2176d1cd91365a20135d8cbe306e64a;p=users%2Fsagi%2Fnvme-cli.git fabrics: Create persistent controller using unique subsystem NQN Prefer unique subsystem NQN discovery controllers over well-known subsystem NQN when a persistent controller is created. Signed-off-by: Daniel Wagner --- diff --git a/fabrics.c b/fabrics.c index 6fe3f144..92c5312f 100644 --- a/fabrics.c +++ b/fabrics.c @@ -138,9 +138,9 @@ static int set_discovery_kato(struct nvme_fabrics_config *cfg) return tmo; } -static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h, - struct nvme_fabrics_config *cfg, - struct tr_config *trcfg) +static nvme_ctrl_t __create_discover_ctrl(nvme_root_t r, nvme_host_t h, + struct nvme_fabrics_config *cfg, + struct tr_config *trcfg) { nvme_ctrl_t c; int tmo, ret; @@ -167,6 +167,40 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h, return c; } +static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h, + struct nvme_fabrics_config *cfg, + struct tr_config *trcfg) +{ + nvme_ctrl_t c; + + c = __create_discover_ctrl(r, h, cfg, trcfg); + if (!persistent) + return c; + + /* Find out the name of discovery controller */ + struct nvme_id_ctrl id = { 0 }; + if (nvme_ctrl_identify(c, &id)) { + fprintf(stderr, "failed to identify controller, error %s\n", + nvme_strerror(errno)); + nvme_disconnect_ctrl(c); + nvme_free_ctrl(c); + return NULL; + } + + if (!strcmp(id.subnqn, NVME_DISC_SUBSYS_NAME)) + return c; + + /* + * The subsysnqn is not the well-known name. Prefer the unique + * subsysnqn over the well-known one. + */ + nvme_disconnect_ctrl(c); + nvme_free_ctrl(c); + + trcfg->subsysnqn = id.subnqn; + return __create_discover_ctrl(r, h, cfg, trcfg); +} + static void print_discovery_log(struct nvmf_discovery_log *log, int numrec) { int i;