All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Christian Brauner" <brauner@kernel.org>
Cc: "Mark Fasheh" <mark@fasheh.com>,
	dsterba@suse.cz, tytso@mit.edu,
	"Joseph Qi" <joseph.qi@linux.alibaba.com>,
	"Joel Becker" <jlbec@evilplan.org>,
	linux-ext4@vger.kernel.org
Subject: Re: [PATCH RFC 06/28] fat: don't set SB_RDONLY after filesystem errors
Date: Mon, 12 Oct 2026 10:37:24 +0000	[thread overview]
Message-ID: <sashiko-outbox-167971@kernel.org> (raw)
In-Reply-To: <20261012-work-fs-sb_rdonly-v1-6-60743a3dc326@kernel.org>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] fat: logical bypass of emergency RO flag on read-only mounts
- [Medium] fat: TOCTOU race in directory operations bypasses emergency RO state
--

commit e77264e006a2ef4a1ac604c047b873a1d5b45bb5
Author: Christian Brauner <brauner@kernel.org>

    fat: don't set SB_RDONLY after filesystem errors

This commit introduces a new FAT_FLAGS_EMERGENCY_RO bit to handle filesystem
errors instead of setting SB_RDONLY directly. This prevents hangs when errors
occur while the filesystem is frozen, and various filesystem operations are
updated to check this new flag to refuse modifications.

