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; }