Module Name: src Committed By: hannken Date: Sat Jul 5 09:33:41 UTC 2014
Modified Files: src/sys/nfs: nfs_vnops.c Log Message: Use vcache_rekey_* for nfs_lookitup() in the "*npp != NULL" case. To generate a diff of this commit: cvs rdiff -u -r1.304 -r1.305 src/sys/nfs/nfs_vnops.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_vnops.c diff -u src/sys/nfs/nfs_vnops.c:1.304 src/sys/nfs/nfs_vnops.c:1.305 --- src/sys/nfs/nfs_vnops.c:1.304 Fri Feb 7 15:29:22 2014 +++ src/sys/nfs/nfs_vnops.c Sat Jul 5 09:33:41 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_vnops.c,v 1.304 2014/02/07 15:29:22 hannken Exp $ */ +/* $NetBSD: nfs_vnops.c,v 1.305 2014/07/05 09:33:41 hannken Exp $ */ /* * Copyright (c) 1989, 1993 @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.304 2014/02/07 15:29:22 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.305 2014/07/05 09:33:41 hannken Exp $"); #ifdef _KERNEL_OPT #include "opt_nfs.h" @@ -2943,12 +2943,12 @@ nfs_lookitup(struct vnode *dvp, const ch struct vnode *newvp = (struct vnode *)0; struct nfsnode *np, *dnp = VTONFS(dvp); char *bpos, *dpos, *cp2; - int error = 0, fhlen; + int error = 0, ofhlen, fhlen; #ifndef NFS_V2_ONLY int attrflag; #endif struct mbuf *mreq, *mrep, *md, *mb; - nfsfh_t *nfhp; + nfsfh_t *ofhp, *nfhp; const int v3 = NFS_ISV3(dvp); nfsstats.rpccnt[NFSPROC_LOOKUP]++; @@ -2961,6 +2961,17 @@ nfs_lookitup(struct vnode *dvp, const ch nfsm_getfh(nfhp, fhlen, v3); if (*npp) { np = *npp; + newvp = NFSTOV(np); + ofhlen = np->n_fhsize; + ofhp = kmem_alloc(ofhlen, KM_SLEEP); + memcpy(ofhp, np->n_fhp, ofhlen); + error = vcache_rekey_enter(newvp->v_mount, newvp, + ofhp, ofhlen, nfhp, fhlen); + if (error) { + kmem_free(ofhp, ofhlen); + m_freem(mrep); + return error; + } if (np->n_fhsize > NFS_SMALLFH && fhlen <= NFS_SMALLFH) { kmem_free(np->n_fhp, np->n_fhsize); np->n_fhp = &np->n_fh; @@ -2971,7 +2982,9 @@ nfs_lookitup(struct vnode *dvp, const ch #endif memcpy(np->n_fhp, nfhp, fhlen); np->n_fhsize = fhlen; - newvp = NFSTOV(np); + vcache_rekey_exit(newvp->v_mount, newvp, + ofhp, ofhlen, np->n_fhp, fhlen); + kmem_free(ofhp, ofhlen); } else if (NFS_CMPFH(dnp, nfhp, fhlen)) { vref(dvp); newvp = dvp;