Re: [PATCH 4/7] btrfs-progs: Introduce btrfs_raid_array and related infrastructures

2018-02-02 Thread Qu Wenruo


On 2018年02月02日 19:37, Nikolay Borisov wrote:
> 
> 
> On  2.02.2018 10:19, Qu Wenruo wrote:
>> 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 
>> ---
>>  ctree.h   | 12 +++-
>>  volumes.c | 66 
>> +++
>>  volumes.h | 30 +
>>  3 files changed, 107 insertions(+), 1 deletion(-)
>>
>> diff --git a/ctree.h b/ctree.h
>> index 17cdac76c58c..c76849d8deb7 100644
>> --- a/ctree.h
>> +++ b/ctree.h
>> @@ -958,7 +958,17 @@ struct btrfs_csum_item {
>>  #define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7)
>>  #define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8)
>>  #define BTRFS_BLOCK_GROUP_RESERVED  BTRFS_AVAIL_ALLOC_BIT_SINGLE
>  
> 
> BTRFS_BLOCK_GROUP_RESERVED differs in userspace than in kernel space. 
> The btrfs_Tree header has it defined as: 
> 
> #define BTRFS_BLOCK_GROUP_RESERVED  (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \ 
>   
>  BTRFS_SPACE_INFO_GLOBAL_RSV)

Another good place to cleanup. :)

Thanks,
Qu

> 
> 
> Otherwise LGTM: 
> 
> Reviewed-by: Nikolay Borisov 
> 
>> -#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 |\
>>   BTRFS_BLOCK_GROUP_SYSTEM |  \
>> diff --git a/volumes.c b/volumes.c
>> index a9dc8c939dc5..b47ff1f392b5 100644
>> --- a/volumes.c
>> +++ b/volumes.c
>> @@ -30,6 +30,72 @@
>>  #include "utils.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 btrfs_device *dev;
>>  u64 physical;
>> diff --git a/volumes.h b/volumes.h
>> index 7bbdf615d31a..612a0a7586f4 100644
>> --- a/volumes.h
>> +++ b/volumes.h
>> @@ -108,6 +108,36 @@ struct map_lookup {
>>  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 */
>> 

Re: [PATCH 4/7] btrfs-progs: Introduce btrfs_raid_array and related infrastructures

2018-02-02 Thread Nikolay Borisov


On  2.02.2018 10:19, Qu Wenruo wrote:
> 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 
> ---
>  ctree.h   | 12 +++-
>  volumes.c | 66 
> +++
>  volumes.h | 30 +
>  3 files changed, 107 insertions(+), 1 deletion(-)
> 
> diff --git a/ctree.h b/ctree.h
> index 17cdac76c58c..c76849d8deb7 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -958,7 +958,17 @@ struct btrfs_csum_item {
>  #define BTRFS_BLOCK_GROUP_RAID5  (1ULL << 7)
>  #define BTRFS_BLOCK_GROUP_RAID6  (1ULL << 8)
>  #define BTRFS_BLOCK_GROUP_RESERVED   BTRFS_AVAIL_ALLOC_BIT_SINGLE
 

BTRFS_BLOCK_GROUP_RESERVED differs in userspace than in kernel space. 
The btrfs_Tree header has it defined as: 

#define BTRFS_BLOCK_GROUP_RESERVED  (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \   
 BTRFS_SPACE_INFO_GLOBAL_RSV)


Otherwise LGTM: 

Reviewed-by: Nikolay Borisov 

> -#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 |\
>BTRFS_BLOCK_GROUP_SYSTEM |  \
> diff --git a/volumes.c b/volumes.c
> index a9dc8c939dc5..b47ff1f392b5 100644
> --- a/volumes.c
> +++ b/volumes.c
> @@ -30,6 +30,72 @@
>  #include "utils.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 btrfs_device *dev;
>   u64 physical;
> diff --git a/volumes.h b/volumes.h
> index 7bbdf615d31a..612a0a7586f4 100644
> --- a/volumes.h
> +++ b/volumes.h
> @@ -108,6 +108,36 @@ struct map_lookup {
>   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)
> +