diff options
author | kib <kib@FreeBSD.org> | 2012-03-11 20:23:46 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2012-03-11 20:23:46 +0000 |
commit | 9d90ef6ecfb0387f18364671cde9bac62ecabd06 (patch) | |
tree | 1c0af46a7e2a665b32232a999aa1a132227ea553 /sys/ufs | |
parent | bb02147acb8d97c8e5463e1512889b6ba054092a (diff) | |
download | FreeBSD-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.c | 6 |
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; |