| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- From 5483df4df2729a5d1e4888a48039b1cd90438480 Mon Sep 17 00:00:00 2001
- From: Othmar Pasteka <[email protected]>
- 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 <[email protected]>
- Signed-off-by: Stefan Hajnoczi <[email protected]>
- ---
- 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);
|