From 56c7da0e3b9ae99489686c2e8d731f2f1f901f37 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Tue, 21 Jan 2020 03:19:25 -0500 Subject: [PATCH] bdev/nvme: check the return value for spdk_nvme_probe_poll_async() When there is an error returned from low level driver, we should unregister the poller and free the context, or it may get double free when reaching next poll round. Fix issue #1156. Change-Id: I34ca605f11249b885756d761291aebbb7a382d7e Signed-off-by: Changpeng Liu Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/482215 Community-CI: SPDK CI Jenkins Tested-by: SPDK CI Jenkins Reviewed-by: Ziye Yang Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- module/bdev/nvme/bdev_nvme.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 482744ea4..b108060ac 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -1522,8 +1522,13 @@ static int bdev_nvme_async_poll(void *arg) { struct nvme_async_probe_ctx *ctx = arg; + int rc; - spdk_nvme_probe_poll_async(ctx->probe_ctx); + rc = spdk_nvme_probe_poll_async(ctx->probe_ctx); + if (spdk_unlikely(rc != -EAGAIN && rc != 0)) { + spdk_poller_unregister(&ctx->poller); + free(ctx); + } return 1; }