From owner-p4-projects@FreeBSD.ORG Sat Jul 3 14:52:52 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 75BB01065675; Sat, 3 Jul 2010 14:52:52 +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 21E55106566B for ; Sat, 3 Jul 2010 14:52:52 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 0F9A28FC21 for ; Sat, 3 Jul 2010 14:52:52 +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 o63EqpdX025556 for ; Sat, 3 Jul 2010 14:52:51 GMT (envelope-from gpf@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o63Eqp0e025554 for perforce@freebsd.org; Sat, 3 Jul 2010 14:52:51 GMT (envelope-from gpf@FreeBSD.org) Date: Sat, 3 Jul 2010 14:52:51 GMT Message-Id: <201007031452.o63Eqp0e025554@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 180436 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: Sat, 03 Jul 2010 14:52:52 -0000 http://p4web.freebsd.org/@@180436?ac=10 Change 180436 by gpf@gpf_desktop on 2010/07/03 14:52:47 - make putroofh & putpubfh actually replace the current fh - provide a cleaner/better implementation of getfh - remove an __unused marker - relocate AUDIT_NFS_EXIT() so that we auditing the final error code Affected files ... .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdserv.c#8 edit .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdsocket.c#11 edit Differences ... ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdserv.c#8 (text+ko) ==== @@ -2455,7 +2455,7 @@ */ APPLESTATIC int nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, - vnode_t dp, vnode_t *vpp, __unused fhandle_t *fhp, NFSPROC_T *p, + vnode_t dp, vnode_t *vpp, fhandle_t *fhp, NFSPROC_T *p, struct nfsexstuff *exp) { u_int32_t *tl; ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/fs/nfsserver/nfs_nfsdsocket.c#11 (text+ko) ==== @@ -539,7 +539,6 @@ struct ucred *credanon; struct nfsexstuff nes, vpnes, savevpnes; static u_int64_t compref = 0; - int rootfhflag = 0, pubfhflag = 0; NFSVNO_EXINIT(&vpnes); NFSVNO_EXINIT(&savevpnes); @@ -771,7 +770,6 @@ } break; case NFSV4OP_PUTPUBFH: - pubfhflag = 1; if (nfs_pubfhset) { nes.nes_vfslocked = vpnes.nes_vfslocked; nfsd_fhtovp(nd, &nfs_pubfh, &nvp, @@ -790,12 +788,11 @@ (fhandle_t *)nfs_pubfh.nfsrvfh_data, 1); vrele(vp); vpnes = nes; + NFSBCOPY(&nfs_pubfh, &fh, sizeof(fh)); } break; case NFSV4OP_PUTROOTFH: - rootfhflag = 1; if (nfs_rootfhset) { - printf("mpkha sto prwto\n"); nes.nes_vfslocked = vpnes.nes_vfslocked; nfsd_fhtovp(nd, &nfs_rootfh, &nvp, &nes, &mp, 0, p); @@ -810,9 +807,9 @@ (fhandle_t *)nfs_rootfh.nfsrvfh_data, 1); vrele(vp); vpnes = nes; + NFSBCOPY(&nfs_rootfh, &fh, sizeof(fh)); } } else if (nfsv4root_vp && nfsv4root_set) { - printf("mpkha sto deytero\n"); if (vp) { if (vpnes.nes_vfslocked) nfsvno_unlockvfs(mp); @@ -823,6 +820,7 @@ NFSVNO_SETEXRDONLY(&vpnes); vpnes.nes_vfslocked = 0; mp = vnode_mount(vp); + NFSBCOPY(&nfs_rootfh, &fh, sizeof(fh)); } else { nd->nd_repstat = NFSERR_NOFILEHANDLE; } @@ -887,6 +885,21 @@ nd->nd_repstat = NFSERR_RESTOREFH; } break; + /* + * XXXgpf: + * NFSV4OP_GETFH hack so that current filehandle, with the hint stored inside, + * is returned instead of recomputing the filehandle and losing the hint. + * All NFS v4 OPs that are supposed to replace the current filehandle, now do so: + * putroofh, putpubfh, open, mknod, lookup, lookupp, putfh + */ + case NFSV4OP_GETFH: + if (vp == NULL) + error = nd->nd_repstat = NFSERR_NOFILEHANDLE; + else { + (void) nfsm_fhtom(nd, (u_int8_t *)fh.nfsrvfh_data, 0, 0); + error = nd->nd_repstat = 0; + } + break; default: /* * Allow a Lookup, Getattr, GetFH, Secinfo on an @@ -1023,27 +1036,8 @@ } break; } - /* - * XXXgpf: - * NFSV4OP_GETFH hack so that current filehandle, with the hint stored inside, - * is returned instead of recomputing the filehandle and losing the hint. - */ - if (op == NFSV4OP_GETFH) { - fhandle_t * fhp; - - vput(vp); - if (rootfhflag) - fhp = (fhandle_t *)nfs_rootfh.nfsrvfh_data; - else if (pubfhflag) - fhp = (fhandle_t *)nfs_pubfh.nfsrvfh_data; - else - fhp = (fhandle_t *)fh.nfsrvfh_data; - (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0); - error = 0; - } - else - error = (*(nfsrv4_ops0[op]))(nd, isdgram, vp, - p, &vpnes); + error = (*(nfsrv4_ops0[op]))(nd, isdgram, vp, + p, &vpnes); if (nfsv4_opflag[op].modifyfs) NFS_ENDWRITE(mp); } else { @@ -1051,8 +1045,7 @@ NULL, p, &vpnes); } } - }; - AUDIT_NFS_EXIT(nd->nd_repstat, curthread); + }; if (error) { if (error == EBADRPC || error == NFSERR_BADXDR) { nd->nd_repstat = NFSERR_BADXDR; @@ -1062,6 +1055,7 @@ } error = 0; } + AUDIT_NFS_EXIT(nd->nd_repstat, curthread); retops++; if (nd->nd_repstat) { *repp = nfsd_errmap(nd);