diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index 15c8e4e4b..5d228bdab 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -233,6 +233,14 @@ uint32_t spdk_bdev_get_block_size(const struct spdk_bdev *bdev); */ uint64_t spdk_bdev_get_num_blocks(const struct spdk_bdev *bdev); +/** + * Get maximum number of descriptors per unmap request. + * + * \param bdev Block device to query. + * \return Maximum number of unmap descriptors per request. + */ +uint32_t spdk_bdev_get_max_unmap_descriptors(const struct spdk_bdev *bdev); + /** * Get minimum I/O buffer address alignment for a bdev. * diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index bd3d0fa93..62535946f 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -557,6 +557,12 @@ spdk_bdev_get_num_blocks(const struct spdk_bdev *bdev) return bdev->blockcnt; } +uint32_t +spdk_bdev_get_max_unmap_descriptors(const struct spdk_bdev *bdev) +{ + return bdev->max_unmap_bdesc_count; +} + size_t spdk_bdev_get_buf_align(const struct spdk_bdev *bdev) { diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index f19bdf2b4..64d4c5907 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -546,6 +546,8 @@ spdk_bdev_scsi_inquiry(struct spdk_bdev *bdev, struct spdk_scsi_task *task, len = 20 - hlen; if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) { + uint32_t max_unmap_desc; + /* * MAXIMUM UNMAP LBA COUNT: indicates the * maximum number of LBAs that may be @@ -560,11 +562,9 @@ spdk_bdev_scsi_inquiry(struct spdk_bdev *bdev, struct spdk_scsi_task *task, * in the parameter data transferred to the * device server for an UNMAP command. */ - if (bdev->max_unmap_bdesc_count < - g_spdk_scsi.scsi_params.max_unmap_block_descriptor_count) - to_be32(&data[24], bdev->max_unmap_bdesc_count); - else - to_be32(&data[24], g_spdk_scsi.scsi_params.max_unmap_block_descriptor_count); + max_unmap_desc = spdk_min(spdk_bdev_get_max_unmap_descriptors(bdev), + g_spdk_scsi.scsi_params.max_unmap_block_descriptor_count); + to_be32(&data[24], max_unmap_desc); /* * OPTIMAL UNMAP GRANULARITY: indicates the diff --git a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c index 2cb7260a1..d4637e2b8 100644 --- a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +++ b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c @@ -106,6 +106,12 @@ spdk_bdev_get_product_name(const struct spdk_bdev *bdev) return "test product"; } +uint32_t +spdk_bdev_get_max_unmap_descriptors(const struct spdk_bdev *bdev) +{ + return 1; +} + void spdk_scsi_lun_clear_all(struct spdk_scsi_lun *lun) {