From owner-svn-soc-all@FreeBSD.ORG Fri Jun 8 14:01:03 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id B3243106566C for ; Fri, 8 Jun 2012 14:01:01 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Fri, 08 Jun 2012 14:01:01 +0000 Date: Fri, 08 Jun 2012 14:01:01 +0000 From: gpf@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120608140101.B3243106566C@hub.freebsd.org> Cc: Subject: socsvn commit: r237309 - soc2012/gpf/pefs_kmod/sys/fs/pefs X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Jun 2012 14:01:03 -0000 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);