mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-27 05:27:56 +00:00
btrfs-progs: Introduce btrfs_raid_array and related infrastructures
As part of the effort to unify code and behavior between btrfs-progs and kernel, copy the btrfs_raid_array from kernel to btrfs-progs. So later we can use the btrfs_raid_array[] to get needed raid info other than manually do if-else branches. Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
e9097ad593
commit
12becfe122
12
ctree.h
12
ctree.h
@ -958,7 +958,17 @@ struct btrfs_csum_item {
|
|||||||
#define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7)
|
#define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7)
|
||||||
#define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8)
|
#define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8)
|
||||||
#define BTRFS_BLOCK_GROUP_RESERVED BTRFS_AVAIL_ALLOC_BIT_SINGLE
|
#define BTRFS_BLOCK_GROUP_RESERVED BTRFS_AVAIL_ALLOC_BIT_SINGLE
|
||||||
#define BTRFS_NR_RAID_TYPES 7
|
|
||||||
|
enum btrfs_raid_types {
|
||||||
|
BTRFS_RAID_RAID10,
|
||||||
|
BTRFS_RAID_RAID1,
|
||||||
|
BTRFS_RAID_DUP,
|
||||||
|
BTRFS_RAID_RAID0,
|
||||||
|
BTRFS_RAID_SINGLE,
|
||||||
|
BTRFS_RAID_RAID5,
|
||||||
|
BTRFS_RAID_RAID6,
|
||||||
|
BTRFS_NR_RAID_TYPES
|
||||||
|
};
|
||||||
|
|
||||||
#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \
|
#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \
|
||||||
BTRFS_BLOCK_GROUP_SYSTEM | \
|
BTRFS_BLOCK_GROUP_SYSTEM | \
|
||||||
|
66
volumes.c
66
volumes.c
@ -30,6 +30,72 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "kernel-lib/raid56.h"
|
#include "kernel-lib/raid56.h"
|
||||||
|
|
||||||
|
const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
|
||||||
|
[BTRFS_RAID_RAID10] = {
|
||||||
|
.sub_stripes = 2,
|
||||||
|
.dev_stripes = 1,
|
||||||
|
.devs_max = 0, /* 0 == as many as possible */
|
||||||
|
.devs_min = 4,
|
||||||
|
.tolerated_failures = 1,
|
||||||
|
.devs_increment = 2,
|
||||||
|
.ncopies = 2,
|
||||||
|
},
|
||||||
|
[BTRFS_RAID_RAID1] = {
|
||||||
|
.sub_stripes = 1,
|
||||||
|
.dev_stripes = 1,
|
||||||
|
.devs_max = 2,
|
||||||
|
.devs_min = 2,
|
||||||
|
.tolerated_failures = 1,
|
||||||
|
.devs_increment = 2,
|
||||||
|
.ncopies = 2,
|
||||||
|
},
|
||||||
|
[BTRFS_RAID_DUP] = {
|
||||||
|
.sub_stripes = 1,
|
||||||
|
.dev_stripes = 2,
|
||||||
|
.devs_max = 1,
|
||||||
|
.devs_min = 1,
|
||||||
|
.tolerated_failures = 0,
|
||||||
|
.devs_increment = 1,
|
||||||
|
.ncopies = 2,
|
||||||
|
},
|
||||||
|
[BTRFS_RAID_RAID0] = {
|
||||||
|
.sub_stripes = 1,
|
||||||
|
.dev_stripes = 1,
|
||||||
|
.devs_max = 0,
|
||||||
|
.devs_min = 2,
|
||||||
|
.tolerated_failures = 0,
|
||||||
|
.devs_increment = 1,
|
||||||
|
.ncopies = 1,
|
||||||
|
},
|
||||||
|
[BTRFS_RAID_SINGLE] = {
|
||||||
|
.sub_stripes = 1,
|
||||||
|
.dev_stripes = 1,
|
||||||
|
.devs_max = 1,
|
||||||
|
.devs_min = 1,
|
||||||
|
.tolerated_failures = 0,
|
||||||
|
.devs_increment = 1,
|
||||||
|
.ncopies = 1,
|
||||||
|
},
|
||||||
|
[BTRFS_RAID_RAID5] = {
|
||||||
|
.sub_stripes = 1,
|
||||||
|
.dev_stripes = 1,
|
||||||
|
.devs_max = 0,
|
||||||
|
.devs_min = 2,
|
||||||
|
.tolerated_failures = 1,
|
||||||
|
.devs_increment = 1,
|
||||||
|
.ncopies = 2,
|
||||||
|
},
|
||||||
|
[BTRFS_RAID_RAID6] = {
|
||||||
|
.sub_stripes = 1,
|
||||||
|
.dev_stripes = 1,
|
||||||
|
.devs_max = 0,
|
||||||
|
.devs_min = 3,
|
||||||
|
.tolerated_failures = 2,
|
||||||
|
.devs_increment = 1,
|
||||||
|
.ncopies = 3,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
struct stripe {
|
struct stripe {
|
||||||
struct btrfs_device *dev;
|
struct btrfs_device *dev;
|
||||||
u64 physical;
|
u64 physical;
|
||||||
|
30
volumes.h
30
volumes.h
@ -108,6 +108,36 @@ struct map_lookup {
|
|||||||
struct btrfs_bio_stripe stripes[];
|
struct btrfs_bio_stripe stripes[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct btrfs_raid_attr {
|
||||||
|
int sub_stripes; /* sub_stripes info for map */
|
||||||
|
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 */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES];
|
||||||
|
|
||||||
|
static inline enum btrfs_raid_types btrfs_bg_flags_to_raid_index(u64 flags)
|
||||||
|
{
|
||||||
|
if (flags & BTRFS_BLOCK_GROUP_RAID10)
|
||||||
|
return BTRFS_RAID_RAID10;
|
||||||
|
else if (flags & BTRFS_BLOCK_GROUP_RAID1)
|
||||||
|
return BTRFS_RAID_RAID1;
|
||||||
|
else if (flags & BTRFS_BLOCK_GROUP_DUP)
|
||||||
|
return BTRFS_RAID_DUP;
|
||||||
|
else if (flags & BTRFS_BLOCK_GROUP_RAID0)
|
||||||
|
return BTRFS_RAID_RAID0;
|
||||||
|
else if (flags & BTRFS_BLOCK_GROUP_RAID5)
|
||||||
|
return BTRFS_RAID_RAID5;
|
||||||
|
else if (flags & BTRFS_BLOCK_GROUP_RAID6)
|
||||||
|
return BTRFS_RAID_RAID6;
|
||||||
|
|
||||||
|
return BTRFS_RAID_SINGLE; /* BTRFS_BLOCK_GROUP_SINGLE */
|
||||||
|
}
|
||||||
|
|
||||||
#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
|
#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
|
||||||
(sizeof(struct btrfs_bio_stripe) * (n)))
|
(sizeof(struct btrfs_bio_stripe) * (n)))
|
||||||
#define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \
|
#define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \
|
||||||
|
Loading…
Reference in New Issue
Block a user