37 lines
1.3 KiB
Diff
37 lines
1.3 KiB
Diff
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;
|
|
|