aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsclient
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2009-08-14 11:17:34 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2009-08-14 11:17:34 +0000
commitb5d2abe26f29727366dce24b703c5ab678af75f8 (patch)
tree0963f0883b3ab95077a4719dcb942df03cf9aa78 /sys/nfsclient
parentb60a1fa9a5ec45c1ac9524b1812385e692d0654d (diff)
downloadsrc-b5d2abe26f29727366dce24b703c5ab678af75f8.tar.gz
src-b5d2abe26f29727366dce24b703c5ab678af75f8.zip
MFC r196205:
In nfs_upgrade_vnlock(), assert that the vnode is locked. When downgrading, pass LK_RETRY to the vn_lock(), since otherwise vn_lock() unlocks the doomed vnode, causing extra unlock. Approved by: re (rwatson)
Notes
Notes: svn path=/stable/8/; revision=196209
Diffstat (limited to 'sys/nfsclient')
-rw-r--r--sys/nfsclient/nfs_subs.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c
index 6f4ef7b5d40d..329294bae30e 100644
--- a/sys/nfsclient/nfs_subs.c
+++ b/sys/nfsclient/nfs_subs.c
@@ -409,28 +409,25 @@ int
nfs_upgrade_vnlock(struct vnode *vp)
{
int old_lock;
-
- if ((old_lock = VOP_ISLOCKED(vp)) != LK_EXCLUSIVE) {
- if (old_lock == LK_SHARED) {
- /* Upgrade to exclusive lock, this might block */
- vn_lock(vp, LK_UPGRADE | LK_RETRY);
- } else {
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
- }
+
+ ASSERT_VOP_LOCKED(vp, "nfs_upgrade_vnlock");
+ old_lock = VOP_ISLOCKED(vp);
+ if (old_lock != LK_EXCLUSIVE) {
+ KASSERT(old_lock == LK_SHARED,
+ ("nfs_upgrade_vnlock: wrong old_lock %d", old_lock));
+ /* Upgrade to exclusive lock, this might block */
+ vn_lock(vp, LK_UPGRADE | LK_RETRY);
}
- return old_lock;
+ return (old_lock);
}
void
nfs_downgrade_vnlock(struct vnode *vp, int old_lock)
{
if (old_lock != LK_EXCLUSIVE) {
- if (old_lock == LK_SHARED) {
- /* Downgrade from exclusive lock, this might block */
- vn_lock(vp, LK_DOWNGRADE);
- } else {
- VOP_UNLOCK(vp, 0);
- }
+ KASSERT(old_lock == LK_SHARED, ("wrong old_lock %d", old_lock));
+ /* Downgrade from exclusive lock. */
+ vn_lock(vp, LK_DOWNGRADE | LK_RETRY);
}
}