]> www.infradead.org Git - users/hch/misc.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)
committerDavid Sterba <dsterba@suse.com>
Mon, 22 Sep 2025 08:54:30 +0000 (10:54 +0200)
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>
fs/btrfs/inode.c
fs/btrfs/zoned.c
fs/btrfs/zoned.h

index 225e9221c4569dc3c3c8c0e0b5f6633848582012..9eb0253507a08eb268e846f4ae0779c5c2046176 100644 (file)
@@ -3109,9 +3109,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 c5c4e512a58683ccc9d3975daa53a110ac561c17..ba444e412613f26547515a6dfcb0a3ff60fdc47f 100644 (file)
@@ -2458,16 +2458,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)
@@ -2484,6 +2485,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) { }