From 7058f8531814df89015b0efda9732583d8ea3a35 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Thu, 11 May 2017 09:48:07 -0700 Subject: [PATCH] bdev: When a channel is destroyed, abort all queued I/O Change-Id: I03d042cbb6de08f7e07b8c0ccc8af44d7b16ae3b Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/362614 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris --- lib/bdev/bdev.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 49e211436..4c720be69 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -546,6 +546,24 @@ static void spdk_bdev_channel_destroy(void *io_device, void *ctx_buf) { struct spdk_bdev_channel *ch = ctx_buf; + struct spdk_bdev_io *bdev_io, *tmp; + uint32_t core; + + core = spdk_env_get_current_core(); + + TAILQ_FOREACH_SAFE(bdev_io, &g_bdev_mgr.need_buf_small[core], buf_link, tmp) { + if (bdev_io->ch == ch) { + TAILQ_REMOVE(&g_bdev_mgr.need_buf_small[core], bdev_io, buf_link); + spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); + } + } + + TAILQ_FOREACH_SAFE(bdev_io, &g_bdev_mgr.need_buf_large[core], buf_link, tmp) { + if (bdev_io->ch == ch) { + TAILQ_REMOVE(&g_bdev_mgr.need_buf_large[core], bdev_io, buf_link); + spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); + } + } spdk_put_io_channel(ch->channel); spdk_put_io_channel(ch->mgmt_channel);