From: sashiko-bot@kernel.org
To: "Christian Brauner" <brauner@kernel.org>, "Jan Kara" <jack@suse.com>
Cc: "Al Viro" <viro@zeniv.linux.org.uk>,
linux-ext4@vger.kernel.org, linux-mm@kvack.org,
linux-efi@vger.kernel.org, linux-mtd@lists.infradead.org,
dsterba@suse.cz, tytso@mit.edu, "Mark Fasheh" <mark@fasheh.com>,
"Joel Becker" <jlbec@evilplan.org>,
"Joseph Qi" <joseph.qi@linux.alibaba.com>
Subject: Re: [PATCH v2 09/34] exfat: don't set SB_RDONLY after filesystem errors
Date: Fri, 30 Oct 2026 16:09:55 +0000 [thread overview]
Message-ID: <sashiko-outbox-191228@kernel.org> (raw)
In-Reply-To: <20261029-work-fs-sb_rdonly-v2-9-2f44f64f0b66@kernel.org>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] exfat: __exfat_truncate() and exfat_evict_inode() modify fs in emergency RO
--
commit 17c10ac04b3dad50bb870e977d92e72ea9d3bcfd
Author: Christian Brauner <brauner@kernel.org>
exfat: don't set SB_RDONLY after filesystem errors
This commit introduces EXFAT_FLAGS_EMERGENCY_RO and exfat_emergency_state() so
that filesystem errors after mount mark the filesystem emergency read-only
rather than setting SB_RDONLY without holding s_umount.
> diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c
> index 5129df1e79b44..3f24e5bd3eb11 100644
> --- a/fs/exfat/inode.c
> +++ b/fs/exfat/inode.c
> @@ -114,8 +114,9 @@ int exfat_write_inode(struct inode *inode, struct writeback_control *wbc)
> {
> int ret;
>
> - if (unlikely(exfat_forced_shutdown(inode->i_sb)))
> - return -EIO;
> + ret = exfat_emergency_state(inode->i_sb);
> + if (unlikely(ret))
> + return ret;
>
> mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
> ret = __exfat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
[Severity: High]
Should __exfat_truncate() or exfat_evict_inode() also check
exfat_emergency_state()?
When an unlinked file is closed (or during unmount) after a filesystem error
sets EXFAT_FLAGS_EMERGENCY_RO (or SB_STATE_EMERGENCY_RO in the follow-up
commit "exfat: use the generic emergency read-only state"),
exfat_evict_inode() calls __exfat_truncate():
fs/exfat/inode.c:exfat_evict_inode() {
truncate_inode_pages_final(&inode->i_data);
if (!inode->i_nlink) {
i_size_write(inode, 0);
mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
__exfat_truncate(inode);
mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
}
...
}
Similarly, if a write in exfat_file_write_iter() encounters a corrupted FAT
chain or cluster error that sets EXFAT_FLAGS_EMERGENCY_RO via
exfat_fs_error(), the error unwind in exfat_extend_valid_size() or
exfat_write_failed() calls exfat_truncate() -> __exfat_truncate().
Because __exfat_truncate() in fs/exfat/file.c calls __exfat_write_inode()
directly rather than exfat_write_inode(), it bypasses the
exfat_emergency_state() check above:
fs/exfat/file.c:__exfat_truncate() {
...
if (__exfat_write_inode(inode, inode_needs_sync(inode)))
return -EIO;
/* cut off from the FAT chain */
if (ei->flags == ALLOC_FAT_CHAIN && last_clu != EXFAT_FREE_CLUSTER &&
last_clu != EXFAT_EOF_CLUSTER) {
if (exfat_ent_set(sb, last_clu, EXFAT_EOF_CLUSTER))
return -EIO;
}
...
/* free the clusters */
if (exfat_free_cluster(inode, &clu))
return -EIO;
...
}
This modifies directory entries, FAT entries, and allocation bitmap buffers via
exfat_free_cluster() -> __exfat_free_cluster() -> exfat_clear_bitmap() (which
also writes synchronously when IS_DIRSYNC(inode) is set), and if mounted with
discard (which __exfat_fs_error() does not clear, unlike
exfat_force_shutdown()), issues block device discard requests via
exfat_discard_cluster() while walking a potentially corrupted cluster chain.
Furthermore, because SB_RDONLY is no longer set on error, sync_filesystem() no
longer returns early at sb_rdonly(sb) and flushes those dirtied metadata
buffers to disk.
Can __exfat_truncate() and/or exfat_evict_inode() check
exfat_emergency_state() to prevent metadata modifications and discards after
the filesystem enters emergency read-only state?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261029-work-fs-sb_rdonly-v2-0-2f44f64f0b66@kernel.org?part=9
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
WARNING: multiple messages have this Message-ID (diff)
From: sashiko-bot@kernel.org
To: "Christian Brauner" <brauner@kernel.org>, "Jan Kara" <jack@suse.com>
Cc: "Al Viro" <viro@zeniv.linux.org.uk>,
linux-ext4@vger.kernel.org, linux-mm@kvack.org,
linux-efi@vger.kernel.org, linux-mtd@lists.infradead.org,
dsterba@suse.cz, tytso@mit.edu, "Mark Fasheh" <mark@fasheh.com>,
"Joel Becker" <jlbec@evilplan.org>,
"Joseph Qi" <joseph.qi@linux.alibaba.com>
Subject: Re: [PATCH v2 09/34] exfat: don't set SB_RDONLY after filesystem errors
Date: Fri, 30 Oct 2026 16:09:55 +0000 [thread overview]
Message-ID: <sashiko-outbox-191228@kernel.org> (raw)
In-Reply-To: <20261029-work-fs-sb_rdonly-v2-9-2f44f64f0b66@kernel.org>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] exfat: __exfat_truncate() and exfat_evict_inode() modify fs in emergency RO
--
commit 17c10ac04b3dad50bb870e977d92e72ea9d3bcfd
Author: Christian Brauner <brauner@kernel.org>
exfat: don't set SB_RDONLY after filesystem errors
This commit introduces EXFAT_FLAGS_EMERGENCY_RO and exfat_emergency_state() so
that filesystem errors after mount mark the filesystem emergency read-only
rather than setting SB_RDONLY without holding s_umount.
> diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c
> index 5129df1e79b44..3f24e5bd3eb11 100644
> --- a/fs/exfat/inode.c
> +++ b/fs/exfat/inode.c
> @@ -114,8 +114,9 @@ int exfat_write_inode(struct inode *inode, struct writeback_control *wbc)
> {
> int ret;
>
> - if (unlikely(exfat_forced_shutdown(inode->i_sb)))
> - return -EIO;
> + ret = exfat_emergency_state(inode->i_sb);
> + if (unlikely(ret))
> + return ret;
>
> mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
> ret = __exfat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
[Severity: High]
Should __exfat_truncate() or exfat_evict_inode() also check
exfat_emergency_state()?
When an unlinked file is closed (or during unmount) after a filesystem error
sets EXFAT_FLAGS_EMERGENCY_RO (or SB_STATE_EMERGENCY_RO in the follow-up
commit "exfat: use the generic emergency read-only state"),
exfat_evict_inode() calls __exfat_truncate():
fs/exfat/inode.c:exfat_evict_inode() {
truncate_inode_pages_final(&inode->i_data);
if (!inode->i_nlink) {
i_size_write(inode, 0);
mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
__exfat_truncate(inode);
mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
}
...
}
Similarly, if a write in exfat_file_write_iter() encounters a corrupted FAT
chain or cluster error that sets EXFAT_FLAGS_EMERGENCY_RO via
exfat_fs_error(), the error unwind in exfat_extend_valid_size() or
exfat_write_failed() calls exfat_truncate() -> __exfat_truncate().
Because __exfat_truncate() in fs/exfat/file.c calls __exfat_write_inode()
directly rather than exfat_write_inode(), it bypasses the
exfat_emergency_state() check above:
fs/exfat/file.c:__exfat_truncate() {
...
if (__exfat_write_inode(inode, inode_needs_sync(inode)))
return -EIO;
/* cut off from the FAT chain */
if (ei->flags == ALLOC_FAT_CHAIN && last_clu != EXFAT_FREE_CLUSTER &&
last_clu != EXFAT_EOF_CLUSTER) {
if (exfat_ent_set(sb, last_clu, EXFAT_EOF_CLUSTER))
return -EIO;
}
...
/* free the clusters */
if (exfat_free_cluster(inode, &clu))
return -EIO;
...
}
This modifies directory entries, FAT entries, and allocation bitmap buffers via
exfat_free_cluster() -> __exfat_free_cluster() -> exfat_clear_bitmap() (which
also writes synchronously when IS_DIRSYNC(inode) is set), and if mounted with
discard (which __exfat_fs_error() does not clear, unlike
exfat_force_shutdown()), issues block device discard requests via
exfat_discard_cluster() while walking a potentially corrupted cluster chain.
Furthermore, because SB_RDONLY is no longer set on error, sync_filesystem() no
longer returns early at sb_rdonly(sb) and flushes those dirtied metadata
buffers to disk.
Can __exfat_truncate() and/or exfat_evict_inode() check
exfat_emergency_state() to prevent metadata modifications and discards after
the filesystem enters emergency read-only state?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261029-work-fs-sb_rdonly-v2-0-2f44f64f0b66@kernel.org?part=9
next prev parent reply other threads:[~2026-10-30 16:09 UTC|newest]
Thread overview: 121+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 16:06 [PATCH v2 00/34] fs: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-29 16:06 ` [PATCH v2 01/34] ecryptfs: don't leak the inode when a lookup can't open the lower file Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 02/34] ecryptfs: fall back to a read-only " Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 03/34] fs: add a generic emergency read-only state Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 04/34] ext2: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 05/34] jfs: " Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 06/34] nilfs2: " Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 07/34] fat: " Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:06 ` [PATCH v2 08/34] exfat: keep the current mount options on remount Christian Brauner
2026-10-29 16:06 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 09/34] exfat: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot [this message]
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 10/34] exfat: use the generic emergency read-only state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 11/34] hfs: don't set SB_RDONLY after MDB write errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 12/34] hfs: use the generic emergency read-only state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 13/34] hfsplus: don't set SB_RDONLY when creating the attributes tree Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:09 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 14/34] affs: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 15/34] ufs: " Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 16/34] hpfs: " Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 17/34] ntfs: " Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 18/34] ntfs: use the generic emergency read-only state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 19/34] ocfs2: keep the current mount options on remount Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 2:58 ` Joseph Qi
2026-10-30 2:58 ` Joseph Qi
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 20/34] ocfs2: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 3:01 ` Joseph Qi
2026-10-30 3:01 ` Joseph Qi
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 21/34] zonefs: don't set SB_RDONLY after I/O errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 22/34] zonefs: use the generic emergency read-only state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 23/34] btrfs: check BTRFS_FS_STATE_RO instead of SB_RDONLY at runtime Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 24/34] btrfs: don't set SB_RDONLY after filesystem errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 25/34] gfs2: wait for a pending withdraw before remounting read-only Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 26/34] gfs2: don't set SB_RDONLY on withdraw Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 27/34] efivarfs: stop using SB_RDONLY for read-only efivar ops Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 28/34] ubifs: don't set SB_RDONLY after errors Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 3:42 ` Zhihao Cheng
2026-10-30 3:42 ` Zhihao Cheng
2026-10-30 16:10 ` sashiko-bot
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 29/34] selftests/filesystems: test filesystem errors while frozen Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 30/34] ext4: allow remounting read-only in the emergency state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 31/34] ext4: use the generic emergency read-only state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 32/34] selftests/filesystems: test ext4 remounts in the emergency state Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 33/34] xfs: allow remounting read-only after a shutdown Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
2026-10-29 16:07 ` [PATCH v2 34/34] selftests/filesystems: test xfs remounts " Christian Brauner
2026-10-29 16:07 ` Christian Brauner
2026-10-30 16:10 ` sashiko-bot
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-191228@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=brauner@kernel.org \
--cc=dsterba@suse.cz \
--cc=jack@suse.com \
--cc=jlbec@evilplan.org \
--cc=joseph.qi@linux.alibaba.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-mtd@lists.infradead.org \
--cc=mark@fasheh.com \
--cc=sashiko-reviews@lists.linux.dev \
--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 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.