Module Name: src Committed By: yamt Date: Thu May 14 15:42:22 UTC 2009
Modified Files: src/sys/nfs: nfs_subs.c Log Message: nfs_clearcommit: fix a race with vnode cleaning. To generate a diff of this commit: cvs rdiff -u -r1.216 -r1.217 src/sys/nfs/nfs_subs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/nfs/nfs_subs.c diff -u src/sys/nfs/nfs_subs.c:1.216 src/sys/nfs/nfs_subs.c:1.217 --- src/sys/nfs/nfs_subs.c:1.216 Sun Mar 15 17:20:10 2009 +++ src/sys/nfs/nfs_subs.c Thu May 14 15:42:22 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_subs.c,v 1.216 2009/03/15 17:20:10 cegger Exp $ */ +/* $NetBSD: nfs_subs.c,v 1.217 2009/05/14 15:42:22 yamt Exp $ */ /* * Copyright (c) 1989, 1993 @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_subs.c,v 1.216 2009/03/15 17:20:10 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_subs.c,v 1.217 2009/05/14 15:42:22 yamt Exp $"); #ifdef _KERNEL_OPT #include "fs_nfs.h" @@ -2192,16 +2192,20 @@ KASSERT(vp->v_mount == mp); if (vp->v_type != VREG) continue; + mutex_enter(&vp->v_interlock); + if (vp->v_iflag & (VI_XLOCK | VI_CLEAN)) { + mutex_exit(&vp->v_interlock); + continue; + } np = VTONFS(vp); np->n_pushlo = np->n_pushhi = np->n_pushedlo = np->n_pushedhi = 0; np->n_commitflags &= ~(NFS_COMMIT_PUSH_VALID | NFS_COMMIT_PUSHED_VALID); - mutex_enter(&vp->v_uobj.vmobjlock); TAILQ_FOREACH(pg, &vp->v_uobj.memq, listq.queue) { pg->flags &= ~PG_NEEDCOMMIT; } - mutex_exit(&vp->v_uobj.vmobjlock); + mutex_exit(&vp->v_interlock); } mutex_exit(&mntvnode_lock); mutex_enter(&nmp->nm_lock);