Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP4
nvme-cli.22026
0003-nvme-discover-lookup-existing-persistent-c...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0003-nvme-discover-lookup-existing-persistent-controllers.patch of Package nvme-cli.22026
From: Hannes Reinecke <hare@suse.de> Date: Thu, 25 Feb 2021 17:12:20 +0100 Subject: [PATCH] nvme-discover: lookup existing persistent controllers References: 1179825 Git-commit: 14d0e0f7e0c1b420da65783881c064e49ac7d6d7 If persistent controller connections are present they should be preferred even if no --device option is given on the commandline. To avoid selecting a temporary non-persistent controller the 'kato' attribute is checked; any controller for which the attribute is '0' will be skipped. This logic is not applied on older kernels that don't support the 'kato' attribute. On these kernels, we just have to assume that the encountered discovery controller is persistent. Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin Wilck <mwilck@suse.de> --- fabrics.c | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-) --- a/fabrics.c +++ b/fabrics.c @@ -299,6 +299,7 @@ static bool ctrl_matches_connectargs(cha bool found = false; char *path, *addr; int ret; + bool persistent = true; ret = asprintf(&path, "%s/%s", SYS_NVME, name); if (ret < 0) @@ -311,7 +312,30 @@ static bool ctrl_matches_connectargs(cha cargs.trsvcid = parse_conn_arg(addr, ' ', conarg_trsvcid); cargs.host_traddr = parse_conn_arg(addr, ' ', conarg_host_traddr); - if (!strcmp(cargs.subsysnqn, args->subsysnqn) && + if (!strcmp(cargs.subsysnqn, NVME_DISC_SUBSYS_NAME)) { + char *kato_str = nvme_get_ctrl_attr(path, "kato"), *p; + unsigned int kato = 0; + + /* + * When looking up discovery controllers we have to skip + * any non-persistent controllers (ie those with a zero + * kato value). Otherwise the controller will vanish from + * underneath us as they are owned by another program. + * + * On older kernels, the 'kato' attribute isn't present. + * Assume a persistent controller for these installations. + */ + if (kato_str) { + kato = strtoul(kato_str, &p, 0); + if (p == kato_str) + kato = 0; + free(kato_str); + persistent = (kato != 0); + } + } + + if (persistent && + !strcmp(cargs.subsysnqn, args->subsysnqn) && !strcmp(cargs.transport, args->transport) && (!strcmp(cargs.traddr, args->traddr) || !strcmp(args->traddr, "none")) && @@ -1277,30 +1301,15 @@ static int do_discover(char *argstr, boo char *dev_name; int instance, numrec = 0, ret, err; int status = 0; + struct connect_args *cargs; - if (cfg.device) { - struct connect_args *cargs; - - cargs = extract_connect_args(argstr); - if (!cargs) - return -ENOMEM; - - /* - * if the cfg.device passed in matches the connect args - * cfg.device is left as-is - * else if there exists a controller that matches the - * connect args - * cfg.device is the matching ctrl name - * else if no ctrl matches the connect args - * cfg.device is set to null. This will attempt to - * create a new ctrl. - * endif - */ - if (!ctrl_matches_connectargs(cfg.device, cargs)) - cfg.device = find_ctrl_with_connectargs(cargs); + cargs = extract_connect_args(argstr); + if (!cargs) + return -ENOMEM; - free_connect_args(cargs); - } + if (!cfg.device || !ctrl_matches_connectargs(cfg.device, cargs)) + cfg.device = find_ctrl_with_connectargs(cargs); + free_connect_args(cargs); if (!cfg.device) { instance = add_ctrl(argstr);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor