summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-11-20 10:06:52 +0100
committerSimon Rettberg2015-11-20 10:06:52 +0100
commit40d6b788fdc3e464c2cc159ab4ee8a496172341e (patch)
tree1b1e0674c66fc2667abc2252b982a34e69e44f13
parent[SERVER] Check uplink server for newer revision than local if client requests... (diff)
downloaddnbd3-40d6b788fdc3e464c2cc159ab4ee8a496172341e.tar.gz
dnbd3-40d6b788fdc3e464c2cc159ab4ee8a496172341e.tar.xz
dnbd3-40d6b788fdc3e464c2cc159ab4ee8a496172341e.zip
[SERVER] Improve image related locking
-rw-r--r--src/server/image.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/server/image.c b/src/server/image.c
index 06f669d..fccc2a9 100644
--- a/src/server/image.c
+++ b/src/server/image.c
@@ -175,9 +175,15 @@ void image_markComplete(dnbd3_image_t *image)
*/
void image_saveAllCacheMaps()
{
+ spin_lock( &imageListLock );
for (int i = 0; i < _num_images; ++i) {
+ _images[i]->users++;
+ spin_unlock( &imageListLock );
image_saveCacheMap( _images[i] );
+ spin_lock( &imageListLock );
+ _images[i]->users--;
}
+ spin_unlock( &imageListLock );
}
/**
@@ -359,8 +365,8 @@ void image_remove(dnbd3_image_t *image)
_images[i] = NULL;
if ( i + 1 == _num_images ) _num_images--;
}
- spin_unlock( &image->lock );
if ( image->users <= 0 ) image = image_free( image );
+ spin_unlock( &image->lock );
spin_unlock( &imageListLock );
}