diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2012-11-21 09:18:10 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-12-16 20:46:28 -0500 |
commit | 31e502298d80e2af9001d17dc419a3fd4b0bebef (patch) | |
tree | 24606ea4998e962fff864eb24e8be6f56b095e14 /fs/btrfs/volumes.c | |
parent | 4ded4f639533ed5f02a0f0ab20d43bb9659c91f8 (diff) |
Btrfs: put raid properties into global table
Raid properties can be shared among raid calculation code, we can put
them into a global table to keep it simple.
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index d79b5b620e94..5cce6aa74012 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -3491,6 +3491,14 @@ static int btrfs_cmp_device_info(const void *a, const void *b) | |||
3491 | return 0; | 3491 | return 0; |
3492 | } | 3492 | } |
3493 | 3493 | ||
3494 | struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = { | ||
3495 | { 2, 1, 0, 4, 2, 2 /* raid10 */ }, | ||
3496 | { 1, 1, 2, 2, 2, 2 /* raid1 */ }, | ||
3497 | { 1, 2, 1, 1, 1, 2 /* dup */ }, | ||
3498 | { 1, 1, 0, 2, 1, 1 /* raid0 */ }, | ||
3499 | { 1, 1, 0, 1, 1, 1 /* single */ }, | ||
3500 | }; | ||
3501 | |||
3494 | static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | 3502 | static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, |
3495 | struct btrfs_root *extent_root, | 3503 | struct btrfs_root *extent_root, |
3496 | struct map_lookup **map_ret, | 3504 | struct map_lookup **map_ret, |
@@ -3520,43 +3528,21 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | |||
3520 | int ndevs; | 3528 | int ndevs; |
3521 | int i; | 3529 | int i; |
3522 | int j; | 3530 | int j; |
3531 | int index; | ||
3523 | 3532 | ||
3524 | BUG_ON(!alloc_profile_is_valid(type, 0)); | 3533 | BUG_ON(!alloc_profile_is_valid(type, 0)); |
3525 | 3534 | ||
3526 | if (list_empty(&fs_devices->alloc_list)) | 3535 | if (list_empty(&fs_devices->alloc_list)) |
3527 | return -ENOSPC; | 3536 | return -ENOSPC; |
3528 | 3537 | ||
3529 | sub_stripes = 1; | 3538 | index = __get_raid_index(type); |
3530 | dev_stripes = 1; | ||
3531 | devs_increment = 1; | ||
3532 | ncopies = 1; | ||
3533 | devs_max = 0; /* 0 == as many as possible */ | ||
3534 | devs_min = 1; | ||
3535 | 3539 | ||
3536 | /* | 3540 | sub_stripes = btrfs_raid_array[index].sub_stripes; |
3537 | * define the properties of each RAID type. | 3541 | dev_stripes = btrfs_raid_array[index].dev_stripes; |
3538 | * FIXME: move this to a global table and use it in all RAID | 3542 | devs_max = btrfs_raid_array[index].devs_max; |
3539 | * calculation code | 3543 | devs_min = btrfs_raid_array[index].devs_min; |
3540 | */ | 3544 | devs_increment = btrfs_raid_array[index].devs_increment; |
3541 | if (type & (BTRFS_BLOCK_GROUP_DUP)) { | 3545 | ncopies = btrfs_raid_array[index].ncopies; |
3542 | dev_stripes = 2; | ||
3543 | ncopies = 2; | ||
3544 | devs_max = 1; | ||
3545 | } else if (type & (BTRFS_BLOCK_GROUP_RAID0)) { | ||
3546 | devs_min = 2; | ||
3547 | } else if (type & (BTRFS_BLOCK_GROUP_RAID1)) { | ||
3548 | devs_increment = 2; | ||
3549 | ncopies = 2; | ||
3550 | devs_max = 2; | ||
3551 | devs_min = 2; | ||
3552 | } else if (type & (BTRFS_BLOCK_GROUP_RAID10)) { | ||
3553 | sub_stripes = 2; | ||
3554 | devs_increment = 2; | ||
3555 | ncopies = 2; | ||
3556 | devs_min = 4; | ||
3557 | } else { | ||
3558 | devs_max = 1; | ||
3559 | } | ||
3560 | 3546 | ||
3561 | if (type & BTRFS_BLOCK_GROUP_DATA) { | 3547 | if (type & BTRFS_BLOCK_GROUP_DATA) { |
3562 | max_stripe_size = 1024 * 1024 * 1024; | 3548 | max_stripe_size = 1024 * 1024 * 1024; |