From 993a8b776ff708dcc5437916342bacef8010cea9 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 6 Aug 2008 23:02:59 +0000 Subject: [PATCH] VMCache::RemoveArea(): Don't release the store reference while having the cache locked, since it enters the VFS and might reenter VMCache, thus causing deadlocks. Fixes bug #2577. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26849 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/vm_cache.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/vm/vm_cache.cpp b/src/system/kernel/vm/vm_cache.cpp index 14e472746a..84e9451239 100644 --- a/src/system/kernel/vm/vm_cache.cpp +++ b/src/system/kernel/vm/vm_cache.cpp @@ -667,6 +667,12 @@ VMCache::RemoveArea(vm_area* area) T(RemoveArea(this, area)); + // We release the store reference first, since otherwise we would reverse + // the locking order or even deadlock ourselves (... -> free_vnode() -> ... + // -> bfs_remove_vnode() -> ... -> file_cache_set_size() -> mutex_lock()). + // Also cf. _RemoveConsumer(). + ReleaseStoreRef(); + AutoLocker locker(this); if (area->cache_prev) @@ -676,8 +682,6 @@ VMCache::RemoveArea(vm_area* area) if (areas == area) areas = area->cache_next; - ReleaseStoreRef(); - return B_OK; }