diff mbox

[2/3] btrfs: use btrfs_raid_array for btrfs_get_num_tolerated_disk_barrier_failures()

Message ID bea5cae2134583da7c2f2e936cecc8d95c3b7baf.1442322310.git.zhaolei@cn.fujitsu.com (mailing list archive)
State Accepted
Headers show

Commit Message

Zhaolei Sept. 15, 2015, 1:08 p.m. UTC
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.

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
---
 fs/btrfs/disk-io.c | 35 ++++++++++++++++++++++-------------
 fs/btrfs/volumes.c |  7 +++++++
 fs/btrfs/volumes.h |  1 +
 3 files changed, 30 insertions(+), 13 deletions(-)

Comments

David Sterba Sept. 22, 2015, 2:30 p.m. UTC | #1
On Tue, Sep 15, 2015 at 09:08:07PM +0800, Zhao Lei wrote:
> 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.
> 
> Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>

Reviewed-by: David Sterba <dsterba@suse.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 0d98aee..126baab 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3445,22 +3445,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(
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 2a65d2d..7b53390 100644
--- a/fs/btrfs/volumes.c
+++ b/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,
 	},
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 75d6083..04ff0ef 100644
--- a/fs/btrfs/volumes.h
+++ b/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 */
 };