Merge tag 'for-5.16/block-2021-11-09' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / drivers / nvme / host / core.c
index 2fc5ea9..4b5de8f 100644 (file)
@@ -203,7 +203,7 @@ int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl)
 static void nvme_do_delete_ctrl(struct nvme_ctrl *ctrl)
 {
        dev_info(ctrl->device,
-                "Removing ctrl: NQN \"%s\"\n", ctrl->opts->subsysnqn);
+                "Removing ctrl: NQN \"%s\"\n", nvmf_ctrl_subsysnqn(ctrl));
 
        flush_work(&ctrl->reset_work);
        nvme_stop_ctrl(ctrl);
@@ -815,6 +815,7 @@ static void nvme_assign_write_stream(struct nvme_ctrl *ctrl,
 static inline void nvme_setup_flush(struct nvme_ns *ns,
                struct nvme_command *cmnd)
 {
+       memset(cmnd, 0, sizeof(*cmnd));
        cmnd->common.opcode = nvme_cmd_flush;
        cmnd->common.nsid = cpu_to_le32(ns->head->ns_id);
 }
@@ -866,6 +867,7 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req,
                return BLK_STS_IOERR;
        }
 
+       memset(cmnd, 0, sizeof(*cmnd));
        cmnd->dsm.opcode = nvme_cmd_dsm;
        cmnd->dsm.nsid = cpu_to_le32(ns->head->ns_id);
        cmnd->dsm.nr = cpu_to_le32(segments - 1);
@@ -882,6 +884,8 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req,
 static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,
                struct request *req, struct nvme_command *cmnd)
 {
+       memset(cmnd, 0, sizeof(*cmnd));
+
        if (ns->ctrl->quirks & NVME_QUIRK_DEALLOCATE_ZEROES)
                return nvme_setup_discard(ns, req, cmnd);
 
@@ -915,9 +919,15 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
                dsmgmt |= NVME_RW_DSM_FREQ_PREFETCH;
 
        cmnd->rw.opcode = op;
+       cmnd->rw.flags = 0;
        cmnd->rw.nsid = cpu_to_le32(ns->head->ns_id);
+       cmnd->rw.rsvd2 = 0;
+       cmnd->rw.metadata = 0;
        cmnd->rw.slba = cpu_to_le64(nvme_sect_to_lba(ns, blk_rq_pos(req)));
        cmnd->rw.length = cpu_to_le16((blk_rq_bytes(req) >> ns->lba_shift) - 1);
+       cmnd->rw.reftag = 0;
+       cmnd->rw.apptag = 0;
+       cmnd->rw.appmask = 0;
 
        if (req_op(req) == REQ_OP_WRITE && ctrl->nr_streams)
                nvme_assign_write_stream(ctrl, req, &control, &dsmgmt);
@@ -974,10 +984,8 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req)
        struct nvme_ctrl *ctrl = nvme_req(req)->ctrl;
        blk_status_t ret = BLK_STS_OK;
 
-       if (!(req->rq_flags & RQF_DONTPREP)) {
+       if (!(req->rq_flags & RQF_DONTPREP))
                nvme_clear_nvme_request(req);
-               memset(cmd, 0, sizeof(*cmd));
-       }
 
        switch (req_op(req)) {
        case REQ_OP_DRV_IN:
@@ -2593,6 +2601,24 @@ static ssize_t nvme_subsys_show_nqn(struct device *dev,
 }
 static SUBSYS_ATTR_RO(subsysnqn, S_IRUGO, nvme_subsys_show_nqn);
 
+static ssize_t nvme_subsys_show_type(struct device *dev,
+                                   struct device_attribute *attr,
+                                   char *buf)
+{
+       struct nvme_subsystem *subsys =
+               container_of(dev, struct nvme_subsystem, dev);
+
+       switch (subsys->subtype) {
+       case NVME_NQN_DISC:
+               return sysfs_emit(buf, "discovery\n");
+       case NVME_NQN_NVME:
+               return sysfs_emit(buf, "nvm\n");
+       default:
+               return sysfs_emit(buf, "reserved\n");
+       }
+}
+static SUBSYS_ATTR_RO(subsystype, S_IRUGO, nvme_subsys_show_type);
+
 #define nvme_subsys_show_str_function(field)                           \
 static ssize_t subsys_##field##_show(struct device *dev,               \
                            struct device_attribute *attr, char *buf)   \
@@ -2613,6 +2639,7 @@ static struct attribute *nvme_subsys_attrs[] = {
        &subsys_attr_serial.attr,
        &subsys_attr_firmware_rev.attr,
        &subsys_attr_subsysnqn.attr,
+       &subsys_attr_subsystype.attr,
 #ifdef CONFIG_NVME_MULTIPATH
        &subsys_attr_iopolicy.attr,
 #endif
@@ -2683,6 +2710,21 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
        memcpy(subsys->firmware_rev, id->fr, sizeof(subsys->firmware_rev));
        subsys->vendor_id = le16_to_cpu(id->vid);
        subsys->cmic = id->cmic;
+
+       /* Versions prior to 1.4 don't necessarily report a valid type */
+       if (id->cntrltype == NVME_CTRL_DISC ||
+           !strcmp(subsys->subnqn, NVME_DISC_SUBSYS_NAME))
+               subsys->subtype = NVME_NQN_DISC;
+       else
+               subsys->subtype = NVME_NQN_NVME;
+
+       if (nvme_discovery_ctrl(ctrl) && subsys->subtype != NVME_NQN_DISC) {
+               dev_err(ctrl->device,
+                       "Subsystem %s is not a discovery controller",
+                       subsys->subnqn);
+               kfree(subsys);
+               return -EINVAL;
+       }
        subsys->awupf = le16_to_cpu(id->awupf);
 #ifdef CONFIG_NVME_MULTIPATH
        subsys->iopolicy = NVME_IOPOLICY_NUMA;