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; } //////////////////////////////