PERFORCE change 179194 for review

Efstratios Karatzas gpf at FreeBSD.org
Fri Jun 4 22:15:23 UTC 2010


http://p4web.freebsd.org/@@179194?ac=10

Change 179194 by gpf at 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);
 }
 


More information about the p4-projects mailing list