release 6.14.1
This commit is contained in:
76
debian/patches/patchset-pf/btrfs/0001-btrfs-fix-non-empty-delayed-iputs-list-on-unmount-du.patch
vendored
Normal file
76
debian/patches/patchset-pf/btrfs/0001-btrfs-fix-non-empty-delayed-iputs-list-on-unmount-du.patch
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
From 361b73ca6606d8bace6fe78b63d508d747c6689a Mon Sep 17 00:00:00 2001
|
||||
From: Filipe Manana <fdmanana@suse.com>
|
||||
Date: Wed, 5 Mar 2025 16:52:26 +0000
|
||||
Subject: btrfs: fix non-empty delayed iputs list on unmount due to compressed
|
||||
write workers
|
||||
|
||||
At close_ctree() after we have ran delayed iputs either through explicitly
|
||||
calling btrfs_run_delayed_iputs() or later during the call to
|
||||
btrfs_commit_super() or btrfs_error_commit_super(), we assert that the
|
||||
delayed iputs list is empty.
|
||||
|
||||
When we have compressed writes this assertion may fail because delayed
|
||||
iputs may have been added to the list after we last ran delayed iputs.
|
||||
This happens like this:
|
||||
|
||||
1) We have a compressed write bio executing;
|
||||
|
||||
2) We enter close_ctree() and flush the fs_info->endio_write_workers
|
||||
queue which is the queue used for running ordered extent completion;
|
||||
|
||||
3) The compressed write bio finishes and enters
|
||||
btrfs_finish_compressed_write_work(), where it calls
|
||||
btrfs_finish_ordered_extent() which in turn calls
|
||||
btrfs_queue_ordered_fn(), which queues a work item in the
|
||||
fs_info->endio_write_workers queue that we have flushed before;
|
||||
|
||||
4) At close_ctree() we proceed, run all existing delayed iputs and
|
||||
call btrfs_commit_super() (which also runs delayed iputs), but before
|
||||
we run the following assertion below:
|
||||
|
||||
ASSERT(list_empty(&fs_info->delayed_iputs))
|
||||
|
||||
A delayed iput is added by the step below...
|
||||
|
||||
5) The ordered extent completion job queued in step 3 runs and results in
|
||||
creating a delayed iput when dropping the last reference of the ordered
|
||||
extent (a call to btrfs_put_ordered_extent() made from
|
||||
btrfs_finish_one_ordered());
|
||||
|
||||
6) At this point the delayed iputs list is not empty, so the assertion at
|
||||
close_ctree() fails.
|
||||
|
||||
Fix this by flushing the fs_info->compressed_write_workers queue at
|
||||
close_ctree() before flushing the fs_info->endio_write_workers queue,
|
||||
respecting the queue dependency as the later is responsible for the
|
||||
execution of ordered extent completion.
|
||||
|
||||
CC: stable@vger.kernel.org # 5.15+
|
||||
Reviewed-by: Qu Wenruo <wqu@suse.com>
|
||||
Signed-off-by: Filipe Manana <fdmanana@suse.com>
|
||||
Signed-off-by: David Sterba <dsterba@suse.com>
|
||||
---
|
||||
fs/btrfs/disk-io.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/fs/btrfs/disk-io.c
|
||||
+++ b/fs/btrfs/disk-io.c
|
||||
@@ -4346,6 +4346,18 @@ void __cold close_ctree(struct btrfs_fs_
|
||||
btrfs_flush_workqueue(fs_info->delalloc_workers);
|
||||
|
||||
/*
|
||||
+ * When finishing a compressed write bio we schedule a work queue item
|
||||
+ * to finish an ordered extent - btrfs_finish_compressed_write_work()
|
||||
+ * calls btrfs_finish_ordered_extent() which in turns does a call to
|
||||
+ * btrfs_queue_ordered_fn(), and that queues the ordered extent
|
||||
+ * completion either in the endio_write_workers work queue or in the
|
||||
+ * fs_info->endio_freespace_worker work queue. We flush those queues
|
||||
+ * below, so before we flush them we must flush this queue for the
|
||||
+ * workers of compressed writes.
|
||||
+ */
|
||||
+ flush_workqueue(fs_info->compressed_write_workers);
|
||||
+
|
||||
+ /*
|
||||
* After we parked the cleaner kthread, ordered extents may have
|
||||
* completed and created new delayed iputs. If one of the async reclaim
|
||||
* tasks is running and in the RUN_DELAYED_IPUTS flush state, then we
|
30
debian/patches/patchset-pf/btrfs/0002-btrfs-tests-fix-chunk-map-leak-after-failure-to-add-.patch
vendored
Normal file
30
debian/patches/patchset-pf/btrfs/0002-btrfs-tests-fix-chunk-map-leak-after-failure-to-add-.patch
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
From 9ac804f2001675a05f01a2f74af0c85861801e59 Mon Sep 17 00:00:00 2001
|
||||
From: Filipe Manana <fdmanana@suse.com>
|
||||
Date: Tue, 11 Mar 2025 15:50:50 +0000
|
||||
Subject: btrfs: tests: fix chunk map leak after failure to add it to the tree
|
||||
|
||||
If we fail to add the chunk map to the fs mapping tree we exit
|
||||
test_rmap_block() without freeing the chunk map. Fix this by adding a
|
||||
call to btrfs_free_chunk_map() before exiting the test function if the
|
||||
call to btrfs_add_chunk_map() failed.
|
||||
|
||||
Fixes: 7dc66abb5a47 ("btrfs: use a dedicated data structure for chunk maps")
|
||||
CC: stable@vger.kernel.org # 6.12+
|
||||
Reviewed-by: Boris Burkov <boris@bur.io>
|
||||
Signed-off-by: Filipe Manana <fdmanana@suse.com>
|
||||
Reviewed-by: David Sterba <dsterba@suse.com>
|
||||
Signed-off-by: David Sterba <dsterba@suse.com>
|
||||
---
|
||||
fs/btrfs/tests/extent-map-tests.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/fs/btrfs/tests/extent-map-tests.c
|
||||
+++ b/fs/btrfs/tests/extent-map-tests.c
|
||||
@@ -1045,6 +1045,7 @@ static int test_rmap_block(struct btrfs_
|
||||
ret = btrfs_add_chunk_map(fs_info, map);
|
||||
if (ret) {
|
||||
test_err("error adding chunk map to mapping tree");
|
||||
+ btrfs_free_chunk_map(map);
|
||||
goto out_free;
|
||||
}
|
||||
|
36
debian/patches/patchset-pf/btrfs/0003-btrfs-zoned-fix-zone-activation-with-missing-devices.patch
vendored
Normal file
36
debian/patches/patchset-pf/btrfs/0003-btrfs-zoned-fix-zone-activation-with-missing-devices.patch
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
From 2d168cd506ec0b7a7619433aa0299b0be05ce655 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
|
||||
Date: Mon, 17 Mar 2025 12:24:58 +0100
|
||||
Subject: btrfs: zoned: fix zone activation with missing devices
|
||||
|
||||
If btrfs_zone_activate() is called with a filesystem that has missing
|
||||
devices (e.g. a RAID file system mounted in degraded mode) it is accessing
|
||||
the btrfs_device::zone_info pointer, which will not be set if the device in
|
||||
question is missing.
|
||||
|
||||
Check if the device is present (by checking if it has a valid block
|
||||
device pointer associated) and if not, skip zone activation for it.
|
||||
|
||||
Fixes: f9a912a3c45f ("btrfs: zoned: make zone activation multi stripe capable")
|
||||
CC: stable@vger.kernel.org # 6.1+
|
||||
Reviewed-by: Naohiro Aota <naohiro.aota@wdc.com>
|
||||
Reviewed-by: Anand Jain <anand.jain@oracle.com>
|
||||
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
|
||||
Reviewed-by: David Sterba <dsterba@suse.com>
|
||||
Signed-off-by: David Sterba <dsterba@suse.com>
|
||||
---
|
||||
fs/btrfs/zoned.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/fs/btrfs/zoned.c
|
||||
+++ b/fs/btrfs/zoned.c
|
||||
@@ -2111,6 +2111,9 @@ bool btrfs_zone_activate(struct btrfs_bl
|
||||
physical = map->stripes[i].physical;
|
||||
zinfo = device->zone_info;
|
||||
|
||||
+ if (!device->bdev)
|
||||
+ continue;
|
||||
+
|
||||
if (zinfo->max_active_zones == 0)
|
||||
continue;
|
||||
|
36
debian/patches/patchset-pf/btrfs/0004-btrfs-zoned-fix-zone-finishing-with-missing-devices.patch
vendored
Normal file
36
debian/patches/patchset-pf/btrfs/0004-btrfs-zoned-fix-zone-finishing-with-missing-devices.patch
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
From 5d05bf549f00ac4b04476b749847a7fcb019a73f Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
|
||||
Date: Mon, 17 Mar 2025 12:24:59 +0100
|
||||
Subject: btrfs: zoned: fix zone finishing with missing devices
|
||||
|
||||
If do_zone_finish() is called with a filesystem that has missing devices
|
||||
(e.g. a RAID file system mounted in degraded mode) it is accessing the
|
||||
btrfs_device::zone_info pointer, which will not be set if the device
|
||||
in question is missing.
|
||||
|
||||
Check if the device is present (by checking if it has a valid block device
|
||||
pointer associated) and if not, skip zone finishing for it.
|
||||
|
||||
Fixes: 4dcbb8ab31c1 ("btrfs: zoned: make zone finishing multi stripe capable")
|
||||
CC: stable@vger.kernel.org # 6.1+
|
||||
Reviewed-by: Naohiro Aota <naohiro.aota@wdc.com>
|
||||
Reviewed-by: Anand Jain <anand.jain@oracle.com>
|
||||
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
|
||||
Reviewed-by: David Sterba <dsterba@suse.com>
|
||||
Signed-off-by: David Sterba <dsterba@suse.com>
|
||||
---
|
||||
fs/btrfs/zoned.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/fs/btrfs/zoned.c
|
||||
+++ b/fs/btrfs/zoned.c
|
||||
@@ -2275,6 +2275,9 @@ static int do_zone_finish(struct btrfs_b
|
||||
struct btrfs_zoned_device_info *zinfo = device->zone_info;
|
||||
unsigned int nofs_flags;
|
||||
|
||||
+ if (!device->bdev)
|
||||
+ continue;
|
||||
+
|
||||
if (zinfo->max_active_zones == 0)
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user