summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-03-11 20:23:46 +0000
committerkib <kib@FreeBSD.org>2012-03-11 20:23:46 +0000
commit9d90ef6ecfb0387f18364671cde9bac62ecabd06 (patch)
tree1c0af46a7e2a665b32232a999aa1a132227ea553 /sys/ufs
parentbb02147acb8d97c8e5463e1512889b6ba054092a (diff)
downloadFreeBSD-src-9d90ef6ecfb0387f18364671cde9bac62ecabd06.zip
FreeBSD-src-9d90ef6ecfb0387f18364671cde9bac62ecabd06.tar.gz
Do not fall back to slow synchronous i/o when low on memory or buffers.
The bawrite() schedules the write to happen immediately, and its use frees the current thread to do more cleanups. Submitted by: bde Reviewed by: mckusick Tested by: pho MFC after: 2 weeks
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_inode.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index 2667e31..8d6105d 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -133,9 +133,11 @@ ffs_update(vp, waitfor)
else
*((struct ufs2_dinode *)bp->b_data +
ino_to_fsbo(fs, ip->i_number)) = *ip->i_din2;
- if ((waitfor && !DOINGASYNC(vp)) ||
- (vm_page_count_severe() || buf_dirty_count_severe())) {
+ if ((waitfor && !DOINGASYNC(vp)))
error = bwrite(bp);
+ else if (vm_page_count_severe() || buf_dirty_count_severe()) {
+ bawrite(bp);
+ error = 0;
} else {
if (bp->b_bufsize == fs->fs_bsize)
bp->b_flags |= B_CLUSTEROK;
OpenPOWER on IntegriCloud