id->maxcmd = cpu_to_le16(NVMET_MAX_CMD);
 
        id->nn = cpu_to_le32(ctrl->subsys->max_nsid);
+       id->mnan = cpu_to_le32(NVMET_MAX_NAMESPACES);
        id->oncs = cpu_to_le16(NVME_CTRL_ONCS_DSM |
                        NVME_CTRL_ONCS_WRITE_ZEROES);
 
 
 int nvmet_ns_enable(struct nvmet_ns *ns)
 {
        struct nvmet_subsys *subsys = ns->subsys;
-       int ret = 0;
+       int ret;
 
        mutex_lock(&subsys->lock);
+       ret = -EMFILE;
+       if (subsys->nr_namespaces == NVMET_MAX_NAMESPACES)
+               goto out_unlock;
+       ret = 0;
        if (ns->enabled)
                goto out_unlock;
 
 
                list_add_tail_rcu(&ns->dev_link, &old->dev_link);
        }
+       subsys->nr_namespaces++;
 
        nvmet_ns_changed(subsys, ns->nsid);
        ns->enabled = true;
        percpu_ref_exit(&ns->ref);
 
        mutex_lock(&subsys->lock);
+       subsys->nr_namespaces--;
        nvmet_ns_changed(subsys, ns->nsid);
        nvmet_ns_dev_disable(ns);
 out_unlock:
 
        struct kref             ref;
 
        struct list_head        namespaces;
+       unsigned int            nr_namespaces;
        unsigned int            max_nsid;
 
        struct list_head        ctrls;
 #define NVMET_QUEUE_SIZE       1024
 #define NVMET_NR_QUEUES                128
 #define NVMET_MAX_CMD          NVMET_QUEUE_SIZE
+
+/*
+ * Nice round number that makes a list of nsids fit into a page.
+ * Should become tunable at some point in the future.
+ */
+#define NVMET_MAX_NAMESPACES   1024
+
 #define NVMET_KAS              10
 #define NVMET_DISC_KATO                120