btrfs: use raid_attr for minimum stripe count in btrfs_calc_avail_data_space
authorDavid Sterba <dsterba@suse.com>
Tue, 18 Jun 2019 18:00:13 +0000 (20:00 +0200)
committerDavid Sterba <dsterba@suse.com>
Tue, 2 Jul 2019 10:30:51 +0000 (12:30 +0200)
Minimum stripe count matches the minimum devices required for a given
profile. The open coded assignments match the raid_attr table.

What's changed here is the meaning for RAID5/6. Previously their
min_stripes would be 1, while newly it's devs_min. This however shold be
the same as before because it's not possible to create filesystem on
fewer devices than the raid_attr table allows.

There's no adjustment regarding the parity stripes (like
calc_data_stripes does), because we're interested in overall space that
would fit on the devices.

Missing devices make no difference for the whole calculation, we have
the size stored in the structures.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/super.c

index 2b44223e98a96bb9ef9a55f89a0e546b75369b59..7d20856ae0c42b669596f3b1f0a6c4d64160a3bd 100644 (file)
@@ -1902,7 +1902,7 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
        u64 type;
        u64 avail_space;
        u64 min_stripe_size;
-       int min_stripes = 1, num_stripes = 1;
+       int min_stripes, num_stripes = 1;
        int i = 0, nr_devices;
        const struct btrfs_raid_attr *rattr;
 
@@ -1929,17 +1929,14 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
        /* calc min stripe number for data space allocation */
        type = btrfs_data_alloc_profile(fs_info);
        rattr = &btrfs_raid_array[btrfs_bg_flags_to_raid_index(type)];
+       min_stripes = rattr->devs_min;
 
-       if (type & BTRFS_BLOCK_GROUP_RAID0) {
-               min_stripes = 2;
+       if (type & BTRFS_BLOCK_GROUP_RAID0)
                num_stripes = nr_devices;
-       } else if (type & BTRFS_BLOCK_GROUP_RAID1) {
-               min_stripes = 2;
+       else if (type & BTRFS_BLOCK_GROUP_RAID1)
                num_stripes = 2;
-       } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
-               min_stripes = 4;
+       else if (type & BTRFS_BLOCK_GROUP_RAID10)
                num_stripes = 4;
-       }
 
        /* Adjust for more than 1 stripe per device */
        min_stripe_size = rattr->dev_stripes * BTRFS_STRIPE_LEN;