summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authortholo <tholo@openbsd.org>1996-11-05 03:30:12 +0000
committertholo <tholo@openbsd.org>1996-11-05 03:30:12 +0000
commit315d0bbea0114ef3bb8cf8f2e968272afcc2b118 (patch)
tree52ba37c1f185f519e8b2c74f858ad6020aa842f7 /sys
parents/games/game/ (diff)
downloadwireguard-openbsd-315d0bbea0114ef3bb8cf8f2e968272afcc2b118.tar.xz
wireguard-openbsd-315d0bbea0114ef3bb8cf8f2e968272afcc2b118.zip
Patch from Kirk McKusick:
The following change eliminates an unnecessary synchronous write from the filesystem. When freeing an indirect block, there is no need to write it (synchronously, no less!) before tossing it.
Diffstat (limited to 'sys')
-rw-r--r--sys/ufs/ffs/ffs_inode.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index 855966780a4..6c33e684cbc 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ffs_inode.c,v 1.3 1996/05/22 11:47:18 deraadt Exp $ */
+/* $OpenBSD: ffs_inode.c,v 1.4 1996/11/05 03:30:12 tholo Exp $ */
/* $NetBSD: ffs_inode.c,v 1.10 1996/05/11 18:27:19 mycroft Exp $ */
/*
@@ -459,16 +459,20 @@ ffs_indirtrunc(ip, lbn, dbn, lastbn, level, countp)
}
bap = (daddr_t *)bp->b_data;
- MALLOC(copy, daddr_t *, fs->fs_bsize, M_TEMP, M_WAITOK);
- bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->fs_bsize);
- bzero((caddr_t)&bap[last + 1],
- (u_int)(NINDIR(fs) - (last + 1)) * sizeof (daddr_t));
- if (last == -1)
- bp->b_flags |= B_INVAL;
- error = bwrite(bp);
- if (error)
- allerror = error;
- bap = copy;
+ if (lastbn != -1) {
+ MALLOC(copy, daddr_t *, fs->fs_bsize, M_TEMP, M_WAITOK);
+ bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->fs_bsize);
+ bzero((caddr_t)&bap[last + 1],
+ (u_int)(NINDIR(fs) - (last + 1)) * sizeof (daddr_t));
+ if ((vp->v_mount->mnt_flag & MNT_ASYNC) == 0) {
+ error = bwrite(bp);
+ if (error)
+ allerror = error;
+ } else {
+ bawrite(bp);
+ }
+ bap = copy;
+ }
/*
* Recursively free totally unused blocks.
@@ -504,7 +508,13 @@ ffs_indirtrunc(ip, lbn, dbn, lastbn, level, countp)
blocksreleased += blkcount;
}
}
- FREE(copy, M_TEMP);
+ if (lastbn != -1) {
+ FREE(copy, M_TEMP);
+ } else {
+ bp->b_flags |= B_INVAL;
+ brelse(bp);
+ }
+
*countp = blocksreleased;
return (allerror);
}