Date: Fri, 08 Jun 2012 14:01:01 +0000 From: gpf@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r237309 - soc2012/gpf/pefs_kmod/sys/fs/pefs Message-ID: <20120608140101.B3243106566C@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120608140101.B3243106566C>