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(-)
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(-)
--
2.25.1
This patch set looks good to me. For whole series: Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com> 2026년 9월 15일 (화) 오후 5:33, Hongling Zeng <zenghongling@kylinos.cn>님이 작성: > > 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(-) > > -- > 2.25.1 > -- Thanks, Hyunchul
On Tue, Sep 15, 2026 at 5:33 PM Hongling Zeng <zenghongling@kylinos.cn> wrote: > > 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 Applied them to #ntfs-next. Thanks!
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@kylinos.cn> 在 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(-) >
© 2016 - 2026 Red Hat, Inc.