Module Name: src
Committed By: christos
Date: Fri May 4 01:40:13 UTC 2012
Modified Files:
src/sys/coda: coda_vnops.c
Log Message:
fix locking in getpages when running executables.
To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 src/sys/coda/coda_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/coda/coda_vnops.c
diff -u src/sys/coda/coda_vnops.c:1.86 src/sys/coda/coda_vnops.c:1.87
--- src/sys/coda/coda_vnops.c:1.86 Thu May 3 10:26:42 2012
+++ src/sys/coda/coda_vnops.c Thu May 3 21:40:13 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: coda_vnops.c,v 1.86 2012/05/03 14:26:42 christos Exp $ */
+/* $NetBSD: coda_vnops.c,v 1.87 2012/05/04 01:40:13 christos Exp $ */
/*
*
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.86 2012/05/03 14:26:42 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.87 2012/05/04 01:40:13 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1898,10 +1898,10 @@ print_cred(kauth_cred_t cred)
* table when coda_inactive calls coda_unsave.
*/
struct cnode *
-make_coda_node(CodaFid *fid, struct mount *vfsp, short type)
+make_coda_node(CodaFid *fid, struct mount *fvsp, short type)
{
struct cnode *cp;
- int err;
+ int error;
if ((cp = coda_find(fid)) == NULL) {
vnode_t *vp;
@@ -1909,9 +1909,9 @@ make_coda_node(CodaFid *fid, struct moun
cp = coda_alloc();
cp->c_fid = *fid;
- err = getnewvnode(VT_CODA, vfsp, coda_vnodeop_p, NULL, &vp);
- if (err) {
- panic("%s: getnewvnode returned error %d", __func__, err);
+ error = getnewvnode(VT_CODA, fvsp, coda_vnodeop_p, NULL, &vp);
+ if (error) {
+ panic("%s: getnewvnode returned error %d", __func__, error);
}
vp->v_data = cp;
vp->v_type = type;
@@ -1989,6 +1989,7 @@ coda_getpages(void *v)
* leave it in the same state on exit.
*/
if (waslocked == 0) {
+ mutex_exit(vp->v_interlock);
cerror = vn_lock(vp, LK_EXCLUSIVE);
if (cerror) {
printf("%s: can't lock vnode %p\n",
@@ -2021,6 +2022,8 @@ coda_getpages(void *v)
#endif
cvp = cp->c_ovp;
didopen = 1;
+ if (waslocked == 0)
+ mutex_enter(vp->v_interlock);
}
KASSERT(cvp != NULL);