From 9872b9920651c170e94b7334dd796c487b884cac Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 27 Sep 2018 16:21:15 +0900 Subject: [PATCH] bdev: Avoid assert when read/write to bdev fails in _spdk_bdev_io_split Currently when read/write to bdev fails in _spdk_bdev_io_split_with_payload due to other than -ENOMEM, assert is called. RAID bdev that utilizes the split IO feature is generally availale now and it will be OK to remove this assert and return error instead. Change-Id: I6ea6fd45b94bff0ea84e498e0c4dfd1dd31e0260 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/427025 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Darek Stojaczyk Reviewed-by: Paul Luse Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- lib/bdev/bdev.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index f68aaaf0c..ec401b2d2 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1205,13 +1205,15 @@ _spdk_bdev_io_split_with_payload(void *_bdev_io) if (rc == 0) { bdev_io->u.bdev.split_current_offset_blocks += to_next_boundary; bdev_io->u.bdev.split_remaining_num_blocks -= to_next_boundary; - } else { - assert(rc == -ENOMEM); + } else if (rc == -ENOMEM) { bdev_io->internal.waitq_entry.bdev = bdev_io->bdev; bdev_io->internal.waitq_entry.cb_fn = _spdk_bdev_io_split_with_payload; bdev_io->internal.waitq_entry.cb_arg = bdev_io; spdk_bdev_queue_io_wait(bdev_io->bdev, spdk_io_channel_from_ctx(bdev_io->internal.ch), &bdev_io->internal.waitq_entry); + } else { + bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED; + bdev_io->internal.cb(bdev_io, false, bdev_io->internal.caller_ctx); } }