nvme: add hostid token to fabric options
authorJohannes Thumshirn <jthumshirn@suse.de>
Tue, 20 Jun 2017 12:23:01 +0000 (14:23 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Jun 2017 14:14:13 +0000 (08:14 -0600)
Currently we have no way to define a stable host-id but always use the one
which is randomly generated when we add the host or use the default host.

Provide a "hostid=%s" for user-space to pass in a persistent host-id which
overrides the randomly generated one.

Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/fabrics.c
drivers/nvme/host/fabrics.h

index 6e6864516ce60f6482c651ecdcc1f949e283cd1a..7ca2d4d70aece2ba0a2c631682ab026ee70d502a 100644 (file)
@@ -58,7 +58,6 @@ static struct nvmf_host *nvmf_host_add(const char *hostnqn)
 
        kref_init(&host->ref);
        memcpy(host->nqn, hostnqn, NVMF_NQN_SIZE);
-       uuid_gen(&host->id);
 
        list_add_tail(&host->list, &nvmf_hosts);
 out_unlock:
@@ -75,7 +74,6 @@ static struct nvmf_host *nvmf_host_default(void)
                return NULL;
 
        kref_init(&host->ref);
-       uuid_gen(&host->id);
        snprintf(host->nqn, NVMF_NQN_SIZE,
                "nqn.2014-08.org.nvmexpress:NVMf:uuid:%pUb", &host->id);
 
@@ -565,6 +563,7 @@ static const match_table_t opt_tokens = {
        { NVMF_OPT_KATO,                "keep_alive_tmo=%d"     },
        { NVMF_OPT_HOSTNQN,             "hostnqn=%s"            },
        { NVMF_OPT_HOST_TRADDR,         "host_traddr=%s"        },
+       { NVMF_OPT_HOST_ID,             "hostid=%s"             },
        { NVMF_OPT_ERR,                 NULL                    }
 };
 
@@ -576,6 +575,7 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
        int token, ret = 0;
        size_t nqnlen  = 0;
        int ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO;
+       uuid_t hostid;
 
        /* Set defaults */
        opts->queue_size = NVMF_DEF_QUEUE_SIZE;
@@ -586,6 +586,8 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
        if (!options)
                return -ENOMEM;
 
+       uuid_gen(&hostid);
+
        while ((p = strsep(&o, ",\n")) != NULL) {
                if (!*p)
                        continue;
@@ -742,6 +744,17 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
                        }
                        opts->host_traddr = p;
                        break;
+               case NVMF_OPT_HOST_ID:
+                       p = match_strdup(args);
+                       if (!p) {
+                               ret = -ENOMEM;
+                               goto out;
+                       }
+                       if (uuid_parse(p, &hostid)) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       break;
                default:
                        pr_warn("unknown parameter or missing value '%s' in ctrl creation request\n",
                                p);
@@ -761,6 +774,8 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
                opts->host = nvmf_default_host;
        }
 
+       uuid_copy(&opts->host->id, &hostid);
+
 out:
        if (!opts->discovery_nqn && !opts->kato)
                opts->kato = NVME_DEFAULT_KATO;
@@ -821,7 +836,8 @@ EXPORT_SYMBOL_GPL(nvmf_free_options);
 
 #define NVMF_REQUIRED_OPTS     (NVMF_OPT_TRANSPORT | NVMF_OPT_NQN)
 #define NVMF_ALLOWED_OPTS      (NVMF_OPT_QUEUE_SIZE | NVMF_OPT_NR_IO_QUEUES | \
-                                NVMF_OPT_KATO | NVMF_OPT_HOSTNQN)
+                                NVMF_OPT_KATO | NVMF_OPT_HOSTNQN | \
+                                NVMF_OPT_HOST_ID)
 
 static struct nvme_ctrl *
 nvmf_create_ctrl(struct device *dev, const char *buf, size_t count)
index f1c9bd7ae7ffa05ef88fd9632db9a1908b44c980..c8b2f0127ccc7c7ddcb85310648c9455bb382b7a 100644 (file)
@@ -56,6 +56,7 @@ enum {
        NVMF_OPT_RECONNECT_DELAY = 1 << 9,
        NVMF_OPT_HOST_TRADDR    = 1 << 10,
        NVMF_OPT_CTRL_LOSS_TMO  = 1 << 11,
+       NVMF_OPT_HOST_ID        = 1 << 12,
 };
 
 /**