Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 08 Jul 2012 10:55:24 +0000
From:      oleksandr@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r239110 - soc2012/oleksandr/udf-head/sys/fs/udf2
Message-ID:  <20120708105524.0E6C2106564A@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: oleksandr
Date: Sun Jul  8 10:55:22 2012
New Revision: 239110
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239110

Log:
  Add some debug printf and comments and check permissions

Modified:
  soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vnops.c

Modified: soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vnops.c
==============================================================================
--- soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vnops.c	Sun Jul  8 09:55:00 2012	(r239109)
+++ soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vnops.c	Sun Jul  8 10:55:22 2012	(r239110)
@@ -252,7 +252,7 @@
 			error = uiomove(bp->b_data + on, n, uio);
 
 		brelse(bp);
-	} while (error == 0 && uio->uio_resid > 0 && n != 0) 
+	} while (error == 0 && uio->uio_resid > 0 && n != 0); 
 #if 0
 	/* note access time unless not requested */
 	if (!(vp->v_mount->mnt_flag & MNT_NOATIME)) {
@@ -761,26 +761,48 @@
 	ump = dir_node->ump;
 	*vpp = NULL;
 
+	DPRINTF(LOOKUP, ("udf_cachedlookup callen\n"));
+	
 	/* simplify/clarification flags */
 	nameiop     = cnp->cn_nameiop;
 	islastcn    = cnp->cn_flags & ISLASTCN;
 	mounted_ro  = dvp->v_mount->mnt_flag & MNT_RDONLY;
 
+	/* check exec/dirread permissions first */
+	error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, curthread);
+	if (error)
+		return (error);
+
+	DPRINTF(LOOKUP, ("\taccess ok\n"));
+
 	/*
 	 * If requesting a modify on the last path element on a read-only
-	 * filingsystem, reject lookup; XXX why is this repeated in every FS ?
+	 * filingsystem, reject lookup.
 	 */
 	if (islastcn && mounted_ro && (nameiop == DELETE || nameiop == RENAME))
 		return (EROFS);
 
+	DPRINTF(LOOKUP, ("\tlooking up cnp->cn_nameptr '%s'\n", cnp->cn_nameptr));
+	
+	/* look in the namei cache; return 0 on success!! */
+#if 0	
+	error = cache_lookup(dvp, vpp, cnp);
+	if (error >= 0)
+		return error;
+
+	DPRINTF(LOOKUP, ("\tNOT found in cache\n"));
+#endif 
 	/* get directory filesize */
 	if (dir_node->fe)
 		file_size = le64toh(dir_node->fe->inf_len);
 	else
 		file_size = le64toh(dir_node->efe->inf_len);
 
-	/* 
-	 * 
+	/*
+	 * If this is a LOOKUP and we've already partially searched through
+	 * the directory, pick up where we left off and flag that the
+	 * directory may need to be searched twice.  For a full description,
+	 * see /sys/fs/cd9660/cd9660_lookup.c:cd9660_lookup()
 	 */
 	if (nameiop != LOOKUP || dir_node->diroff == 0 || dir_node->diroff > file_size) {
 		offset = 0;
@@ -833,7 +855,11 @@
 	if (error)
 		goto exit; 
 
+	/* Did we have a match? */
 	if (id) {
+		/*
+		 * Remember where this entry was if it's the final component.
+		 */
 		if ((cnp->cn_flags & ISLASTCN) && cnp->cn_nameiop == LOOKUP)
 			dir_node->diroff = offset;
 		if (numpasses == 2)
@@ -843,13 +869,16 @@
 			vn_vget_ino(dvp, id, cnp->cn_lkflags, &tdp);
 		}
 		else if (dir_node->hash_id == id) {
-			/* through a glass darkly... */
-			VREF(dvp);
+			VREF(dvp);	/* we want ourself, ie "." */
+			/*
+			 * When we lookup "." we still can be asked to lock it
+			 * differently.
+			 */
 			ltype = cnp->cn_lkflags & LK_TYPE_MASK;
 			if (ltype != VOP_ISLOCKED(dvp)) {
 				if (ltype == LK_EXCLUSIVE)
 					vn_lock(dvp, LK_UPGRADE | LK_RETRY);
-				else
+				else /* if (ltype == LK_SHARED) */
 					vn_lock(dvp, LK_DOWNGRADE | LK_RETRY);
 			}
 			tdp = dvp;
@@ -860,16 +889,19 @@
 
 		if (!error) {
 			*vpp = tdp;
+			/* Put this entry in the cache */
 			if (cnp->cn_flags & MAKEENTRY) 
 				cache_enter(dvp, *vpp, cnp);
 		}
 	}
 	else {
+		/* Name wasn't found on this pass. Do another pass? */
 		if (numpasses-- == 2) {
 			offset = 0;
 			goto lookuploop;
 		}
 
+		/* Enter name into cache as non-existant */
 		if (cnp->cn_flags & MAKEENTRY)
 			cache_enter(dvp, *vpp, cnp);
 
@@ -883,18 +915,10 @@
 exit:
 	free(fid, M_UDFTEMP);
 	free(unix_name, M_UDFTEMP);
+	
+	DPRINTFIF(LOOKUP, error, ("udf_cachedlookup returning error %d\n", error));
 
 	return (error);
-#if 0
-	not sure if anything like this would be needed.
-	if ((cnp->cn_namelen == 1) && (cnp->cn_nameptr[0] == '.')) {
-		DPRINTF(LOOKUP, ("\tlookup '.'\n"));
-		/* special case 1 '.' */
-		vref(dvp);
-		*vpp = dvp;
-		/* done */
-	}
-#endif
 }
 
 /* --------------------------------------------------------------------- */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120708105524.0E6C2106564A>