Module Name: src
Committed By: hannken
Date: Sun Jun 4 08:01:33 UTC 2017
Modified Files:
src/sys/miscfs/genfs: genfs_vnops.c
Log Message:
Now that FSTRANS is part of VOP_*LOCK() remove FSTRANS and vdead_check()
from genfs_.*lock() and assert the vnode state once the vnode is locked.
To generate a diff of this commit:
cvs rdiff -u -r1.195 -r1.196 src/sys/miscfs/genfs/genfs_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/miscfs/genfs/genfs_vnops.c
diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.195 src/sys/miscfs/genfs/genfs_vnops.c:1.196
--- src/sys/miscfs/genfs/genfs_vnops.c:1.195 Tue Apr 11 14:29:32 2017
+++ src/sys/miscfs/genfs/genfs_vnops.c Sun Jun 4 08:01:33 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: genfs_vnops.c,v 1.195 2017/04/11 14:29:32 riastradh Exp $ */
+/* $NetBSD: genfs_vnops.c,v 1.196 2017/06/04 08:01:33 hannken Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.195 2017/04/11 14:29:32 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.196 2017/06/04 08:01:33 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -288,41 +288,18 @@ genfs_deadlock(void *v)
vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
int flags = ap->a_flags;
krw_t op;
- int error;
+
+ if (! ISSET(flags, LK_RETRY))
+ return ENOENT;
op = (ISSET(flags, LK_EXCLUSIVE) ? RW_WRITER : RW_READER);
if (ISSET(flags, LK_NOWAIT)) {
if (! rw_tryenter(vip->vi_lock, op))
return EBUSY;
- if (mutex_tryenter(vp->v_interlock)) {
- error = vdead_check(vp, VDEAD_NOWAIT);
- if (error == ENOENT && ISSET(flags, LK_RETRY))
- error = 0;
- mutex_exit(vp->v_interlock);
- } else
- error = EBUSY;
- if (error)
- rw_exit(vip->vi_lock);
- return error;
- }
-
- rw_enter(vip->vi_lock, op);
- mutex_enter(vp->v_interlock);
- error = vdead_check(vp, VDEAD_NOWAIT);
- if (error == EBUSY) {
- rw_exit(vip->vi_lock);
- error = vdead_check(vp, 0);
- KASSERT(error == ENOENT);
- mutex_exit(vp->v_interlock);
+ } else {
rw_enter(vip->vi_lock, op);
- mutex_enter(vp->v_interlock);
- }
- KASSERT(error == ENOENT);
- mutex_exit(vp->v_interlock);
- if (! ISSET(flags, LK_RETRY)) {
- rw_exit(vip->vi_lock);
- return ENOENT;
}
+ VSTATE_ASSERT_UNLOCKED(vp, VS_RECLAIMED);
return 0;
}
@@ -355,43 +332,18 @@ genfs_lock(void *v)
} */ *ap = v;
vnode_t *vp = ap->a_vp;
vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
- struct mount *mp = vp->v_mount;
int flags = ap->a_flags;
krw_t op;
- int error;
op = (ISSET(flags, LK_EXCLUSIVE) ? RW_WRITER : RW_READER);
if (ISSET(flags, LK_NOWAIT)) {
- if (fstrans_start_nowait(mp, FSTRANS_SHARED))
- return EBUSY;
- if (! rw_tryenter(vip->vi_lock, op)) {
- fstrans_done(mp);
+ if (! rw_tryenter(vip->vi_lock, op))
return EBUSY;
- }
- if (mutex_tryenter(vp->v_interlock)) {
- error = vdead_check(vp, VDEAD_NOWAIT);
- mutex_exit(vp->v_interlock);
- } else
- error = EBUSY;
- if (error) {
- rw_exit(vip->vi_lock);
- fstrans_done(mp);
- }
- return error;
- }
-
- fstrans_start(mp, FSTRANS_SHARED);
- rw_enter(vip->vi_lock, op);
- mutex_enter(vp->v_interlock);
- error = vdead_check(vp, VDEAD_NOWAIT);
- if (error) {
- rw_exit(vip->vi_lock);
- fstrans_done(mp);
- error = vdead_check(vp, 0);
- KASSERT(error == ENOENT);
+ } else {
+ rw_enter(vip->vi_lock, op);
}
- mutex_exit(vp->v_interlock);
- return error;
+ VSTATE_ASSERT_UNLOCKED(vp, VS_ACTIVE);
+ return 0;
}
/*
@@ -405,10 +357,8 @@ genfs_unlock(void *v)
} */ *ap = v;
vnode_t *vp = ap->a_vp;
vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
- struct mount *mp = vp->v_mount;
rw_exit(vip->vi_lock);
- fstrans_done(mp);
return 0;
}