]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 May 2022 11:56:42 +0000 (13:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 May 2022 11:56:42 +0000 (13:56 +0200)
added patches:
dm-interlock-pending-dm_io-and-dm_wait_for_bios_completion.patch

queue-5.10/dm-interlock-pending-dm_io-and-dm_wait_for_bios_completion.patch [new file with mode: 0644]
queue-5.10/series

diff --git a/queue-5.10/dm-interlock-pending-dm_io-and-dm_wait_for_bios_completion.patch b/queue-5.10/dm-interlock-pending-dm_io-and-dm_wait_for_bios_completion.patch
new file mode 100644 (file)
index 0000000..741a88f
--- /dev/null
@@ -0,0 +1,60 @@
+From 9f6dc633761006f974701d4c88da71ab68670749 Mon Sep 17 00:00:00 2001
+From: Mike Snitzer <snitzer@redhat.com>
+Date: Thu, 17 Feb 2022 23:40:02 -0500
+Subject: dm: interlock pending dm_io and dm_wait_for_bios_completion
+
+From: Mike Snitzer <snitzer@redhat.com>
+
+commit 9f6dc633761006f974701d4c88da71ab68670749 upstream.
+
+Commit d208b89401e0 ("dm: fix mempool NULL pointer race when
+completing IO") didn't go far enough.
+
+When bio_end_io_acct ends the count of in-flight I/Os may reach zero
+and the DM device may be suspended. There is a possibility that the
+suspend races with dm_stats_account_io.
+
+Fix this by adding percpu "pending_io" counters to track outstanding
+dm_io. Move kicking of suspend queue to dm_io_dec_pending(). Also,
+rename md_in_flight_bios() to dm_in_flight_bios() and update it to
+iterate all pending_io counters.
+
+Fixes: d208b89401e0 ("dm: fix mempool NULL pointer race when completing IO")
+Cc: stable@vger.kernel.org
+Co-developed-by: Mikulas Patocka <mpatocka@redhat.com>
+Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/md/dm.c |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/md/dm.c
++++ b/drivers/md/dm.c
+@@ -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;
+ }
index f2a191bc90dba14619b371e28bfec943f32f29d1..14f4360aa709906d92844c15d5b63ae6d127719d 100644 (file)
@@ -66,3 +66,4 @@ kvm-lapic-enable-timer-posted-interrupt-only-when-mw.patch
 rcu-fix-callbacks-processing-time-limit-retaining-cond_resched.patch
 rcu-apply-callbacks-processing-time-limit-only-on-softirq.patch
 block-map-add-__gfp_zero-flag-for-alloc_page-in-function-bio_copy_kern.patch
+dm-interlock-pending-dm_io-and-dm_wait_for_bios_completion.patch