From: sashiko-bot@kernel.org
To: "Christian Brauner" <brauner@kernel.org>
Cc: tytso@mit.edu, "Joel Becker" <jlbec@evilplan.org>,
"Mark Fasheh" <mark@fasheh.com>,
dsterba@suse.cz, "Joseph Qi" <joseph.qi@linux.alibaba.com>,
linux-ext4@vger.kernel.org
Subject: Re: [PATCH RFC 14/28] ntfs: don't set SB_RDONLY after filesystem errors
Date: Mon, 12 Oct 2026 10:45:12 +0000 [thread overview]
Message-ID: <sashiko-outbox-167983@kernel.org> (raw)
In-Reply-To: <20261012-work-fs-sb_rdonly-v1-14-60743a3dc326@kernel.org>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] vfs: ABBA deadlock between umount and thaw_super on frozen NTFS
--
commit dfc5fc432ef752d67cfa9b90f071205bebdf7f7a
Author: Christian Brauner <brauner@kernel.org>
ntfs: don't set SB_RDONLY after filesystem errors
This commit updates NTFS to handle errors by setting NV_EmergencyRO instead
of SB_RDONLY to avoid leaving s_writers locked after thawing. It introduces
an asynchronous work item to mark the volume dirty on disk and flushes/syncs
this work during unmount.
> diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
> index 4066bacabe377..12ad2ce938ba9 100644
> --- a/fs/ntfs/super.c
> +++ b/fs/ntfs/super.c
[ ... ]
> @@ -423,6 +446,29 @@ int ntfs_set_volume_flags(struct ntfs_volume *vol, __le16 flags)
> return ntfs_write_volume_flags(vol, vol->vol_flags | flags);
> }
>
> +/*
> + * ntfs_error_work - mark the volume dirty on disk after an error
> + * @work: the error_work of the ntfs volume
> + *
> + * VOLUME_IS_DIRTY makes chkdsk check the volume. It is set lazily on the first
> + * modification and ntfs_sync_fs() clears it again, so it may not be on disk
> + * when an error makes the volume read-only, and the inode writeback that would
> + * write it is refused from then on. __ntfs_write_inode() still writes $Volume
> + * in that state. This runs from a work item because ntfs_error() may be called
> + * with mft records locked. sb_start_intwrite() waits for a frozen volume to be
> + * thawed.
> + */
> +static void ntfs_error_work(struct work_struct *work)
> +{
> + struct ntfs_volume *vol = container_of(work, struct ntfs_volume,
> + error_work);
> +
> + sb_start_intwrite(vol->sb);
[Severity: High]
Could this cause an ABBA deadlock if an error occurs while the filesystem
is frozen?
If the filesystem is frozen via freeze_super(), the VFS holds a write lock
on sb->s_writers.rw_sem. The worker executing ntfs_error_work() blocks here
indefinitely waiting for a thaw operation to release that lock.
> + if (!ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY))
> + ntfs_commit_inode(vol->vol_ino);
> + sb_end_intwrite(vol->sb);
> +}
[ ... ]
> @@ -1716,6 +1762,15 @@ static void ntfs_put_super(struct super_block *sb)
>
> cancel_work_sync(&vol->precalc_work);
>
> + /*
> + * If an error made the volume read-only, make sure it is marked dirty
> + * even if the error work didn't get to run. The commit of $Volume
> + * below writes it.
> + */
> + disable_work_sync(&vol->error_work);
[Severity: High]
Does this sequence lead to an unresolvable 3-way deadlock between the error
worker, umount, and thaw_super()?
If the error worker is blocked on sb_start_intwrite() as noted above, and
the user attempts to unmount the filesystem, deactivate_super() acquires
down_write(&sb->s_umount) before calling ntfs_put_super().
The disable_work_sync() call here will block forever waiting for the worker
to finish, keeping sb->s_umount held by the unmount process.
To recover the filesystem, the user must call thaw_super(), but that
requires acquiring down_write(&sb->s_umount), which is now stuck behind
the blocked unmount.
> + if (NVolEmergencyRO(vol))
> + ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY);
> +
> /*
> * Commit all inodes while they are still open in case some of them
> * cause others to be dirtied.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261012-work-fs-sb_rdonly-v1-0-60743a3dc326@kernel.org?part=14
next prev parent reply other threads:[~2026-10-12 10:45 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
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 [this message]
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-167983@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.