summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs/ffs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ufs/ffs/ffs_vnops.c')
-rw-r--r--sys/ufs/ffs/ffs_vnops.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index 341b811..d3b68b7 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vnops.c 8.15 (Berkeley) 5/14/95
- * $Id: ffs_vnops.c,v 1.36 1997/10/16 20:32:35 phk Exp $
+ * $Id: ffs_vnops.c,v 1.37 1997/10/27 13:33:45 bde Exp $
*/
#include <sys/param.h>
@@ -124,6 +124,16 @@ ffs_fsync(ap)
struct buf *nbp;
int pass;
int s;
+ daddr_t lbn;
+
+
+ if (vp->v_type == VBLK) {
+ lbn = INT_MAX;
+ } else {
+ struct inode *ip;
+ ip = VTOI(vp);
+ lbn = lblkno(ip->i_fs, (ip->i_size + ip->i_fs->fs_bsize - 1));
+ }
pass = 0;
/*
@@ -133,24 +143,40 @@ loop:
s = splbio();
for (bp = vp->v_dirtyblkhd.lh_first; bp; bp = nbp) {
nbp = bp->b_vnbufs.le_next;
- if ((bp->b_flags & B_BUSY) || (pass == 0 && (bp->b_blkno < 0)))
+ if ((bp->b_flags & B_BUSY) || (pass == 0 && (bp->b_lblkno < 0)))
continue;
if ((bp->b_flags & B_DELWRI) == 0)
panic("ffs_fsync: not dirty");
- if (bp->b_vp != vp || ap->a_waitfor != MNT_NOWAIT) {
+ if (((bp->b_vp != vp) || (ap->a_waitfor != MNT_NOWAIT)) ||
+ ((vp->v_type != VREG) && (vp->v_type != VBLK))) {
bremfree(bp);
bp->b_flags |= B_BUSY;
splx(s);
+
/*
* Wait for I/O associated with indirect blocks to complete,
* since there is no way to quickly wait for them below.
*/
- if (bp->b_vp == vp || ap->a_waitfor == MNT_NOWAIT)
- (void) bawrite(bp);
- else
+ if ((bp->b_vp == vp) && (ap->a_waitfor == MNT_NOWAIT)) {
+ if (bp->b_flags & B_CLUSTEROK) {
+ bdwrite(bp);
+ (void) vfs_bio_awrite(bp);
+ } else {
+ (void) bawrite(bp);
+ }
+ } else {
(void) bwrite(bp);
+ }
+
+ } else if ((vp->v_type == VREG) && (bp->b_lblkno >= lbn)) {
+
+ bremfree(bp);
+ bp->b_flags |= B_BUSY | B_INVAL | B_NOCACHE;
+ brelse(bp);
+ splx(s);
+
} else {
vfs_bio_awrite(bp);
splx(s);
@@ -182,4 +208,3 @@ loop:
gettime(&tv);
return (UFS_UPDATE(ap->a_vp, &tv, &tv, ap->a_waitfor == MNT_WAIT));
}
-
OpenPOWER on IntegriCloud