From f84616102baac96245e08352dba9d6385937f549 Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Mon, 24 Jul 2017 18:43:16 +0200 Subject: [PATCH] bdev: allow closing descriptor from it's remove_cb bdev could be unregistered multiple times when all it's descriptors have been instantly closed via it's remove_cb without any deferred event/poller Change-Id: I128716077b0512c6334bdd113220684f8cfcbecb Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/370949 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/bdev/bdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 987bdafca..3f3ff460f 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1437,6 +1437,7 @@ spdk_bdev_unregister(struct spdk_bdev *bdev) { struct spdk_bdev_desc *desc, *tmp; int rc; + bool do_destruct = true; SPDK_TRACELOG(SPDK_TRACE_DEBUG, "Removing bdev %s from list\n", bdev->name); @@ -1447,12 +1448,13 @@ spdk_bdev_unregister(struct spdk_bdev *bdev) TAILQ_FOREACH_SAFE(desc, &bdev->open_descs, link, tmp) { if (desc->remove_cb) { pthread_mutex_unlock(&bdev->mutex); + do_destruct = false; desc->remove_cb(desc->remove_ctx); pthread_mutex_lock(&bdev->mutex); } } - if (!TAILQ_EMPTY(&bdev->open_descs)) { + if (!do_destruct) { pthread_mutex_unlock(&bdev->mutex); return; }