* [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag
@ 2018-04-30 9:48 Anand Jain
2018-04-30 14:11 ` kbuild test robot
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Anand Jain @ 2018-04-30 9:48 UTC (permalink / raw)
To: linux-btrfs
We set the BTRFS_BALANCE_RESUME flag in the btrfs_recover_balance(),
which is not called during the remount. So when resuming from the
paused balance we hit BUG.
kernel: kernel BUG at fs/btrfs/volumes.c:3890!
::
kernel: balance_kthread+0x51/0x60 [btrfs]
kernel: kthread+0x111/0x130
::
kernel: RIP: btrfs_balance+0x12e1/0x1570 [btrfs] RSP: ffffba7d0090bde8
Reproducer:
On a mounted BTRFS.
btrfs balance start --full-balance /btrfs
btrfs balance pause /btrfs
mount -o remount,ro /dev/sdb /btrfs
mount -o remount,rw /dev/sdb /btrfs
To fix this set the BTRFS_BALANCE_RESUME flag in btrfs_resume_balance_async()
instead of btrfs_recover_balance().
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
v1->v2: btrfs_resume_balance_async() can be called only from remount or
mount, we don't need to hold fs_info->balance_lock.
Strictly speaking we should rather keep the balance at the paused state
unless it is resumed by the user again, that means neither mount nor
remount-rw should resume the balance automatically, former case needs
writing balance status to the disk. Which needs compatibility
verification. So for now just avoid BUG.
fs/btrfs/volumes.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 3e6983a169c4..64bcaf25908b 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -4115,6 +4115,8 @@ int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info)
return 0;
}
+ fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME;
+
tsk = kthread_run(balance_kthread, fs_info, "btrfs-balance");
return PTR_ERR_OR_ZERO(tsk);
}
@@ -4156,7 +4158,6 @@ int btrfs_recover_balance(struct btrfs_fs_info *fs_info)
bctl->fs_info = fs_info;
bctl->flags = btrfs_balance_flags(leaf, item);
- bctl->flags |= BTRFS_BALANCE_RESUME;
btrfs_balance_data(leaf, item, &disk_bargs);
btrfs_disk_balance_args_to_cpu(&bctl->data, &disk_bargs);
--
2.7.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag 2018-04-30 9:48 [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag Anand Jain @ 2018-04-30 14:11 ` kbuild test robot 2018-04-30 14:12 ` kbuild test robot 2018-05-16 14:35 ` David Sterba 2 siblings, 0 replies; 5+ messages in thread From: kbuild test robot @ 2018-04-30 14:11 UTC (permalink / raw) To: Anand Jain; +Cc: kbuild-all, linux-btrfs [-- Attachment #1: Type: text/plain, Size: 1817 bytes --] Hi Anand, Thank you for the patch! Yet something to improve: [auto build test ERROR on btrfs/next] [also build test ERROR on v4.17-rc3 next-20180430] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Anand-Jain/btrfs-fix-BUG-trying-to-resume-balance-without-resume-flag/20180430-192532 base: https://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs.git next config: i386-randconfig-a1-201817 (attached as .config) compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): fs/btrfs/volumes.c: In function 'btrfs_resume_balance_async': >> fs/btrfs/volumes.c:3971:22: error: 'struct btrfs_balance_control' has no member named 'b_flags' fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME; ^ vim +3971 fs/btrfs/volumes.c 3954 3955 int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info) 3956 { 3957 struct task_struct *tsk; 3958 3959 spin_lock(&fs_info->balance_lock); 3960 if (!fs_info->balance_ctl) { 3961 spin_unlock(&fs_info->balance_lock); 3962 return 0; 3963 } 3964 spin_unlock(&fs_info->balance_lock); 3965 3966 if (btrfs_test_opt(fs_info, SKIP_BALANCE)) { 3967 btrfs_info(fs_info, "force skipping balance"); 3968 return 0; 3969 } 3970 > 3971 fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME; 3972 3973 tsk = kthread_run(balance_kthread, fs_info, "btrfs-balance"); 3974 return PTR_ERR_OR_ZERO(tsk); 3975 } 3976 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 32886 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag 2018-04-30 9:48 [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag Anand Jain 2018-04-30 14:11 ` kbuild test robot @ 2018-04-30 14:12 ` kbuild test robot 2018-05-16 14:35 ` David Sterba 2 siblings, 0 replies; 5+ messages in thread From: kbuild test robot @ 2018-04-30 14:12 UTC (permalink / raw) To: Anand Jain; +Cc: kbuild-all, linux-btrfs [-- Attachment #1: Type: text/plain, Size: 1885 bytes --] Hi Anand, Thank you for the patch! Yet something to improve: [auto build test ERROR on btrfs/next] [also build test ERROR on v4.17-rc3 next-20180430] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Anand-Jain/btrfs-fix-BUG-trying-to-resume-balance-without-resume-flag/20180430-192532 base: https://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs.git next config: i386-randconfig-x000-201817 (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): fs//btrfs/volumes.c: In function 'btrfs_resume_balance_async': >> fs//btrfs/volumes.c:3971:24: error: 'struct btrfs_balance_control' has no member named 'b_flags'; did you mean 'flags'? fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME; ^~~~~~~ flags vim +3971 fs//btrfs/volumes.c 3954 3955 int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info) 3956 { 3957 struct task_struct *tsk; 3958 3959 spin_lock(&fs_info->balance_lock); 3960 if (!fs_info->balance_ctl) { 3961 spin_unlock(&fs_info->balance_lock); 3962 return 0; 3963 } 3964 spin_unlock(&fs_info->balance_lock); 3965 3966 if (btrfs_test_opt(fs_info, SKIP_BALANCE)) { 3967 btrfs_info(fs_info, "force skipping balance"); 3968 return 0; 3969 } 3970 > 3971 fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME; 3972 3973 tsk = kthread_run(balance_kthread, fs_info, "btrfs-balance"); 3974 return PTR_ERR_OR_ZERO(tsk); 3975 } 3976 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 31372 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag 2018-04-30 9:48 [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag Anand Jain 2018-04-30 14:11 ` kbuild test robot 2018-04-30 14:12 ` kbuild test robot @ 2018-05-16 14:35 ` David Sterba 2018-05-17 7:16 ` Anand Jain 2 siblings, 1 reply; 5+ messages in thread From: David Sterba @ 2018-05-16 14:35 UTC (permalink / raw) To: Anand Jain; +Cc: linux-btrfs On Mon, Apr 30, 2018 at 05:48:45PM +0800, Anand Jain wrote: > We set the BTRFS_BALANCE_RESUME flag in the btrfs_recover_balance(), > which is not called during the remount. So when resuming from the > paused balance we hit BUG. > > kernel: kernel BUG at fs/btrfs/volumes.c:3890! > :: > kernel: balance_kthread+0x51/0x60 [btrfs] > kernel: kthread+0x111/0x130 > :: > kernel: RIP: btrfs_balance+0x12e1/0x1570 [btrfs] RSP: ffffba7d0090bde8 > > Reproducer: > On a mounted BTRFS. > > btrfs balance start --full-balance /btrfs > btrfs balance pause /btrfs > mount -o remount,ro /dev/sdb /btrfs > mount -o remount,rw /dev/sdb /btrfs > > To fix this set the BTRFS_BALANCE_RESUME flag in btrfs_resume_balance_async() > instead of btrfs_recover_balance(). > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > v1->v2: btrfs_resume_balance_async() can be called only from remount or > mount, we don't need to hold fs_info->balance_lock. For mount it's ok, there's nothing that can run in parallel, but remount ro->rw that resumes the balance can be run with the ioctl that checks balance status in parallel, at any time. As the fs_info::balance_ctl is set up, btrfs_ioctl_balance_progress will proceed and return the current status. > Strictly speaking we should rather keep the balance at the paused state > unless it is resumed by the user again, that means neither mount nor > remount-rw should resume the balance automatically, former case needs > writing balance status to the disk. Which needs compatibility > verification. So for now just avoid BUG. > > fs/btrfs/volumes.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index 3e6983a169c4..64bcaf25908b 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -4115,6 +4115,8 @@ int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info) > return 0; > } > > + fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME; Though there's no update operation on flags, I think it's still better to add the locks that set the resume status. And a comment why it's here. > + > tsk = kthread_run(balance_kthread, fs_info, "btrfs-balance"); > return PTR_ERR_OR_ZERO(tsk); > } > @@ -4156,7 +4158,6 @@ int btrfs_recover_balance(struct btrfs_fs_info *fs_info) > > bctl->fs_info = fs_info; > bctl->flags = btrfs_balance_flags(leaf, item); > - bctl->flags |= BTRFS_BALANCE_RESUME; Also, it does not hurt to leave this here, as it logically matches what the function does: we found the balance item, thus we set the status accordingly. Please update and resend, I'd like to push this to 4.17-rc as it's a crash fix with a reproducer. Thanks. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag 2018-05-16 14:35 ` David Sterba @ 2018-05-17 7:16 ` Anand Jain 0 siblings, 0 replies; 5+ messages in thread From: Anand Jain @ 2018-05-17 7:16 UTC (permalink / raw) To: dsterba, linux-btrfs On 05/16/2018 10:35 PM, David Sterba wrote: > On Mon, Apr 30, 2018 at 05:48:45PM +0800, Anand Jain wrote: >> We set the BTRFS_BALANCE_RESUME flag in the btrfs_recover_balance(), >> which is not called during the remount. So when resuming from the >> paused balance we hit BUG. >> >> kernel: kernel BUG at fs/btrfs/volumes.c:3890! >> :: >> kernel: balance_kthread+0x51/0x60 [btrfs] >> kernel: kthread+0x111/0x130 >> :: >> kernel: RIP: btrfs_balance+0x12e1/0x1570 [btrfs] RSP: ffffba7d0090bde8 >> >> Reproducer: >> On a mounted BTRFS. >> >> btrfs balance start --full-balance /btrfs >> btrfs balance pause /btrfs >> mount -o remount,ro /dev/sdb /btrfs >> mount -o remount,rw /dev/sdb /btrfs >> >> To fix this set the BTRFS_BALANCE_RESUME flag in btrfs_resume_balance_async() >> instead of btrfs_recover_balance(). >> >> Signed-off-by: Anand Jain <anand.jain@oracle.com> >> --- >> v1->v2: btrfs_resume_balance_async() can be called only from remount or >> mount, we don't need to hold fs_info->balance_lock. > > For mount it's ok, there's nothing that can run in parallel, but remount > ro->rw that resumes the balance can be run with the ioctl that checks > balance status in parallel, at any time. As the fs_info::balance_ctl is > set up, btrfs_ioctl_balance_progress will proceed and return the current > status. You are right. >> Strictly speaking we should rather keep the balance at the paused state >> unless it is resumed by the user again, that means neither mount nor >> remount-rw should resume the balance automatically, former case needs >> writing balance status to the disk. Which needs compatibility >> verification. So for now just avoid BUG. >> >> fs/btrfs/volumes.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c >> index 3e6983a169c4..64bcaf25908b 100644 >> --- a/fs/btrfs/volumes.c >> +++ b/fs/btrfs/volumes.c >> @@ -4115,6 +4115,8 @@ int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info) >> return 0; >> } >> >> + fs_info->balance_ctl->b_flags |= BTRFS_BALANCE_RESUME; > > Though there's no update operation on flags, I think it's still better > to add the locks that set the resume status. And a comment why it's > here. ok. >> + >> tsk = kthread_run(balance_kthread, fs_info, "btrfs-balance"); >> return PTR_ERR_OR_ZERO(tsk); >> } >> @@ -4156,7 +4158,6 @@ int btrfs_recover_balance(struct btrfs_fs_info *fs_info) >> >> bctl->fs_info = fs_info; >> bctl->flags = btrfs_balance_flags(leaf, item); >> - bctl->flags |= BTRFS_BALANCE_RESUME; > > Also, it does not hurt to leave this here, as it logically matches what > the function does: we found the balance item, thus we set the status > accordingly. ok. > Please update and resend, I'd like to push this to 4.17-rc as it's a > crash fix with a reproducer. Thanks. Sent v3 with the above changes. Thanks, Anand > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-05-17 7:14 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-04-30 9:48 [PATCH v2] btrfs: fix BUG trying to resume balance without resume flag Anand Jain 2018-04-30 14:11 ` kbuild test robot 2018-04-30 14:12 ` kbuild test robot 2018-05-16 14:35 ` David Sterba 2018-05-17 7:16 ` Anand Jain
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox