btrfs: remove the need_raid_map parameter from btrfs_map_block()
authorQu Wenruo <wqu@suse.com>
Sun, 17 Sep 2023 10:06:21 +0000 (19:36 +0930)
committerDavid Sterba <dsterba@suse.com>
Thu, 12 Oct 2023 14:44:05 +0000 (16:44 +0200)
The parameter @need_raid_map is mostly a legacy from the old days where
we don't yet have a solid definition on the @mirror_num, and only
check-integrity was using that parameter, while all other call sites
just pass 1 for that parameter.

Now since we have removed check-integrity functionality, we can also
remove the @need_raid_map parameter.

This change will also remove the ability to read P/Q stripe directly
when passing 0 as @need_raid_map.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/bio.c
fs/btrfs/scrub.c
fs/btrfs/volumes.c
fs/btrfs/volumes.h
fs/btrfs/zoned.c

index 31ff36990404f0811789de8e54e91c7db946bdab..964714258f8649c3dad06320dc00027b342beb5f 100644 (file)
@@ -656,7 +656,7 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
 
        btrfs_bio_counter_inc_blocked(fs_info);
        error = btrfs_map_block(fs_info, btrfs_op(bio), logical, &map_length,
-                               &bioc, &smap, &mirror_num, 1);
+                               &bioc, &smap, &mirror_num);
        if (error) {
                ret = errno_to_blk_status(error);
                goto fail;
index f16220ce5fbaa0c8bbb66fe2fc612c262bad03ce..7bcab3899ae627ba6a0ece7956b6b714fb92cb20 100644 (file)
@@ -896,7 +896,7 @@ static void scrub_stripe_report_errors(struct scrub_ctx *sctx,
                ASSERT(stripe->mirror_num >= 1);
                ret = btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS,
                                      stripe->logical, &mapped_len, &bioc,
-                                     NULL, NULL, 1);
+                                     NULL, NULL);
                /*
                 * If we failed, dev will be NULL, and later detailed reports
                 * will just be skipped.
@@ -1951,7 +1951,7 @@ static int scrub_raid56_parity_stripe(struct scrub_ctx *sctx,
 
        btrfs_bio_counter_inc_blocked(fs_info);
        ret = btrfs_map_block(fs_info, BTRFS_MAP_WRITE, full_stripe_start,
-                             &length, &bioc, NULL, NULL, 1);
+                             &length, &bioc, NULL, NULL);
        if (ret < 0) {
                btrfs_put_bioc(bioc);
                btrfs_bio_counter_dec(fs_info);
index 871a55d36e32a836bad794a2852f0b1d305436e9..cae7802d7e2d682e2b7a7295e7b08409b42e7800 100644 (file)
@@ -6246,16 +6246,11 @@ static void set_io_stripe(struct btrfs_io_stripe *dst, const struct map_lookup *
  *                     For RAID6 profile, mirror > 2 means mark another
  *                     data/P stripe error and rebuild from the remaining
  *                     stripes..
- *
- * @need_raid_map:     (Used only for integrity checker) whether the map wants
- *                      a full stripe map (including all data and P/Q stripes)
- *                      for RAID56. Should always be 1 except integrity checker.
  */
 int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
                    u64 logical, u64 *length,
                    struct btrfs_io_context **bioc_ret,
-                   struct btrfs_io_stripe *smap, int *mirror_num_ret,
-                   int need_raid_map)
+                   struct btrfs_io_stripe *smap, int *mirror_num_ret)
 {
        struct extent_map *em;
        struct map_lookup *map;
@@ -6350,8 +6345,10 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
                }
 
        } else if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) {
-               if (need_raid_map && (op != BTRFS_MAP_READ || mirror_num > 1)) {
+               if (op != BTRFS_MAP_READ || mirror_num > 1) {
                        /*
+                        * Needs full stripe mapping.
+                        *
                         * Push stripe_nr back to the start of the full stripe
                         * For those cases needing a full stripe, @stripe_nr
                         * is the full stripe number.
@@ -6374,19 +6371,14 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
                        stripe_index = 0;
                        stripe_offset = 0;
                } else {
-                       /*
-                        * Mirror #0 or #1 means the original data block.
-                        * Mirror #2 is RAID5 parity block.
-                        * Mirror #3 is RAID6 Q block.
-                        */
+                       ASSERT(mirror_num <= 1);
+                       /* Just grab the data stripe directly. */
                        stripe_index = stripe_nr % data_stripes;
                        stripe_nr /= data_stripes;
-                       if (mirror_num > 1)
-                               stripe_index = data_stripes + mirror_num - 2;
 
                        /* We distribute the parity blocks across stripes */
                        stripe_index = (stripe_nr + stripe_index) % map->num_stripes;
-                       if (op == BTRFS_MAP_READ && mirror_num <= 1)
+                       if (op == BTRFS_MAP_READ && mirror_num < 1)
                                mirror_num = 1;
                }
        } else {
@@ -6448,7 +6440,7 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
         *
         * It's still mostly the same as other profiles, just with extra rotation.
         */
-       if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK && need_raid_map &&
+       if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK &&
            (op != BTRFS_MAP_READ || mirror_num > 1)) {
                /*
                 * For RAID56 @stripe_nr is already the number of full stripes
@@ -8077,7 +8069,7 @@ int btrfs_map_repair_block(struct btrfs_fs_info *fs_info,
        ASSERT(mirror_num > 0);
 
        ret = btrfs_map_block(fs_info, BTRFS_MAP_WRITE, logical, &map_length,
-                             &bioc, smap, &mirror_ret, true);
+                             &bioc, smap, &mirror_ret);
        if (ret < 0)
                return ret;
 
index 576bfcb5b76486a62950843c373ad127feaa3d93..f169c6e06cc140c865c05d5a7e5e409cbfbf9c0f 100644 (file)
@@ -605,8 +605,7 @@ void btrfs_put_bioc(struct btrfs_io_context *bioc);
 int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
                    u64 logical, u64 *length,
                    struct btrfs_io_context **bioc_ret,
-                   struct btrfs_io_stripe *smap, int *mirror_num_ret,
-                   int need_raid_map);
+                   struct btrfs_io_stripe *smap, int *mirror_num_ret);
 int btrfs_map_repair_block(struct btrfs_fs_info *fs_info,
                           struct btrfs_io_stripe *smap, u64 logical,
                           u32 length, int mirror_num);
index c6eedf4bfba907e20c6da648c4104d1dfe21dfe8..a347f7164473680b3f10b0a22c05d4b521d5cf3e 100644 (file)
@@ -1887,7 +1887,7 @@ static int read_zone_info(struct btrfs_fs_info *fs_info, u64 logical,
        int i, ret;
 
        ret = btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical,
-                             &mapped_length, &bioc, NULL, NULL, 1);
+                             &mapped_length, &bioc, NULL, NULL);
        if (ret || !bioc || mapped_length < PAGE_SIZE) {
                ret = -EIO;
                goto out_put_bioc;