From owner-p4-projects@FreeBSD.ORG Fri Jun 4 22:15:23 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A8C5D1065676; Fri, 4 Jun 2010 22:15:23 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6BA531065672 for ; Fri, 4 Jun 2010 22:15:23 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: from repoman.freebsd.org (unknown [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 194A38FC12 for ; Fri, 4 Jun 2010 22:15:22 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o54MFLrj053693 for ; Fri, 4 Jun 2010 22:15:21 GMT (envelope-from gpf@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o54MFLMo053691 for perforce@freebsd.org; Fri, 4 Jun 2010 22:15:21 GMT (envelope-from gpf@FreeBSD.org) Date: Fri, 4 Jun 2010 22:15:21 GMT Message-Id: <201006042215.o54MFLMo053691@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gpf@FreeBSD.org using -f From: Efstratios Karatzas To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 179194 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jun 2010 22:15:23 -0000 http://p4web.freebsd.org/@@179194?ac=10 Change 179194 by gpf@gpf_desktop on 2010/06/04 22:15:06 - Altered nfs code so that directory ino_t hints are stored inside the file handle. This was done for the new nfs implentation in sys/fs/nfsserver and works for all the v2 & v3 methods; just tested it. Per my previous e-mail. I should have said that we need to add a new nfs_server option, not an option for mount. I also forgot to mention that I fixed a bug in dir_ilookup(). Affected files ... .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfs/nfs_var.h#2 edit .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdport.c#3 edit .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdserv.c#2 edit .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdsocket.c#3 edit .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdstate.c#2 edit Differences ... ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfs/nfs_var.h#2 (text+ko) ==== @@ -512,7 +512,7 @@ NFSPROC_T *); int nfsvno_setattr(vnode_t, struct nfsvattr *, struct ucred *, NFSPROC_T *, struct nfsexstuff *); -int nfsvno_getfh(vnode_t, fhandle_t *, NFSPROC_T *); +int nfsvno_getfh(vnode_t, fhandle_t *, NFSPROC_T *, vnode_t); int nfsvno_accchk(vnode_t, accmode_t, struct ucred *, struct nfsexstuff *, NFSPROC_T *, int, int, u_int32_t *); int nfsvno_namei(struct nfsrv_descript *, struct nameidata *, ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdport.c#3 (text+ko) ==== @@ -118,13 +118,13 @@ * Get a file handle for a vnode. */ int -nfsvno_getfh(struct vnode *vp, fhandle_t *fhp, struct thread *p) +nfsvno_getfh(struct vnode *vp, fhandle_t *fhp, struct thread *p, struct vnode *dvp) { int error; NFSBZERO((caddr_t)fhp, sizeof(fhandle_t)); fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid; - error = VOP_VPTOFH(vp, &fhp->fh_fid, NULL); + error = VOP_VPTOFH(vp, &fhp->fh_fid, dvp); return (error); } @@ -1940,7 +1940,7 @@ if (refp == NULL && ((nd->nd_flag & ND_NFSV3) || NFSNONZERO_ATTRBIT(&attrbits))) { - r = nfsvno_getfh(nvp, &nfh, p); + r = nfsvno_getfh(nvp, &nfh, p, vp); if (!r) r = nfsvno_getattr(nvp, nvap, nd->nd_cred, p); @@ -2652,7 +2652,7 @@ nfsexargp->fspec, p); if ((error = namei(&nd)) != 0) return (error); - error = nfsvno_getfh(nd.ni_vp, &fh, p); + error = nfsvno_getfh(nd.ni_vp, &fh, p, NULL); vrele(nd.ni_vp); if (!error) { nfs_rootfh.nfsrvfh_len = NFSX_MYFH; ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdserv.c#2 (text+ko) ==== @@ -203,7 +203,7 @@ if (!nd->nd_repstat) { if (nd->nd_flag & ND_NFSV4) { if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_FILEHANDLE)) - nd->nd_repstat = nfsvno_getfh(vp, &fh, p); + nd->nd_repstat = nfsvno_getfh(vp, &fh, p, NULL); if (!nd->nd_repstat) nd->nd_repstat = nfsrv_checkgetattr(nd, vp, &nva, &attrbits, nd->nd_cred, p); @@ -438,7 +438,7 @@ } NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP, - LOCKLEAF | SAVESTART); + LOCKLEAF | SAVESTART | WANTPARENT); nfsvno_setpathbuf(&named, &bufp, &hashp); error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen); if (error) { @@ -467,7 +467,9 @@ vrele(named.ni_startdir); nfsvno_relpathbuf(&named); vp = named.ni_vp; - nd->nd_repstat = nfsvno_getfh(vp, fhp, p); + nd->nd_repstat = nfsvno_getfh(vp, fhp, p, named.ni_dvp); + if (named.ni_dvp) + vrele(named.ni_dvp); if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p); if (vpp) { @@ -990,7 +992,7 @@ &exclusive_flag, cverf, rdev, p, exp); if (!nd->nd_repstat) { - nd->nd_repstat = nfsvno_getfh(vp, &fh, p); + nd->nd_repstat = nfsvno_getfh(vp, &fh, p, named.ni_dvp); if (!nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p); @@ -1214,7 +1216,7 @@ if (!nd->nd_repstat) { vp = named.ni_vp; nfsrv_fixattr(nd, vp, &nva, aclp, p, &attrbits, exp); - nd->nd_repstat = nfsvno_getfh(vp, fhp, p); + nd->nd_repstat = nfsvno_getfh(vp, fhp, p, named.ni_dvp); if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p); @@ -1698,7 +1700,7 @@ if (!nd->nd_repstat && !(nd->nd_flag & ND_NFSV2)) { nfsrv_fixattr(nd, ndp->ni_vp, nvap, aclp, p, attrbitp, exp); if (nd->nd_flag & ND_NFSV3) { - nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p); + nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p, ndp->ni_dvp); if (!nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(ndp->ni_vp, nvap, nd->nd_cred, p); @@ -1833,7 +1835,7 @@ if (!nd->nd_repstat) { vp = ndp->ni_vp; nfsrv_fixattr(nd, vp, nvap, aclp, p, attrbitp, exp); - nd->nd_repstat = nfsvno_getfh(vp, fhp, p); + nd->nd_repstat = nfsvno_getfh(vp, fhp, p, ndp->ni_dvp); if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred, p); @@ -2928,7 +2930,7 @@ { fhandle_t fh; - nd->nd_repstat = nfsvno_getfh(vp, &fh, p); + nd->nd_repstat = nfsvno_getfh(vp, &fh, p, NULL); vput(vp); if (!nd->nd_repstat) (void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 0); @@ -3132,7 +3134,7 @@ nfsvno_relpathbuf(&named); fh.nfsrvfh_len = NFSX_MYFH; vp = named.ni_vp; - nd->nd_repstat = nfsvno_getfh(vp, (fhandle_t *)fh.nfsrvfh_data, p); + nd->nd_repstat = nfsvno_getfh(vp, (fhandle_t *)fh.nfsrvfh_data, p, NULL); mp = vnode_mount(vp); /* so it won't try to re-lock filesys */ retnes.nes_vfslocked = exp->nes_vfslocked; vput(vp); @@ -3352,7 +3354,7 @@ if (!nd->nd_repstat) nd->nd_repstat = nfsvno_statfs(vp, &sf); if (!nd->nd_repstat) - nd->nd_repstat = nfsvno_getfh(vp, &fh, p); + nd->nd_repstat = nfsvno_getfh(vp, &fh, p, NULL); if (!nd->nd_repstat) { nfsvno_getfs(&fs, isdgram); error = nfsv4_loadattr(nd, vp, &nva, NULL, &fh, fhsize, NULL, ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdsocket.c#3 (text+ko) ==== ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdstate.c#2 (text+ko) ==== @@ -2974,7 +2974,7 @@ * Do a sanity check against the file handle for DelegReturn. */ if (vp) { - error = nfsvno_getfh(vp, &fh, p); + error = nfsvno_getfh(vp, &fh, p, NULL); if (error) return (error); } @@ -3112,7 +3112,7 @@ } else { panic("nfsrv_getlockfh"); } - error = nfsvno_getfh(vp, fhp, p); + error = nfsvno_getfh(vp, fhp, p, NULL); return (error); }