btrfs: use btrfs_raid_array for btrfs_get_num_tolerated_disk_barrier_failures()
authorZhao Lei <zhaolei@cn.fujitsu.com>
Tue, 15 Sep 2015 13:08:07 +0000 (21:08 +0800)
committerDavid Sterba <dsterba@suse.com>
Wed, 21 Oct 2015 16:28:48 +0000 (18:28 +0200)
btrfs_raid_array[] is used to define all raid attributes, use it
to get tolerated_failures in btrfs_get_num_tolerated_disk_barrier_failures(),
instead of complex condition in function.

It can make code simple and auto-support other possible raid-type in
future.

Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/volumes.c
fs/btrfs/volumes.h

index 1e60d00d4ea7c42104614ede9e203a1f56e6408a..322fd6ded7233a5709bddaf454e01f604a84e763 100644 (file)
@@ -3449,22 +3449,31 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
 
 int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags)
 {
-       if ((flags & (BTRFS_BLOCK_GROUP_DUP |
-                     BTRFS_BLOCK_GROUP_RAID0 |
-                     BTRFS_AVAIL_ALLOC_BIT_SINGLE)) ||
-           ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0))
-               return 0;
+       int raid_type;
+       int min_tolerated = INT_MAX;
 
-       if (flags & (BTRFS_BLOCK_GROUP_RAID1 |
-                    BTRFS_BLOCK_GROUP_RAID5 |
-                    BTRFS_BLOCK_GROUP_RAID10))
-               return 1;
+       if ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 ||
+           (flags & BTRFS_AVAIL_ALLOC_BIT_SINGLE))
+               min_tolerated = min(min_tolerated,
+                                   btrfs_raid_array[BTRFS_RAID_SINGLE].
+                                   tolerated_failures);
 
-       if (flags & BTRFS_BLOCK_GROUP_RAID6)
-               return 2;
+       for (raid_type = 0; raid_type < BTRFS_NR_RAID_TYPES; raid_type++) {
+               if (raid_type == BTRFS_RAID_SINGLE)
+                       continue;
+               if (!(flags & btrfs_raid_group[raid_type]))
+                       continue;
+               min_tolerated = min(min_tolerated,
+                                   btrfs_raid_array[raid_type].
+                                   tolerated_failures);
+       }
 
-       pr_warn("BTRFS: unknown raid type: %llu\n", flags);
-       return 0;
+       if (min_tolerated == INT_MAX) {
+               pr_warn("BTRFS: unknown raid flag: %llu\n", flags);
+               min_tolerated = 0;
+       }
+
+       return min_tolerated;
 }
 
 int btrfs_calc_num_tolerated_disk_barrier_failures(
index 2a65d2d45410541c31de1d3b48c0e3722a5e6395..7b533909d00621fe2083a6fd1e81de55b56449d3 100644 (file)
@@ -48,6 +48,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 1,
                .devs_max       = 0,    /* 0 == as many as possible */
                .devs_min       = 4,
+               .tolerated_failures = 1,
                .devs_increment = 2,
                .ncopies        = 2,
        },
@@ -56,6 +57,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 1,
                .devs_max       = 2,
                .devs_min       = 2,
+               .tolerated_failures = 1,
                .devs_increment = 2,
                .ncopies        = 2,
        },
@@ -64,6 +66,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 2,
                .devs_max       = 1,
                .devs_min       = 1,
+               .tolerated_failures = 0,
                .devs_increment = 1,
                .ncopies        = 2,
        },
@@ -72,6 +75,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 1,
                .devs_max       = 0,
                .devs_min       = 2,
+               .tolerated_failures = 0,
                .devs_increment = 1,
                .ncopies        = 1,
        },
@@ -80,6 +84,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 1,
                .devs_max       = 1,
                .devs_min       = 1,
+               .tolerated_failures = 0,
                .devs_increment = 1,
                .ncopies        = 1,
        },
@@ -88,6 +93,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 1,
                .devs_max       = 0,
                .devs_min       = 2,
+               .tolerated_failures = 1,
                .devs_increment = 1,
                .ncopies        = 2,
        },
@@ -96,6 +102,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
                .dev_stripes    = 1,
                .devs_max       = 0,
                .devs_min       = 3,
+               .tolerated_failures = 2,
                .devs_increment = 1,
                .ncopies        = 3,
        },
index 75d6083d9b3b29b75d6588321eaadaa714dce733..04ff0efe2f5831856e445735ab28fd6fef263a20 100644 (file)
@@ -334,6 +334,7 @@ struct btrfs_raid_attr {
        int dev_stripes;        /* stripes per dev */
        int devs_max;           /* max devs to use */
        int devs_min;           /* min devs needed */
+       int tolerated_failures; /* max tolerated fail devs */
        int devs_increment;     /* ndevs has to be a multiple of this */
        int ncopies;            /* how many copies to data has */
 };