Signed-off-by: Benoit Canet <ben...@irqsave.net> --- block/qcow2-dedup.c | 14 ++++++++++++++ block/qcow2.c | 5 +++++ configure | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+)
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c index 28001c6..bd8397e 100644 --- a/block/qcow2-dedup.c +++ b/block/qcow2-dedup.c @@ -30,6 +30,9 @@ #include "block/block_int.h" #include "qemu-common.h" #include "qcow2.h" +#ifdef CONFIG_SKEIN_DEDUP +#include <skeinApi.h> +#endif static int qcow2_dedup_read_write_hash(BlockDriverState *bs, QCowHash *hash, @@ -202,6 +205,17 @@ static int qcow2_compute_cluster_hash(BlockDriverState *bs, case QCOW_HASH_SHA256: return gnutls_hash_fast(GNUTLS_DIG_SHA256, data, s->cluster_size, hash->data); +#if defined(CONFIG_SKEIN_DEDUP) + case QCOW_HASH_SKEIN: + { + SkeinCtx_t ctx; + skeinCtxPrepare(&ctx, Skein256); + skeinInit(&ctx, Skein256); + skeinUpdate(&ctx, data, s->cluster_size); + skeinFinal(&ctx, hash->data); + } + return 0; +#endif default: error_report("Invalid deduplication hash algorithm %i", s->dedup_hash_algo); diff --git a/block/qcow2.c b/block/qcow2.c index 13f6a5c..0154d50 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1540,6 +1540,11 @@ static int8_t qcow2_get_dedup_hash_algo(char *value) if (!strcmp(value, "sha256")) { return QCOW_HASH_SHA256; } +#if defined(CONFIG_SKEIN_DEDUP) + if (!strcmp(value, "skein")) { + return QCOW_HASH_SKEIN; + } +#endif error_printf("Unsupported deduplication hash algorithm.\n"); return -EINVAL; diff --git a/configure b/configure index 390326e..97497af 100755 --- a/configure +++ b/configure @@ -223,6 +223,7 @@ libiscsi="" coroutine="" seccomp="" glusterfs="" +skein_dedup="no" # parse CC options first for opt do @@ -882,6 +883,8 @@ for opt do ;; --enable-glusterfs) glusterfs="yes" ;; + --enable-skein-dedup) skein_dedup="yes" + ;; *) echo "ERROR: unknown option $opt"; show_help="yes" ;; esac @@ -1130,6 +1133,7 @@ echo " --with-coroutine=BACKEND coroutine backend. Supported options:" echo " gthread, ucontext, sigaltstack, windows" echo " --enable-glusterfs enable GlusterFS backend" echo " --disable-glusterfs disable GlusterFS backend" +echo " --enable-skein-dedup enable computing dedup hashes with SKEIN" echo "" echo "NOTE: The object files are built at the place where configure is launched" exit 1 @@ -2412,6 +2416,30 @@ EOF fi fi +########################################## +# SKEIN dedup hash function probe +if test "$skein_dedup" != "no" ; then + cat > $TMPC <<EOF +#include <skeinApi.h> +int main(void) { + SkeinCtx_t ctx; + skeinCtxPrepare(&ctx, 512); + return 0; +} +EOF + skein_libs="-lskein3fish" + if compile_prog "" "$skein_libs" ; then + skein_dedup=yes + libs_tools="$skein_libs $libs_tools" + libs_softmmu="$skein_libs $libs_softmmu" + else + if test "$skein_dedup" = "yes" ; then + feature_not_found "libskein3fish not found" + fi + skein_dedup=no + fi +fi + # # Check for xxxat() functions when we are building linux-user # emulator. This is done because older glibc versions don't @@ -3296,6 +3324,7 @@ echo "build guest agent $guest_agent" echo "seccomp support $seccomp" echo "coroutine backend $coroutine_backend" echo "GlusterFS support $glusterfs" +echo "SKEIN support $skein_dedup" if test "$sdl_too_old" = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -3637,6 +3666,10 @@ if test "$glusterfs" = "yes" ; then echo "CONFIG_GLUSTERFS=y" >> $config_host_mak fi +if test "$skein_dedup" = "yes" ; then + echo "CONFIG_SKEIN_DEDUP=y" >> $config_host_mak +fi + # USB host support case "$usb" in linux) -- 1.7.10.4