Commit 326ac2c5 authored by Jens Axboe's avatar Jens Axboe

Merge tag 'nvme-6.3-2022-03-01' of git://git.infradead.org/nvme into for-6.3/block

Pull NVMe fixes from Christoph:

"nvme fixes for Linux 6.3

 - don't access released socket during error recovery (Akinobu Mita)
 - bring back auto-removal of deleted namespaces during sequential scan
   (Christoph Hellwig)
 - fix an error code in nvme_auth_process_dhchap_challenge
   (Dan Carpenter)
 - show well known discovery name (Daniel Wagner)
 - add a missing endianess conversion in effects masking (Keith Busch)"

* tag 'nvme-6.3-2022-03-01' of git://git.infradead.org/nvme:
  nvme-fabrics: show well known discovery name
  nvme-tcp: don't access released socket during error recovery
  nvme-auth: fix an error code in nvme_auth_process_dhchap_challenge()
  nvme: bring back auto-removal of deleted namespaces during sequential scan
  nvme: fix sparse warning on effects masking
parents e33b9365 26a57cb3
...@@ -254,7 +254,7 @@ static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl, ...@@ -254,7 +254,7 @@ static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl,
chap->qid, ret, gid_name); chap->qid, ret, gid_name);
chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE; chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
chap->dh_tfm = NULL; chap->dh_tfm = NULL;
return -ret; return ret;
} }
dev_dbg(ctrl->device, "qid %d: selected DH group %s\n", dev_dbg(ctrl->device, "qid %d: selected DH group %s\n",
chap->qid, gid_name); chap->qid, gid_name);
......
...@@ -38,6 +38,7 @@ struct nvme_ns_info { ...@@ -38,6 +38,7 @@ struct nvme_ns_info {
bool is_shared; bool is_shared;
bool is_readonly; bool is_readonly;
bool is_ready; bool is_ready;
bool is_removed;
}; };
unsigned int admin_timeout = 60; unsigned int admin_timeout = 60;
...@@ -1402,16 +1403,8 @@ static int nvme_identify_ns(struct nvme_ctrl *ctrl, unsigned nsid, ...@@ -1402,16 +1403,8 @@ static int nvme_identify_ns(struct nvme_ctrl *ctrl, unsigned nsid,
error = nvme_submit_sync_cmd(ctrl->admin_q, &c, *id, sizeof(**id)); error = nvme_submit_sync_cmd(ctrl->admin_q, &c, *id, sizeof(**id));
if (error) { if (error) {
dev_warn(ctrl->device, "Identify namespace failed (%d)\n", error); dev_warn(ctrl->device, "Identify namespace failed (%d)\n", error);
goto out_free_id; kfree(*id);
} }
error = NVME_SC_INVALID_NS | NVME_SC_DNR;
if ((*id)->ncap == 0) /* namespace not allocated or attached */
goto out_free_id;
return 0;
out_free_id:
kfree(*id);
return error; return error;
} }
...@@ -1425,6 +1418,13 @@ static int nvme_ns_info_from_identify(struct nvme_ctrl *ctrl, ...@@ -1425,6 +1418,13 @@ static int nvme_ns_info_from_identify(struct nvme_ctrl *ctrl,
ret = nvme_identify_ns(ctrl, info->nsid, &id); ret = nvme_identify_ns(ctrl, info->nsid, &id);
if (ret) if (ret)
return ret; return ret;
if (id->ncap == 0) {
/* namespace not allocated or attached */
info->is_removed = true;
return -ENODEV;
}
info->anagrpid = id->anagrpid; info->anagrpid = id->anagrpid;
info->is_shared = id->nmic & NVME_NS_NMIC_SHARED; info->is_shared = id->nmic & NVME_NS_NMIC_SHARED;
info->is_readonly = id->nsattr & NVME_NS_ATTR_RO; info->is_readonly = id->nsattr & NVME_NS_ATTR_RO;
...@@ -3104,7 +3104,7 @@ static void nvme_init_known_nvm_effects(struct nvme_ctrl *ctrl) ...@@ -3104,7 +3104,7 @@ static void nvme_init_known_nvm_effects(struct nvme_ctrl *ctrl)
* Rather than blindly freezing the IO queues for this effect that * Rather than blindly freezing the IO queues for this effect that
* doesn't even apply to IO, mask it off. * doesn't even apply to IO, mask it off.
*/ */
log->acs[nvme_admin_security_recv] &= ~NVME_CMD_EFFECTS_CSE_MASK; log->acs[nvme_admin_security_recv] &= cpu_to_le32(~NVME_CMD_EFFECTS_CSE_MASK);
log->iocs[nvme_cmd_write] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC); log->iocs[nvme_cmd_write] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC);
log->iocs[nvme_cmd_write_zeroes] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC); log->iocs[nvme_cmd_write_zeroes] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC);
...@@ -4429,6 +4429,7 @@ static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid) ...@@ -4429,6 +4429,7 @@ static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
{ {
struct nvme_ns_info info = { .nsid = nsid }; struct nvme_ns_info info = { .nsid = nsid };
struct nvme_ns *ns; struct nvme_ns *ns;
int ret;
if (nvme_identify_ns_descs(ctrl, &info)) if (nvme_identify_ns_descs(ctrl, &info))
return; return;
...@@ -4445,19 +4446,19 @@ static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid) ...@@ -4445,19 +4446,19 @@ static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
* set up a namespace. If not fall back to the legacy version. * set up a namespace. If not fall back to the legacy version.
*/ */
if ((ctrl->cap & NVME_CAP_CRMS_CRIMS) || if ((ctrl->cap & NVME_CAP_CRMS_CRIMS) ||
(info.ids.csi != NVME_CSI_NVM && info.ids.csi != NVME_CSI_ZNS)) { (info.ids.csi != NVME_CSI_NVM && info.ids.csi != NVME_CSI_ZNS))
if (nvme_ns_info_from_id_cs_indep(ctrl, &info)) ret = nvme_ns_info_from_id_cs_indep(ctrl, &info);
return; else
} else { ret = nvme_ns_info_from_identify(ctrl, &info);
if (nvme_ns_info_from_identify(ctrl, &info))
return; if (info.is_removed)
} nvme_ns_remove_by_nsid(ctrl, nsid);
/* /*
* Ignore the namespace if it is not ready. We will get an AEN once it * Ignore the namespace if it is not ready. We will get an AEN once it
* becomes ready and restart the scan. * becomes ready and restart the scan.
*/ */
if (!info.is_ready) if (ret || !info.is_ready)
return; return;
ns = nvme_find_get_ns(ctrl, nsid); ns = nvme_find_get_ns(ctrl, nsid);
......
...@@ -189,7 +189,8 @@ nvmf_ctlr_matches_baseopts(struct nvme_ctrl *ctrl, ...@@ -189,7 +189,8 @@ nvmf_ctlr_matches_baseopts(struct nvme_ctrl *ctrl,
static inline char *nvmf_ctrl_subsysnqn(struct nvme_ctrl *ctrl) static inline char *nvmf_ctrl_subsysnqn(struct nvme_ctrl *ctrl)
{ {
if (!ctrl->subsys) if (!ctrl->subsys ||
!strcmp(ctrl->opts->subsysnqn, NVME_DISC_SUBSYS_NAME))
return ctrl->opts->subsysnqn; return ctrl->opts->subsysnqn;
return ctrl->subsys->subnqn; return ctrl->subsys->subnqn;
} }
......
...@@ -2489,6 +2489,10 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size) ...@@ -2489,6 +2489,10 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size)
len = nvmf_get_address(ctrl, buf, size); len = nvmf_get_address(ctrl, buf, size);
mutex_lock(&queue->queue_lock);
if (!test_bit(NVME_TCP_Q_LIVE, &queue->flags))
goto done;
ret = kernel_getsockname(queue->sock, (struct sockaddr *)&src_addr); ret = kernel_getsockname(queue->sock, (struct sockaddr *)&src_addr);
if (ret > 0) { if (ret > 0) {
if (len > 0) if (len > 0)
...@@ -2496,6 +2500,8 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size) ...@@ -2496,6 +2500,8 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size)
len += scnprintf(buf + len, size - len, "%ssrc_addr=%pISc\n", len += scnprintf(buf + len, size - len, "%ssrc_addr=%pISc\n",
(len) ? "," : "", &src_addr); (len) ? "," : "", &src_addr);
} }
done:
mutex_unlock(&queue->queue_lock);
return len; return len;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment