Spdk/module/bdev
Shuhei Matsumoto 01f769c62a bdev/nvme: Ensure ctrlr->destruct is set only once
Checking if destruct is false and setting destruct to true are
separated by mutex in remove_cb() and bdev_nvme_library_fini().

It was possible that multiple threads called nvme_bdev_ctrlr_destruct()
because the caller could call nvme_bdev_ctrlr_destruct() before
setting destruct to true after knowing it was false.

This patch ensures that nvme_bdev_ctrlr_destruct() is called only once.

Set ctrlr->destruct to true without releasing mutex after checking
if ctrlr->destruct is false.

If destruct is set to true before calling nvme_ctrlr_depopulate_namespaces(),
nvme_ctrlr_depopulate_namespace_done() may call nvme_bdev_ctrlr_destruct()
because it is likely that reference count is zero and destruct is true.
In this case, remove_cb() or bdev_nvme_library_fini() cannot call
nvme_bdev_destruct() after returning from nvme_ctrlr_depopulate_namespaces().

On the other hand, if a controller has no namespace,
nvme_ctrlr_depopulate_namespaces() does nothing and
nvme_ctrlr_depopulate_namespace_done() is not called. Hence
remove_cb() or bdev_nvme_library_fini() has to call nvme_bdev_destruct()
after returning nvme_ctrlr_depopulate_namespaces().

To unify both cases, initialize reference count to one as a sentinel value
and remove_cb() and bdev_nvme_library_fini() decrement reference count
and then calls nvme_bdev_ctrlr_destruct() if reference count is zero
after returning from nvme_ctrlr_depopulate_namespaces().

Additionally, add assert to check if reference count is not negative
to find bug in future.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I8a617b5aa4d0a9faff832e63c2ed4b353341dd6b
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4817
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
2020-11-16 12:23:04 +00:00
..
aio bdev_aio: fix interrupt mode notify error 2020-10-26 11:49:03 +00:00
compress bdev_module: remove config_text 2020-10-21 02:25:45 +00:00
crypto bdev modules: remove legacy config support 2020-10-20 02:42:16 +00:00
delay bdev_module: remove config_text 2020-10-21 02:25:45 +00:00
error module/error: remove legacy config support 2020-10-16 08:15:26 +00:00
ftl build: remove unused references to conf library 2020-10-20 02:42:16 +00:00
gpt module/gpt: remove legacy config support 2020-10-19 09:55:43 +00:00
iscsi bdev modules: remove legacy config support 2020-10-20 02:42:16 +00:00
lvol bdev/lvol: Pass bdev name instead of bdev pointer to vbdev_lvs_create 2020-10-20 08:52:29 +00:00
malloc module/malloc: remove legacy config support 2020-10-19 09:55:43 +00:00
null module/null: remove legacy config support 2020-10-19 09:55:43 +00:00
nvme bdev/nvme: Ensure ctrlr->destruct is set only once 2020-11-16 12:23:04 +00:00
ocf bdev/ocf: Fix metadata updater call 2020-11-06 08:11:19 +00:00
passthru module/passthru: remove legacy config support 2020-10-19 09:55:43 +00:00
pmem bdev modules: remove legacy config support 2020-10-20 02:42:16 +00:00
raid bdev modules: remove legacy config support 2020-10-20 02:42:16 +00:00
rbd bdev modules: remove legacy config support 2020-10-20 02:42:16 +00:00
split module/split: remove legacy config support 2020-10-19 09:55:43 +00:00
uring module/uring: remove legacy config support 2020-10-19 09:55:43 +00:00
virtio module/virtio_blk/sci: remove legacy config support 2020-10-20 02:42:16 +00:00
zone_block bdev_module: remove config_text 2020-10-21 02:25:45 +00:00
Makefile bdev: move bdev_rpc library contents 2020-09-25 11:43:42 +00:00