* [Qemu-devel] [Patch 3/4] [RFC] Zero Cluster Dedup, Offline dedup, qemu-img extentions
@ 2008-10-06 17:31 Shahar Frank
2008-10-06 17:46 ` Daniel P. Berrange
0 siblings, 1 reply; 3+ messages in thread
From: Shahar Frank @ 2008-10-06 17:31 UTC (permalink / raw)
To: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 8678 bytes --]
MDSUM Extension for the map verb
Signed-off-by: Shahar Frank <shaharf@qumranet.com>
diff --git a/Makefile b/Makefile
index 35061a4..21e43d5 100644
--- a/Makefile
+++ b/Makefile
@@ -187,7 +187,7 @@ libqemu_user.a: $(USER_OBJS)
######################################################################
qemu-img$(EXESUF): qemu-img.o qemu-tool.o osdep.o $(BLOCK_OBJS)
- $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
+ $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS) $(MD5SUMLIBS)
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
diff --git a/configure b/configure
index a224e6a..6420066 100755
--- a/configure
+++ b/configure
@@ -114,6 +114,7 @@ mixemu="no"
bluez="yes"
signalfd="no"
eventfd="no"
+md5sum="yes"
# OS specific
targetos=`uname -s`
@@ -346,6 +347,8 @@ for opt do
;;
--disable-aio) aio="no"
;;
+ --disable-md5sum) md5sum="no"
+ ;;
*) echo "ERROR: unknown option $opt"; show_help="yes"
;;
esac
@@ -448,6 +451,7 @@ echo " --enable-uname-release=R Return R for uname
-r in usermode emulation"
echo " --sparc_cpu=V Build qemu for Sparc architecture v7,
v8, v8plus, v8plusa, v9"
echo " --disable-vde disable support for vde network"
echo " --disable-aio disable AIO support"
+echo " --disable-md5sum disable MD5SUM support"
echo ""
echo "NOTE: The object files are built at the place where configure is
launched"
exit 1
@@ -489,6 +493,7 @@ if test "$mingw32" = "yes" ; then
linux_user="no"
fi
+MD5SUMLIBS=
if [ "$darwin" = "yes" -o "$mingw32" = "yes" ] ; then
AIOLIBS=
elif [ "$bsd" = "yes" ]; then
@@ -496,6 +501,7 @@ elif [ "$bsd" = "yes" ]; then
else
# Some Linux architectures (e.g. s390) don't imply -lpthread
automatically.
AIOLIBS="-lrt -lpthread"
+ MD5SUMLIBS="-lssl"
fi
# Check for gcc4, error if pre-gcc4
@@ -920,6 +926,20 @@ EOF
fi
##########################################
+# md5sum probe
+if test "$md5sum" = "yes" ; then
+ md5sum=no
+ cat > $TMPC << EOF
+#include <openssl/bio.h>
+#include <openssl/evp.h>
+int main(void) { return (int)BIO_new(BIO_s_mem()); }
+EOF
+ if $cc $ARCH_CFLAGS -o $TMPE $MD5SUMLIBS $TMPC 2> /dev/null ; then
+ md5sum=yes
+ fi
+fi
+
+##########################################
# signalfd probe
cat > $TMPC << EOF
#define _GNU_SOURCE
@@ -1018,6 +1038,7 @@ echo "uname -r $uname_release"
echo "NPTL support $nptl"
echo "vde support $vde"
echo "AIO support $aio"
+echo "md5sum support $md5sum"
if test $sdl_too_old = "yes"; then
echo "-> Your SDL version is too old - please upgrade to have SDL
support"
@@ -1064,6 +1085,7 @@ echo "CFLAGS=$CFLAGS" >> $config_mak
echo "LDFLAGS=$LDFLAGS" >> $config_mak
echo "EXESUF=$EXESUF" >> $config_mak
echo "AIOLIBS=$AIOLIBS" >> $config_mak
+echo "MD5SUMLIBS=$MD5SUMLIBS" >> $config_mak
case "$cpu" in
i386)
echo "ARCH=i386" >> $config_mak
@@ -1280,6 +1302,10 @@ if test "$aio" = "yes" ; then
echo "#define CONFIG_AIO 1" >> $config_h
echo "CONFIG_AIO=yes" >> $config_mak
fi
+if test "$md5sum" = "yes" ; then
+ echo "#define CONFIG_MD5SUM 1" >> $config_h
+ echo "CONFIG_MD5SUM=yes" >> $config_mak
+fi
if test "$signalfd" = "yes" ; then
echo "#define CONFIG_signalfd 1" >> $config_h
fi
diff --git a/qemu-img.c b/qemu-img.c
index c6fe43d..8cda447 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -77,6 +77,7 @@ static void help(void)
" '-e' indicates that the target image must be encrypted
(qcow format only)\n"
" '-6' indicates that the target image must use
compatibility level 6 (vmdk format only)\n"
" '-r' indicated that the base images are recursed in (for
info and map)\n"
+ " '-s' indicated that the md5sum of the clusters is to be
printed (for map)\n"
);
printf("\nSupported format:");
bdrv_iterate_format(format_print, NULL);
@@ -172,6 +173,79 @@ static int read_password(char *buf, int buf_size)
}
#endif
+
+#ifdef CONFIG_MD5SUM
+/* md5sum functiuons */
+
+#include <openssl/bio.h>
+#include <openssl/evp.h>
+
+#define MD5HASHSZ 16
+
+/* openssl buffering */
+BIO *bio;
+BIO *bio_md;
+
+static inline int update_hash_block(void *block, int len)
+{
+ return BIO_write(bio, block, len);
+}
+
+static inline int reset_hashing(void)
+{
+ return BIO_reset(bio);
+}
+
+static inline int get_hash(char *buf, int len)
+{
+ return BIO_gets(bio_md, buf, len);
+}
+
+static int compute_block_hash(void *buf, int bufsz, void *mdbuf, int
mdlen)
+{
+ int hashlen;
+
+ reset_hashing();
+ update_hash_block(buf, bufsz);
+ if ((hashlen = get_hash(mdbuf, mdlen)) < 0)
+ return -1;
+ return hashlen;
+}
+
+static int sprint_hash(char *buf, int bufsz, uint8_t * hash, int
hashsz)
+{
+ int i;
+
+ if (bufsz < hashsz * 2)
+ hashsz = bufsz / 2;
+ for (i = 0; i < hashsz; i++)
+ sprintf(buf + i * 2, "%02x", hash[i]);
+ if (i * 2 < bufsz)
+ buf[i * 2 + 1] = 0;
+ return i*2;
+}
+
+static int initialize_hashing(void)
+{
+ bio = BIO_new(BIO_s_mem());
+ if (!bio)
+ error("can't allocate bio struct");
+ bio_md = BIO_new(BIO_f_md());
+ if (!bio_md)
+ error("can't allocate bio_md struct");
+ if (BIO_set_md(bio_md, EVP_md5()) != 1)
+ error("can't set bio md");
+ bio = BIO_push(bio_md, bio);
+ if (!bio)
+ error("can't push hashing md to hashing bio");
+ reset_hashing();
+ return 0;
+}
+
+#else
+static int initialize_hashing(void) {};
+#endif
+
static BlockDriverState *bdrv_new_open(const char *filename,
const char *fmt)
{
@@ -348,6 +422,33 @@ static int img_commit(int argc, char **argv)
#define IO_BUF_SIZE 65536
+#ifdef CONFIG_MD5SUM
+static void
+sectors_sum_str(BlockDriverState *bs, uint64_t offset, int sectors,
char *str, int len)
+{
+ char buf[IO_BUF_SIZE];
+ char mdbuf[MD5HASHSZ];
+
+ if (sectors <= 0 || sectors > (IO_BUF_SIZE >> 9))
+ error("sectors_sum_str: bad sectors param %d", sectors);
+ if (bdrv_read(bs, offset >> 9, buf, sectors) < 0)
+ error("sectors_sum_str: error while reading offset 0x%"PRIx64,
offset);
+
+ if (compute_block_hash(buf, sectors << 9, mdbuf, sizeof mdbuf) < 0)
+ error("sectors_sum_str: can't compute hash");
+
+ sprint_hash(str, len, mdbuf, sizeof mdbuf);
+}
+#else
+static void
+sectors_sum_str(BlockDriverState *bs, uint64_t offset, int sectors,
char *str, int len)
+{
+ if (len > 0)
+ str[0] = 0;
+ return;
+}
+#endif
+
static int img_map(int argc, char **argv)
{
int c, ret = 0, cluster_size, cluster_sectors;
@@ -357,11 +458,12 @@ static int img_map(int argc, char **argv)
int64_t offset, poffset, e;
uint64_t bs_sectors;
BlockDriverInfo bdi;
- int local = 1;
+ int local = 1, sum = 0;
+ char sumstr[64];
fmt = NULL;
for(;;) {
- c = getopt(argc, argv, "f:hr");
+ c = getopt(argc, argv, "f:hrs");
if (c == -1)
break;
switch(c) {
@@ -374,6 +476,15 @@ static int img_map(int argc, char **argv)
case 'r':
local = 0;
break;
+ case 's':
+#ifdef CONFIG_MD5SUM
+ sum = 1;
+ sumstr[0] = ' ';
+ sumstr[1] = 0;
+#else
+ fprintf(stderr, "warning: md5sum is not supported\n");
+#endif
+ break;
}
}
if (optind >= argc)
@@ -408,12 +519,14 @@ static int img_map(int argc, char **argv)
for (offset = 0; offset < e; offset += cluster_size) {
poffset = bs->drv->bdrv_map(bs, offset, local, &store);
if (poffset > 0 || poffset == -ENOTSUP) {
+ if (sum)
+ sectors_sum_str(bs, offset, cluster_sectors, sumstr+1,
sizeof sumstr - 1);
if (poffset == -ENOTSUP)
poffset = 0;
- printf("%s 0x%016"PRIx64" 0x%016"PRIx64"\n",
- store->filename, offset, poffset);
+ printf("%s 0x%016"PRIx64" 0x%016"PRIx64"%s\n",
+ store->filename, offset, poffset, sumstr);
}
- if (poffset < 0) {
+ if (poffset < 0) {
ret = poffset;
break;
}
@@ -897,6 +1010,7 @@ int main(int argc, char **argv)
const char *cmd;
int ret = 0;
+ initialize_hashing();
bdrv_init();
if (argc < 2)
help();
[-- Attachment #2: 3-md5sum.patch --]
[-- Type: application/octet-stream, Size: 8284 bytes --]
diff --git a/Makefile b/Makefile
index 35061a4..21e43d5 100644
--- a/Makefile
+++ b/Makefile
@@ -187,7 +187,7 @@ libqemu_user.a: $(USER_OBJS)
######################################################################
qemu-img$(EXESUF): qemu-img.o qemu-tool.o osdep.o $(BLOCK_OBJS)
- $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
+ $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS) $(MD5SUMLIBS)
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
diff --git a/configure b/configure
index a224e6a..6420066 100755
--- a/configure
+++ b/configure
@@ -114,6 +114,7 @@ mixemu="no"
bluez="yes"
signalfd="no"
eventfd="no"
+md5sum="yes"
# OS specific
targetos=`uname -s`
@@ -346,6 +347,8 @@ for opt do
;;
--disable-aio) aio="no"
;;
+ --disable-md5sum) md5sum="no"
+ ;;
*) echo "ERROR: unknown option $opt"; show_help="yes"
;;
esac
@@ -448,6 +451,7 @@ echo " --enable-uname-release=R Return R for uname -r in usermode emulation"
echo " --sparc_cpu=V Build qemu for Sparc architecture v7, v8, v8plus, v8plusa, v9"
echo " --disable-vde disable support for vde network"
echo " --disable-aio disable AIO support"
+echo " --disable-md5sum disable MD5SUM support"
echo ""
echo "NOTE: The object files are built at the place where configure is launched"
exit 1
@@ -489,6 +493,7 @@ if test "$mingw32" = "yes" ; then
linux_user="no"
fi
+MD5SUMLIBS=
if [ "$darwin" = "yes" -o "$mingw32" = "yes" ] ; then
AIOLIBS=
elif [ "$bsd" = "yes" ]; then
@@ -496,6 +501,7 @@ elif [ "$bsd" = "yes" ]; then
else
# Some Linux architectures (e.g. s390) don't imply -lpthread automatically.
AIOLIBS="-lrt -lpthread"
+ MD5SUMLIBS="-lssl"
fi
# Check for gcc4, error if pre-gcc4
@@ -920,6 +926,20 @@ EOF
fi
##########################################
+# md5sum probe
+if test "$md5sum" = "yes" ; then
+ md5sum=no
+ cat > $TMPC << EOF
+#include <openssl/bio.h>
+#include <openssl/evp.h>
+int main(void) { return (int)BIO_new(BIO_s_mem()); }
+EOF
+ if $cc $ARCH_CFLAGS -o $TMPE $MD5SUMLIBS $TMPC 2> /dev/null ; then
+ md5sum=yes
+ fi
+fi
+
+##########################################
# signalfd probe
cat > $TMPC << EOF
#define _GNU_SOURCE
@@ -1018,6 +1038,7 @@ echo "uname -r $uname_release"
echo "NPTL support $nptl"
echo "vde support $vde"
echo "AIO support $aio"
+echo "md5sum support $md5sum"
if test $sdl_too_old = "yes"; then
echo "-> Your SDL version is too old - please upgrade to have SDL support"
@@ -1064,6 +1085,7 @@ echo "CFLAGS=$CFLAGS" >> $config_mak
echo "LDFLAGS=$LDFLAGS" >> $config_mak
echo "EXESUF=$EXESUF" >> $config_mak
echo "AIOLIBS=$AIOLIBS" >> $config_mak
+echo "MD5SUMLIBS=$MD5SUMLIBS" >> $config_mak
case "$cpu" in
i386)
echo "ARCH=i386" >> $config_mak
@@ -1280,6 +1302,10 @@ if test "$aio" = "yes" ; then
echo "#define CONFIG_AIO 1" >> $config_h
echo "CONFIG_AIO=yes" >> $config_mak
fi
+if test "$md5sum" = "yes" ; then
+ echo "#define CONFIG_MD5SUM 1" >> $config_h
+ echo "CONFIG_MD5SUM=yes" >> $config_mak
+fi
if test "$signalfd" = "yes" ; then
echo "#define CONFIG_signalfd 1" >> $config_h
fi
diff --git a/qemu-img.c b/qemu-img.c
index c6fe43d..8cda447 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -77,6 +77,7 @@ static void help(void)
" '-e' indicates that the target image must be encrypted (qcow format only)\n"
" '-6' indicates that the target image must use compatibility level 6 (vmdk format only)\n"
" '-r' indicated that the base images are recursed in (for info and map)\n"
+ " '-s' indicated that the md5sum of the clusters is to be printed (for map)\n"
);
printf("\nSupported format:");
bdrv_iterate_format(format_print, NULL);
@@ -172,6 +173,79 @@ static int read_password(char *buf, int buf_size)
}
#endif
+
+#ifdef CONFIG_MD5SUM
+/* md5sum functiuons */
+
+#include <openssl/bio.h>
+#include <openssl/evp.h>
+
+#define MD5HASHSZ 16
+
+/* openssl buffering */
+BIO *bio;
+BIO *bio_md;
+
+static inline int update_hash_block(void *block, int len)
+{
+ return BIO_write(bio, block, len);
+}
+
+static inline int reset_hashing(void)
+{
+ return BIO_reset(bio);
+}
+
+static inline int get_hash(char *buf, int len)
+{
+ return BIO_gets(bio_md, buf, len);
+}
+
+static int compute_block_hash(void *buf, int bufsz, void *mdbuf, int mdlen)
+{
+ int hashlen;
+
+ reset_hashing();
+ update_hash_block(buf, bufsz);
+ if ((hashlen = get_hash(mdbuf, mdlen)) < 0)
+ return -1;
+ return hashlen;
+}
+
+static int sprint_hash(char *buf, int bufsz, uint8_t * hash, int hashsz)
+{
+ int i;
+
+ if (bufsz < hashsz * 2)
+ hashsz = bufsz / 2;
+ for (i = 0; i < hashsz; i++)
+ sprintf(buf + i * 2, "%02x", hash[i]);
+ if (i * 2 < bufsz)
+ buf[i * 2 + 1] = 0;
+ return i*2;
+}
+
+static int initialize_hashing(void)
+{
+ bio = BIO_new(BIO_s_mem());
+ if (!bio)
+ error("can't allocate bio struct");
+ bio_md = BIO_new(BIO_f_md());
+ if (!bio_md)
+ error("can't allocate bio_md struct");
+ if (BIO_set_md(bio_md, EVP_md5()) != 1)
+ error("can't set bio md");
+ bio = BIO_push(bio_md, bio);
+ if (!bio)
+ error("can't push hashing md to hashing bio");
+ reset_hashing();
+ return 0;
+}
+
+#else
+static int initialize_hashing(void) {};
+#endif
+
static BlockDriverState *bdrv_new_open(const char *filename,
const char *fmt)
{
@@ -348,6 +422,33 @@ static int img_commit(int argc, char **argv)
#define IO_BUF_SIZE 65536
+#ifdef CONFIG_MD5SUM
+static void
+sectors_sum_str(BlockDriverState *bs, uint64_t offset, int sectors, char *str, int len)
+{
+ char buf[IO_BUF_SIZE];
+ char mdbuf[MD5HASHSZ];
+
+ if (sectors <= 0 || sectors > (IO_BUF_SIZE >> 9))
+ error("sectors_sum_str: bad sectors param %d", sectors);
+ if (bdrv_read(bs, offset >> 9, buf, sectors) < 0)
+ error("sectors_sum_str: error while reading offset 0x%"PRIx64, offset);
+
+ if (compute_block_hash(buf, sectors << 9, mdbuf, sizeof mdbuf) < 0)
+ error("sectors_sum_str: can't compute hash");
+
+ sprint_hash(str, len, mdbuf, sizeof mdbuf);
+}
+#else
+static void
+sectors_sum_str(BlockDriverState *bs, uint64_t offset, int sectors, char *str, int len)
+{
+ if (len > 0)
+ str[0] = 0;
+ return;
+}
+#endif
+
static int img_map(int argc, char **argv)
{
int c, ret = 0, cluster_size, cluster_sectors;
@@ -357,11 +458,12 @@ static int img_map(int argc, char **argv)
int64_t offset, poffset, e;
uint64_t bs_sectors;
BlockDriverInfo bdi;
- int local = 1;
+ int local = 1, sum = 0;
+ char sumstr[64];
fmt = NULL;
for(;;) {
- c = getopt(argc, argv, "f:hr");
+ c = getopt(argc, argv, "f:hrs");
if (c == -1)
break;
switch(c) {
@@ -374,6 +476,15 @@ static int img_map(int argc, char **argv)
case 'r':
local = 0;
break;
+ case 's':
+#ifdef CONFIG_MD5SUM
+ sum = 1;
+ sumstr[0] = ' ';
+ sumstr[1] = 0;
+#else
+ fprintf(stderr, "warning: md5sum is not supported\n");
+#endif
+ break;
}
}
if (optind >= argc)
@@ -408,12 +519,14 @@ static int img_map(int argc, char **argv)
for (offset = 0; offset < e; offset += cluster_size) {
poffset = bs->drv->bdrv_map(bs, offset, local, &store);
if (poffset > 0 || poffset == -ENOTSUP) {
+ if (sum)
+ sectors_sum_str(bs, offset, cluster_sectors, sumstr+1, sizeof sumstr - 1);
if (poffset == -ENOTSUP)
poffset = 0;
- printf("%s 0x%016"PRIx64" 0x%016"PRIx64"\n",
- store->filename, offset, poffset);
+ printf("%s 0x%016"PRIx64" 0x%016"PRIx64"%s\n",
+ store->filename, offset, poffset, sumstr);
}
- if (poffset < 0) {
+ if (poffset < 0) {
ret = poffset;
break;
}
@@ -897,6 +1010,7 @@ int main(int argc, char **argv)
const char *cmd;
int ret = 0;
+ initialize_hashing();
bdrv_init();
if (argc < 2)
help();
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [Patch 3/4] [RFC] Zero Cluster Dedup, Offline dedup, qemu-img extentions
2008-10-06 17:31 [Qemu-devel] [Patch 3/4] [RFC] Zero Cluster Dedup, Offline dedup, qemu-img extentions Shahar Frank
@ 2008-10-06 17:46 ` Daniel P. Berrange
2008-10-07 9:17 ` Shahar Frank
0 siblings, 1 reply; 3+ messages in thread
From: Daniel P. Berrange @ 2008-10-06 17:46 UTC (permalink / raw)
To: qemu-devel
On Mon, Oct 06, 2008 at 10:31:39AM -0700, Shahar Frank wrote:
> MDSUM Extension for the map verb
>
> Signed-off-by: Shahar Frank <shaharf@qumranet.com>
>
> @@ -496,6 +501,7 @@ elif [ "$bsd" = "yes" ]; then
> else
> # Some Linux architectures (e.g. s390) don't imply -lpthread
> automatically.
> AIOLIBS="-lrt -lpthread"
> + MD5SUMLIBS="-lssl"
> fi
>
> # Check for gcc4, error if pre-gcc4
> @@ -920,6 +926,20 @@ EOF
We're already linking to GCrypt/GNUTLS for SSL stuff in the VNC server, and
one crypto/SSL library per application really ought to be enough. GCrypt
has APIs for doing md5 hashing (and pretty much every other hashing algo
you can think of). Furthermore, OpenSSL's licensing terms are commonly
considered to be incompatible with the GPL, unless you add an explicit
exception allowing linking to OpenSSL.
Regards,
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [Qemu-devel] [Patch 3/4] [RFC] Zero Cluster Dedup, Offline dedup, qemu-img extentions
2008-10-06 17:46 ` Daniel P. Berrange
@ 2008-10-07 9:17 ` Shahar Frank
0 siblings, 0 replies; 3+ messages in thread
From: Shahar Frank @ 2008-10-07 9:17 UTC (permalink / raw)
To: Daniel P. Berrange, qemu-devel
> > MDSUM Extension for the map verb
> >
> > Signed-off-by: Shahar Frank <shaharf@qumranet.com>
> >
> > @@ -496,6 +501,7 @@ elif [ "$bsd" = "yes" ]; then
> > else
> > # Some Linux architectures (e.g. s390) don't imply -lpthread
> > automatically.
> > AIOLIBS="-lrt -lpthread"
> > + MD5SUMLIBS="-lssl"
> > fi
> >
> > # Check for gcc4, error if pre-gcc4
> > @@ -920,6 +926,20 @@ EOF
>
> We're already linking to GCrypt/GNUTLS for SSL stuff in the VNC
server,
> and
> one crypto/SSL library per application really ought to be enough.
GCrypt
> has APIs for doing md5 hashing (and pretty much every other hashing
algo
> you can think of). Furthermore, OpenSSL's licensing terms are commonly
> considered to be incompatible with the GPL, unless you add an explicit
> exception allowing linking to OpenSSL.
Thanks. I wasn't aware to this. I will change it to use GCrypt/GNUTLS.
Shahar
>
> Regards,
> Daniel
> --
> |: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/
> :|
> |: http://libvirt.org -o- http://virt-manager.org -o-
http://ovirt.org
> :|
> |: http://autobuild.org -o-
http://search.cpan.org/~danberr/
> :|
> |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B
9505
> :|
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-10-07 9:18 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-06 17:31 [Qemu-devel] [Patch 3/4] [RFC] Zero Cluster Dedup, Offline dedup, qemu-img extentions Shahar Frank
2008-10-06 17:46 ` Daniel P. Berrange
2008-10-07 9:17 ` Shahar Frank
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).