From 392d6f9af15fd96a5c6d24f7cf5e1ef66b03c343 Mon Sep 17 00:00:00 2001 From: yamt Date: Tue, 20 Apr 2004 11:51:28 +0000 Subject: [PATCH] nfs_inactive: inactive the vp before doing sillyrename works. vp can be reclaimed soon after it's unlocked. --- sys/nfs/nfs_node.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/sys/nfs/nfs_node.c b/sys/nfs/nfs_node.c index 1d228e4e9f24..6e7d6c469050 100644 --- a/sys/nfs/nfs_node.c +++ b/sys/nfs/nfs_node.c @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_node.c,v 1.75 2004/04/05 10:44:09 yamt Exp $ */ +/* $NetBSD: nfs_node.c,v 1.76 2004/04/20 11:51:28 yamt Exp $ */ /* * Copyright (c) 1989, 1993 @@ -35,7 +35,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: nfs_node.c,v 1.75 2004/04/05 10:44:09 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_node.c,v 1.76 2004/04/20 11:51:28 yamt Exp $"); #include "opt_nfs.h" @@ -250,7 +250,20 @@ nfs_inactive(v) removed = (np->n_flag & NREMOVED) != 0; np->n_flag &= (NMODIFIED | NFLUSHINPROG | NFLUSHWANT | NQNFSEVICTED | NQNFSNONCACHE | NQNFSWRITE); + + if ((nmp->nm_flag & NFSMNT_NQNFS) && CIRCLEQ_NEXT(np, n_timer) != 0) { + CIRCLEQ_REMOVE(&nmp->nm_timerhead, np, n_timer); + } + + if (vp->v_type == VDIR && np->n_dircache) + nfs_invaldircache(vp, 1); + VOP_UNLOCK(vp, 0); + + /* XXXMP only kernel_lock protects vp */ + if (removed) + vrecycle(vp, NULL, p); + if (sp != NULL) { /* @@ -271,16 +284,6 @@ nfs_inactive(v) FREE(sp, M_NFSREQ); } - if ((nmp->nm_flag & NFSMNT_NQNFS) && CIRCLEQ_NEXT(np, n_timer) != 0) { - CIRCLEQ_REMOVE(&nmp->nm_timerhead, np, n_timer); - } - - if (vp->v_type == VDIR && np->n_dircache) - nfs_invaldircache(vp, 1); - - if (removed) - vrecycle(vp, NULL, p); - return (0); }