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