diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2012-01-16 15:04:48 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2012-01-16 15:04:48 -0500 |
commit | 9555c6c180600b40f6e86bd4dc53bf47e06ed663 (patch) | |
tree | 74f95edee2368e183a2a054c24725d2940632a8f | |
parent | 596410151ed71819b9e8a8018c6c9992796b256d (diff) |
Btrfs: add skip_balance mount option
Since restriper kthread starts involuntarily on mount and can suck cpu
and memory bandwidth add a mount option to forcefully skip it. The
restriper in that case hangs around in paused state and can be resumed
from userspace when it's convenient.
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r-- | fs/btrfs/ctree.h | 1 | ||||
-rw-r--r-- | fs/btrfs/super.c | 11 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 10 |
3 files changed, 17 insertions, 5 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 9997a59e4f58..99eb2bcd9aa7 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1492,6 +1492,7 @@ struct btrfs_ioctl_defrag_range_args { | |||
1492 | #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16) | 1492 | #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16) |
1493 | #define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17) | 1493 | #define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17) |
1494 | #define BTRFS_MOUNT_RECOVERY (1 << 18) | 1494 | #define BTRFS_MOUNT_RECOVERY (1 << 18) |
1495 | #define BTRFS_MOUNT_SKIP_BALANCE (1 << 19) | ||
1495 | 1496 | ||
1496 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) | 1497 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) |
1497 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) | 1498 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 34a8b6112ea4..063b521e3ded 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -164,8 +164,9 @@ enum { | |||
164 | Opt_compress_type, Opt_compress_force, Opt_compress_force_type, | 164 | Opt_compress_type, Opt_compress_force, Opt_compress_force_type, |
165 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, | 165 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, |
166 | Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, | 166 | Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, |
167 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, | 167 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, Opt_inode_cache, |
168 | Opt_inode_cache, Opt_no_space_cache, Opt_recovery, Opt_err, | 168 | Opt_no_space_cache, Opt_recovery, Opt_skip_balance, |
169 | Opt_err, | ||
169 | }; | 170 | }; |
170 | 171 | ||
171 | static match_table_t tokens = { | 172 | static match_table_t tokens = { |
@@ -200,6 +201,7 @@ static match_table_t tokens = { | |||
200 | {Opt_inode_cache, "inode_cache"}, | 201 | {Opt_inode_cache, "inode_cache"}, |
201 | {Opt_no_space_cache, "nospace_cache"}, | 202 | {Opt_no_space_cache, "nospace_cache"}, |
202 | {Opt_recovery, "recovery"}, | 203 | {Opt_recovery, "recovery"}, |
204 | {Opt_skip_balance, "skip_balance"}, | ||
203 | {Opt_err, NULL}, | 205 | {Opt_err, NULL}, |
204 | }; | 206 | }; |
205 | 207 | ||
@@ -398,6 +400,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
398 | printk(KERN_INFO "btrfs: enabling auto recovery"); | 400 | printk(KERN_INFO "btrfs: enabling auto recovery"); |
399 | btrfs_set_opt(info->mount_opt, RECOVERY); | 401 | btrfs_set_opt(info->mount_opt, RECOVERY); |
400 | break; | 402 | break; |
403 | case Opt_skip_balance: | ||
404 | btrfs_set_opt(info->mount_opt, SKIP_BALANCE); | ||
405 | break; | ||
401 | case Opt_err: | 406 | case Opt_err: |
402 | printk(KERN_INFO "btrfs: unrecognized mount option " | 407 | printk(KERN_INFO "btrfs: unrecognized mount option " |
403 | "'%s'\n", p); | 408 | "'%s'\n", p); |
@@ -723,6 +728,8 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
723 | seq_puts(seq, ",autodefrag"); | 728 | seq_puts(seq, ",autodefrag"); |
724 | if (btrfs_test_opt(root, INODE_MAP_CACHE)) | 729 | if (btrfs_test_opt(root, INODE_MAP_CACHE)) |
725 | seq_puts(seq, ",inode_cache"); | 730 | seq_puts(seq, ",inode_cache"); |
731 | if (btrfs_test_opt(root, SKIP_BALANCE)) | ||
732 | seq_puts(seq, ",skip_balance"); | ||
726 | return 0; | 733 | return 0; |
727 | } | 734 | } |
728 | 735 | ||
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 17e565388de0..e0160607e6e2 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -2707,15 +2707,19 @@ static int balance_kthread(void *data) | |||
2707 | struct btrfs_balance_control *bctl = | 2707 | struct btrfs_balance_control *bctl = |
2708 | (struct btrfs_balance_control *)data; | 2708 | (struct btrfs_balance_control *)data; |
2709 | struct btrfs_fs_info *fs_info = bctl->fs_info; | 2709 | struct btrfs_fs_info *fs_info = bctl->fs_info; |
2710 | int ret; | 2710 | int ret = 0; |
2711 | 2711 | ||
2712 | mutex_lock(&fs_info->volume_mutex); | 2712 | mutex_lock(&fs_info->volume_mutex); |
2713 | mutex_lock(&fs_info->balance_mutex); | 2713 | mutex_lock(&fs_info->balance_mutex); |
2714 | 2714 | ||
2715 | set_balance_control(bctl); | 2715 | set_balance_control(bctl); |
2716 | 2716 | ||
2717 | printk(KERN_INFO "btrfs: continuing balance\n"); | 2717 | if (btrfs_test_opt(fs_info->tree_root, SKIP_BALANCE)) { |
2718 | ret = btrfs_balance(bctl, NULL); | 2718 | printk(KERN_INFO "btrfs: force skipping balance\n"); |
2719 | } else { | ||
2720 | printk(KERN_INFO "btrfs: continuing balance\n"); | ||
2721 | ret = btrfs_balance(bctl, NULL); | ||
2722 | } | ||
2719 | 2723 | ||
2720 | mutex_unlock(&fs_info->balance_mutex); | 2724 | mutex_unlock(&fs_info->balance_mutex); |
2721 | mutex_unlock(&fs_info->volume_mutex); | 2725 | mutex_unlock(&fs_info->volume_mutex); |