diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 98d0f676f..451e4e4d6 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -1549,7 +1549,7 @@ spdk_nvmf_ctrlr_identify_ns(struct spdk_nvmf_ctrlr *ctrlr, return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } - spdk_nvmf_bdev_ctrlr_identify_ns(ns, nsdata); + spdk_nvmf_bdev_ctrlr_identify_ns(ns, nsdata, ctrlr->dif_insert_or_strip); /* Due to bug in the Linux kernel NVMe driver we have to set noiob no larger than mdts */ max_num_blocks = ctrlr->admin_qpair->transport->opts.max_io_size / diff --git a/lib/nvmf/ctrlr_bdev.c b/lib/nvmf/ctrlr_bdev.c index d7ca71616..e6c15f057 100644 --- a/lib/nvmf/ctrlr_bdev.c +++ b/lib/nvmf/ctrlr_bdev.c @@ -103,7 +103,8 @@ nvmf_bdev_ctrlr_complete_cmd(struct spdk_bdev_io *bdev_io, bool success, } void -spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata) +spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata, + bool dif_insert_or_strip) { struct spdk_bdev *bdev = ns->bdev; uint64_t num_blocks; @@ -115,32 +116,37 @@ spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_da nsdata->nuse = num_blocks; nsdata->nlbaf = 0; nsdata->flbas.format = 0; - nsdata->lbaf[0].ms = spdk_bdev_get_md_size(bdev); - nsdata->lbaf[0].lbads = spdk_u32log2(spdk_bdev_get_block_size(bdev)); - if (nsdata->lbaf[0].ms != 0) { - nsdata->flbas.extended = 1; - nsdata->mc.extended = 1; - nsdata->mc.pointer = 0; - nsdata->dps.md_start = spdk_bdev_is_dif_head_of_md(bdev); + if (!dif_insert_or_strip) { + nsdata->lbaf[0].ms = spdk_bdev_get_md_size(bdev); + nsdata->lbaf[0].lbads = spdk_u32log2(spdk_bdev_get_block_size(bdev)); + if (nsdata->lbaf[0].ms != 0) { + nsdata->flbas.extended = 1; + nsdata->mc.extended = 1; + nsdata->mc.pointer = 0; + nsdata->dps.md_start = spdk_bdev_is_dif_head_of_md(bdev); - switch (spdk_bdev_get_dif_type(bdev)) { - case SPDK_DIF_TYPE1: - nsdata->dpc.pit1 = 1; - nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE1; - break; - case SPDK_DIF_TYPE2: - nsdata->dpc.pit2 = 1; - nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE2; - break; - case SPDK_DIF_TYPE3: - nsdata->dpc.pit3 = 1; - nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE3; - break; - default: - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Protection Disabled\n"); - nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_DISABLE; - break; + switch (spdk_bdev_get_dif_type(bdev)) { + case SPDK_DIF_TYPE1: + nsdata->dpc.pit1 = 1; + nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE1; + break; + case SPDK_DIF_TYPE2: + nsdata->dpc.pit2 = 1; + nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE2; + break; + case SPDK_DIF_TYPE3: + nsdata->dpc.pit3 = 1; + nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE3; + break; + default: + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Protection Disabled\n"); + nsdata->dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_DISABLE; + break; + } } + } else { + nsdata->lbaf[0].ms = 0; + nsdata->lbaf[0].lbads = spdk_u32log2(spdk_bdev_get_data_block_size(bdev)); } nsdata->noiob = spdk_bdev_get_optimal_io_boundary(bdev); nsdata->nmic.can_share = 1; diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index bc38f3078..3ce39cb68 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -382,7 +382,8 @@ bool spdk_nvmf_ctrlr_dsm_supported(struct spdk_nvmf_ctrlr *ctrlr); bool spdk_nvmf_ctrlr_write_zeroes_supported(struct spdk_nvmf_ctrlr *ctrlr); void spdk_nvmf_ctrlr_ns_changed(struct spdk_nvmf_ctrlr *ctrlr, uint32_t nsid); -void spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata); +void spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata, + bool dif_insert_or_strip); int spdk_nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch, struct spdk_nvmf_request *req); int spdk_nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index f1639b2ec..45006b02c 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -175,7 +175,8 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_ } void -spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata) +spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata, + bool dif_insert_or_strip) { uint64_t num_blocks; diff --git a/test/unit/lib/nvmf/tcp.c/tcp_ut.c b/test/unit/lib/nvmf/tcp.c/tcp_ut.c index 92fff6db6..ca94ed39e 100644 --- a/test/unit/lib/nvmf/tcp.c/tcp_ut.c +++ b/test/unit/lib/nvmf/tcp.c/tcp_ut.c @@ -213,7 +213,8 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_ } void -spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata) +spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata, + bool dif_insert_or_strip) { uint64_t num_blocks;