X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;ds=sidebyside;f=debian%2Fpatches%2Fpve%2F0011-introduce-new-vma-archive-format.patch;h=92523a3de58fb8f1516b83d717080b58ffa10e79;hb=1a91ab45b7b886b5a4d2b12a559e4b239eccceed;hp=3e0fab32365efa9382f0ed4b6116f15e3e4d0d64;hpb=ca0fe5f5a34450a040edc30d3e4076971059b0b0;p=pve-qemu-kvm.git diff --git a/debian/patches/pve/0011-introduce-new-vma-archive-format.patch b/debian/patches/pve/0011-introduce-new-vma-archive-format.patch index 3e0fab3..92523a3 100644 --- a/debian/patches/pve/0011-introduce-new-vma-archive-format.patch +++ b/debian/patches/pve/0011-introduce-new-vma-archive-format.patch @@ -1,7 +1,7 @@ -From 04b6468a295871877b55fe792c566839e2afe29c Mon Sep 17 00:00:00 2001 +From c1338b34ccac2c5e6d7d1aca3ca3e3457a3f744c Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 13 Nov 2012 11:11:38 +0100 -Subject: [PATCH 11/41] introduce new vma archive format +Subject: [PATCH 11/47] introduce new vma archive format This is a very simple archive format, see docs/specs/vma_spec.txt @@ -9,55 +9,55 @@ Signed-off-by: Dietmar Maurer --- Makefile | 3 +- Makefile.objs | 1 + - vma-reader.c | 799 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - vma-writer.c | 876 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - vma.c | 582 ++++++++++++++++++++++++++++++++++++++ + vma-reader.c | 797 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + vma-writer.c | 870 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + vma.c | 586 +++++++++++++++++++++++++++++++++++++++ vma.h | 146 ++++++++++ - 6 files changed, 2406 insertions(+), 1 deletion(-) + 6 files changed, 2402 insertions(+), 1 deletion(-) create mode 100644 vma-reader.c create mode 100644 vma-writer.c create mode 100644 vma.c create mode 100644 vma.h diff --git a/Makefile b/Makefile -index 930ac27..6cedc40 100644 +index 6c359b2..edbc8b5 100644 --- a/Makefile +++ b/Makefile -@@ -166,7 +166,7 @@ ifneq ($(wildcard config-host.mak),) - include $(SRC_PATH)/tests/Makefile +@@ -284,7 +284,7 @@ ifneq ($(wildcard config-host.mak),) + include $(SRC_PATH)/tests/Makefile.include endif -all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules +all: $(DOCS) $(TOOLS) vma$(EXESUF) $(HELPERS-y) recurse-all modules - config-host.h: config-host.h-timestamp - config-host.h-timestamp: config-host.mak -@@ -235,6 +235,7 @@ qemu-img.o: qemu-img-cmds.h - qemu-img$(EXESUF): qemu-img.o $(block-obj-y) $(crypto-obj-y) $(qom-obj-y) libqemuutil.a libqemustub.a - qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) $(crypto-obj-y) $(qom-obj-y) libqemuutil.a libqemustub.a - qemu-io$(EXESUF): qemu-io.o $(block-obj-y) $(crypto-obj-y) $(qom-obj-y) libqemuutil.a libqemustub.a -+vma$(EXESUF): vma.o vma-reader.o $(block-obj-y) $(crypto-obj-y) $(qom-obj-y) libqemuutil.a libqemustub.a + qemu-version.h: FORCE + $(call quiet-command, \ +@@ -377,6 +377,7 @@ qemu-img.o: qemu-img-cmds.h + qemu-img$(EXESUF): qemu-img.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS) + qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS) + qemu-io$(EXESUF): qemu-io.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS) ++vma$(EXESUF): vma.o vma-reader.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS) - qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o + qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS) diff --git a/Makefile.objs b/Makefile.objs -index 77be052..97d2bcc 100644 +index 6167e7b..9b12ee6 100644 --- a/Makefile.objs +++ b/Makefile.objs -@@ -14,6 +14,7 @@ block-obj-$(CONFIG_POSIX) += aio-posix.o - block-obj-$(CONFIG_WIN32) += aio-win32.o +@@ -14,6 +14,7 @@ block-obj-y += block.o blockjob.o block-obj-y += block/ block-obj-y += qemu-io-cmds.o + block-obj-$(CONFIG_REPLICATION) += replication.o +block-obj-y += vma-writer.o block-obj-m = block/ diff --git a/vma-reader.c b/vma-reader.c new file mode 100644 -index 0000000..bc36cba +index 0000000..51dd8fe --- /dev/null +++ b/vma-reader.c -@@ -0,0 +1,799 @@ +@@ -0,0 +1,797 @@ +/* + * VMA: Virtual Machine Archive + * @@ -71,14 +71,7 @@ index 0000000..bc36cba + * + */ + -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++#include "qemu/osdep.h" +#include +#include + @@ -87,8 +80,7 @@ index 0000000..bc36cba +#include "qemu/ratelimit.h" +#include "vma.h" +#include "block/block.h" -+ -+#define BITS_PER_LONG (sizeof(unsigned long) * CHAR_BIT) ++#include "sysemu/block-backend.h" + +static unsigned char zero_vma_block[VMA_BLOCK_SIZE]; + @@ -502,7 +494,13 @@ index 0000000..bc36cba + assert(vmar->rstate[dev_id].bs == NULL); + + int64_t size = bdrv_getlength(bs); -+ if (size != vmar->devinfo[dev_id].size) { ++ int64_t size_diff = size - vmar->devinfo[dev_id].size; ++ ++ /* storage types can have different size restrictions, so it ++ * is not always possible to create an image with exact size. ++ * So we tolerate a size difference up to 4MB. ++ */ ++ if ((size_diff < 0) || (size_diff > 4*1024*1024)) { + error_setg(errp, "vma_reader_register_bs for stream %s failed - " + "unexpected size %zd != %zd", vmar->devinfo[dev_id].devname, + size, vmar->devinfo[dev_id].size); @@ -859,10 +857,10 @@ index 0000000..bc36cba + diff --git a/vma-writer.c b/vma-writer.c new file mode 100644 -index 0000000..8a3fa1c +index 0000000..b0cf529 --- /dev/null +++ b/vma-writer.c -@@ -0,0 +1,876 @@ +@@ -0,0 +1,870 @@ +/* + * VMA: Virtual Machine Archive + * @@ -876,22 +874,16 @@ index 0000000..8a3fa1c + * + */ + -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++#include "qemu/osdep.h" +#include +#include + -+#include "qemu-common.h" +#include "vma.h" +#include "block/block.h" +#include "monitor/monitor.h" +#include "qemu/main-loop.h" ++#include "qemu/coroutine.h" ++#include "qemu/cutils.h" + +#define DEBUG_VMA 0 + @@ -1084,7 +1076,7 @@ index 0000000..8a3fa1c + VmaWriter *vmaw = opaque; + + DPRINTF("vma_co_continue_write\n"); -+ qemu_coroutine_enter(vmaw->co_writer, NULL); ++ qemu_coroutine_enter(vmaw->co_writer); +} + +static ssize_t coroutine_fn @@ -1102,7 +1094,7 @@ index 0000000..8a3fa1c + + vmaw->co_writer = qemu_coroutine_self(); + -+ aio_set_fd_handler(qemu_get_aio_context(), vmaw->fd, NULL, vma_co_continue_write, vmaw); ++ aio_set_fd_handler(qemu_get_aio_context(), vmaw->fd, false, NULL, vma_co_continue_write, vmaw); + + DPRINTF("vma_co_write wait until writable\n"); + qemu_coroutine_yield(); @@ -1129,7 +1121,7 @@ index 0000000..8a3fa1c + } + } + -+ aio_set_fd_handler(qemu_get_aio_context(), vmaw->fd, NULL, NULL, NULL); ++ aio_set_fd_handler(qemu_get_aio_context(), vmaw->fd, false, NULL, NULL, NULL); + + vmaw->co_writer = NULL; + @@ -1741,10 +1733,10 @@ index 0000000..8a3fa1c +} diff --git a/vma.c b/vma.c new file mode 100644 -index 0000000..86c117b +index 0000000..8732bfa --- /dev/null +++ b/vma.c -@@ -0,0 +1,582 @@ +@@ -0,0 +1,586 @@ +/* + * VMA: Virtual Machine Archive + * @@ -1758,20 +1750,15 @@ index 0000000..86c117b + * + */ + -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++#include "qemu/osdep.h" +#include + +#include "vma.h" +#include "qemu-common.h" +#include "qemu/error-report.h" +#include "qemu/main-loop.h" ++#include "qapi/qmp/qstring.h" ++#include "sysemu/char.h" /* qstring_from_str */ + +static void help(void) +{ @@ -2044,7 +2031,7 @@ index 0000000..86c117b + } + + BlockDriverState *bs = bdrv_new(); -+ if (errp || bdrv_open(&bs, devfn, NULL, NULL, flags, NULL, &errp)) { ++ if (errp || bdrv_open(&bs, devfn, NULL, NULL, flags, &errp)) { + g_error("can't open file %s - %s", devfn, + error_get_pretty(errp)); + } @@ -2140,7 +2127,7 @@ index 0000000..86c117b + +static int create_archive(int argc, char **argv) +{ -+ int i, c, res; ++ int i, c; + int verbose = 0; + const char *archivename; + GList *config_files = NULL; @@ -2209,12 +2196,11 @@ index 0000000..86c117b + char *devname = NULL; + path = extract_devname(path, &devname, ind++); + -+ BlockDriver *drv = NULL; + Error *errp = NULL; -+ BlockDriverState *bs = bdrv_new(); ++ BlockDriverState *bs; + -+ res = bdrv_open(&bs, path, NULL, NULL, BDRV_O_CACHE_WB , drv, &errp); -+ if (res < 0) { ++ bs = bdrv_open(path, NULL, NULL, 0, &errp); ++ if (!bs) { + unlink(archivename); + g_error("bdrv_open '%s' failed - %s", path, error_get_pretty(errp)); + } @@ -2231,8 +2217,8 @@ index 0000000..86c117b + job->vmaw = vmaw; + job->dev_id = dev_id; + -+ Coroutine *co = qemu_coroutine_create(backup_run); -+ qemu_coroutine_enter(co, job); ++ Coroutine *co = qemu_coroutine_create(backup_run, job); ++ qemu_coroutine_enter(co); + } + + VmaStatus vmastat; @@ -2270,6 +2256,16 @@ index 0000000..86c117b + if (vmastat.closed) { + break; + } ++ } else { ++ Coroutine *co = qemu_coroutine_create(backup_run_empty, vmaw); ++ qemu_coroutine_enter(co); ++ while (1) { ++ main_loop_wait(false); ++ vma_writer_get_status(vmaw, &vmastat); ++ if (vmastat.closed) { ++ break; ++ } ++ } + } + + bdrv_drain_all();