aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorJulian Elischer <julian@FreeBSD.org>1998-06-10 18:13:19 +0000
committerJulian Elischer <julian@FreeBSD.org>1998-06-10 18:13:19 +0000
commit28913ebe4e0f0742e69450735e06e692a4b84ffc (patch)
tree18021b08759b878653c0aa608fda0862baf9b14f /sys/kern/vfs_subr.c
parentdd08c7e27d2b1159afa8750fe6ebd94a668a4b06 (diff)
downloadsrc-28913ebe4e0f0742e69450735e06e692a4b84ffc.tar.gz
src-28913ebe4e0f0742e69450735e06e692a4b84ffc.zip
Submitted by: Kirk McKusick <mckusick@McKusick.COM>
Fix for potential hang when trying to reboot the system or to forcibly unmount a soft update enabled filesystem. FreeBSD already handled the reboot case differently, this is however a better fix.
Notes
Notes: svn path=/head/; revision=36862
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index f4d947d05156..82786c838b8e 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95
- * $Id: vfs_subr.c,v 1.153 1998/05/17 19:38:55 tegge Exp $
+ * $Id: vfs_subr.c,v 1.154 1998/06/07 17:11:46 dfr Exp $
*/
/*
@@ -580,13 +580,23 @@ vinvalbuf(vp, flags, cred, p, slpflag, slptimeo)
int s, error;
vm_object_t object;
- if ((flags & V_SAVE) && vp->v_dirtyblkhd.lh_first != NULL) {
- if ((error = VOP_FSYNC(vp, cred, MNT_WAIT, p)))
- return (error);
- if (vp->v_dirtyblkhd.lh_first != NULL)
- panic("vinvalbuf: dirty bufs");
- }
-
+ if (flags & V_SAVE) {
+ s = splbio();
+ while (vp->v_numoutput) {
+ vp->v_flag |= VBWAIT;
+ sleep((caddr_t)&vp->v_numoutput, PRIBIO + 1);
+ }
+ if (vp->v_dirtyblkhd.lh_first != NULL) {
+ splx(s);
+ if ((error = VOP_FSYNC(vp, cred, MNT_WAIT, p)) != 0)
+ return (error);
+ s = splbio();
+ if (vp->v_numoutput > 0 ||
+ vp->v_dirtyblkhd.lh_first != NULL)
+ panic("vinvalbuf: dirty bufs");
+ }
+ splx(s);
+ }
s = splbio();
for (;;) {
if ((blist = vp->v_cleanblkhd.lh_first) && (flags & V_SAVEMETA))