[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v6 18/42] nvme: support identify namespace descriptor list
From: |
Maxim Levitsky |
Subject: |
Re: [PATCH v6 18/42] nvme: support identify namespace descriptor list |
Date: |
Wed, 25 Mar 2020 12:43:22 +0200 |
On Mon, 2020-03-16 at 07:29 -0700, Klaus Jensen wrote:
> From: Klaus Jensen <address@hidden>
>
> Since we are not providing the NGUID or EUI64 fields, we must support
> the Namespace UUID. We do not have any way of storing a persistent
> unique identifier, so conjure up a UUID that is just the namespace id.
>
> Signed-off-by: Klaus Jensen <address@hidden>
> ---
> hw/block/nvme.c | 38 ++++++++++++++++++++++++++++++++++++++
> hw/block/trace-events | 1 +
> 2 files changed, 39 insertions(+)
>
> diff --git a/hw/block/nvme.c b/hw/block/nvme.c
> index 16de3ca1c5d5..007f8817f101 100644
> --- a/hw/block/nvme.c
> +++ b/hw/block/nvme.c
> @@ -942,6 +942,42 @@ static uint16_t nvme_identify_nslist(NvmeCtrl *n,
> NvmeIdentify *c)
> return ret;
> }
>
> +static uint16_t nvme_identify_ns_descr_list(NvmeCtrl *n, NvmeIdentify *c)
> +{
> + uint32_t nsid = le32_to_cpu(c->nsid);
> + uint64_t prp1 = le64_to_cpu(c->prp1);
> + uint64_t prp2 = le64_to_cpu(c->prp2);
> +
> + void *list;
> + uint16_t ret;
> + NvmeIdNsDescr *ns_descr;
> +
> + trace_nvme_dev_identify_ns_descr_list(nsid);
> +
> + if (unlikely(nsid == 0 || nsid > n->num_namespaces)) {
> + trace_nvme_dev_err_invalid_ns(nsid, n->num_namespaces);
> + return NVME_INVALID_NSID | NVME_DNR;
> + }
> +
> + list = g_malloc0(NVME_IDENTIFY_DATA_SIZE);
> + ns_descr = list;
> +
> + /*
> + * Because the NGUID and EUI64 fields are 0 in the Identify Namespace
> data
> + * structure, a Namespace UUID (nidt = 0x3) must be reported in the
> + * Namespace Identification Descriptor. Add a very basic Namespace UUID
> + * here.
> + */
> + ns_descr->nidt = NVME_NIDT_UUID;
> + ns_descr->nidl = NVME_NIDT_UUID_LEN;
> + stl_be_p(ns_descr + sizeof(*ns_descr), nsid);
> +
> + ret = nvme_dma_read_prp(n, (uint8_t *) list, NVME_IDENTIFY_DATA_SIZE,
> prp1,
> + prp2);
> + g_free(list);
> + return ret;
> +}
> +
> static uint16_t nvme_identify(NvmeCtrl *n, NvmeCmd *cmd)
> {
> NvmeIdentify *c = (NvmeIdentify *)cmd;
> @@ -953,6 +989,8 @@ static uint16_t nvme_identify(NvmeCtrl *n, NvmeCmd *cmd)
> return nvme_identify_ctrl(n, c);
> case NVME_ID_CNS_NS_ACTIVE_LIST:
> return nvme_identify_nslist(n, c);
> + case NVME_ID_CNS_NS_DESCR_LIST:
> + return nvme_identify_ns_descr_list(n, c);
> default:
> trace_nvme_dev_err_invalid_identify_cns(le32_to_cpu(c->cns));
> return NVME_INVALID_FIELD | NVME_DNR;
> diff --git a/hw/block/trace-events b/hw/block/trace-events
> index 13e2c71664f6..4cde0844ef64 100644
> --- a/hw/block/trace-events
> +++ b/hw/block/trace-events
> @@ -41,6 +41,7 @@ nvme_dev_del_cq(uint16_t cqid) "deleted completion queue,
> sqid=%"PRIu16""
> nvme_dev_identify_ctrl(void) "identify controller"
> nvme_dev_identify_ns(uint32_t ns) "nsid %"PRIu32""
> nvme_dev_identify_nslist(uint32_t ns) "nsid %"PRIu32""
> +nvme_dev_identify_ns_descr_list(uint32_t ns) "nsid %"PRIu32""
> nvme_dev_getfeat(uint16_t cid, uint32_t fid) "cid %"PRIu16" fid 0x%"PRIx32""
> nvme_dev_setfeat(uint16_t cid, uint32_t fid, uint32_t val) "cid %"PRIu16"
> fid 0x%"PRIx32" val 0x%"PRIx32""
> nvme_dev_getfeat_vwcache(const char* result) "get feature volatile write
> cache, result=%s"
I think that we should add namespace uuid as a device parameter,
but its OK to do this in follow up patch.
Reviewed-by: Maxim Levitsky <address@hidden>
Best regards,
Maxim Levitsky
- Re: [PATCH v6 14/42] nvme: add missing mandatory features, (continued)
- [PATCH v6 17/42] nvme: add log specific field to trace events, Klaus Jensen, 2020/03/16
- [PATCH v6 15/42] nvme: additional tracing, Klaus Jensen, 2020/03/16
- [PATCH v6 12/42] nvme: add support for the get log page command, Klaus Jensen, 2020/03/16
- [PATCH v6 18/42] nvme: support identify namespace descriptor list, Klaus Jensen, 2020/03/16
- Re: [PATCH v6 18/42] nvme: support identify namespace descriptor list,
Maxim Levitsky <=
- [PATCH v6 13/42] nvme: add support for the asynchronous event request command, Klaus Jensen, 2020/03/16
- [PATCH v6 20/42] nvme: provide the mandatory subnqn field, Klaus Jensen, 2020/03/16
- [PATCH v6 19/42] nvme: enforce valid queue creation sequence, Klaus Jensen, 2020/03/16
- [PATCH v6 22/42] nvme: memset preallocated requests structures, Klaus Jensen, 2020/03/16