From: Alex Zhuravlev Date: Thu, 11 Nov 2021 08:19:46 +0000 (+0300) Subject: LU-15207 libcfs: reset hs_rehash_bits X-Git-Tag: 2.15.51~188 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=9257f24dfdf9f0a68512fce52d79064f78d9dc88;p=fs%2Flustre-release.git LU-15207 libcfs: reset hs_rehash_bits if rehash work is cancelled, then nobody resets hs_rehash_bits and the first iterator asserts at LASSERT(!cfs_hash_is_rehashing(hs)) in cfs_hash_for_each_relax(). Signed-off-by: Alex Zhuravlev Change-Id: I1a567f6be77ca6c45e5d4f256722206b12588554 Reviewed-on: https://review.whamcloud.com/45533 Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/libcfs/libcfs/hash.c b/libcfs/libcfs/hash.c index ca234ef..6fb32ad 100644 --- a/libcfs/libcfs/hash.c +++ b/libcfs/libcfs/hash.c @@ -1828,8 +1828,15 @@ EXPORT_SYMBOL(cfs_hash_for_each_key); void cfs_hash_rehash_cancel(struct cfs_hash *hs) { - LASSERT(cfs_hash_with_rehash(hs)); - cancel_work_sync(&hs->hs_rehash_work); + LASSERT(hs->hs_iterators > 0 || hs->hs_exiting); + while (cfs_hash_is_rehashing(hs)) { + if (cancel_work_sync(&hs->hs_rehash_work)) { + cfs_hash_lock(hs, 1); + hs->hs_rehash_bits = 0; + cfs_hash_unlock(hs, 1); + } + cond_resched(); + } } void