aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2012-01-16 15:04:48 -0500
committerIlya Dryomov <idryomov@gmail.com>2012-01-16 15:04:48 -0500
commit9555c6c180600b40f6e86bd4dc53bf47e06ed663 (patch)
tree74f95edee2368e183a2a054c24725d2940632a8f
parent596410151ed71819b9e8a8018c6c9992796b256d (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.h1
-rw-r--r--fs/btrfs/super.c11
-rw-r--r--fs/btrfs/volumes.c10
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
171static match_table_t tokens = { 172static 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);