diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index cc15514b4a76..51192d94c90c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -3449,13 +3449,12 @@ int btrfs_calc_num_tolerated_disk_barrier_failures( | |||
3449 | BTRFS_BLOCK_GROUP_SYSTEM, | 3449 | BTRFS_BLOCK_GROUP_SYSTEM, |
3450 | BTRFS_BLOCK_GROUP_METADATA, | 3450 | BTRFS_BLOCK_GROUP_METADATA, |
3451 | BTRFS_BLOCK_GROUP_DATA | BTRFS_BLOCK_GROUP_METADATA}; | 3451 | BTRFS_BLOCK_GROUP_DATA | BTRFS_BLOCK_GROUP_METADATA}; |
3452 | int num_types = 4; | ||
3453 | int i; | 3452 | int i; |
3454 | int c; | 3453 | int c; |
3455 | int num_tolerated_disk_barrier_failures = | 3454 | int num_tolerated_disk_barrier_failures = |
3456 | (int)fs_info->fs_devices->num_devices; | 3455 | (int)fs_info->fs_devices->num_devices; |
3457 | 3456 | ||
3458 | for (i = 0; i < num_types; i++) { | 3457 | for (i = 0; i < ARRAY_SIZE(types); i++) { |
3459 | struct btrfs_space_info *tmp; | 3458 | struct btrfs_space_info *tmp; |
3460 | 3459 | ||
3461 | sinfo = NULL; | 3460 | sinfo = NULL; |
@@ -3473,44 +3472,38 @@ int btrfs_calc_num_tolerated_disk_barrier_failures( | |||
3473 | 3472 | ||
3474 | down_read(&sinfo->groups_sem); | 3473 | down_read(&sinfo->groups_sem); |
3475 | for (c = 0; c < BTRFS_NR_RAID_TYPES; c++) { | 3474 | for (c = 0; c < BTRFS_NR_RAID_TYPES; c++) { |
3476 | if (!list_empty(&sinfo->block_groups[c])) { | 3475 | u64 flags; |
3477 | u64 flags; | 3476 | |
3478 | 3477 | if (list_empty(&sinfo->block_groups[c])) | |
3479 | btrfs_get_block_group_info( | 3478 | continue; |
3480 | &sinfo->block_groups[c], &space); | 3479 | |
3481 | if (space.total_bytes == 0 || | 3480 | btrfs_get_block_group_info(&sinfo->block_groups[c], |
3482 | space.used_bytes == 0) | 3481 | &space); |
3483 | continue; | 3482 | if (space.total_bytes == 0 || space.used_bytes == 0) |
3484 | flags = space.flags; | 3483 | continue; |
3485 | /* | 3484 | flags = space.flags; |
3486 | * return | 3485 | /* |
3487 | * 0: if dup, single or RAID0 is configured for | 3486 | * return |
3488 | * any of metadata, system or data, else | 3487 | * 0: if dup, single or RAID0 is configured for |
3489 | * 1: if RAID5 is configured, or if RAID1 or | 3488 | * any of metadata, system or data, else |
3490 | * RAID10 is configured and only two mirrors | 3489 | * 1: if RAID5 is configured, or if RAID1 or |
3491 | * are used, else | 3490 | * RAID10 is configured and only two mirrors |
3492 | * 2: if RAID6 is configured, else | 3491 | * are used, else |
3493 | * num_mirrors - 1: if RAID1 or RAID10 is | 3492 | * 2: if RAID6 is configured |
3494 | * configured and more than | 3493 | */ |
3495 | * 2 mirrors are used. | 3494 | if (num_tolerated_disk_barrier_failures > 0 && |
3496 | */ | 3495 | ((flags & (BTRFS_BLOCK_GROUP_DUP | |
3497 | if (num_tolerated_disk_barrier_failures > 0 && | 3496 | BTRFS_BLOCK_GROUP_RAID0)) || |
3498 | ((flags & (BTRFS_BLOCK_GROUP_DUP | | 3497 | ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0))) |
3499 | BTRFS_BLOCK_GROUP_RAID0)) || | 3498 | num_tolerated_disk_barrier_failures = 0; |
3500 | ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) | 3499 | else if (num_tolerated_disk_barrier_failures > 1 && |
3501 | == 0))) | 3500 | (flags & (BTRFS_BLOCK_GROUP_RAID1 | |
3502 | num_tolerated_disk_barrier_failures = 0; | 3501 | BTRFS_BLOCK_GROUP_RAID5 | |
3503 | else if (num_tolerated_disk_barrier_failures > 1) { | 3502 | BTRFS_BLOCK_GROUP_RAID10))) |
3504 | if (flags & (BTRFS_BLOCK_GROUP_RAID1 | | 3503 | num_tolerated_disk_barrier_failures = 1; |
3505 | BTRFS_BLOCK_GROUP_RAID5 | | 3504 | else if (num_tolerated_disk_barrier_failures > 2 && |
3506 | BTRFS_BLOCK_GROUP_RAID10)) { | 3505 | (flags & BTRFS_BLOCK_GROUP_RAID6)) |
3507 | num_tolerated_disk_barrier_failures = 1; | 3506 | num_tolerated_disk_barrier_failures = 2; |
3508 | } else if (flags & | ||
3509 | BTRFS_BLOCK_GROUP_RAID6) { | ||
3510 | num_tolerated_disk_barrier_failures = 2; | ||
3511 | } | ||
3512 | } | ||
3513 | } | ||
3514 | } | 3507 | } |
3515 | up_read(&sinfo->groups_sem); | 3508 | up_read(&sinfo->groups_sem); |
3516 | } | 3509 | } |