On 01.02.2023 21:22, Nikolay Borisov wrote:
blk_cbt_update_size uses spin_lock_irq to lock the cbt while pages are being copied and the new cbt is published at q->cbt. This lock is used to synchronize against blk_cbt_release, which can be called within softirq context. This function requires unlocking be done with spin_unlock_irq so that interrupts are properly reenabled. Without this fix the core on which blk_cbt_update_size run would end up with interrupts being disabled.
Reviewed-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> Fixes: e69ca16f4135 ("cbt: introduce changed block tracking")
Reported-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> Signed-off-by: Nikolay Borisov <nikolay.bori...@virtuozzo.com> --- block/blk-cbt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/blk-cbt.c b/block/blk-cbt.c index 32485c793484..083ed5785031 100644 --- a/block/blk-cbt.c +++ b/block/blk-cbt.c @@ -607,7 +607,7 @@ void blk_cbt_update_size(struct block_device *bdev) } rcu_assign_pointer(q->cbt, new); in_use = cbt->count; - spin_unlock(&cbt->lock); + spin_unlock_irq(&cbt->lock); if (!in_use) call_rcu(&cbt->rcu, &cbt_release_callback); err_mtx:
-- Best regards, Tikhomirov Pavel Software Developer, Virtuozzo. _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel