From 5f1c1189fade27d07247f379db2447c76254d26e Mon Sep 17 00:00:00 2001 From: Xiaodong Liu Date: Tue, 12 Jun 2018 05:12:49 -0400 Subject: [PATCH] nvme: add PI to spdk_nvme_ns_cmd_read/writev() apptag and its mask are required to set proper PI elements in nvme read/write cmds. Change-Id: Ibabc4738f637d13ea16246d5e77e7d045f032af8 Signed-off-by: Xiaodong Liu Reviewed-on: https://review.gerrithub.io/414786 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Young Tack Jin Reviewed-by: Jim Harris --- include/spdk/nvme.h | 10 ++++++++-- lib/nvme/nvme_ns_cmd.c | 10 ++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 339ffd7fa..5a731ccaa 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -1223,6 +1223,8 @@ int spdk_nvme_ns_cmd_writev(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpa * payload memory segment * \param metadata virtual address pointer to the metadata payload, the length * of metadata is specified by spdk_nvme_ns_get_md_size() + * \param apptag_mask application tag mask. + * \param apptag application tag to use end-to-end protection information. * * \return 0 if successfully submitted, ENOMEM if an nvme_request * structure cannot be allocated for the I/O request @@ -1234,7 +1236,8 @@ int spdk_nvme_ns_cmd_writev_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qp uint64_t lba, uint32_t lba_count, spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags, spdk_nvme_req_reset_sgl_cb reset_sgl_fn, - spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata); + spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata, + uint16_t apptag_mask, uint16_t apptag); /** * \brief Submits a write I/O to the specified NVMe namespace. @@ -1351,6 +1354,8 @@ int spdk_nvme_ns_cmd_readv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpai * payload memory segment * \param metadata virtual address pointer to the metadata payload, the length * of metadata is specified by spdk_nvme_ns_get_md_size() + * \param apptag_mask application tag mask. + * \param apptag application tag to use end-to-end protection information. * * \return 0 if successfully submitted, ENOMEM if an nvme_request * structure cannot be allocated for the I/O request @@ -1362,7 +1367,8 @@ int spdk_nvme_ns_cmd_readv_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpa uint64_t lba, uint32_t lba_count, spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags, spdk_nvme_req_reset_sgl_cb reset_sgl_fn, - spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata); + spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata, + uint16_t apptag_mask, uint16_t apptag); /** * \brief Submits a read I/O to the specified NVMe namespace. diff --git a/lib/nvme/nvme_ns_cmd.c b/lib/nvme/nvme_ns_cmd.c index 4ef62a874..5a694ad57 100644 --- a/lib/nvme/nvme_ns_cmd.c +++ b/lib/nvme/nvme_ns_cmd.c @@ -674,7 +674,8 @@ spdk_nvme_ns_cmd_readv_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair * uint64_t lba, uint32_t lba_count, spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags, spdk_nvme_req_reset_sgl_cb reset_sgl_fn, - spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata) + spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata, + uint16_t apptag_mask, uint16_t apptag) { struct nvme_request *req; struct nvme_payload payload; @@ -686,7 +687,7 @@ spdk_nvme_ns_cmd_readv_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair * payload = NVME_PAYLOAD_SGL(reset_sgl_fn, next_sge_fn, cb_arg, metadata); req = _nvme_ns_cmd_rw(ns, qpair, &payload, 0, 0, lba, lba_count, cb_fn, cb_arg, SPDK_NVME_OPC_READ, - io_flags, 0, 0, true); + io_flags, apptag_mask, apptag, true); if (req != NULL) { return nvme_qpair_submit_request(qpair, req); } else if (spdk_nvme_ns_check_request_length(lba_count, @@ -784,7 +785,8 @@ spdk_nvme_ns_cmd_writev_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair uint64_t lba, uint32_t lba_count, spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags, spdk_nvme_req_reset_sgl_cb reset_sgl_fn, - spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata) + spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata, + uint16_t apptag_mask, uint16_t apptag) { struct nvme_request *req; struct nvme_payload payload; @@ -796,7 +798,7 @@ spdk_nvme_ns_cmd_writev_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair payload = NVME_PAYLOAD_SGL(reset_sgl_fn, next_sge_fn, cb_arg, metadata); req = _nvme_ns_cmd_rw(ns, qpair, &payload, 0, 0, lba, lba_count, cb_fn, cb_arg, SPDK_NVME_OPC_WRITE, - io_flags, 0, 0, true); + io_flags, apptag_mask, apptag, true); if (req != NULL) { return nvme_qpair_submit_request(qpair, req); } else if (spdk_nvme_ns_check_request_length(lba_count,