From 64f5a574a771534c3261bf49fbe380a501fd492d Mon Sep 17 00:00:00 2001 From: mycroft Date: Tue, 30 May 2000 17:23:52 +0000 Subject: [PATCH] In ffs_update(): * Move the clearing of IN_MODIFIED and IN_ACCESSED later, so they are not cleared if the bread() failed. * Explicitly set waitfor to 0 in the softdep case, if IN_MODIFIED is not set (mirroring the bwrite()/bdwrite() decision). --- sys/ufs/ffs/ffs_inode.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c index 55513d5157e2..97f5db0fee6f 100644 --- a/sys/ufs/ffs/ffs_inode.c +++ b/sys/ufs/ffs/ffs_inode.c @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_inode.c,v 1.34 2000/05/29 18:04:30 mycroft Exp $ */ +/* $NetBSD: ffs_inode.c,v 1.35 2000/05/30 17:23:52 mycroft Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -107,12 +107,15 @@ ffs_update(v) flags = ip->i_flag & (IN_MODIFIED | IN_ACCESSED); if (flags == 0) return (0); - ip->i_flag &= ~flags; fs = ip->i_fs; - waitfor = ap->a_flags & UPDATE_WAIT; - if ((ap->a_flags & UPDATE_DIROP) && !DOINGSOFTDEP(ap->a_vp)) - waitfor |= UPDATE_WAIT; + if ((flags & IN_MODIFIED) != 0 && + (ap->a_vp->v_mount->mnt_flag & MNT_ASYNC) == 0) { + waitfor = ap->a_flags & UPDATE_WAIT; + if ((ap->a_flags & UPDATE_DIROP) && !DOINGSOFTDEP(ap->a_vp)) + waitfor |= UPDATE_WAIT; + } else + waitfor = 0; /* * Ensure that uid and gid are correct. This is a temporary @@ -129,6 +132,7 @@ ffs_update(v) brelse(bp); return (error); } + ip->i_flag &= ~(IN_MODIFIED | IN_ACCESSED); if (DOINGSOFTDEP(ap->a_vp)) softdep_update_inodeblock(ip, bp, waitfor); else if (ip->i_ffs_effnlink != ip->i_ffs_nlink) @@ -141,8 +145,7 @@ ffs_update(v) else #endif memcpy(cp, &ip->i_din.ffs_din, DINODE_SIZE); - if (waitfor && (flags & IN_MODIFIED) != 0 && - (ap->a_vp->v_mount->mnt_flag & MNT_ASYNC) == 0) { + if (waitfor) { return (bwrite(bp)); } else { bdwrite(bp);