diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 5ca53e4e3..835660f92 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -2001,6 +2001,22 @@ bdev_rw_should_split(struct spdk_bdev_io *bdev_io) return false; } +static bool +bdev_unmap_should_split(struct spdk_bdev_io *bdev_io) +{ + uint32_t num_unmap_segments; + + if (!bdev_io->bdev->max_unmap || !bdev_io->bdev->max_unmap_segments) { + return false; + } + num_unmap_segments = spdk_divide_round_up(bdev_io->u.bdev.num_blocks, bdev_io->bdev->max_unmap); + if (num_unmap_segments > bdev_io->bdev->max_unmap_segments) { + return true; + } + + return false; +} + static bool bdev_io_should_split(struct spdk_bdev_io *bdev_io) { @@ -2008,6 +2024,8 @@ bdev_io_should_split(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_READ: case SPDK_BDEV_IO_TYPE_WRITE: return bdev_rw_should_split(bdev_io); + case SPDK_BDEV_IO_TYPE_UNMAP: + return bdev_unmap_should_split(bdev_io); default: return false; }