diff options
author | kib <kib@FreeBSD.org> | 2011-02-13 21:52:26 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2011-02-13 21:52:26 +0000 |
commit | 210cf47742b6bb6abb45d62614583a40f05baa7b (patch) | |
tree | 2e7b80c839d137887179d97b15412e9941dafed3 | |
parent | 185c49188e1915848323d56f2d14cfbe8a904d96 (diff) | |
download | FreeBSD-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.c | 23 |
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); } /* |