summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-02-13 21:52:26 +0000
committerkib <kib@FreeBSD.org>2011-02-13 21:52:26 +0000
commit210cf47742b6bb6abb45d62614583a40f05baa7b (patch)
tree2e7b80c839d137887179d97b15412e9941dafed3
parent185c49188e1915848323d56f2d14cfbe8a904d96 (diff)
downloadFreeBSD-src-210cf47742b6bb6abb45d62614583a40f05baa7b.zip
FreeBSD-src-210cf47742b6bb6abb45d62614583a40f05baa7b.tar.gz
Lock the vnode around clearing of VV_TEXT flag. Remove mp_fixme() note
mentioning that vnode lock is needed. Reviewed by: alc Tested by: pho MFC after: 1 week
-rw-r--r--sys/vm/vm_object.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 1eb84f6..fb52216 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -437,16 +437,21 @@ vm_object_vndeallocate(vm_object_t object)
}
#endif
- object->ref_count--;
- if (object->ref_count == 0) {
- mp_fixme("Unlocked vflag access.");
- vp->v_vflag &= ~VV_TEXT;
+ if (object->ref_count > 1) {
+ object->ref_count--;
+ VM_OBJECT_UNLOCK(object);
+ /* vrele may need the vnode lock. */
+ vrele(vp);
+ } else {
+ VM_OBJECT_UNLOCK(object);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ VM_OBJECT_LOCK(object);
+ object->ref_count--;
+ if (object->ref_count == 0)
+ vp->v_vflag &= ~VV_TEXT;
+ VM_OBJECT_UNLOCK(object);
+ vput(vp);
}
- VM_OBJECT_UNLOCK(object);
- /*
- * vrele may need a vop lock
- */
- vrele(vp);
}
/*
OpenPOWER on IntegriCloud