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