From: Dave Chinner <david@fromorbit.com>
To: Jan Kara <jack@suse.cz>
Cc: Christian Brauner <brauner@kernel.org>,
Al Viro <viro@zeniv.linux.org.uk>,
linux-fsdevel@vger.kernel.org, Ted Tso <tytso@mit.edu>,
David Howells <dhowells@redhat.com>
Subject: Re: [PATCH] fs: Protect reconfiguration of sb read-write from racing writes
Date: Fri, 16 Jun 2023 08:36:53 +1000 [thread overview]
Message-ID: <ZIuShQWnWEWscTWr@dread.disaster.area> (raw)
In-Reply-To: <20230615113848.8439-1-jack@suse.cz>
On Thu, Jun 15, 2023 at 01:38:48PM +0200, Jan Kara wrote:
> The reconfigure / remount code takes a lot of effort to protect
> filesystem's reconfiguration code from racing writes on remounting
> read-only. However during remounting read-only filesystem to read-write
> mode userspace writes can start immediately once we clear SB_RDONLY
> flag. This is inconvenient for example for ext4 because we need to do
> some writes to the filesystem (such as preparation of quota files)
> before we can take userspace writes so we are clearing SB_RDONLY flag
> before we are fully ready to accept userpace writes and syzbot has found
> a way to exploit this [1]. Also as far as I'm reading the code
> the filesystem remount code was protected from racing writes in the
> legacy mount path by the mount's MNT_READONLY flag so this is relatively
> new problem. It is actually fairly easy to protect remount read-write
> from racing writes using sb->s_readonly_remount flag so let's just do
> that instead of having to workaround these races in the filesystem code.
>
> [1] https://lore.kernel.org/all/00000000000006a0df05f6667499@google.com/T/
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/super.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/fs/super.c b/fs/super.c
> index 34afe411cf2b..6cd64961aa07 100644
> --- a/fs/super.c
> +++ b/fs/super.c
> @@ -903,6 +903,7 @@ int reconfigure_super(struct fs_context *fc)
> struct super_block *sb = fc->root->d_sb;
> int retval;
> bool remount_ro = false;
> + bool remount_rw = false;
> bool force = fc->sb_flags & SB_FORCE;
>
> if (fc->sb_flags_mask & ~MS_RMT_MASK)
> @@ -920,7 +921,7 @@ int reconfigure_super(struct fs_context *fc)
> bdev_read_only(sb->s_bdev))
> return -EACCES;
> #endif
> -
> + remount_rw = !(fc->sb_flags & SB_RDONLY) && sb_rdonly(sb);
> remount_ro = (fc->sb_flags & SB_RDONLY) && !sb_rdonly(sb);
> }
>
> @@ -950,6 +951,14 @@ int reconfigure_super(struct fs_context *fc)
> if (retval)
> return retval;
> }
> + } else if (remount_rw) {
> + /*
> + * We set s_readonly_remount here to protect filesystem's
> + * reconfigure code from writes from userspace until
> + * reconfigure finishes.
> + */
> + sb->s_readonly_remount = 1;
> + smp_wmb();
What does the magic random memory barrier do? What is it ordering,
and what is it paired with?
This sort of thing is much better done with small helpers that
encapsulate the necessary memory barriers:
sb_set_readonly_remount()
sb_clear_readonly_remount()
alongside the helper that provides the read-side check and memory
barrier the write barrier is associated with.
I don't often ask for code to be cleaned up before a bug fix can be
added, but I think this is one of the important cases where it does
actually matter - we should never add undocumented memory barriers
in the code like this...
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2023-06-15 22:36 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-15 11:38 [PATCH] fs: Protect reconfiguration of sb read-write from racing writes Jan Kara
2023-06-15 12:53 ` Christian Brauner
2023-06-15 14:10 ` Theodore Ts'o
2023-06-15 14:48 ` Jan Kara
2023-06-15 15:01 ` Christian Brauner
2023-06-15 22:36 ` Dave Chinner [this message]
2023-06-16 16:37 ` Jan Kara
2023-06-16 22:48 ` Dave Chinner
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=ZIuShQWnWEWscTWr@dread.disaster.area \
--to=david@fromorbit.com \
--cc=brauner@kernel.org \
--cc=dhowells@redhat.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=tytso@mit.edu \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox