Signed-off-by: Benoit Canet <ben...@irqsave.net> --- block/qcow2-dedup.c | 15 +++++++++++++++ block/qcow2.c | 5 +++++ configure | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+)
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c index 599cb2e..606459f 100644 --- a/block/qcow2-dedup.c +++ b/block/qcow2-dedup.c @@ -33,6 +33,10 @@ #include <gnutls/crypto.h> #endif +#ifdef CONFIG_SKEIN_DEDUP +#include <skeinApi.h> +#endif + /* * Prepare a buffer containing everything required to compute cluster * sized deduplication hashes. @@ -153,6 +157,17 @@ static int qcow2_compute_cluster_hash(BlockDriverState *bs, return gnutls_hash_fast(GNUTLS_DIG_SHA256, data, s->cluster_size, hash->data); #endif +#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 11c115f..ea2f0f2 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1592,6 +1592,11 @@ static int8_t qcow2_get_dedup_hash_algo(char *value) if (!value || !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 34b26b2..902c3c1 100755 --- a/configure +++ b/configure @@ -241,6 +241,7 @@ gtkabi="2.0" tpm="no" libssh2="" sha256_dedup="yes" +skein_dedup="no" # parse CC options first for opt do @@ -935,6 +936,10 @@ for opt do ;; --enable-sha256-dedup) sha256_dedup="yes" ;; + --disable-skein-dedup) skein_dedup="no" + ;; + --enable-skein-dedup) skein_dedup="yes" + ;; *) echo "ERROR: unknown option $opt"; show_help="yes" ;; esac @@ -1202,6 +1207,7 @@ echo " --gcov=GCOV use specified gcov [$gcov_tool]" echo " --enable-tpm enable TPM support" echo " --disable-libssh2 disable ssh block device support" echo " --enable-libssh2 enable ssh block device support" +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 @@ -2613,6 +2619,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 @@ -3603,6 +3633,7 @@ echo "gcov enabled $gcov" echo "TPM support $tpm" echo "libssh2 support $libssh2" echo "TPM passthrough $tpm_passthrough" +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" @@ -3991,6 +4022,10 @@ if test "$sha256_dedup" = "yes" ; then echo "CONFIG_SHA256_DEDUP=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