]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: factor out helper for single device IO check
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Wed, 13 Dec 2023 14:42:56 +0000 (06:42 -0800)
committerDavid Sterba <dsterba@suse.com>
Fri, 15 Dec 2023 22:03:58 +0000 (23:03 +0100)
The check in btrfs_map_block() deciding if a particular I/O is targeting a
single device is getting more and more convoluted.

Factor out the check conditions into a helper function, with no functional
change otherwise.

Reviewed-by: Christoph Hellwig <hch@lst.de>
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/volumes.c

index 1cc6b5d5eb6147becf99c7fa97b95dea75b96de2..f23223f0ea5b14bfa23ca6a5409953ae45bd3e1d 100644 (file)
@@ -6330,6 +6330,27 @@ static int set_io_stripe(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
        return 0;
 }
 
+static bool is_single_device_io(struct btrfs_fs_info *fs_info,
+                               const struct btrfs_io_stripe *smap,
+                               const struct btrfs_chunk_map *map,
+                               int num_alloc_stripes,
+                               enum btrfs_map_op op, int mirror_num)
+{
+       if (!smap)
+               return false;
+
+       if (num_alloc_stripes != 1)
+               return false;
+
+       if (btrfs_need_stripe_tree_update(fs_info, map->type) && op != BTRFS_MAP_READ)
+               return false;
+
+       if ((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) && mirror_num > 1)
+               return false;
+
+       return true;
+}
+
 /*
  * Map one logical range to one or more physical ranges.
  *
@@ -6532,10 +6553,8 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
         * physical block information on the stack instead of allocating an
         * I/O context structure.
         */
-       if (smap && num_alloc_stripes == 1 &&
-           !(btrfs_need_stripe_tree_update(fs_info, map->type) &&
-             op != BTRFS_MAP_READ) &&
-           !((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) && mirror_num > 1)) {
+       if (is_single_device_io(fs_info, smap, map, num_alloc_stripes, op,
+                               mirror_num)) {
                ret = set_io_stripe(fs_info, op, logical, length, smap, map,
                                    stripe_index, stripe_offset, stripe_nr);
                if (mirror_num_ret)