# HG changeset patch # User Pascal Bellard # Date 1453036213 -3600 # Node ID 8fe10eb4f215540cb4d741960868d7b93a526c9c # Parent abbb1698abc013a7d7b565f6e476baecedfbaaf5 cloop: deduplicate support diff -r abbb1698abc0 -r 8fe10eb4f215 fusecloop/stuff/fusecloop.u --- a/fusecloop/stuff/fusecloop.u Sun Jan 17 11:38:57 2016 +0100 +++ b/fusecloop/stuff/fusecloop.u Sun Jan 17 14:10:13 2016 +0100 @@ -1,6 +1,6 @@ --- compressed_loop.h +++ compressed_loop.h -@@ -41,6 +41,75 @@ +@@ -41,6 +41,80 @@ /* data_index (num_blocks 64bit pointers, network order)... */ /* compressed data (gzip block compressed format)... */ @@ -67,7 +67,12 @@ + offsets[i].size = ntohl(ofs32[i]); + for (i = 0, j = sizeof(struct cloop_head); i < n; i++) { + offsets[i].offset = j; -+ j += offsets[i].size; ++ if (offsets[i].size & 0x80000000) { ++ unsigned long k = offset[i].size & 0x7FFFFFFF; ++ offsets[i].offset = offsets[k].offset; ++ offsets[i].size = offsets[k].size; ++ } ++ else j += offsets[i].size; + } + return (char *) "32BE v3.0"; + } diff -r abbb1698abc0 -r 8fe10eb4f215 linux-cloop/stuff/cloop.u --- a/linux-cloop/stuff/cloop.u Sun Jan 17 11:38:57 2016 +0100 +++ b/linux-cloop/stuff/cloop.u Sun Jan 17 14:10:13 2016 +0100 @@ -1,6 +1,6 @@ --- cloop.h +++ cloop.h -@@ -20,6 +20,75 @@ +@@ -20,6 +20,80 @@ /* data_index (num_blocks 64bit pointers, network order)... */ /* compressed data (gzip block compressed format)... */ @@ -67,7 +67,12 @@ + offsets[i].size = ntohl(ofs32[i]); + for (i = 0, j = sizeof(struct cloop_head); i < n; i++) { + offsets[i].offset = j; -+ j += offsets[i].size; ++ if (offsets[i].size & 0x80000000) { ++ unsigned long k = offset[i].size & 0x7FFFFFFF; ++ offsets[i].offset = offsets[k].offset; ++ offsets[i].size = offsets[k].size; ++ } ++ else j += offsets[i].size; + } + return (char *) "32BE v3.0"; + } diff -r abbb1698abc0 -r 8fe10eb4f215 linux64-cloop/stuff/cloop.u --- a/linux64-cloop/stuff/cloop.u Sun Jan 17 11:38:57 2016 +0100 +++ b/linux64-cloop/stuff/cloop.u Sun Jan 17 14:10:13 2016 +0100 @@ -1,6 +1,6 @@ --- cloop.h +++ cloop.h -@@ -20,6 +20,75 @@ +@@ -20,6 +20,80 @@ /* data_index (num_blocks 64bit pointers, network order)... */ /* compressed data (gzip block compressed format)... */ @@ -67,7 +67,12 @@ + offsets[i].size = ntohl(ofs32[i]); + for (i = 0, j = sizeof(struct cloop_head); i < n; i++) { + offsets[i].offset = j; -+ j += offsets[i].size; ++ if (offsets[i].size & 0x80000000) { ++ unsigned long k = offset[i].size & 0x7FFFFFFF; ++ offsets[i].offset = offsets[k].offset; ++ offsets[i].size = offsets[k].size; ++ } ++ else j += offsets[i].size; + } + return (char *) "32BE v3.0"; + } diff -r abbb1698abc0 -r 8fe10eb4f215 qemu/stuff/cloop.u --- a/qemu/stuff/cloop.u Sun Jan 17 11:38:57 2016 +0100 +++ b/qemu/stuff/cloop.u Sun Jan 17 14:10:13 2016 +0100 @@ -1,6 +1,6 @@ --- block/cloop.c +++ block/cloop.c -@@ -29,11 +29,85 @@ +@@ -29,11 +29,90 @@ /* Maximum compressed block size */ #define MAX_BLOCK_SIZE (64 * 1024 * 1024) @@ -72,7 +72,12 @@ + } + for (i = 0, j = 128 + 4 + 4; i < n; i++) { + offsets[i].offset = j; -+ j += offsets[i].size; ++ if (offsets[i].size & 0x80000000) { ++ unsigned long k = offset[i].size & 0x7FFFFFFF; ++ offsets[i].offset = offsets[k].offset; ++ offsets[i].size = offsets[k].size; ++ } ++ else j += offsets[i].size; + } + } + return 0;