Many parts of the blobstore.c seem to have gone with the assumption that blob creation, deletion, etc. all happen on the md thread. This assumption would allow modification of the bs->used_md_pages and bs->used_clusters bit arrays without holding a lock. Placing "assert(spdk_get_thread() == bs->md_thread)" in bs_claim_md_page() and bs_claim_cluster() show that each of these functions are called on other threads due writes to thin provisioned volumes. This problem was first seen in the wild with this failed assertion: bs_claim_md_page: Assertion `spdk_bit_array_get(bs->used_md_pages, page) == false' failed. This commit adds "assert(spdk_spin_held(&bs->used_lock))" in those places where bs->used_md_pages and bs->used_lock are modified, then holds bs->used_lock in the places needed to satisfy these assertions. Signed-off-by: Mike Gerdts <mgerdts@nvidia.com> Change-Id: I0523dd343ec490d994352932b2a73379a80e36f4 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15953 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Community-CI: Mellanox Build Bot |
||
---|---|---|
.. | ||
blob.c | ||
bs_dev_common.c | ||
bs_scheduler.c | ||
Makefile |