1
0
mirror of https://git.FreeBSD.org/src.git synced 2026-06-02 11:24:32 +00:00

fsck_msdosfs: fix FAT header correction not persisting in cache mode

When fsck_msdosfs runs with FAT32 cache mode (used for large
filesystems that cannot be mmap'd), a detected FAT header correction
was written into the in-memory buffer but the corresponding cache
entry (fat32_cache_allentries[0]) was never marked dirty.  As a
result, fat_flush_fat32_cache_entry() skipped it, the corrected
bytes were never written to disk, and copyfat() propagated the
uncorrected on-disk data to all backup FAT copies.  Every subsequent
fsck run would repeat the same "FAT starts with odd byte sequence /
FIXED" cycle indefinitely.

Fix by marking fat32_cache_allentries[0].dirty = true after applying
the in-memory correction, ensuring the chunk is flushed before
copyfat() runs.

Obtained from:	https://android-review.googlesource.com/c/platform/external/fsck_msdos/+/4047981
MFC after:	3 days
This commit is contained in:
Lianwei Wang
2026-05-08 21:56:12 -07:00
committed by Xin LI
parent 1bef5535c1
commit 10e342c1ec
+11
View File
@@ -927,6 +927,17 @@ readfat(int fs, struct bootblock *boot, struct fat_descriptor **fp)
default:
break;
}
/*
* In cache mode the header lives in
* fat32_cache_allentries[0]. Mark it
* dirty so it is flushed to disk (either
* on eviction or in writefat()) before
* copyfat() copies the primary FAT to
* backup copies.
*/
if (fat->use_cache)
fat->fat32_cache_allentries[0].dirty =
true;
}
}
}