map_backing_store() would deadlock in error case for REGION_PRIVATE_MAP.
Closes #1379. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21914 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
d3ce129ef3
commit
5c806b5dbc
@ -1000,6 +1000,7 @@ insert_area(vm_address_space *addressSpace, void **_address,
|
|||||||
|
|
||||||
/*! You need to hold the lock of the cache and the write lock of the address
|
/*! You need to hold the lock of the cache and the write lock of the address
|
||||||
space when calling this function.
|
space when calling this function.
|
||||||
|
Note, that in case of error your cache will be temporarily unlocked.
|
||||||
*/
|
*/
|
||||||
static status_t
|
static status_t
|
||||||
map_backing_store(vm_address_space *addressSpace, vm_cache *cache,
|
map_backing_store(vm_address_space *addressSpace, vm_cache *cache,
|
||||||
@ -1022,6 +1023,7 @@ map_backing_store(vm_address_space *addressSpace, vm_cache *cache,
|
|||||||
|
|
||||||
// if this is a private map, we need to create a new cache & store object
|
// if this is a private map, we need to create a new cache & store object
|
||||||
// pair to handle the private copies of pages as they are written to
|
// pair to handle the private copies of pages as they are written to
|
||||||
|
vm_cache* sourceCache = cache;
|
||||||
if (mapping == REGION_PRIVATE_MAP) {
|
if (mapping == REGION_PRIVATE_MAP) {
|
||||||
vm_cache *newCache;
|
vm_cache *newCache;
|
||||||
vm_store *newStore;
|
vm_store *newStore;
|
||||||
@ -1091,9 +1093,13 @@ map_backing_store(vm_address_space *addressSpace, vm_cache *cache,
|
|||||||
|
|
||||||
err2:
|
err2:
|
||||||
if (mapping == REGION_PRIVATE_MAP) {
|
if (mapping == REGION_PRIVATE_MAP) {
|
||||||
// we created this cache, so we must delete it again
|
// We created this cache, so we must delete it again. Note, that we
|
||||||
|
// need to temporarily unlock the source cache or we'll otherwise
|
||||||
|
// deadlock, since vm_cache_remove_consumer will try to lock it too.
|
||||||
mutex_unlock(&cache->lock);
|
mutex_unlock(&cache->lock);
|
||||||
|
mutex_unlock(&sourceCache->lock);
|
||||||
vm_cache_release_ref(cache);
|
vm_cache_release_ref(cache);
|
||||||
|
mutex_lock(&sourceCache->lock);
|
||||||
}
|
}
|
||||||
err1:
|
err1:
|
||||||
free(area->name);
|
free(area->name);
|
||||||
|
Loading…
Reference in New Issue
Block a user