]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ntfs: restore $MFT mirror contents check
authorDaeMyung Kang <charsyam@gmail.com>
Sun, 10 May 2026 17:11:14 +0000 (02:11 +0900)
committerNamjae Jeon <linkinjeon@kernel.org>
Mon, 11 May 2026 14:30:48 +0000 (23:30 +0900)
check_mft_mirror() still computes the number of bytes to validate in each
mirrored MFT record, but the actual comparison against $MFTMirr was dropped
when the superblock code was updated.

As a result, mount misses a stale or inconsistent $MFTMirr as long as both
records pass the structural baad-record checks. Restore the comparison and
log an error when the primary $MFT record differs from its mirror copy.

Returning false lets the existing mount error handling mark the volume as
having NTFS errors and, with on_errors=remount-ro, continue read-only. The
default on_errors=continue mount policy still allows the mount to proceed.

Fixes: 6251f0b0de7d ("ntfs: update super block operations")
Signed-off-by: DaeMyung Kang <charsyam@gmail.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/ntfs/super.c

index d282cf6e712e7762cab3ed787b47173eb8cab6de..9e321cc2febe7d6ccdbce34c4817655b968e2195 100644 (file)
@@ -993,6 +993,13 @@ mft_unmap_out:
                            ntfs_is_baad_recordp((__le32 *)kmirr))
                                bytes = vol->mft_record_size;
                }
+               /* Compare the two records. */
+               if (memcmp(kmft, kmirr, bytes)) {
+                       ntfs_error(sb,
+                                  "$MFT and $MFTMirr record %i do not match.  Run chkdsk.",
+                                  i);
+                       goto mm_unmap_out;
+               }
                kmft += vol->mft_record_size;
                kmirr += vol->mft_record_size;
        } while (++i < vol->mftmirr_size);