svn commit: r196205 - head/sys/nfsclient
Konstantin Belousov
kib at FreeBSD.org
Fri Aug 14 10:59:18 UTC 2009
Author: kib
Date: Fri Aug 14 10:59:17 2009
New Revision: 196205
URL: http://svn.freebsd.org/changeset/base/196205
Log:
In nfs_upgrade_vnlock(), assert that the vnode is locked. It is for all
pathes, as far as I see and testing seems to confirm it. Comparision of
old_lock with LK_SHARED make sense only if vnode is locked by current
thread.
When downgrading, pass LK_RETRY to the vn_lock(), since otherwise
vn_lock() unlocks the doomed vnode, causing extra unlock.
Reported and tested by: pho
Approved by: re (rwatson)
MFC after: 3 weeks
Modified:
head/sys/nfsclient/nfs_subs.c
Modified: head/sys/nfsclient/nfs_subs.c
==============================================================================
--- head/sys/nfsclient/nfs_subs.c Fri Aug 14 10:57:57 2009 (r196204)
+++ head/sys/nfsclient/nfs_subs.c Fri Aug 14 10:59:17 2009 (r196205)
@@ -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);
}
}
More information about the svn-src-all
mailing list