summaryrefslogtreecommitdiffstats
path: root/src/server/image.c
diff options
context:
space:
mode:
authorsr2013-07-08 18:46:26 +0200
committersr2013-07-08 18:46:26 +0200
commitdc81a51d59ccf31a5b47b989060a626e97a3d709 (patch)
treebf4219d12573c91efe53ae0941dc0a95cca3caa6 /src/server/image.c
parentNotes about locks (diff)
downloaddnbd3-dc81a51d59ccf31a5b47b989060a626e97a3d709.tar.gz
dnbd3-dc81a51d59ccf31a5b47b989060a626e97a3d709.tar.xz
dnbd3-dc81a51d59ccf31a5b47b989060a626e97a3d709.zip
Rewriting....
Diffstat (limited to 'src/server/image.c')
-rw-r--r--src/server/image.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/server/image.c b/src/server/image.c
new file mode 100644
index 0000000..8a2b943
--- /dev/null
+++ b/src/server/image.c
@@ -0,0 +1,38 @@
+#include "image.h"
+
+#include <glib/gmacros.h>
+#include <assert.h>
+
+int image_is_complete(dnbd3_image_t *image)
+{
+ assert(image != NULL);
+ if (image->working && image->cache_map == NULL) {
+ return TRUE;
+ }
+ if (image->filesize == 0 || !image->working) {
+ return FALSE;
+ }
+ int complete = TRUE, j;
+ const int map_len_bytes = IMGSIZE_TO_MAPBYTES(image->filesize);
+ for (j = 0; j < map_len_bytes - 1; ++j)
+ {
+ if (image->cache_map[j] != 0xFF)
+ {
+ complete = FALSE;
+ break;
+ }
+ }
+ if (complete) // Every block except the last one is complete
+ { // Last one might need extra treatment if it's not a full byte
+ const int blocks_in_last_byte = (image->filesize >> 12) & 7;
+ uint8_t last_byte = 0;
+ if (blocks_in_last_byte == 0) {
+ last_byte = 0xFF;
+ } else {
+ for (j = 0; j < blocks_in_last_byte; ++j)
+ last_byte |= (1 << j);
+ }
+ complete = ((image->cache_map[map_len_bytes - 1] & last_byte) == last_byte);
+ }
+ return complete;
+}