aboutsummaryrefslogtreecommitdiff
path: root/sys/ufs/ffs/ffs_vnops.c
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>1999-06-18 05:49:46 +0000
committerKirk McKusick <mckusick@FreeBSD.org>1999-06-18 05:49:46 +0000
commit7481264c1ef3321c99a8a86e9b584d4fb8986e47 (patch)
tree1dad1a556171bd74309ccb1d7bcff465117a6707 /sys/ufs/ffs/ffs_vnops.c
parent7c903b3d7e60d0f12960410cdd5ec72b86959912 (diff)
downloadsrc-7481264c1ef3321c99a8a86e9b584d4fb8986e47.tar.gz
src-7481264c1ef3321c99a8a86e9b584d4fb8986e47.zip
On our final pass through ffs_fsync, do all I/O synchronously so that
we can find out if our flush is failing because of write errors. This change avoids a "flush failed" panic during unrecoverable disk errors.
Notes
Notes: svn path=/head/; revision=47995
Diffstat (limited to 'sys/ufs/ffs/ffs_vnops.c')
-rw-r--r--sys/ufs/ffs/ffs_vnops.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index 10ccfdef0fe2..97c96fcc5432 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vnops.c 8.15 (Berkeley) 5/14/95
- * $Id: ffs_vnops.c,v 1.55 1999/03/02 04:04:31 mckusick Exp $
+ * $Id: ffs_vnops.c,v 1.56 1999/05/14 01:26:05 mckusick Exp $
*/
#include <sys/param.h>
@@ -143,7 +143,7 @@ ffs_fsync(ap)
/*
* Flush all dirty buffers associated with a vnode.
*/
- passes = NIADDR;
+ passes = NIADDR + 1;
skipmeta = 0;
if (ap->a_waitfor == MNT_WAIT)
skipmeta = 1;
@@ -174,11 +174,11 @@ loop:
((vp->v_type != VREG) && (vp->v_type != VBLK))) {
/*
- * Wait for I/O associated with indirect blocks to
- * complete, since there is no way to quickly wait
- * for them below.
+ * On our final pass through, do all I/O synchronously
+ * so that we can find out if our flush is failing
+ * because of write errors.
*/
- if ((bp->b_vp == vp) || (ap->a_waitfor != MNT_WAIT)) {
+ if (passes > 0 || (ap->a_waitfor != MNT_WAIT)) {
if ((bp->b_flags & B_CLUSTEROK) &&
ap->a_waitfor != MNT_WAIT) {
(void) vfs_bio_awrite(bp);
@@ -193,7 +193,8 @@ loop:
bremfree(bp);
bp->b_flags |= B_BUSY;
splx(s);
- (void) bwrite(bp);
+ if ((error = bwrite(bp)) != 0)
+ return (error);
s = splbio();
}
} else if ((vp->v_type == VREG) && (bp->b_lblkno >= lbn)) {