]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: zoned: return error from btrfs_zone_finish_endio()
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Tue, 22 Jul 2025 11:39:11 +0000 (13:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 2 Nov 2025 13:14:40 +0000 (22:14 +0900)
[ Upstream commit 3c44cd3c79fcb38a86836dea6ff8fec322a9e68c ]

Now that btrfs_zone_finish_endio_workfn() is directly calling
do_zone_finish() the only caller of btrfs_zone_finish_endio() is
btrfs_finish_one_ordered().

btrfs_finish_one_ordered() already has error handling in-place so
btrfs_zone_finish_endio() can return an error if the block group lookup
fails.

Also as btrfs_zone_finish_endio() already checks for zoned filesystems and
returns early, there's no need to do this in the caller.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/inode.c
fs/btrfs/zoned.c
fs/btrfs/zoned.h

index ee5ffeab85bb78ea24fb4b1a29de4c8934805c7b..b1be3e0fe72823d2f252c56f3f6210f0a2a61f31 100644 (file)
@@ -3051,9 +3051,10 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent)
                goto out;
        }
 
-       if (btrfs_is_zoned(fs_info))
-               btrfs_zone_finish_endio(fs_info, ordered_extent->disk_bytenr,
-                                       ordered_extent->disk_num_bytes);
+       ret = btrfs_zone_finish_endio(fs_info, ordered_extent->disk_bytenr,
+                                     ordered_extent->disk_num_bytes);
+       if (ret)
+               goto out;
 
        if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered_extent->flags)) {
                truncated = true;
index 3622ba1d8e09f4734db88521e33e14799188e3b8..6e8b8c46ba18f64bb68cb0350c66c2ec4064c152 100644 (file)
@@ -2263,16 +2263,17 @@ bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)
        return ret;
 }
 
-void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 length)
+int btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 length)
 {
        struct btrfs_block_group *block_group;
        u64 min_alloc_bytes;
 
        if (!btrfs_is_zoned(fs_info))
-               return;
+               return 0;
 
        block_group = btrfs_lookup_block_group(fs_info, logical);
-       ASSERT(block_group);
+       if (WARN_ON_ONCE(!block_group))
+               return -ENOENT;
 
        /* No MIXED_BG on zoned btrfs. */
        if (block_group->flags & BTRFS_BLOCK_GROUP_DATA)
@@ -2289,6 +2290,7 @@ void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 len
 
 out:
        btrfs_put_block_group(block_group);
+       return 0;
 }
 
 static void btrfs_zone_finish_endio_workfn(struct work_struct *work)
index 448955641d11439cafe768892492008092397f1f..c18f31d3dc25f65587f8d5d3a7c8513338de0058 100644 (file)
@@ -71,7 +71,7 @@ int btrfs_sync_zone_write_pointer(struct btrfs_device *tgt_dev, u64 logical,
 bool btrfs_zone_activate(struct btrfs_block_group *block_group);
 int btrfs_zone_finish(struct btrfs_block_group *block_group);
 bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags);
-void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical,
+int btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical,
                             u64 length);
 void btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg,
                                   struct extent_buffer *eb);
@@ -227,8 +227,11 @@ static inline bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices,
        return true;
 }
 
-static inline void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info,
-                                          u64 logical, u64 length) { }
+static inline int btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info,
+                                          u64 logical, u64 length)
+{
+       return 0;
+}
 
 static inline void btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg,
                                                 struct extent_buffer *eb) { }