static struct nvmf_host *nvmf_default_host;
 
-static struct nvmf_host *__nvmf_host_find(const char *hostnqn)
+/**
+ * __nvmf_host_find() - Find a matching to a previously created host
+ * @hostnqn: Host NQN to match
+ * @id: Host ID to match
+ *
+ * We have defined a host as how it is perceived by the target.
+ * Therefore, we don't allow different Host NQNs with the same Host ID.
+ * Similarly, we do not allow the usage of the same Host NQN with different
+ * Host IDs. This will maintain unambiguous host identification.
+ *
+ * Return: Returns host pointer on success, NULL in case of no match or
+ *         ERR_PTR(-EINVAL) in case of error match.
+ */
+static struct nvmf_host *__nvmf_host_find(const char *hostnqn, uuid_t *id)
 {
        struct nvmf_host *host;
 
+       lockdep_assert_held(&nvmf_hosts_mutex);
+
        list_for_each_entry(host, &nvmf_hosts, list) {
-               if (!strcmp(host->nqn, hostnqn))
+               bool same_hostnqn = !strcmp(host->nqn, hostnqn);
+               bool same_hostid = uuid_equal(&host->id, id);
+
+               if (same_hostnqn && same_hostid)
                        return host;
+
+               if (same_hostnqn) {
+                       pr_err("found same hostnqn %s but different hostid %pUb\n",
+                              hostnqn, id);
+                       return ERR_PTR(-EINVAL);
+               }
+               if (same_hostid) {
+                       pr_err("found same hostid %pUb but different hostnqn %s\n",
+                              id, hostnqn);
+                       return ERR_PTR(-EINVAL);
+
+               }
        }
 
        return NULL;
 }
 
-static struct nvmf_host *nvmf_host_add(const char *hostnqn)
+static struct nvmf_host *nvmf_host_alloc(const char *hostnqn, uuid_t *id)
+{
+       struct nvmf_host *host;
+
+       host = kmalloc(sizeof(*host), GFP_KERNEL);
+       if (!host)
+               return NULL;
+
+       kref_init(&host->ref);
+       uuid_copy(&host->id, id);
+       strscpy(host->nqn, hostnqn, NVMF_NQN_SIZE);
+
+       return host;
+}
+
+static struct nvmf_host *nvmf_host_add(const char *hostnqn, uuid_t *id)
 {
        struct nvmf_host *host;
 
        mutex_lock(&nvmf_hosts_mutex);
-       host = __nvmf_host_find(hostnqn);
-       if (host) {
+       host = __nvmf_host_find(hostnqn, id);
+       if (IS_ERR(host)) {
+               goto out_unlock;
+       } else if (host) {
                kref_get(&host->ref);
                goto out_unlock;
        }
 
-       host = kmalloc(sizeof(*host), GFP_KERNEL);
+       host = nvmf_host_alloc(hostnqn, id);
        if (!host)
-               goto out_unlock;
-
-       kref_init(&host->ref);
-       strscpy(host->nqn, hostnqn, NVMF_NQN_SIZE);
+               return ERR_PTR(-ENOMEM);
 
        list_add_tail(&host->list, &nvmf_hosts);
 out_unlock:
 static struct nvmf_host *nvmf_host_default(void)
 {
        struct nvmf_host *host;
+       char nqn[NVMF_NQN_SIZE];
+       uuid_t id;
 
-       host = kmalloc(sizeof(*host), GFP_KERNEL);
+       uuid_gen(&id);
+       snprintf(nqn, NVMF_NQN_SIZE,
+               "nqn.2014-08.org.nvmexpress:uuid:%pUb", &id);
+
+       host = nvmf_host_alloc(nqn, &id);
        if (!host)
                return NULL;
 
-       kref_init(&host->ref);
-       uuid_gen(&host->id);
-       snprintf(host->nqn, NVMF_NQN_SIZE,
-               "nqn.2014-08.org.nvmexpress:uuid:%pUb", &host->id);
-
        mutex_lock(&nvmf_hosts_mutex);
        list_add_tail(&host->list, &nvmf_hosts);
        mutex_unlock(&nvmf_hosts_mutex);
        size_t nqnlen  = 0;
        int ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO;
        uuid_t hostid;
+       char hostnqn[NVMF_NQN_SIZE];
 
        /* Set defaults */
        opts->queue_size = NVMF_DEF_QUEUE_SIZE;
        if (!options)
                return -ENOMEM;
 
-       uuid_gen(&hostid);
+       /* use default host if not given by user space */
+       uuid_copy(&hostid, &nvmf_default_host->id);
+       strscpy(hostnqn, nvmf_default_host->nqn, NVMF_NQN_SIZE);
 
        while ((p = strsep(&o, ",\n")) != NULL) {
                if (!*p)
                                ret = -EINVAL;
                                goto out;
                        }
-                       opts->host = nvmf_host_add(p);
+                       strscpy(hostnqn, p, NVMF_NQN_SIZE);
                        kfree(p);
-                       if (!opts->host) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
                        break;
                case NVMF_OPT_RECONNECT_DELAY:
                        if (match_int(args, &token)) {
                                opts->fast_io_fail_tmo, ctrl_loss_tmo);
        }
 
-       if (!opts->host) {
-               kref_get(&nvmf_default_host->ref);
-               opts->host = nvmf_default_host;
+       opts->host = nvmf_host_add(hostnqn, &hostid);
+       if (IS_ERR(opts->host)) {
+               ret = PTR_ERR(opts->host);
+               opts->host = NULL;
+               goto out;
        }
 
-       uuid_copy(&opts->host->id, &hostid);
-
 out:
        kfree(options);
        return ret;