[PATCH] ntfs: do not mark the volume clean in sync_fs when errors were recorded

Dennis Tighe posted 1 patch 1 month ago
fs/ntfs/super.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH] ntfs: do not mark the volume clean in sync_fs when errors were recorded
Posted by Dennis Tighe 1 month ago
ntfs_put_super() and the remount-read-only path both clear the dirty bit
only when NVolErrors(vol) is false. ntfs_sync_fs() clears it
unconditionally, so any sync() on a volume that recorded an error marks
that volume clean. A volume without this set is then seen as not needing 
recovery and it does not run one, so whatever went wrong is never repaired.

This change skips resetting the dirty bit when there are volume errors.

Reproduced on a volume whose $MFTMirr does not match $MFT, which sets the
error flag while leaving the mount read-write: after a write and a sync,
the on-disk volume flags read 0x0000 with this driver and 0x0001 with the
guard in place.

Fixes: 6251f0b0de7d ("ntfs: update super block operations")
Assisted-by: claude:claude-opus-5
Signed-off-by: Dennis Tighe <dennis.tighe@gmail.com>
---
 fs/ntfs/super.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
index 30481e5d5dd4..a4dc64fb89ed 100644
--- a/fs/ntfs/super.c
+++ b/fs/ntfs/super.c
@@ -1862,7 +1862,8 @@ static int ntfs_sync_fs(struct super_block *sb, int wait)
 		return 0;
 
 	/* If there are some dirty buffers in the bdev inode */
-	if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) {
+	if (!NVolErrors(vol) &&
+	    ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) {
 		ntfs_warning(sb, "Failed to clear dirty bit in volume information flags.  Run chkdsk.");
 		err = -EIO;
 	}
-- 
2.43.0
Re: [PATCH] ntfs: do not mark the volume clean in sync_fs when errors were recorded
Posted by Namjae Jeon 1 month ago
On Mon, Aug 24, 2026 at 2:08 PM Dennis Tighe <dennis.tighe@gmail.com> wrote:
>
> ntfs_put_super() and the remount-read-only path both clear the dirty bit
> only when NVolErrors(vol) is false. ntfs_sync_fs() clears it
> unconditionally, so any sync() on a volume that recorded an error marks
> that volume clean. A volume without this set is then seen as not needing
> recovery and it does not run one, so whatever went wrong is never repaired.
>
> This change skips resetting the dirty bit when there are volume errors.
>
> Reproduced on a volume whose $MFTMirr does not match $MFT, which sets the
> error flag while leaving the mount read-write: after a write and a sync,
> the on-disk volume flags read 0x0000 with this driver and 0x0001 with the
> guard in place.
>
> Fixes: 6251f0b0de7d ("ntfs: update super block operations")
> Assisted-by: claude:claude-opus-5
> Signed-off-by: Dennis Tighe <dennis.tighe@gmail.com>
Applied it to #ntfs-next.
Thanks!
Re: [PATCH] ntfs: do not mark the volume clean in sync_fs when errors were recorded
Posted by Hyunchul Lee 1 month ago
2026년 8월 24일 (월) 오후 2:08, Dennis Tighe <dennis.tighe@gmail.com>님이 작성:
>
> ntfs_put_super() and the remount-read-only path both clear the dirty bit
> only when NVolErrors(vol) is false. ntfs_sync_fs() clears it
> unconditionally, so any sync() on a volume that recorded an error marks
> that volume clean. A volume without this set is then seen as not needing
> recovery and it does not run one, so whatever went wrong is never repaired.
>
> This change skips resetting the dirty bit when there are volume errors.
>
> Reproduced on a volume whose $MFTMirr does not match $MFT, which sets the
> error flag while leaving the mount read-write: after a write and a sync,
> the on-disk volume flags read 0x0000 with this driver and 0x0001 with the
> guard in place.
>
> Fixes: 6251f0b0de7d ("ntfs: update super block operations")
> Assisted-by: claude:claude-opus-5
> Signed-off-by: Dennis Tighe <dennis.tighe@gmail.com>

Looks good to me.

Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>

> ---
>  fs/ntfs/super.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
> index 30481e5d5dd4..a4dc64fb89ed 100644
> --- a/fs/ntfs/super.c
> +++ b/fs/ntfs/super.c
> @@ -1862,7 +1862,8 @@ static int ntfs_sync_fs(struct super_block *sb, int wait)
>                 return 0;
>
>         /* If there are some dirty buffers in the bdev inode */
> -       if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) {
> +       if (!NVolErrors(vol) &&
> +           ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) {
>                 ntfs_warning(sb, "Failed to clear dirty bit in volume information flags.  Run chkdsk.");
>                 err = -EIO;
>         }
> --
> 2.43.0
>


-- 
Thanks,
Hyunchul