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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user