Commits
Vasily Averin authored and Konstantin Khorenko committed 0a074588bfb
cbt: bitmap corruption caused by ipi IPI generated by cbt_flush_cache() can interrupt blk_cbt_add() in "bad" places and lead to bitmap corruption. CPU A CPU B blk_cbt_add() ... cbt_flush_cache() old = *ex; submit IPI ex->start = start; interrupt __cbt_flush_cpu_cache if (ex->len) <<< found non-changed len __blk_cbt_set(cbt, ex->start, ex->len, 0, 1); <<< set wrong bitmask ex->start += ex->len; <<< incorrectly adjusts ex->start ex->len = 0; return from interrupt back to blk_cbt_add() ex->len = len; <<< set len and get wrong bitmask (because ex->start was changed in __cbt_flush_cpu_cache) Similar problem happens if IPI will be processed in middle of following block in blk_cbt_add() if (ex->start + ex->len == start) { ex->len += len; goto out_rcu; } Patch disables interrupts in specified places. https://jira.sw.ru/browse/PSBM-89323 Signed-off-by: Vasily Averin <vvs@virtuozzo.com>