aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2008-07-30 18:16:06 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2008-07-30 18:16:06 +0000
commit24bbc85bf6aa71e985016839a31c861da99b9276 (patch)
treed19baac22a60d4175977ccc5b7376d9bb7bcfc05
parent5b7f4ced658974e95ec2cff0f285a0e42fd0b70e (diff)
Notes
-rw-r--r--sys/vm/vnode_pager.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index 47584569ab9b..61f4fd9d2e6f 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -1179,6 +1179,7 @@ vnode_pager_lock(vm_object_t first_object)
{
struct vnode *vp;
vm_object_t backing_object, object;
+ int locked, lockf;
VM_OBJECT_LOCK_ASSERT(first_object, MA_OWNED);
for (object = first_object; object != NULL; object = backing_object) {
@@ -1196,13 +1197,19 @@ vnode_pager_lock(vm_object_t first_object)
return NULL;
}
vp = object->handle;
+ locked = VOP_ISLOCKED(vp);
VI_LOCK(vp);
VM_OBJECT_UNLOCK(object);
if (first_object != object)
VM_OBJECT_UNLOCK(first_object);
VFS_ASSERT_GIANT(vp->v_mount);
- if (vget(vp, LK_CANRECURSE | LK_INTERLOCK |
- LK_RETRY | LK_SHARED, curthread)) {
+ if (locked == LK_EXCLUSIVE)
+ lockf = LK_CANRECURSE | LK_INTERLOCK | LK_RETRY |
+ LK_EXCLUSIVE;
+ else
+ lockf = LK_CANRECURSE | LK_INTERLOCK | LK_RETRY |
+ LK_SHARED;
+ if (vget(vp, lockf, curthread)) {
VM_OBJECT_LOCK(first_object);
if (object != first_object)
VM_OBJECT_LOCK(object);