Btrfs: pause/recover the space balance when doing remount
PATCH 3/5 Btrfs: pause/recover the space balance when doing remount
pause the space balance threads when remounting the fs to be readonly, and recover it when remounting it from r/o to r/w
Signed-off-by Miao Xie <[email protected]>
--- fs/btrfs/super.c | 9 ++++++++- fs/btrfs/volumes.c | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-)
fs/btrfs/super.c +8 -1
@@ -1148,6 +1148,9 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)if (*flags &MS_RDONLY ) { sb->s_flags |=MS_RDONLY ; +/* pause restriper - we want to resume on remount to r/w */ +btrfs_pause_balance (root->fs_info); + ret =btrfs_commit_super (root);if (ret) goto restore;
@@ -1174,7 +1177,10 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)if (ret) goto restore; - sb->s_flags &= ~MS_RDONLY ; +if (sb->s_flags &MS_RDONLY ) { + sb->s_flags &= ~MS_RDONLY ; +btrfs_recover_balance (fs_info->tree_root); + } }return 0 ;
@@ -1190,6 +1196,7 @@ restore: fs_info->alloc_start = old_alloc_start; fs_info->thread_pool_size = old_thread_pool_size; fs_info->metadata_ratio = old_metadata_ratio; +return ret; }
fs/btrfs/volumes.c +7 -1
@@ -2833,7 +2833,13 @@ static int balance_kthread(void *data)mutex_lock (&fs_info->volume_mutex);mutex_lock (&fs_info->balance_mutex); -set_balance_control (bctl); +if (fs_info->balance_ctl) { +kfree (bctl); + bctl = fs_info->balance_ctl; + bctl->flags = bctl->flags |BTRFS_BALANCE_RESUME ; + }else { +set_balance_control (bctl); + }if (btrfs_test_opt (fs_info->tree_root,SKIP_BALANCE )) {printk (KERN_INFO "btrfs: force skipping balance\n" );
Signature · 1 line
1.7.6.5
Quoted 52 lines · Miao Xie
pause the space balance threads when remounting the fs to be readonly, and recover it when remounting it from r/o to r/w
Signed-off-by Miao Xie <[email protected]>--- fs/btrfs/super.c | 9 ++++++++- fs/btrfs/volumes.c | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-)fs/btrfs/super.c +8
-1@@ -1148,6 +1148,9 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)if (*flags &MS_RDONLY ) { sb->s_flags |=MS_RDONLY ; +/* pause restriper - we want to resume on remount to r/w */ +btrfs_pause_balance (root->fs_info); + ret =btrfs_commit_super (root);if (ret) goto restore;@@ -1174,7 +1177,10 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)if (ret) goto restore; - sb->s_flags &= ~MS_RDONLY ; +if (sb->s_flags &MS_RDONLY ) { + sb->s_flags &= ~MS_RDONLY ; +btrfs_recover_balance (fs_info->tree_root); + } }return 0 ;@@ -1190,6 +1196,7 @@ restore: fs_info->alloc_start = old_alloc_start; fs_info->thread_pool_size = old_thread_pool_size; fs_info->metadata_ratio = old_metadata_ratio; +return ret; }fs/btrfs/volumes.c +0
-1@@ -2833,7 +2833,13 @@ static int balance_kthread(void *data)mutex_lock (&fs_info->volume_mutex);mutex_lock (&fs_info->balance_mutex); -set_balance_control (bctl);
fs/btrfs/volumes.c static int balance_kthread(void *data) · line 2845
Quoted 10 lines
fs/btrfs/volumes.c +7
-0+if (fs_info->balance_ctl) { +kfree (bctl); + bctl = fs_info->balance_ctl; + bctl->flags = bctl->flags |BTRFS_BALANCE_RESUME ; + }else { +set_balance_control (bctl); + }if (btrfs_test_opt (fs_info->tree_root,SKIP_BALANCE )) {printk (KERN_INFO "btrfs: force skipping balance\n" );
This is a known bug. There is a deeper problem here, related to the fact that we restore balancing state not early enough and that we don't restore it on ro mounts at all. I have a patch in the works to fix that problem, and it also fixes this one the right way. I'm backed up with other things right now, but I'll post it as soon as I get a chance.
Thanks,
Ilya