summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>1998-06-10 18:13:19 +0000
committerjulian <julian@FreeBSD.org>1998-06-10 18:13:19 +0000
commitacd840b15c2055a6ec2f6e8c95159e9360e554bc (patch)
tree44ce87cce22500224d8d9f104861b86ebe31d85d /sys
parentc2048619cdc89757121c64a03972215f34758b5c (diff)
downloadFreeBSD-src-acd840b15c2055a6ec2f6e8c95159e9360e554bc.zip
FreeBSD-src-acd840b15c2055a6ec2f6e8c95159e9360e554bc.tar.gz
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.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_export.c26
-rw-r--r--sys/kern/vfs_subr.c26
2 files changed, 36 insertions, 16 deletions
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index f4d947d..82786c8 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.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))
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index f4d947d..82786c8 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))
OpenPOWER on IntegriCloud