diff --git a/kmod/src/block.c b/kmod/src/block.c index 1d80a667..bb581173 100644 --- a/kmod/src/block.c +++ b/kmod/src/block.c @@ -286,10 +286,16 @@ static int block_insert(struct super_block *sb, struct block_private *bp) WARN_ON_ONCE(atomic_read(&bp->refcount) & BLOCK_REF_INSERTED); +retry: atomic_add(BLOCK_REF_INSERTED, &bp->refcount); - ret = rhashtable_insert_fast(&binf->ht, &bp->ht_head, block_ht_params); + ret = rhashtable_lookup_insert_fast(&binf->ht, &bp->ht_head, block_ht_params); if (ret < 0) { atomic_sub(BLOCK_REF_INSERTED, &bp->refcount); + if (ret == -EBUSY) { + /* wait for pending rebalance to finish */ + synchronize_rcu(); + goto retry; + } } else { atomic_inc(&binf->total_inserted); TRACE_BLOCK(insert, bp);