diff --git a/lib/bdev/null/bdev_null.c b/lib/bdev/null/bdev_null.c index 7fdc968e4..16fce54a2 100644 --- a/lib/bdev/null/bdev_null.c +++ b/lib/bdev/null/bdev_null.c @@ -39,6 +39,7 @@ #include "spdk/thread.h" #include "spdk/json.h" #include "spdk/string.h" +#include "spdk/likely.h" #include "spdk/bdev_module.h" #include "spdk_internal/log.h" @@ -93,8 +94,17 @@ bdev_null_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_ case SPDK_BDEV_IO_TYPE_READ: if (bdev_io->u.bdev.iovs[0].iov_base == NULL) { assert(bdev_io->u.bdev.iovcnt == 1); - bdev_io->u.bdev.iovs[0].iov_base = g_null_read_buf; - bdev_io->u.bdev.iovs[0].iov_len = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; + if (spdk_likely(bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen <= + SPDK_BDEV_LARGE_BUF_MAX_SIZE)) { + bdev_io->u.bdev.iovs[0].iov_base = g_null_read_buf; + bdev_io->u.bdev.iovs[0].iov_len = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; + } else { + SPDK_ERRLOG("Overflow occurred. Read I/O size %" PRIu64 " was larger than permitted %d\n", + bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen, + SPDK_BDEV_LARGE_BUF_MAX_SIZE); + spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); + return; + } } TAILQ_INSERT_TAIL(&ch->io, bdev_io, module_link); break;