Module Name:    src
Committed By:   yamt
Date:           Thu Apr 14 15:29:25 UTC 2011

Modified Files:
        src/sys/kern: vfs_lookup.c

Log Message:
assertions


To generate a diff of this commit:
cvs rdiff -u -r1.174 -r1.175 src/sys/kern/vfs_lookup.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/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.174 src/sys/kern/vfs_lookup.c:1.175
--- src/sys/kern/vfs_lookup.c:1.174	Mon Apr 11 18:24:49 2011
+++ src/sys/kern/vfs_lookup.c	Thu Apr 14 15:29:25 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_lookup.c,v 1.174 2011/04/11 18:24:49 jakllsch Exp $	*/
+/*	$NetBSD: vfs_lookup.c,v 1.175 2011/04/14 15:29:25 yamt Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.174 2011/04/11 18:24:49 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.175 2011/04/14 15:29:25 yamt Exp $");
 
 #include "opt_magiclinks.h"
 
@@ -691,6 +691,8 @@
 	size_t linklen;
 	int error;
 
+	KASSERT(VOP_ISLOCKED(searchdir) == LK_EXCLUSIVE);
+	KASSERT(VOP_ISLOCKED(foundobj) == LK_EXCLUSIVE);
 	if (ndp->ni_loopcnt++ >= MAXSYMLINKS) {
 		return ELOOP;
 	}
@@ -769,6 +771,7 @@
 	}
 
 	*newsearchdir_ret = searchdir;
+	KASSERT(VOP_ISLOCKED(searchdir) == LK_EXCLUSIVE);
 	return 0;
 }
 
@@ -875,6 +878,7 @@
 	struct nameidata *ndp = state->ndp;
 
 	KASSERT(cnp == &ndp->ni_cnd);
+	KASSERT(VOP_ISLOCKED(searchdir) == LK_EXCLUSIVE);
 	*newsearchdir_ret = searchdir;
 
 	/*
@@ -900,7 +904,8 @@
 				foundobj = searchdir;
 				vref(foundobj);
 				*foundobj_ret = foundobj;
-				return 0;
+				error = 0;
+				goto done;
 			}
 			if (ndp->ni_rootdir != rootvnode) {
 				int retval;
@@ -924,7 +929,8 @@
 				    vn_lock(foundobj, LK_EXCLUSIVE | LK_RETRY);
 				    *newsearchdir_ret = foundobj;
 				    *foundobj_ret = foundobj;
-				    return 0;
+				    error = 0;
+				    goto done;
 				}
 			}
 			if ((searchdir->v_vflag & VV_ROOT) == 0 ||
@@ -968,7 +974,7 @@
 		}
 
 		if (error != EJUSTRETURN)
-			return error;
+			goto done;
 
 		/*
 		 * If this was not the last component, or there were trailing
@@ -976,7 +982,8 @@
 		 * then the name must exist.
 		 */
 		if ((cnp->cn_flags & (REQUIREDIR | CREATEDIR)) == REQUIREDIR) {
-			return ENOENT;
+			error = ENOENT;
+			goto done;
 		}
 
 		/*
@@ -984,7 +991,8 @@
 		 * allowing file to be created.
 		 */
 		if (state->rdonly) {
-			return EROFS;
+			error = EROFS;
+			goto done;
 		}
 
 		/*
@@ -994,7 +1002,8 @@
 		 * as searchdir.
 		 */
 		*foundobj_ret = NULL;
-		return (0);
+		error = 0;
+		goto done;
 	}
 #ifdef NAMEI_DIAGNOSTIC
 	printf("found\n");
@@ -1028,7 +1037,7 @@
 		error = vfs_busy(mp, NULL);
 		if (error != 0) {
 			vput(foundobj);
-			return error;
+			goto done;
 		}
 		KASSERT(searchdir != foundobj);
 		VOP_UNLOCK(searchdir);
@@ -1037,7 +1046,7 @@
 		vfs_unbusy(mp, false, NULL);
 		if (error) {
 			vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY);
-			return error;
+			goto done;
 		}
 		VOP_UNLOCK(foundobj);
 		vn_lock(searchdir, LK_EXCLUSIVE | LK_RETRY);
@@ -1045,7 +1054,15 @@
 	}
 
 	*foundobj_ret = foundobj;
-	return 0;
+	error = 0;
+done:
+	KASSERT(VOP_ISLOCKED(*newsearchdir_ret) == LK_EXCLUSIVE);
+	/*
+	 * *foundobj_ret is valid only if error == 0.
+	 */
+	KASSERT(error != 0 || *foundobj_ret == NULL ||
+	    VOP_ISLOCKED(*foundobj_ret) == LK_EXCLUSIVE);
+	return error;
 }
 
 //////////////////////////////

Reply via email to