[PATCH v13 0/7] ntfs: fix volume flag races and persist the recorded error state

Hongling Zeng posted 7 patches 1 week, 2 days ago
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(-)
[PATCH v13 0/7] ntfs: fix volume flag races and persist the recorded error state
Posted by Hongling Zeng 1 week, 2 days ago
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
Re: [PATCH v13 0/7] ntfs: fix volume flag races and persist the recorded error state
Posted by Hyunchul Lee 1 week, 2 days ago
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
Re: [PATCH v13 0/7] ntfs: fix volume flag races and persist the recorded error state
Posted by Namjae Jeon 1 week, 1 day ago
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!
Re: [PATCH v13 0/7] ntfs: fix volume flag races and persist the recorded error state
Posted by liubaolin 1 week, 1 day ago
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(-)
>