Support transient attribute on vmware disks

vmx/vmx.c ignores the transient attribute on the disk xml format. This patch
adds a 1-1 relationship between it and [disk].mode = "independent-nonpersistent".

The other modes are ignored as before. It works in my testing.

https://bugzilla.redhat.com/show_bug.cgi?id=1044023

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Wout Mertens 2013-12-17 18:04:35 +01:00 committed by Eric Blake
parent eafe4076ea
commit 5d7e4f0cf3
1 changed files with 17 additions and 0 deletions

View File

@ -1980,6 +1980,9 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
char writeThrough_name[32] = ""; char writeThrough_name[32] = "";
bool writeThrough = false; bool writeThrough = false;
char mode_name[32] = "";
char *mode = NULL;
if (def == NULL || *def != NULL) { if (def == NULL || *def != NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
return -1; return -1;
@ -2093,6 +2096,7 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
VMX_BUILD_NAME(fileType); VMX_BUILD_NAME(fileType);
VMX_BUILD_NAME(fileName); VMX_BUILD_NAME(fileName);
VMX_BUILD_NAME(writeThrough); VMX_BUILD_NAME(writeThrough);
VMX_BUILD_NAME(mode);
/* vmx:present */ /* vmx:present */
if (virVMXGetConfigBoolean(conf, present_name, &present, false, true) < 0) { if (virVMXGetConfigBoolean(conf, present_name, &present, false, true) < 0) {
@ -2121,6 +2125,11 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
goto cleanup; goto cleanup;
} }
/* vmx:mode -> def:transient */
if (virVMXGetConfigString(conf, mode_name, &mode, true) < 0) {
goto cleanup;
}
if (clientDevice) { if (clientDevice) {
/* /*
* Just ignore devices in client mode, because I have no clue how to * Just ignore devices in client mode, because I have no clue how to
@ -2172,6 +2181,9 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
(*def)->src = ctx->parseFileName(fileName, ctx->opaque); (*def)->src = ctx->parseFileName(fileName, ctx->opaque);
(*def)->cachemode = writeThrough ? VIR_DOMAIN_DISK_CACHE_WRITETHRU (*def)->cachemode = writeThrough ? VIR_DOMAIN_DISK_CACHE_WRITETHRU
: VIR_DOMAIN_DISK_CACHE_DEFAULT; : VIR_DOMAIN_DISK_CACHE_DEFAULT;
if (mode)
(*def)->transient = STRCASEEQ(mode,
"independent-nonpersistent");
if ((*def)->src == NULL) { if ((*def)->src == NULL) {
goto cleanup; goto cleanup;
@ -2290,6 +2302,7 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
VIR_FREE(deviceType); VIR_FREE(deviceType);
VIR_FREE(fileType); VIR_FREE(fileType);
VIR_FREE(fileName); VIR_FREE(fileName);
VIR_FREE(mode);
return result; return result;
@ -3498,6 +3511,10 @@ virVMXFormatDisk(virVMXContext *ctx, virDomainDiskDefPtr def,
} }
} }
if (def->transient)
virBufferAsprintf(buffer,
"%s%d:%d.mode = \"independent-nonpersistent\"\n",
busType, controllerOrBus, unit);
return 0; return 0;
} }