diff options
author | Alan Cox <alc@FreeBSD.org> | 2003-09-17 06:55:42 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2003-09-17 06:55:42 +0000 |
commit | 4b5f5531792294f5aa0a2bc9a0c6260e21ece925 (patch) | |
tree | a7d31037fc37767ec39809a0c6df316b38ee502d /sys/vm/vm_pageout.c | |
parent | 9e3275a35bd5cf88cf676b1c4d2033dbce846846 (diff) | |
download | src-4b5f5531792294f5aa0a2bc9a0c6260e21ece925.tar.gz src-4b5f5531792294f5aa0a2bc9a0c6260e21ece925.zip |
When calling vget() on a vnode-backed vm object, acquire the vnode
interlock before releasing the vm object's lock.
Notes
Notes:
svn path=/head/; revision=120150
Diffstat (limited to 'sys/vm/vm_pageout.c')
-rw-r--r-- | sys/vm/vm_pageout.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 18c9df9d3f7c..4da592e095da 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -926,13 +926,14 @@ rescan0: */ if (object->type == OBJT_VNODE) { vp = object->handle; - mp = NULL; if (vp->v_type == VREG) vn_start_write(vp, &mp, V_NOWAIT); vm_page_unlock_queues(); + VI_LOCK(vp); VM_OBJECT_UNLOCK(object); - if (vget(vp, LK_EXCLUSIVE|LK_TIMELOCK, curthread)) { + if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK | + LK_TIMELOCK, curthread)) { VM_OBJECT_LOCK(object); vm_page_lock_queues(); ++pageout_lock_miss; |