From: Filipe Manana <fdmanana@kernel.org>
To: Naohiro Aota <Naohiro.Aota@wdc.com>
Cc: "linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org>,
Johannes Thumshirn <Johannes.Thumshirn@wdc.com>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
"viro@zeniv.linux.org.uk" <viro@zeniv.linux.org.uk>,
"david@fromorbit.com" <david@fromorbit.com>
Subject: Re: [PATCH 1/4] btrfs: mark resumed async balance as writing
Date: Mon, 14 Mar 2022 11:25:20 +0000 [thread overview]
Message-ID: <Yi8mIFooTUybN+l0@debian9.Home> (raw)
In-Reply-To: <20220314022922.e4k5wxob6rqjw3aw@naota-xeon>
On Mon, Mar 14, 2022 at 02:29:22AM +0000, Naohiro Aota wrote:
> On Fri, Mar 11, 2022 at 02:08:37PM +0000, Filipe Manana wrote:
> > On Fri, Mar 11, 2022 at 04:38:02PM +0900, Naohiro Aota wrote:
> > > When btrfs balance is interrupted with umount, the background balance
> > > resumes on the next mount. There is a potential deadlock with FS freezing
> > > here like as described in commit 26559780b953 ("btrfs: zoned: mark
> > > relocation as writing").
> > >
> > > Mark the process as sb_writing. To preserve the order of sb_start_write()
> > > (or mnt_want_write_file()) and btrfs_exclop_start(), call sb_start_write()
> > > at btrfs_resume_balance_async() before taking fs_info->super_lock.
> > >
> > > Fixes: 5accdf82ba25 ("fs: Improve filesystem freezing handling")
> >
> > This seems odd to me. I read the note you left on the cover letter about
> > this, but honestly I don't think it's fair to blame that commit. I see
> > it more as btrfs specific problem.
>
> Yeah, I was really not sure how I should write the tag. The issue is
> we missed to add sb_start_write() after this commit.
>
> > Plus it's a 10 years old commit, so instead of the Fixes tag, adding a
> > minimal kernel version to the CC stable tag below makes more sense.
>
> So, only with "Cc: stable@vger.kernel.org # 3.6+" ?
Looking at kernel.org the oldest stable kernel is 4.9, so anything older
than that is pointless.
>
> > > Cc: stable@vger.kernel.org
> > > Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
> > > ---
> > > fs/btrfs/volumes.c | 2 ++
> > > 1 file changed, 2 insertions(+)
> > >
> > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> > > index 1be7cb2f955f..0d27d8d35c7a 100644
> > > --- a/fs/btrfs/volumes.c
> > > +++ b/fs/btrfs/volumes.c
> > > @@ -4443,6 +4443,7 @@ static int balance_kthread(void *data)
> > > if (fs_info->balance_ctl)
> > > ret = btrfs_balance(fs_info, fs_info->balance_ctl, NULL);
> > > mutex_unlock(&fs_info->balance_mutex);
> > > + sb_end_write(fs_info->sb);
> > >
> > > return ret;
> > > }
> > > @@ -4463,6 +4464,7 @@ int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info)
> > > return 0;
> > > }
> > >
> > > + sb_start_write(fs_info->sb);
> >
> > I don't understand this.
> >
> > We are doing the sb_start_write() here, in the task doing the mount, and then
> > we do the sb_end_write() at the kthread that runs balance_kthread().
>
> Oops, I made a mistake here. It actually printed the lockdep warning
> "lock held when returning to user space!".
>
> > Why not do the sb_start_write() in the kthread?
> >
> > This is also buggy in the case the call below to kthread_run() fails, as
> > we end up never calling sb_end_write().
>
> I was trying to preserve the lock taking order: sb_start_write() ->
> spin_lock(fs_info->super_lock). But, it might not be a big deal as
> long as we don't call sb_start_write() in the super_lock.
>
> > Thanks.
> >
> > > spin_lock(&fs_info->super_lock);
> > > ASSERT(fs_info->exclusive_operation == BTRFS_EXCLOP_BALANCE_PAUSED);
> > > fs_info->exclusive_operation = BTRFS_EXCLOP_BALANCE;
> > > --
> > > 2.35.1
> > >
next prev parent reply other threads:[~2022-03-14 11:25 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-11 7:38 [PATCH 0/4] protect relocation with sb_start_write Naohiro Aota
2022-03-11 7:38 ` [PATCH 1/4] btrfs: mark resumed async balance as writing Naohiro Aota
2022-03-11 14:08 ` Filipe Manana
2022-03-14 2:29 ` Naohiro Aota
2022-03-14 11:25 ` Filipe Manana [this message]
2022-03-11 7:38 ` [PATCH 2/4] btrfs: mark device addition as sb_writing Naohiro Aota
2022-03-11 14:21 ` Filipe Manana
2022-03-14 2:31 ` Naohiro Aota
2022-03-11 7:38 ` [PATCH 3/4] fs: add check functions for sb_start_{write,pagefault,intwrite} Naohiro Aota
2022-03-11 14:28 ` Filipe Manana
2022-03-11 7:38 ` [PATCH 4/4] btrfs: assert that relocation is protected with sb_start_write() Naohiro Aota
2022-03-11 14:33 ` Filipe Manana
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Yi8mIFooTUybN+l0@debian9.Home \
--to=fdmanana@kernel.org \
--cc=Johannes.Thumshirn@wdc.com \
--cc=Naohiro.Aota@wdc.com \
--cc=david@fromorbit.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.