> diff --git a/fs/fat/misc.c b/fs/fat/misc.c
> index e79762cf19754..ecba57df83ca2 100644
> --- a/fs/fat/misc.c
> +++ b/fs/fat/misc.c
[ ... ]
> @@ -32,10 +33,22 @@ void __fat_fs_error(struct super_block *sb, int report, const char *fmt, ...)
>  		va_end(args);
>  	}
>  
> -	if (opts->errors == FAT_ERRORS_PANIC)
> +	if (opts->errors == FAT_ERRORS_PANIC) {
>  		panic("FAT-fs (%s): fs panic from previous error\n", sb->s_id);
> -	else if (opts->errors == FAT_ERRORS_RO && !sb_rdonly(sb)) {
> -		sb->s_flags |= SB_RDONLY;
> +	} else if (opts->errors == FAT_ERRORS_RO && !sb_rdonly(sb)) {
> +		/*
> +		 * Only a mount in progress may still set SB_RDONLY: the
> +		 * mounter holds s_umount and nothing can freeze the superblock
> +		 * before SB_BORN. Later, setting it without s_umount on a
> +		 * frozen superblock makes thaw_super() mark it unfrozen but
> +		 * skip sb_freeze_unlock(), so the s_writers rwsems stay
> +		 * write-locked and every writer hangs. Refuse modifications
> +		 * until umount instead.
> +		 */
> +		if (!(sb->s_flags & SB_BORN))
> +			sb->s_flags |= SB_RDONLY;
> +		else if (test_and_set_bit(FAT_FLAGS_EMERGENCY_RO, &sbi->flags))
> +			return;

[Severity: High]
Does this logic bypass setting the emergency read-only flag if the filesystem
is already mounted read-only when the error occurs?

If an error happens on a read-only mount, the !sb_rdonly(sb) condition skips
setting the FAT_FLAGS_EMERGENCY_RO bit, meaning the filesystem won't
persistently record its corrupted emergency state.

If the administrator later remounts the filesystem as read-write,
fat_reconfigure() allows the remount because fat_emergency_ro(sb) will return
false. Could this allow modifying a known-corrupted filesystem?

> diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
> index da3e89c0b16ac..73f7f11b05907 100644
> --- a/fs/fat/namei_vfat.c
> +++ b/fs/fat/namei_vfat.c
> @@ -791,6 +791,9 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry)
>  	struct fat_slot_info sinfo;
>  	int err;
>  
> +	if (unlikely(fat_emergency_ro(sb)))
> +		return -EROFS;
> +
>  	mutex_lock(&MSDOS_SB(sb)->s_lock);
>  
>  	err = fat_dir_empty(inode);

[Severity: Medium]
Could this lockless check introduce a TOCTOU race?

If a separate thread encounters an error and locklessly sets
FAT_FLAGS_EMERGENCY_RO, and concurrently a thread executing vfat_rmdir() passes
this check and waits on s_lock, the rmdir thread will proceed with the
operation once it acquires the lock.

Since fat_remove_entries() is called later inside s_lock but doesn't perform
its own internal check of the emergency read-only flag (unlike
fat_add_entries()), could directory modifications be written to disk despite
the filesystem having entered an emergency read-only state?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261012-work-fs-sb_rdonly-v1-0-60743a3dc326@kernel.org?part=6

  reply	other threads:[~2026-10-12 10:37 UTC|newest]

Thread overview: 102+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-12 10:20 [PATCH RFC 00/28] fs: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-12 10:20 ` Christian Brauner
2026-10-12 10:20 ` [PATCH RFC 01/28] ecryptfs: don't leak the inode when a lookup can't open the lower file Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:34   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 02/28] ecryptfs: fall back to a read-only " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:32   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 03/28] ext2: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:44   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 04/28] jfs: " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:41   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 05/28] nilfs2: " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:34   ` sashiko-bot
2026-10-13 16:01   ` Ryusuke Konishi
2026-10-13 16:01     ` Ryusuke Konishi
2026-10-12 10:20 ` [PATCH RFC 06/28] fat: " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:37   ` sashiko-bot [this message]
2026-10-12 10:20 ` [PATCH RFC 07/28] exfat: keep the current mount options on remount Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:36   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 08/28] exfat: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:35   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 09/28] hfs: don't set SB_RDONLY after MDB write errors Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:41   ` sashiko-bot
2026-10-12 22:57   ` [Jfs-discussion] " Viacheslav Dubeyko
2026-10-12 22:57     ` Viacheslav Dubeyko
2026-10-12 10:20 ` [PATCH RFC 10/28] hfsplus: don't set SB_RDONLY when creating the attributes tree Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:36   ` sashiko-bot
2026-10-12 22:34   ` [Jfs-discussion] " Viacheslav Dubeyko
2026-10-12 22:34     ` Viacheslav Dubeyko
2026-10-12 10:20 ` [PATCH RFC 11/28] affs: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:41   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 12/28] ufs: " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:39   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 13/28] hpfs: " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:35   ` sashiko-bot
2026-10-12 10:20 ` [PATCH RFC 14/28] ntfs: " Christian Brauner
2026-10-12 10:20   ` Christian Brauner
2026-10-12 10:45   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 15/28] ocfs2: keep options that can't change on remount Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:45   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 16/28] ocfs2: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:59   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 17/28] zonefs: don't set SB_RDONLY after I/O errors Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:42   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 18/28] btrfs: check BTRFS_FS_STATE_RO instead of SB_RDONLY at runtime Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:53   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 19/28] btrfs: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 11:05   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 20/28] gfs2: wait for a pending withdraw before remounting read-only Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:44   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 21/28] gfs2: don't set SB_RDONLY on withdraw Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:48   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 22/28] efivarfs: stop using SB_RDONLY for read-only efivar ops Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:52   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 23/28] ubifs: don't set SB_RDONLY after errors Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 11:05   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 24/28] selftests/filesystems: test filesystem errors while frozen Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:47   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 25/28] ext4: allow remounting read-only in the emergency state Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:49   ` sashiko-bot
2026-10-12 16:38   ` Jan Kara
2026-10-12 16:38     ` Jan Kara
2026-10-12 10:21 ` [PATCH RFC 26/28] selftests/filesystems: test ext4 remounts " Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:52   ` sashiko-bot
2026-10-12 10:21 ` [PATCH RFC 27/28] xfs: allow remounting read-only after a shutdown Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:55   ` sashiko-bot
2026-10-13  7:38   ` Christoph Hellwig
2026-10-13  7:38     ` Christoph Hellwig
2026-10-12 10:21 ` [PATCH RFC 28/28] selftests/filesystems: test xfs remounts " Christian Brauner
2026-10-12 10:21   ` Christian Brauner
2026-10-12 10:51   ` sashiko-bot
2026-10-13  7:40   ` Christoph Hellwig
2026-10-13  7:40     ` Christoph Hellwig
2026-10-12 16:53 ` [PATCH RFC 00/28] fs: don't set SB_RDONLY after filesystem errors Jan Kara
2026-10-12 16:53   ` Jan Kara
2026-10-13 19:39   ` Christian Brauner
2026-10-13 19:39     ` Christian Brauner

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=sashiko-outbox-167971@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=brauner@kernel.org \
    --cc=dsterba@suse.cz \
    --cc=jlbec@evilplan.org \
    --cc=joseph.qi@linux.alibaba.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=mark@fasheh.com \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=tytso@mit.edu \
    /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.