Re: [PATCH v13 7/7] ntfs: fail remount on sync errors and keep the dirty bit on SB_FORCE
From: liubaolin
Date: Wed Sep 16 2026 - 17:46:12 EST
在 2026/9/15 16:32, Hongling Zeng 写道:
ntfs_reconfigure() currently ignores sync_filesystem() errors, allowing
a regular read-only remount to succeed even when dirty data was not
synced. Check the error and fail regular remounts, leaving the
superblock read-write so ntfs_put_super() can retry at unmount.
SB_FORCE does not wait for writers already in progress, so it must not
clear the on-disk dirty bit. Warn and continue on sync errors for
SB_FORCE. A forced remount updates the dirty state only when errors
have been recorded, and never clears the dirty bit. Skip the commit if
that state update fails, since the in-memory flags may be inconsistent.
Reported-by: Hyunchul Lee <hyc.lee@xxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Hongling Zeng <zenghongling@xxxxxxxxxx>
---
fs/ntfs/super.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
index 0228d7429596..82b5bf28b6ab 100644
--- a/fs/ntfs/super.c
+++ b/fs/ntfs/super.c
@@ -272,7 +272,13 @@ static int ntfs_reconfigure(struct fs_context *fc)
ntfs_debug("Entering with remount");
- sync_filesystem(sb);
+ err = sync_filesystem(sb);
+ if (err) {
+ ntfs_warning(sb, "Failed to sync the filesystem.");
+ /* A forced remount must still turn the superblock read-only. */
+ if (!(fc->sb_flags & SB_FORCE))
+ return err;
+ }
/*
* For the read-write compiled driver, if we are remounting read-write,
@@ -329,11 +335,20 @@ static int ntfs_reconfigure(struct fs_context *fc)
* or flush fails the remount, leaving the superblock
* read-write so ntfs_put_super() retries at unmount.
*/
- err = ntfs_sync_volume_dirty_state(vol);
- if (err) {
- ntfs_warning(sb,
- "Failed to update dirty bit in volume information flags. Run chkdsk.");
- return err;
+ /*
+ * A forced remount does not drain writers in progress,
+ * so one may still be modifying metadata when the flags
+ * are committed: never clear the dirty bit then; if
+ * errors have been recorded, the update preserves or
+ * sets it; otherwise, skip the update entirely.
+ */
+ if (!(fc->sb_flags & SB_FORCE) || NVolErrors(vol)) {
+ err = ntfs_sync_volume_dirty_state(vol);
+ if (err) {
+ ntfs_warning(sb,
+ "Failed to update dirty bit in volume information flags. Run chkdsk.");
+ return err;
+ }
}
if (NInoDirty(NTFS_I(vol->vol_ino))) {
/* ntfs_commit_inode() would discard the error. */
Looks good to me.
Reviewed-by: Baolin Liu <liubaolin@xxxxxxxxxx>