From 11839b805c0a267f724e650849b12f957473414e Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 25 Feb 2019 12:44:10 +0900 Subject: [PATCH] bdev/null: Check if the number of blocks of read I/O is not larger than allowed. Add a check if the number of blocks of read I/O is not larger than allowed. This is a preparation to the subsequent patches that support DIF in NULL bdev. Change-Id: I82d4c835788d2f347fd5fdef82e1def313dd49a1 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/446052 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: wuzhouhui Reviewed-by: Ziye Yang Reviewed-by: Changpeng Liu --- lib/bdev/null/bdev_null.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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;