Backup FATs were sometimes marked dirty by copying their first block

from the primary FAT, and then they were not marked clean on unmount.
Force marking them clean when appropriate.

Submitted by:	bde
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2013-02-01 18:25:53 +00:00
parent 9ec062dddd
commit 79fb7dd167
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=246218

View File

@ -321,8 +321,8 @@ updatefats(pmp, bp, fatbn)
struct buf *bp;
u_long fatbn;
{
int i;
struct buf *bpn;
int cleanfat, i;
#ifdef MSDOSFS_DEBUG
printf("updatefats(pmp %p, bp %p, fatbn %lu)\n", pmp, bp, fatbn);
@ -362,12 +362,23 @@ updatefats(pmp, bp, fatbn)
* filesystem was mounted. If synch is asked for then use
* bwrite()'s and really slow things down.
*/
if (fatbn != pmp->pm_fatblk || FAT12(pmp))
cleanfat = 0;
else if (FAT16(pmp))
cleanfat = 16;
else
cleanfat = 32;
for (i = 1; i < pmp->pm_FATs; i++) {
fatbn += pmp->pm_FATsecs;
/* getblk() never fails */
bpn = getblk(pmp->pm_devvp, fatbn, bp->b_bcount,
0, 0, 0);
bcopy(bp->b_data, bpn->b_data, bp->b_bcount);
/* Force the clean bit on in the other copies. */
if (cleanfat == 16)
((u_int8_t *)bpn->b_data)[3] |= 0x80;
else if (cleanfat == 32)
((u_int8_t *)bpn->b_data)[7] |= 0x08;
if (pmp->pm_flags & MSDOSFSMNT_WAITONFAT)
bwrite(bpn);
else