|
@@ -270,8 +270,7 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)
|
|
|
struct nvme_id_ns *id;
|
|
|
u16 status = 0;
|
|
|
|
|
|
- ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->identify.nsid);
|
|
|
- if (!ns) {
|
|
|
+ if (le32_to_cpu(req->cmd->identify.nsid) == NVME_NSID_ALL) {
|
|
|
status = NVME_SC_INVALID_NS | NVME_SC_DNR;
|
|
|
goto out;
|
|
|
}
|
|
@@ -279,9 +278,14 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)
|
|
|
id = kzalloc(sizeof(*id), GFP_KERNEL);
|
|
|
if (!id) {
|
|
|
status = NVME_SC_INTERNAL;
|
|
|
- goto out_put_ns;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
+ /* return an all zeroed buffer if we can't find an active namespace */
|
|
|
+ ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->identify.nsid);
|
|
|
+ if (!ns)
|
|
|
+ goto done;
|
|
|
+
|
|
|
/*
|
|
|
* nuse = ncap = nsze isn't always true, but we have no way to find
|
|
|
* that out from the underlying device.
|
|
@@ -306,11 +310,10 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)
|
|
|
|
|
|
id->lbaf[0].ds = ns->blksize_shift;
|
|
|
|
|
|
+ nvmet_put_namespace(ns);
|
|
|
+done:
|
|
|
status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
|
|
|
-
|
|
|
kfree(id);
|
|
|
-out_put_ns:
|
|
|
- nvmet_put_namespace(ns);
|
|
|
out:
|
|
|
nvmet_req_complete(req, status);
|
|
|
}
|