]> 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:18:04 +0000 (22:18 +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 4031cbdea07400460bed29b3e6843c81b2763ea8..41da405181b4f084c6a8c5bd2b5b5dd3a138123c 100644 (file)
@@ -3107,9 +3107,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 87c5dd3ad016e480575789fc7871ac5036e0623d..fcdf7b058a584cdccceb512b95c01724887c9c9c 100644 (file)
@@ -2464,16 +2464,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)
@@ -2490,6 +2491,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 6e11533b8e14c27e5b8bebbf24a9b632b36c23ba..17c5656580dd9747f73196d4af3f49e74d150dbe 100644 (file)
@@ -83,7 +83,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);
@@ -234,8 +234,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) { }