Parcourir la source

btrfs: use btrfs_raid_array for btrfs_get_num_tolerated_disk_barrier_failures()

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>
Zhao Lei il y a 10 ans
Parent
commit
8789f4fe60
3 fichiers modifiés avec 30 ajouts et 13 suppressions
  1. 22 13
      fs/btrfs/disk-io.c
  2. 7 0
      fs/btrfs/volumes.c
  3. 1 0
      fs/btrfs/volumes.h

+ 22 - 13
fs/btrfs/disk-io.c

@@ -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(

+ 7 - 0
fs/btrfs/volumes.c

@@ -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,
 	},

+ 1 - 0
fs/btrfs/volumes.h

@@ -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 */
 };