[bug report] most of blktests nvme/ failed on the latest linux tree

Shinichiro Kawasaki shinichiro.kawasaki at wdc.com
Fri Jun 30 01:48:55 PDT 2023


On Jun 29, 2023 / 09:40, Daniel Wagner wrote:
> On Wed, Jun 28, 2023 at 08:25:24AM +0000, Shinichiro Kawasaki wrote:
> > I looked in nvme-cli code. When it generates hostnqn, it does not set hostid.
> > A quick dirty patch below for nvme-cli avoided the failures for nvme_trtype=loop
> > condition. If this is the fix approach, the kernel commit will need
> > corresponding change in the nvme-cli side.
> > 
> > 
> > diff --git a/fabrics.c b/fabrics.c
> > index ac240cad..f1981206 100644
> > --- a/fabrics.c
> > +++ b/fabrics.c
> > @@ -753,8 +753,13 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
> >  	hostid_arg = hostid;
> >  	if (!hostnqn)
> >  		hostnqn = hnqn = nvmf_hostnqn_from_file();
> > -	if (!hostnqn)
> > +	if (!hostnqn) {
> > +		char *uuid;
> >  		hostnqn = hnqn = nvmf_hostnqn_generate();
> > +		uuid = strstr(hostnqn, "uuid:");
> > +		if (uuid)
> > +			hostid = hid = strdup(uuid + strlen("uuid:"));
> > +	}
> >  	if (!hostid)
> >  		hostid = hid = nvmf_hostid_from_file();
> >  	h = nvme_lookup_host(r, hostnqn, hostid);
> > @@ -966,8 +971,13 @@ int nvmf_connect(const char *desc, int argc, char **argv)
> >  
> >  	if (!hostnqn)
> >  		hostnqn = hnqn = nvmf_hostnqn_from_file();
> > -	if (!hostnqn)
> > +	if (!hostnqn) {
> > +		char *uuid;
> >  		hostnqn = hnqn = nvmf_hostnqn_generate();
> > +		uuid = strstr(hostnqn, "uuid:");
> > +		if (uuid)
> > +			hostid = hid = strdup(uuid + strlen("uuid:"));
> > +	}
> >  	if (!hostid)
> >  		hostid = hid = nvmf_hostid_from_file();
> >  	h = nvme_lookup_host(r, hostnqn, hostid);
> 
> Looks reasonable. Though I would propably also add a warning iff
> nvmf_hostid_from_file() does return a not matching hostid.

Thanks for the comment. I revised the patch as below, and it looks working.
The blktests failures are already fixed, but I still think this fix in nvme-
cli will avoid confusions. Will post as a formal patch later.

diff --git a/fabrics.c b/fabrics.c
index ac240cad..2eeea48c 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -677,6 +677,26 @@ static int nvme_read_volatile_config(nvme_root_t r)
 	return ret;
 }
 
+char *nvmf_hostid_from_hostnqn(const char *hostnqn)
+{
+	const char *uuid;
+	const char *hostid_from_file;
+
+	if (!hostnqn)
+		return NULL;
+
+	uuid = strstr(hostnqn, "uuid:");
+	if (!uuid)
+		return NULL;
+	uuid += strlen("uuid:");
+
+	hostid_from_file = nvmf_hostid_from_file();
+	if (hostid_from_file && strcmp(uuid, hostid_from_file))
+		fprintf(stderr, "warning: use generated hostid instead of hostid file\n");
+
+	return strdup(uuid);
+}
+
 int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 {
 	char *subsysnqn = NVME_DISC_SUBSYS_NAME;
@@ -753,8 +773,10 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 	hostid_arg = hostid;
 	if (!hostnqn)
 		hostnqn = hnqn = nvmf_hostnqn_from_file();
-	if (!hostnqn)
+	if (!hostnqn) {
 		hostnqn = hnqn = nvmf_hostnqn_generate();
+		hostid = hid = nvmf_hostid_from_hostnqn(hostnqn);
+	}
 	if (!hostid)
 		hostid = hid = nvmf_hostid_from_file();
 	h = nvme_lookup_host(r, hostnqn, hostid);
@@ -966,8 +988,10 @@ int nvmf_connect(const char *desc, int argc, char **argv)
 
 	if (!hostnqn)
 		hostnqn = hnqn = nvmf_hostnqn_from_file();
-	if (!hostnqn)
+	if (!hostnqn) {
 		hostnqn = hnqn = nvmf_hostnqn_generate();
+		hostid = hid = nvmf_hostid_from_hostnqn(hostnqn);
+	}
 	if (!hostid)
 		hostid = hid = nvmf_hostid_from_file();
 	h = nvme_lookup_host(r, hostnqn, hostid);
-- 
2.39.2



More information about the Linux-nvme mailing list