]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.14
authorSasha Levin <sashal@kernel.org>
Fri, 19 Jun 2020 04:11:09 +0000 (00:11 -0400)
committerSasha Levin <sashal@kernel.org>
Fri, 19 Jun 2020 04:11:09 +0000 (00:11 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.14/blk-mq-move-_blk_mq_update_nr_hw_queues-synchronize_.patch [new file with mode: 0644]
queue-4.14/btrfs-fix-error-handling-when-submitting-direct-i-o-.patch [new file with mode: 0644]
queue-4.14/btrfs-fix-wrong-file-range-cleanup-after-an-error-fi.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/blk-mq-move-_blk_mq_update_nr_hw_queues-synchronize_.patch b/queue-4.14/blk-mq-move-_blk_mq_update_nr_hw_queues-synchronize_.patch
new file mode 100644 (file)
index 0000000..5092b1b
--- /dev/null
@@ -0,0 +1,55 @@
+From 3574841f77a86a1314eff325c5e27e8b9c58f688 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Jun 2020 19:32:23 +0100
+Subject: blk-mq: move _blk_mq_update_nr_hw_queues synchronize_rcu call
+
+From: Giuliano Procida <gprocida@google.com>
+
+This fixes the
+4.14 backport commit 574eb136ec7f315c3ef2ca68fa9b3e16c56baa24
+which was
+upstream commit f5bbbbe4d63577026f908a809f22f5fd5a90ea1f.
+
+The upstream commit added a call to synchronize_rcu to
+_blk_mq_update_nr_hw_queues, just after freezing queues.
+
+In the backport this landed just after unfreezeing queues.
+
+This commit moves the call to its intended place.
+
+Fixes: 574eb136ec7f ("blk-mq: sync the update nr_hw_queues with blk_mq_queue_tag_busy_iter")
+Signed-off-by: Giuliano Procida <gprocida@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ block/blk-mq.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/block/blk-mq.c b/block/blk-mq.c
+index 9d53f476c517..cf56bdad2e06 100644
+--- a/block/blk-mq.c
++++ b/block/blk-mq.c
+@@ -2738,6 +2738,10 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
+       list_for_each_entry(q, &set->tag_list, tag_set_list)
+               blk_mq_freeze_queue(q);
++      /*
++       * Sync with blk_mq_queue_tag_busy_iter.
++       */
++      synchronize_rcu();
+       set->nr_hw_queues = nr_hw_queues;
+       blk_mq_update_queue_map(set);
+@@ -2748,10 +2752,6 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
+       list_for_each_entry(q, &set->tag_list, tag_set_list)
+               blk_mq_unfreeze_queue(q);
+-      /*
+-       * Sync with blk_mq_queue_tag_busy_iter.
+-       */
+-      synchronize_rcu();
+ }
+ void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues)
+-- 
+2.25.1
+
diff --git a/queue-4.14/btrfs-fix-error-handling-when-submitting-direct-i-o-.patch b/queue-4.14/btrfs-fix-error-handling-when-submitting-direct-i-o-.patch
new file mode 100644 (file)
index 0000000..785cdb1
--- /dev/null
@@ -0,0 +1,67 @@
+From 5cb8ca899d21b95e87cc9b39a3da29d59914daa7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Apr 2020 14:46:12 -0700
+Subject: btrfs: fix error handling when submitting direct I/O bio
+
+From: Omar Sandoval <osandov@fb.com>
+
+[ Upstream commit 6d3113a193e3385c72240096fe397618ecab6e43 ]
+
+In btrfs_submit_direct_hook(), if a direct I/O write doesn't span a RAID
+stripe or chunk, we submit orig_bio without cloning it. In this case, we
+don't increment pending_bios. Then, if btrfs_submit_dio_bio() fails, we
+decrement pending_bios to -1, and we never complete orig_bio. Fix it by
+initializing pending_bios to 1 instead of incrementing later.
+
+Fixing this exposes another bug: we put orig_bio prematurely and then
+put it again from end_io. Fix it by not putting orig_bio.
+
+After this change, pending_bios is really more of a reference count, but
+I'll leave that cleanup separate to keep the fix small.
+
+Fixes: e65e15355429 ("btrfs: fix panic caused by direct IO")
+CC: stable@vger.kernel.org # 4.4+
+Reviewed-by: Nikolay Borisov <nborisov@suse.com>
+Reviewed-by: Josef Bacik <josef@toxicpanda.com>
+Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
+Signed-off-by: Omar Sandoval <osandov@fb.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/btrfs/inode.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 2a196bb134d9..3e65ac2d4869 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -8707,7 +8707,6 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip)
+       /* bio split */
+       ASSERT(map_length <= INT_MAX);
+-      atomic_inc(&dip->pending_bios);
+       do {
+               clone_len = min_t(int, submit_len, map_length);
+@@ -8758,7 +8757,8 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip)
+       if (!status)
+               return 0;
+-      bio_put(bio);
++      if (bio != orig_bio)
++              bio_put(bio);
+ out_err:
+       dip->errors = 1;
+       /*
+@@ -8798,7 +8798,7 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode,
+       bio->bi_private = dip;
+       dip->orig_bio = bio;
+       dip->dio_bio = dio_bio;
+-      atomic_set(&dip->pending_bios, 0);
++      atomic_set(&dip->pending_bios, 1);
+       io_bio = btrfs_io_bio(bio);
+       io_bio->logical = file_offset;
+-- 
+2.25.1
+
diff --git a/queue-4.14/btrfs-fix-wrong-file-range-cleanup-after-an-error-fi.patch b/queue-4.14/btrfs-fix-wrong-file-range-cleanup-after-an-error-fi.patch
new file mode 100644 (file)
index 0000000..d7443fe
--- /dev/null
@@ -0,0 +1,46 @@
+From 5eaf3239924061f77462c34d80aa573d9c7d57e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 May 2020 11:15:53 +0100
+Subject: btrfs: fix wrong file range cleanup after an error filling dealloc
+ range
+
+From: Filipe Manana <fdmanana@suse.com>
+
+[ Upstream commit e2c8e92d1140754073ad3799eb6620c76bab2078 ]
+
+If an error happens while running dellaloc in COW mode for a range, we can
+end up calling extent_clear_unlock_delalloc() for a range that goes beyond
+our range's end offset by 1 byte, which affects 1 extra page. This results
+in clearing bits and doing page operations (such as a page unlock) outside
+our target range.
+
+Fix that by calling extent_clear_unlock_delalloc() with an inclusive end
+offset, instead of an exclusive end offset, at cow_file_range().
+
+Fixes: a315e68f6e8b30 ("Btrfs: fix invalid attempt to free reserved space on failure to cow range")
+CC: stable@vger.kernel.org # 4.14+
+Signed-off-by: Filipe Manana <fdmanana@suse.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/btrfs/inode.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 3e65ac2d4869..ad138f0b0ce1 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -1139,8 +1139,8 @@ static noinline int cow_file_range(struct inode *inode,
+        */
+       if (extent_reserved) {
+               extent_clear_unlock_delalloc(inode, start,
+-                                           start + cur_alloc_size,
+-                                           start + cur_alloc_size,
++                                           start + cur_alloc_size - 1,
++                                           start + cur_alloc_size - 1,
+                                            locked_page,
+                                            clear_bits,
+                                            page_ops);
+-- 
+2.25.1
+
index 22f2915bde8250388884904f9a58be8dca6944ac..c2bca99127a20d0d67d410782ea98cc3dc08f1a1 100644 (file)
@@ -156,3 +156,6 @@ vga_switcheroo-use-device-link-for-hda-controller.patch
 pci-generalize-multi-function-power-dependency-devic.patch
 pci-add-acs-quirk-for-intel-root-complex-integrated-.patch
 pci-unify-acs-quirk-desired-vs-provided-checking.patch
+btrfs-fix-error-handling-when-submitting-direct-i-o-.patch
+btrfs-fix-wrong-file-range-cleanup-after-an-error-fi.patch
+blk-mq-move-_blk_mq_update_nr_hw_queues-synchronize_.patch