summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs/msdosfs_vfsops.c
diff options
context:
space:
mode:
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