Re: [PATCH v13 0/7] ntfs: fix volume flag races and persist the recorded error state
From: liubaolin
Date: Wed Sep 16 2026 - 17:41:53 EST
After several rounds of review and Hongling's revisions, I think the series is now in good shape.
For the whole series:
Reviewed-by: Baolin Liu <liubaolin@xxxxxxxxxx>
在 2026/9/15 16:32, Hongling Zeng 写道:
Hi all,
The fs/ntfs runtime metadata-corruption paths only record the in-memory
NVolErrors() flag, and the dirty-bit persistence used to race with
ntfs_sync_fs(): a volume could end up with a clean on-disk dirty flag
despite modification or recorded corruption, so chkdsk would not run on
the next mount. This series fixes that.
1/6 makes the volume flag read-modify-write atomic under the
$Volume mrec_lock;
2/6 marks the volume dirty unconditionally on metadata changes,
dropping the racy caller-side checks in file.c and namei.c;
3/6 derives the on-disk dirty bit from the recorded error state at
the persistence points (sync_fs, remount-ro, put_super) and never
writes a hibernated volume;
4/6 persists the dirty state after the final put_super() commits so
late errors cannot unmount clean;
5/6 stops ntfs_sync_fs() from clearing VOLUME_IS_DIRTY: the clearing
moves to the quiescent transitions, a recorded error state is
still persisted at sync time, and sync now reports writeback and
flush errors instead of discarding them;
6/6 checks the dirty-state commit on remount and unmount.
7/7 ntfs: fail remount on sync errors and keep the dirty bit on
SB_FORCE
Changes in this revision, from the review:
- 5/6: with the clearing gone from the sync path, a recorded error
state is persisted without ever clearing the bit, and
sync_blockdev() and blkdev_issue_flush() are both called with the
first error returned.
- The IOCB_NOWAIT behavior and the per-operation $Volume mrec_lock
acquisition are outside the scope of this series. The series keeps
the unconditional ntfs_set_volume_flags() call to preserve the
ordering that marks the volume dirty before the metadata
modification; a RWF_NOWAIT write still blocks in the marking when
the volume looks clean, as it already did on the base. The
non-blocking and contended-lock handling (mutex_trylock, GFP_NOWAIT)
will be addressed in a separate follow-up patch.
Hongling Zeng (4):
ntfs: fix volume flag update races
ntfs: set the volume dirty bit unconditionally on metadata changes
ntfs: sync the volume dirty bit with the recorded error state
ntfs: persist the dirty state after the final put_super() commits
fs/ntfs/file.c | 20 ++---
fs/ntfs/namei.c | 24 ++----
fs/ntfs/ntfs.h | 1 -
fs/ntfs/super.c | 191 ++++++++++++++++++++++++++++++++++++-----------
fs/ntfs/volume.h | 4 +
5 files changed, 171 insertions(+), 69 deletions(-)