mirror of https://github.com/xqemu/xqemu.git
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 <pasteka@kabsi.at> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
a04eca108e
commit
7f2039f611
31
block/vmdk.c
31
block/vmdk.c
|
@ -1442,6 +1442,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||||
int fd, idx = 0;
|
int fd, idx = 0;
|
||||||
char desc[BUF_SIZE];
|
char desc[BUF_SIZE];
|
||||||
int64_t total_size = 0, filesize;
|
int64_t total_size = 0, filesize;
|
||||||
|
const char *adapter_type = NULL;
|
||||||
const char *backing_file = NULL;
|
const char *backing_file = NULL;
|
||||||
const char *fmt = NULL;
|
const char *fmt = NULL;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
@ -1453,6 +1454,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||||
const char *desc_extent_line;
|
const char *desc_extent_line;
|
||||||
char parent_desc_line[BUF_SIZE] = "";
|
char parent_desc_line[BUF_SIZE] = "";
|
||||||
uint32_t parent_cid = 0xffffffff;
|
uint32_t parent_cid = 0xffffffff;
|
||||||
|
uint32_t number_heads = 16;
|
||||||
const char desc_template[] =
|
const char desc_template[] =
|
||||||
"# Disk DescriptorFile\n"
|
"# Disk DescriptorFile\n"
|
||||||
"version=1\n"
|
"version=1\n"
|
||||||
|
@ -1469,9 +1471,9 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||||
"\n"
|
"\n"
|
||||||
"ddb.virtualHWVersion = \"%d\"\n"
|
"ddb.virtualHWVersion = \"%d\"\n"
|
||||||
"ddb.geometry.cylinders = \"%" PRId64 "\"\n"
|
"ddb.geometry.cylinders = \"%" PRId64 "\"\n"
|
||||||
"ddb.geometry.heads = \"16\"\n"
|
"ddb.geometry.heads = \"%d\"\n"
|
||||||
"ddb.geometry.sectors = \"63\"\n"
|
"ddb.geometry.sectors = \"63\"\n"
|
||||||
"ddb.adapterType = \"ide\"\n";
|
"ddb.adapterType = \"%s\"\n";
|
||||||
|
|
||||||
if (filename_decompose(filename, path, prefix, postfix, PATH_MAX)) {
|
if (filename_decompose(filename, path, prefix, postfix, PATH_MAX)) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1480,6 +1482,8 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||||
while (options && options->name) {
|
while (options && options->name) {
|
||||||
if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
|
if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
|
||||||
total_size = options->value.n;
|
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)) {
|
} else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
|
||||||
backing_file = options->value.s;
|
backing_file = options->value.s;
|
||||||
} else if (!strcmp(options->name, BLOCK_OPT_COMPAT6)) {
|
} else if (!strcmp(options->name, BLOCK_OPT_COMPAT6)) {
|
||||||
|
@ -1489,6 +1493,20 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||||
}
|
}
|
||||||
options++;
|
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) {
|
if (!fmt) {
|
||||||
/* Default format to monolithicSparse */
|
/* Default format to monolithicSparse */
|
||||||
fmt = "monolithicSparse";
|
fmt = "monolithicSparse";
|
||||||
|
@ -1576,7 +1594,8 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||||
parent_desc_line,
|
parent_desc_line,
|
||||||
ext_desc_lines,
|
ext_desc_lines,
|
||||||
(flags & BLOCK_FLAG_COMPAT6 ? 6 : 4),
|
(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) {
|
if (split || flat) {
|
||||||
fd = qemu_open(filename,
|
fd = qemu_open(filename,
|
||||||
O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
|
O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
|
||||||
|
@ -1660,6 +1679,12 @@ static QEMUOptionParameter vmdk_create_options[] = {
|
||||||
.type = OPT_SIZE,
|
.type = OPT_SIZE,
|
||||||
.help = "Virtual disk size"
|
.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,
|
.name = BLOCK_OPT_BACKING_FILE,
|
||||||
.type = OPT_STRING,
|
.type = OPT_STRING,
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
#define BLOCK_OPT_SUBFMT "subformat"
|
#define BLOCK_OPT_SUBFMT "subformat"
|
||||||
#define BLOCK_OPT_COMPAT_LEVEL "compat"
|
#define BLOCK_OPT_COMPAT_LEVEL "compat"
|
||||||
#define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts"
|
#define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts"
|
||||||
|
#define BLOCK_OPT_ADAPTER_TYPE "adapter_type"
|
||||||
|
|
||||||
typedef struct BdrvTrackedRequest BdrvTrackedRequest;
|
typedef struct BdrvTrackedRequest BdrvTrackedRequest;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue