Module Name:    src
Committed By:   rmind
Date:           Fri Jul  2 03:29:47 UTC 2010

Modified Files:
        src/sys/fs/tmpfs: tmpfs_subr.c tmpfs_vnops.c

Log Message:
tmpfs_lookup: add comment, de-ident main path.  No functional change.
tmpfs_dir_attach: add assert.


To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/sys/fs/tmpfs/tmpfs_subr.c
cvs rdiff -u -r1.71 -r1.72 src/sys/fs/tmpfs/tmpfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/tmpfs/tmpfs_subr.c
diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.57 src/sys/fs/tmpfs/tmpfs_subr.c:1.58
--- src/sys/fs/tmpfs/tmpfs_subr.c:1.57	Tue Jun 22 18:32:08 2010
+++ src/sys/fs/tmpfs/tmpfs_subr.c	Fri Jul  2 03:29:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: tmpfs_subr.c,v 1.57 2010/06/22 18:32:08 rmind Exp $	*/
+/*	$NetBSD: tmpfs_subr.c,v 1.58 2010/07/02 03:29:47 rmind Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.57 2010/06/22 18:32:08 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.58 2010/07/02 03:29:47 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/dirent.h>
@@ -536,6 +536,7 @@
 {
 	struct tmpfs_node *dnode;
 
+	KASSERT(VOP_ISLOCKED(vp));
 	dnode = VP_TO_TMPFS_DIR(vp);
 
 	TAILQ_INSERT_TAIL(&dnode->tn_spec.tn_dir.tn_dir, de, td_entries);
@@ -563,7 +564,6 @@
 	struct tmpfs_node *dnode;
 
 	KASSERT(VOP_ISLOCKED(vp));
-
 	dnode = VP_TO_TMPFS_DIR(vp);
 
 	if (dnode->tn_spec.tn_dir.tn_readdir_lastp == de) {

Index: src/sys/fs/tmpfs/tmpfs_vnops.c
diff -u src/sys/fs/tmpfs/tmpfs_vnops.c:1.71 src/sys/fs/tmpfs/tmpfs_vnops.c:1.72
--- src/sys/fs/tmpfs/tmpfs_vnops.c:1.71	Thu Jun 24 13:03:11 2010
+++ src/sys/fs/tmpfs/tmpfs_vnops.c	Fri Jul  2 03:29:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: tmpfs_vnops.c,v 1.71 2010/06/24 13:03:11 hannken Exp $	*/
+/*	$NetBSD: tmpfs_vnops.c,v 1.72 2010/07/02 03:29:47 rmind Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.71 2010/06/24 13:03:11 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.72 2010/07/02 03:29:47 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/dirent.h>
@@ -111,18 +111,28 @@
 const struct vnodeopv_desc tmpfs_vnodeop_opv_desc =
 	{ &tmpfs_vnodeop_p, tmpfs_vnodeop_entries };
 
-/* --------------------------------------------------------------------- */
-
+/*
+ * tmpfs_lookup: lookup routine.
+ *
+ * Arguments: dvp (directory being searched), vpp (result),
+ * cnp (component name - path).
+ *
+ * => Caller holds a reference and lock on dvp.
+ * => We return looked-up vnode (vpp) locked, with a reference held.
+ */
 int
 tmpfs_lookup(void *v)
 {
-	struct vnode *dvp = ((struct vop_lookup_args *)v)->a_dvp;
-	struct vnode **vpp = ((struct vop_lookup_args *)v)->a_vpp;
-	struct componentname *cnp = ((struct vop_lookup_args *)v)->a_cnp;
-
-	int error;
+	struct vop_lookup_args /* {
+		struct vnode *a_dvp;
+		struct vnode **a_vpp;
+		struct componentname *a_cnp;
+	} */ *ap = v;
+	struct vnode *dvp = ap->a_dvp, **vpp = ap->a_vpp;
+	struct componentname *cnp = ap->a_cnp;
 	struct tmpfs_dirent *de;
 	struct tmpfs_node *dnode;
+	int error;
 
 	KASSERT(VOP_ISLOCKED(dvp));
 
@@ -134,8 +144,10 @@
 	if (error != 0)
 		goto out;
 
-	/* If requesting the last path component on a read-only file system
-	 * with a write operation, deny it. */
+	/*
+	 * If requesting the last path component on a read-only file system
+	 * with a write operation, deny it.
+	 */
 	if ((cnp->cn_flags & ISLASTCN) &&
 	    (dvp->v_mount->mnt_flag & MNT_RDONLY) &&
 	    (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) {
@@ -143,8 +155,10 @@
 		goto out;
 	}
 
-	/* Avoid doing a linear scan of the directory if the requested
-	 * directory/name couple is already in the cache. */
+	/*
+	 * Avoid doing a linear scan of the directory if the requested
+	 * directory/name couple is already in the cache.
+	 */
 	error = cache_lookup(dvp, vpp, cnp);
 	if (error >= 0)
 		goto out;
@@ -162,107 +176,98 @@
 		    dnode->tn_spec.tn_dir.tn_parent, vpp);
 
 		vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY);
+		goto done;
+
 	} else if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') {
 		vref(dvp);
 		*vpp = dvp;
 		error = 0;
-	} else {
-		de = tmpfs_dir_lookup(dnode, cnp);
-		if (de == NULL) {
-			/* The entry was not found in the directory.
-			 * This is OK iff we are creating or renaming an
-			 * entry and are working on the last component of
-			 * the path name. */
-			if ((cnp->cn_flags & ISLASTCN) &&
-			    (cnp->cn_nameiop == CREATE || \
-			    cnp->cn_nameiop == RENAME)) {
-				error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred);
-				if (error != 0)
-					goto out;
-
-				/* Keep the component name in the buffer for
-				 * future uses. */
-				cnp->cn_flags |= SAVENAME;
-
-				error = EJUSTRETURN;
-			} else
-				error = ENOENT;
-		} else {
-			struct tmpfs_node *tnode;
+		goto done;
+	}
 
-			/* The entry was found, so get its associated
-			 * tmpfs_node. */
-			tnode = de->td_node;
-
-			/* If we are not at the last path component and
-			 * found a non-directory or non-link entry (which
-			 * may itself be pointing to a directory), raise
-			 * an error. */
-			if ((tnode->tn_type != VDIR &&
-			    tnode->tn_type != VLNK) &&
-			    !(cnp->cn_flags & ISLASTCN)) {
-				error = ENOTDIR;
+	de = tmpfs_dir_lookup(dnode, cnp);
+	if (de == NULL) {
+		/*
+		 * The entry was not found in the directory.  This is valid
+		 * if we are creating or renaming an entry and are working
+		 * on the last component of the path name.
+		 */
+		if ((cnp->cn_flags & ISLASTCN) && (cnp->cn_nameiop == CREATE ||
+		    cnp->cn_nameiop == RENAME)) {
+			error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred);
+			if (error) {
 				goto out;
 			}
+			/* Keep the component name for future uses. */
+			cnp->cn_flags |= SAVENAME;
+			error = EJUSTRETURN;
+		} else {
+			error = ENOENT;
+		}
+	} else {
+		struct tmpfs_node *tnode = de->td_node;
 
-			/* Check permissions */
-			if ((cnp->cn_flags & ISLASTCN) &&
-			    (cnp->cn_nameiop == DELETE ||
-			    cnp->cn_nameiop == RENAME)) {
-				kauth_action_t action = 0;
-
-				/* This is the file-system's decision. */
-				if ((dnode->tn_mode & S_ISTXT) != 0 &&
-				    kauth_cred_geteuid(cnp->cn_cred) != dnode->tn_uid &&
-				    kauth_cred_geteuid(cnp->cn_cred) != tnode->tn_uid)
-					error = EPERM;
-				else
-					error = 0;
-
-				/* Only bother if we're not already failing it. */
-				if (!error) {
-					error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred);
-				}
+		/*
+		 * If we are not at the last path component and found a
+		 * non-directory or non-link entry (which may itself be
+		 * pointing to a directory), raise an error.
+		 */
+		if ((tnode->tn_type != VDIR && tnode->tn_type != VLNK) &&
+		    (cnp->cn_flags & ISLASTCN) == 0) {
+			error = ENOTDIR;
+			goto out;
+		}
 
-				if (cnp->cn_nameiop == DELETE)
-					action |= KAUTH_VNODE_DELETE;
-				else /* if (cnp->cn_nameiop == RENAME) */
-					action |= KAUTH_VNODE_RENAME;
-
-				error = kauth_authorize_vnode(cnp->cn_cred,
-				    action, *vpp, dvp, error);
-				if (error != 0)
-					goto out;
+		/* Check permissions. */
+		if ((cnp->cn_flags & ISLASTCN) && (cnp->cn_nameiop == DELETE ||
+		    cnp->cn_nameiop == RENAME)) {
+			kauth_action_t action = 0;
+
+			/* This is the file-system's decision. */
+			if ((dnode->tn_mode & S_ISTXT) != 0 &&
+			    kauth_cred_geteuid(cnp->cn_cred) != dnode->tn_uid &&
+			    kauth_cred_geteuid(cnp->cn_cred) != tnode->tn_uid)
+				error = EPERM;
+			else
+				error = 0;
 
-				cnp->cn_flags |= SAVENAME;
-			} else
-				de = NULL;
+			/* Only bother if we are not already failing it. */
+			if (!error) {
+				error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred);
+			}
 
-			/* Allocate a new vnode on the matching entry. */
-			error = tmpfs_alloc_vp(dvp->v_mount, tnode, vpp);
+			if (cnp->cn_nameiop == DELETE) {
+				action |= KAUTH_VNODE_DELETE;
+			} else {
+				KASSERT(cnp->cn_nameiop == RENAME);
+				action |= KAUTH_VNODE_RENAME;
+			}
+			error = kauth_authorize_vnode(cnp->cn_cred,
+			    action, *vpp, dvp, error);
+			if (error) {
+				goto out;
+			}
+			cnp->cn_flags |= SAVENAME;
 		}
+		/* Allocate a new vnode on the matching entry. */
+		error = tmpfs_alloc_vp(dvp->v_mount, tnode, vpp);
 	}
-
-	/* Store the result of this lookup in the cache.  Avoid this if the
+done:
+	/*
+	 * Store the result of this lookup in the cache.  Avoid this if the
 	 * request was for creation, as it does not improve timings on
-	 * emprical tests. */
+	 * emprical tests.
+	 */
 	if ((cnp->cn_flags & MAKEENTRY) && cnp->cn_nameiop != CREATE &&
 	    (cnp->cn_flags & ISDOTDOT) == 0)
 		cache_enter(dvp, *vpp, cnp);
 
 out:
-	/* If there were no errors, *vpp cannot be null and it must be
-	 * locked. */
 	KASSERT(IFF(error == 0, *vpp != NULL && VOP_ISLOCKED(*vpp)));
-
-	/* dvp must always be locked. */
 	KASSERT(VOP_ISLOCKED(dvp));
-
 	return error;
 }
 
-/* --------------------------------------------------------------------- */
-
 int
 tmpfs_create(void *v)
 {

Reply via email to