diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index dfe5e3a22f55..029b903a4ae3 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -1475,6 +1475,9 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1475 | free_fs_devices(cur_devices); | 1475 | free_fs_devices(cur_devices); |
1476 | } | 1476 | } |
1477 | 1477 | ||
1478 | root->fs_info->num_tolerated_disk_barrier_failures = | ||
1479 | btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info); | ||
1480 | |||
1478 | /* | 1481 | /* |
1479 | * at this point, the device is zero sized. We want to | 1482 | * at this point, the device is zero sized. We want to |
1480 | * remove it from the devices list and zero out the old super | 1483 | * remove it from the devices list and zero out the old super |
@@ -1799,6 +1802,8 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1799 | btrfs_clear_space_info_full(root->fs_info); | 1802 | btrfs_clear_space_info_full(root->fs_info); |
1800 | 1803 | ||
1801 | unlock_chunks(root); | 1804 | unlock_chunks(root); |
1805 | root->fs_info->num_tolerated_disk_barrier_failures = | ||
1806 | btrfs_calc_num_tolerated_disk_barrier_failures(root->fs_info); | ||
1802 | ret = btrfs_commit_transaction(trans, root); | 1807 | ret = btrfs_commit_transaction(trans, root); |
1803 | 1808 | ||
1804 | if (seeding_dev) { | 1809 | if (seeding_dev) { |
@@ -2809,6 +2814,26 @@ int btrfs_balance(struct btrfs_balance_control *bctl, | |||
2809 | } | 2814 | } |
2810 | } | 2815 | } |
2811 | 2816 | ||
2817 | if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { | ||
2818 | int num_tolerated_disk_barrier_failures; | ||
2819 | u64 target = bctl->sys.target; | ||
2820 | |||
2821 | num_tolerated_disk_barrier_failures = | ||
2822 | btrfs_calc_num_tolerated_disk_barrier_failures(fs_info); | ||
2823 | if (num_tolerated_disk_barrier_failures > 0 && | ||
2824 | (target & | ||
2825 | (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID0 | | ||
2826 | BTRFS_AVAIL_ALLOC_BIT_SINGLE))) | ||
2827 | num_tolerated_disk_barrier_failures = 0; | ||
2828 | else if (num_tolerated_disk_barrier_failures > 1 && | ||
2829 | (target & | ||
2830 | (BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10))) | ||
2831 | num_tolerated_disk_barrier_failures = 1; | ||
2832 | |||
2833 | fs_info->num_tolerated_disk_barrier_failures = | ||
2834 | num_tolerated_disk_barrier_failures; | ||
2835 | } | ||
2836 | |||
2812 | ret = insert_balance_item(fs_info->tree_root, bctl); | 2837 | ret = insert_balance_item(fs_info->tree_root, bctl); |
2813 | if (ret && ret != -EEXIST) | 2838 | if (ret && ret != -EEXIST) |
2814 | goto out; | 2839 | goto out; |
@@ -2841,6 +2866,11 @@ int btrfs_balance(struct btrfs_balance_control *bctl, | |||
2841 | __cancel_balance(fs_info); | 2866 | __cancel_balance(fs_info); |
2842 | } | 2867 | } |
2843 | 2868 | ||
2869 | if (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { | ||
2870 | fs_info->num_tolerated_disk_barrier_failures = | ||
2871 | btrfs_calc_num_tolerated_disk_barrier_failures(fs_info); | ||
2872 | } | ||
2873 | |||
2844 | wake_up(&fs_info->balance_wait_q); | 2874 | wake_up(&fs_info->balance_wait_q); |
2845 | 2875 | ||
2846 | return ret; | 2876 | return ret; |