Author: kib
Date: Fri Feb  1 18:25:53 2013
New Revision: 246218
URL: http://svnweb.freebsd.org/changeset/base/246218

Log:
  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

Modified:
  head/sys/fs/msdosfs/msdosfs_fat.c

Modified: head/sys/fs/msdosfs/msdosfs_fat.c
==============================================================================
--- head/sys/fs/msdosfs/msdosfs_fat.c   Fri Feb  1 18:06:06 2013        
(r246217)
+++ head/sys/fs/msdosfs/msdosfs_fat.c   Fri Feb  1 18:25:53 2013        
(r246218)
@@ -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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to