bdev: do not call spdk_bdev_module_finish_iter from bdev unregister ctx
There is a call to spdk_bdev_close () during spdk_bdev_part_base_free (). This will trigger spdk_bdev_module-> module_fini () if this is the last descriptor to the last bdev. In module_fini () resource might be freed. But then, after spdk_bdev_close(), call to base_free_fn () is done which may try to free the same resource again. To avoid this, call spdk_bdev_module_finish_iter () after _spdk_bdev_finish_unregister_bdevs_iter () return. Change-Id: Ia6eb210504d121772221da18651a90ffc89dbbc4 Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com> Reviewed-on: https://review.gerrithub.io/405322 Reviewed-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
4473942f46
commit
b29498053d
@ -781,7 +781,12 @@ _spdk_bdev_finish_unregister_bdevs_iter(void *cb_arg, int bdeverrno)
|
||||
|
||||
if (TAILQ_EMPTY(&g_bdev_mgr.bdevs)) {
|
||||
SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Done unregistering bdevs\n");
|
||||
spdk_bdev_module_finish_iter(NULL);
|
||||
/*
|
||||
* Bdev module finish need to be deffered as we might be in the middle of some context
|
||||
* (like bdev part free) that will use this bdev (or private bdev driver ctx data)
|
||||
* after returning.
|
||||
*/
|
||||
spdk_thread_send_msg(spdk_get_thread(), spdk_bdev_module_finish_iter, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user