summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs/msdosfs_vfsops.c
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2013-02-24 16:50:53 +0000
committerattilio <attilio@FreeBSD.org>2013-02-24 16:50:53 +0000
commitcff31deb1a197b29ab976c135fdd01dfb6951a6a (patch)
treedbdcb15ce3419e48e823390b612d613ff00bd567 /sys/fs/msdosfs/msdosfs_vfsops.c
parentb4e24f9126f7a4c80ce0c44f6b4230021089bc1e (diff)
parent084e5da56e3c4bc6f9c6ed314310a9b8af2c695b (diff)
downloadFreeBSD-src-cff31deb1a197b29ab976c135fdd01dfb6951a6a.zip
FreeBSD-src-cff31deb1a197b29ab976c135fdd01dfb6951a6a.tar.gz
MFC
Diffstat (limited to 'sys/fs/msdosfs/msdosfs_vfsops.c')
-rw-r--r--sys/fs/msdosfs/msdosfs_vfsops.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index a209970..213dd00 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -896,6 +896,40 @@ msdosfs_statfs(struct mount *mp, struct statfs *sbp)
return (0);
}
+/*
+ * If we have an FSInfo block, update it.
+ */
+static int
+msdosfs_fsiflush(struct msdosfsmount *pmp, int waitfor)
+{
+ struct fsinfo *fp;
+ struct buf *bp;
+ int error;
+
+ MSDOSFS_LOCK_MP(pmp);
+ if (pmp->pm_fsinfo == 0 || (pmp->pm_flags & MSDOSFS_FSIMOD) == 0) {
+ error = 0;
+ goto unlock;
+ }
+ error = bread(pmp->pm_devvp, pmp->pm_fsinfo, pmp->pm_BytesPerSec,
+ NOCRED, &bp);
+ if (error != 0) {
+ brelse(bp);
+ goto unlock;
+ }
+ fp = (struct fsinfo *)bp->b_data;
+ putulong(fp->fsinfree, pmp->pm_freeclustercount);
+ putulong(fp->fsinxtfree, pmp->pm_nxtfree);
+ pmp->pm_flags &= ~MSDOSFS_FSIMOD;
+ if (waitfor == MNT_WAIT)
+ error = bwrite(bp);
+ else
+ bawrite(bp);
+unlock:
+ MSDOSFS_UNLOCK_MP(pmp);
+ return (error);
+}
+
static int
msdosfs_sync(struct mount *mp, int waitfor)
{
@@ -958,6 +992,10 @@ loop:
allerror = error;
VOP_UNLOCK(pmp->pm_devvp, 0);
}
+
+ error = msdosfs_fsiflush(pmp, waitfor);
+ if (error != 0)
+ allerror = error;
return (allerror);
}
OpenPOWER on IntegriCloud