diff --git a/sys/ufs/lfs/lfs_balloc.c b/sys/ufs/lfs/lfs_balloc.c index df02ee1a84f7..ec3443d8eca8 100644 --- a/sys/ufs/lfs/lfs_balloc.c +++ b/sys/ufs/lfs/lfs_balloc.c @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_balloc.c,v 1.26 2000/11/17 19:14:41 perseant Exp $ */ +/* $NetBSD: lfs_balloc.c,v 1.27 2000/11/21 00:00:31 perseant Exp $ */ /*- * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc. @@ -413,7 +413,7 @@ lfs_fragextend(vp, osize, nsize, lbn, bpp) /* Adjust locked-list accounting */ if (((*bpp)->b_flags & (B_LOCKED | B_CALL)) == B_LOCKED) - locked_queue_bytes += btodb((*bpp)->b_bufsize - obufsize); + locked_queue_bytes += (*bpp)->b_bufsize - obufsize; bzero((char *)((*bpp)->b_data) + osize, (u_int)(nsize - osize)); diff --git a/sys/ufs/lfs/lfs_inode.c b/sys/ufs/lfs/lfs_inode.c index a9108f8f6ade..05a2d84caf9c 100644 --- a/sys/ufs/lfs/lfs_inode.c +++ b/sys/ufs/lfs/lfs_inode.c @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_inode.c,v 1.46 2000/11/17 19:14:41 perseant Exp $ */ +/* $NetBSD: lfs_inode.c,v 1.47 2000/11/21 00:00:31 perseant Exp $ */ /*- * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc. @@ -229,6 +229,7 @@ lfs_truncate(v) off_t osize; long lastseg; size_t bc; + int obufsize, odb; if (length < 0) return (EINVAL); @@ -332,6 +333,8 @@ lfs_truncate(v) lfs_reserve(fs, ovp, -fsbtodb(fs, 2 * NIADDR + 3)); return (error); } + obufsize = bp->b_bufsize; + odb = btodb(bp->b_bcount); oip->i_ffs_size = length; size = blksize(fs, oip, lbn); (void) uvm_vnp_uncache(ovp); @@ -339,6 +342,11 @@ lfs_truncate(v) memset((char *)bp->b_data + offset, 0, (u_int)(size - offset)); allocbuf(bp, size); + if (bp->b_flags & B_DELWRI) { + if ((bp->b_flags & (B_LOCKED | B_CALL)) == B_LOCKED) + locked_queue_bytes -= obufsize - bp->b_bufsize; + fs->lfs_avail += odb - btodb(size); + } (void) VOP_BWRITE(bp); } uvm_vnp_setsize(ovp, length); @@ -644,6 +652,11 @@ lfs_indirtrunc(struct inode *ip, ufs_daddr_t lbn, daddr_t dbn, if (copy != NULL) { FREE(copy, M_TEMP); } else { + if (bp->b_flags & B_DELWRI) { + LFS_UNLOCK_BUF(bp); + fs->lfs_avail += btodb(bp->b_bcount); + wakeup(&fs->lfs_avail); + } bp->b_flags |= B_INVAL; brelse(bp); } @@ -689,6 +702,7 @@ restart: if (bp->b_flags & B_DELWRI) { bp->b_flags &= ~B_DELWRI; fs->lfs_avail += btodb(bp->b_bcount); + wakeup(&fs->lfs_avail); } LFS_UNLOCK_BUF(bp); brelse(bp); @@ -712,6 +726,7 @@ restart: if (bp->b_flags & B_DELWRI) { bp->b_flags &= ~B_DELWRI; fs->lfs_avail += btodb(bp->b_bcount); + wakeup(&fs->lfs_avail); } LFS_UNLOCK_BUF(bp); brelse(bp);