aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/ctree.h10
-rw-r--r--fs/btrfs/extent-tree.c22
-rw-r--r--fs/btrfs/volumes.c47
3 files changed, 59 insertions, 20 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 9ee099f3f834..541ce9a9949e 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -953,7 +953,15 @@ struct btrfs_dev_replace_item {
953#define BTRFS_BLOCK_GROUP_DUP (1ULL << 5) 953#define BTRFS_BLOCK_GROUP_DUP (1ULL << 5)
954#define BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6) 954#define BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6)
955#define BTRFS_BLOCK_GROUP_RESERVED BTRFS_AVAIL_ALLOC_BIT_SINGLE 955#define BTRFS_BLOCK_GROUP_RESERVED BTRFS_AVAIL_ALLOC_BIT_SINGLE
956#define BTRFS_NR_RAID_TYPES 5 956
957enum btrfs_raid_types {
958 BTRFS_RAID_RAID10,
959 BTRFS_RAID_RAID1,
960 BTRFS_RAID_DUP,
961 BTRFS_RAID_RAID0,
962 BTRFS_RAID_SINGLE,
963 BTRFS_NR_RAID_TYPES
964};
957 965
958#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \ 966#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \
959 BTRFS_BLOCK_GROUP_SYSTEM | \ 967 BTRFS_BLOCK_GROUP_SYSTEM | \
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 82400b2b2517..174c4d5c692c 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5545,20 +5545,16 @@ wait_block_group_cache_done(struct btrfs_block_group_cache *cache)
5545 5545
5546int __get_raid_index(u64 flags) 5546int __get_raid_index(u64 flags)
5547{ 5547{
5548 int index;
5549
5550 if (flags & BTRFS_BLOCK_GROUP_RAID10) 5548 if (flags & BTRFS_BLOCK_GROUP_RAID10)
5551 index = 0; 5549 return BTRFS_RAID_RAID10;
5552 else if (flags & BTRFS_BLOCK_GROUP_RAID1) 5550 else if (flags & BTRFS_BLOCK_GROUP_RAID1)
5553 index = 1; 5551 return BTRFS_RAID_RAID1;
5554 else if (flags & BTRFS_BLOCK_GROUP_DUP) 5552 else if (flags & BTRFS_BLOCK_GROUP_DUP)
5555 index = 2; 5553 return BTRFS_RAID_DUP;
5556 else if (flags & BTRFS_BLOCK_GROUP_RAID0) 5554 else if (flags & BTRFS_BLOCK_GROUP_RAID0)
5557 index = 3; 5555 return BTRFS_RAID_RAID0;
5558 else 5556 else
5559 index = 4; 5557 return BTRFS_RAID_SINGLE;
5560
5561 return index;
5562} 5558}
5563 5559
5564static int get_block_group_index(struct btrfs_block_group_cache *cache) 5560static int get_block_group_index(struct btrfs_block_group_cache *cache)
@@ -7518,16 +7514,16 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr)
7518 index = get_block_group_index(block_group); 7514 index = get_block_group_index(block_group);
7519 } 7515 }
7520 7516
7521 if (index == 0) { 7517 if (index == BTRFS_RAID_RAID10) {
7522 dev_min = 4; 7518 dev_min = 4;
7523 /* Divide by 2 */ 7519 /* Divide by 2 */
7524 min_free >>= 1; 7520 min_free >>= 1;
7525 } else if (index == 1) { 7521 } else if (index == BTRFS_RAID_RAID1) {
7526 dev_min = 2; 7522 dev_min = 2;
7527 } else if (index == 2) { 7523 } else if (index == BTRFS_RAID_DUP) {
7528 /* Multiply by 2 */ 7524 /* Multiply by 2 */
7529 min_free <<= 1; 7525 min_free <<= 1;
7530 } else if (index == 3) { 7526 } else if (index == BTRFS_RAID_RAID0) {
7531 dev_min = fs_devices->rw_devices; 7527 dev_min = fs_devices->rw_devices;
7532 do_div(min_free, dev_min); 7528 do_div(min_free, dev_min);
7533 } 7529 }
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 5349e17d8863..1ce581d58d87 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -3562,13 +3562,48 @@ static int btrfs_cmp_device_info(const void *a, const void *b)
3562} 3562}
3563 3563
3564struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = { 3564struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
3565 { 2, 1, 0, 4, 2, 2 /* raid10 */ }, 3565 [BTRFS_RAID_RAID10] = {
3566 { 1, 1, 2, 2, 2, 2 /* raid1 */ }, 3566 .sub_stripes = 2,
3567 { 1, 2, 1, 1, 1, 2 /* dup */ }, 3567 .dev_stripes = 1,
3568 { 1, 1, 0, 2, 1, 1 /* raid0 */ }, 3568 .devs_max = 0, /* 0 == as many as possible */
3569 { 1, 1, 1, 1, 1, 1 /* single */ }, 3569 .devs_min = 4,
3570 .devs_increment = 2,
3571 .ncopies = 2,
3572 },
3573 [BTRFS_RAID_RAID1] = {
3574 .sub_stripes = 1,
3575 .dev_stripes = 1,
3576 .devs_max = 2,
3577 .devs_min = 2,
3578 .devs_increment = 2,
3579 .ncopies = 2,
3580 },
3581 [BTRFS_RAID_DUP] = {
3582 .sub_stripes = 1,
3583 .dev_stripes = 2,
3584 .devs_max = 1,
3585 .devs_min = 1,
3586 .devs_increment = 1,
3587 .ncopies = 2,
3588 },
3589 [BTRFS_RAID_RAID0] = {
3590 .sub_stripes = 1,
3591 .dev_stripes = 1,
3592 .devs_max = 0,
3593 .devs_min = 2,
3594 .devs_increment = 1,
3595 .ncopies = 1,
3596 },
3597 [BTRFS_RAID_SINGLE] = {
3598 .sub_stripes = 1,
3599 .dev_stripes = 1,
3600 .devs_max = 1,
3601 .devs_min = 1,
3602 .devs_increment = 1,
3603 .ncopies = 1,
3604 },
3570}; 3605};
3571 3606
3572static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, 3607static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
3573 struct btrfs_root *extent_root, 3608 struct btrfs_root *extent_root,
3574 struct map_lookup **map_ret, 3609 struct map_lookup **map_ret,