diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/ctree.h | 10 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 22 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 47 |
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 | |
957 | enum 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 | ||
5546 | int __get_raid_index(u64 flags) | 5546 | int __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 | ||
5564 | static int get_block_group_index(struct btrfs_block_group_cache *cache) | 5560 | static 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 | ||
3564 | struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = { | 3564 | struct 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 | ||
3572 | static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | 3607 | static 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, |