From: Sasha Levin Date: Fri, 19 Jun 2020 04:11:09 +0000 (-0400) Subject: Fixes for 4.14 X-Git-Tag: v4.4.228~34 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fb2025862796b7b381d7866afd49dd57b8a22c39;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.14 Signed-off-by: Sasha Levin --- 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 index 00000000000..5092b1b2b14 --- /dev/null +++ b/queue-4.14/blk-mq-move-_blk_mq_update_nr_hw_queues-synchronize_.patch @@ -0,0 +1,55 @@ +From 3574841f77a86a1314eff325c5e27e8b9c58f688 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +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 +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..785cdb1d785 --- /dev/null +++ b/queue-4.14/btrfs-fix-error-handling-when-submitting-direct-i-o-.patch @@ -0,0 +1,67 @@ +From 5cb8ca899d21b95e87cc9b39a3da29d59914daa7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 16 Apr 2020 14:46:12 -0700 +Subject: btrfs: fix error handling when submitting direct I/O bio + +From: Omar Sandoval + +[ 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 +Reviewed-by: Josef Bacik +Reviewed-by: Johannes Thumshirn +Signed-off-by: Omar Sandoval +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..d7443fe7228 --- /dev/null +++ b/queue-4.14/btrfs-fix-wrong-file-range-cleanup-after-an-error-fi.patch @@ -0,0 +1,46 @@ +From 5eaf3239924061f77462c34d80aa573d9c7d57e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-4.14/series b/queue-4.14/series index 22f2915bde8..c2bca99127a 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -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