This is backport of the patch 9f6dc6337610 ("dm: interlock pending dm_io
and dm_wait_for_bios_completion") for the kernel 5.10.The bugs fixed by this patch can cause random crashing when reloading dm table, so it is eligible for stable backport. Note that the percpu variable md->pending_io is not needed in the stable kernels, because the "in_flight" counter in struct disk_stats counts the same value, so it is not backported. In order to fix this bug, we swap the calls to bio_end_io_acct and dm_stats_account_io. Signed-off-by: Mikulas Patocka <[email protected]> Reviewed-by: Mike Snitzer <[email protected]> --- drivers/md/dm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) Index: linux-stable/drivers/md/dm.c =================================================================== --- linux-stable.orig/drivers/md/dm.c 2022-04-30 20:09:28.000000000 +0200 +++ linux-stable/drivers/md/dm.c 2022-04-30 20:10:19.000000000 +0200 @@ -612,13 +612,15 @@ static void end_io_acct(struct mapped_de { unsigned long duration = jiffies - start_time; - bio_end_io_acct(bio, start_time); - if (unlikely(dm_stats_used(&md->stats))) dm_stats_account_io(&md->stats, bio_data_dir(bio), bio->bi_iter.bi_sector, bio_sectors(bio), true, duration, stats_aux); + smp_wmb(); + + bio_end_io_acct(bio, start_time); + /* nudge anyone waiting on suspend queue */ if (unlikely(wq_has_sleeper(&md->wait))) wake_up(&md->wait); @@ -2348,6 +2350,8 @@ static int dm_wait_for_bios_completion(s } finish_wait(&md->wait, &wait); + smp_rmb(); + return r; } -- dm-devel mailing list [email protected] https://listman.redhat.com/mailman/listinfo/dm-devel
