socsvn commit: r237309 - soc2012/gpf/pefs_kmod/sys/fs/pefs
gpf at FreeBSD.org
gpf at FreeBSD.org
Fri Jun 8 14:01:03 UTC 2012
Author: gpf
Date: Fri Jun 8 14:01:01 2012
New Revision: 237309
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237309
Log:
- replace call to pefs_lookup() with namei()
Modified:
soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h
soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c
Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h
==============================================================================
--- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Fri Jun 8 13:27:30 2012 (r237308)
+++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs.h Fri Jun 8 14:01:01 2012 (r237309)
@@ -65,6 +65,7 @@
uint32_t pxsl_namelen;
uint32_t pxsl_slink_len;
char pxsl_filename[MAXPATHLEN];
+ /* XXXgpf: rename to target */
char pxsl_slink[PEFS_SECTOR_SIZE];
};
Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c
==============================================================================
--- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Fri Jun 8 13:27:30 2012 (r237308)
+++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Fri Jun 8 14:01:01 2012 (r237309)
@@ -2358,7 +2358,7 @@
struct pefs_enccn enccn;
struct componentname cn;
struct pefs_chunk pc;
- struct vop_cachedlookup_args la;
+ struct nameidata nd, *ndp = &nd;
u_quad_t fsize;
struct vnode *vp = ap->a_vp;
struct vnode *lvp = PEFS_LOWERVP(vp);
@@ -2581,8 +2581,6 @@
}
break;
case PEFS_GETSLINKCTEXT:
- vn_lock(vp, LK_EXCLUSIVE);
-
if (vp->v_type != VDIR) {
printf("pefs_ioctl: PEFS_GETSLINKCTEXT vp is not a directory\n");
VOP_UNLOCK(vp, 0);
@@ -2602,31 +2600,25 @@
return (EINVAL);
}
- /* pefs_lookup() so that we can grab a vp for our symlink */
- la.a_dvp = vp;
- la.a_vpp = &svp;
- la.a_cnp = &cn;
-
- cn.cn_nameiop = LOOKUP;
- cn.cn_thread = td;
- cn.cn_cred = cred;
- cn.cn_lkflags = LK_EXCLUSIVE;
- cn.cn_flags = LOCKPARENT | LOCKLEAF | NOFOLLOW;
- cn.cn_nameptr = xsl->pxsl_filename;
- cn.cn_namelen = xsl->pxsl_namelen;
- cn.cn_pnbuf = NULL;
- cn.cn_consume = 0;
-
- /* XXXgpf: gleb says that maybe using namei() would be better */
- error = pefs_lookup(&la);
+ /* grab a vnodep for our symlink */
+ NDINIT_ATVP(ndp, LOOKUP, MPSAFE | LOCKPARENT | LOCKLEAF | NOFOLLOW, UIO_SYSSPACE, xsl->pxsl_filename, vp, td);
+ error = namei(ndp);
if (error != 0) {
- printf("pefs_ioctl: PEFS_GETSLINKCTEXT lookup error %d", error);
- VOP_UNLOCK(vp, 0);
+ printf("pefs_ioctl: PEFS_GETSLINKCTEXT namei error %d\n", error);
return (error);
}
+ NDFREE(ndp, NDF_ONLY_PNBUF);
+ svp = ndp->ni_vp;
+
+ if (ndp->ni_dvp != vp) {
+ printf("pefs_ioctl: PEFS_GETSLINKCTEXT namei returned wrong parent\n");
+ vput(svp);
+ VOP_UNLOCK(vp, 0);
+ return (ENOENT);
+ }
if (svp->v_type != VLNK) {
- printf("pefs_ioctl: PEFS_GETSLINKCTEXT svp is not a symlink '/'\n");
+ printf("pefs_ioctl: PEFS_GETSLINKCTEXT svp is not a symlink\n");
vput(svp);
VOP_UNLOCK(vp, 0);
return (EFTYPE);
@@ -2634,6 +2626,7 @@
/* VOP_READLINK our slvp */
slvp = PEFS_LOWERVP(svp);
+
pn = VP_TO_PN(svp);
pefs_chunk_create(&pc, pn, MAXPATHLEN);
puio = pefs_chunk_uio(&pc, 0, UIO_READ);
More information about the svn-soc-all
mailing list