From 9e2e48ff31cea669cfc9c1476f49b815ea9ac1b1 Mon Sep 17 00:00:00 2001 From: Brett Mastbergen Date: Wed, 2 Oct 2019 10:28:16 -0400 Subject: tools: qemu: Add patches to support adapter_type and monolithicFlat Its way more trouble to update this to a newer version of qemu than it is to backport the two additional features we need. Signed-off-by: Brett Mastbergen --- ...-selecting-SCSI-adapter-in-image-creation.patch | 114 +++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tools/qemu/patches/0012-vmdk-Allow-selecting-SCSI-adapter-in-image-creation.patch (limited to 'tools/qemu/patches/0012-vmdk-Allow-selecting-SCSI-adapter-in-image-creation.patch') diff --git a/tools/qemu/patches/0012-vmdk-Allow-selecting-SCSI-adapter-in-image-creation.patch b/tools/qemu/patches/0012-vmdk-Allow-selecting-SCSI-adapter-in-image-creation.patch new file mode 100644 index 0000000000..fc3dee361e --- /dev/null +++ b/tools/qemu/patches/0012-vmdk-Allow-selecting-SCSI-adapter-in-image-creation.patch @@ -0,0 +1,114 @@ +From 5483df4df2729a5d1e4888a48039b1cd90438480 Mon Sep 17 00:00:00 2001 +From: Othmar Pasteka +Date: Wed, 30 Jan 2013 00:26:52 +0100 +Subject: [PATCH 12/12] vmdk: Allow selecting SCSI adapter in image creation + +Introduce a new option "adapter_type" when converting to vmdk images. +It can be one of the following: ide (default), buslogic, lsilogic +or legacyESX (according to the vmdk spec from vmware). + +In case of a non-ide adapter, heads is set to 255 instead of the 16. +The latter is used for "ide". + +Also see LP#545089 + +Signed-off-by: Othmar Pasteka +Signed-off-by: Stefan Hajnoczi +--- + block/vmdk.c | 31 ++++++++++++++++++++++++++++--- + block_int.h | 1 + + 2 files changed, 29 insertions(+), 3 deletions(-) + +--- a/block/vmdk.c ++++ b/block/vmdk.c +@@ -1089,6 +1089,7 @@ static int vmdk_create(const char *filen + int fd, idx = 0; + char desc[BUF_SIZE]; + int64_t total_size = 0, filesize; ++ const char *adapter_type = NULL; + const char *backing_file = NULL; + const char *fmt = NULL; + int flags = 0; +@@ -1100,6 +1101,7 @@ static int vmdk_create(const char *filen + const char *desc_extent_line; + char parent_desc_line[BUF_SIZE] = ""; + uint32_t parent_cid = 0xffffffff; ++ uint32_t number_heads = 16; + const char desc_template[] = + "# Disk DescriptorFile\n" + "version=1\n" +@@ -1116,9 +1118,9 @@ static int vmdk_create(const char *filen + "\n" + "ddb.virtualHWVersion = \"%d\"\n" + "ddb.geometry.cylinders = \"%" PRId64 "\"\n" +- "ddb.geometry.heads = \"16\"\n" ++ "ddb.geometry.heads = \"%d\"\n" + "ddb.geometry.sectors = \"63\"\n" +- "ddb.adapterType = \"ide\"\n"; ++ "ddb.adapterType = \"%s\"\n"; + + if (filename_decompose(filename, path, prefix, postfix, PATH_MAX)) { + return -EINVAL; +@@ -1127,6 +1129,8 @@ static int vmdk_create(const char *filen + while (options && options->name) { + if (!strcmp(options->name, BLOCK_OPT_SIZE)) { + total_size = options->value.n; ++ } else if (!strcmp(options->name, BLOCK_OPT_ADAPTER_TYPE)) { ++ adapter_type = options->value.s; + } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) { + backing_file = options->value.s; + } else if (!strcmp(options->name, BLOCK_OPT_COMPAT6)) { +@@ -1136,6 +1140,20 @@ static int vmdk_create(const char *filen + } + options++; + } ++ if (!adapter_type) { ++ adapter_type = "ide"; ++ } else if (strcmp(adapter_type, "ide") && ++ strcmp(adapter_type, "buslogic") && ++ strcmp(adapter_type, "lsilogic") && ++ strcmp(adapter_type, "legacyESX")) { ++ fprintf(stderr, "VMDK: Unknown adapter type: '%s'.\n", adapter_type); ++ return -EINVAL; ++ } ++ if (strcmp(adapter_type, "ide") != 0) { ++ /* that's the number of heads with which vmware operates when ++ creating, exporting, etc. vmdk files with a non-ide adapter type */ ++ number_heads = 255; ++ } + if (!fmt) { + /* Default format to monolithicSparse */ + fmt = "monolithicSparse"; +@@ -1222,7 +1240,8 @@ static int vmdk_create(const char *filen + parent_desc_line, + ext_desc_lines, + (flags & BLOCK_FLAG_COMPAT6 ? 6 : 4), +- total_size / (int64_t)(63 * 16 * 512)); ++ total_size / (int64_t)(63 * number_heads * 512), number_heads, ++ adapter_type); + if (split || flat) { + fd = open( + filename, +@@ -1281,6 +1300,12 @@ static QEMUOptionParameter vmdk_create_o + .help = "Virtual disk size" + }, + { ++ .name = BLOCK_OPT_ADAPTER_TYPE, ++ .type = OPT_STRING, ++ .help = "Virtual adapter type, can be one of " ++ "ide (default), lsilogic, buslogic or legacyESX" ++ }, ++ { + .name = BLOCK_OPT_BACKING_FILE, + .type = OPT_STRING, + .help = "File name of a base image" +--- a/block_int.h ++++ b/block_int.h +@@ -40,6 +40,7 @@ + #define BLOCK_OPT_TABLE_SIZE "table_size" + #define BLOCK_OPT_PREALLOC "preallocation" + #define BLOCK_OPT_SUBFMT "subformat" ++#define BLOCK_OPT_ADAPTER_TYPE "adapter_type" + + typedef struct AIOPool { + void (*cancel)(BlockDriverAIOCB *acb); -- cgit v1.2.3