[libvirt] [PATCH 0/4 v3] Support to set disk wwn

v2 - v3: * Just rebase on the top. v1 - v2: * Validate wwn while parsing * Error out earlier "if (disk->device == "lun" && disk->wwn)", no logic change. This introduces new element <wwn> for disk, to allow to set wwn (just like setting serial number) for the virtual disk (Only QEMU devices like ide-drive, ide-hd, ide-cd, scsi-disk, scsi-hd, and scsi-cd support it). Osier Yang (4): schema: Add schema for disk <wwn> conf: Parse and format disk <wwn> qemu: Add caps to indentify if setting wwn is supported by qemu qemu: Use disk wwn in qemu command line docs/formatdomain.html.in | 6 +++ docs/schemas/basictypes.rng | 6 +++ docs/schemas/domaincommon.rng | 5 +++ docs/schemas/nodedev.rng | 6 --- src/conf/domain_conf.c | 12 +++++++ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 1 + src/qemu/qemu_capabilities.c | 8 ++++ src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 33 ++++++++++++++++++ src/util/util.c | 17 +++++++++ src/util/util.h | 2 + .../qemuxml2argv-disk-ide-wwn.args | 6 +++ .../qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml | 28 ++++++++++++++++ .../qemuxml2argv-disk-scsi-disk-wwn.args | 10 ++++++ .../qemuxml2argv-disk-scsi-disk-wwn.xml | 35 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 7 ++++ 17 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml -- 1.7.7.3

* docs/formatdomain.html.in: Add document. * docs/schemas/nodedev.rng: Move definition of "wwn" to ... * docs/schemas/basictypes.rng: ...Here * docs/schemas/domaincommon.rng: Add schema for disk <wwn> --- docs/formatdomain.html.in | 6 ++++++ docs/schemas/basictypes.rng | 6 ++++++ docs/schemas/domaincommon.rng | 5 +++++ docs/schemas/nodedev.rng | 6 ------ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index c05f3df..8bdfbf1 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1582,6 +1582,12 @@ like <code><serial>WD-WMAP9A966149</serial></code>. <span class="since">Since 0.7.1</span> </dd> + <dt><code>wwn</code></dt> + <dd>If present, this element specifies the WWN (World Wide Name) + of a virtual hard disk or CD-ROM drive. It must be composed + of 16 hexadecimal digits. + <span class='since'>Since 0.10.1</span> + </dd> <dt><code>host</code></dt> <dd>The <code>host</code> element has two attributes "name" and "port", which specify the hostname and the port number. The meaning of this diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index 766f9a0..38cab16 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -213,4 +213,10 @@ </data> </define> + <define name='wwn'> + <data type='string'> + <param name='pattern'>[0-9a-fA-F]{16}</param> + </data> + </define> + </grammar> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index d70f0c2..aafb10c 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -892,6 +892,11 @@ <optional> <ref name="diskBlockIo"/> </optional> + <optional> + <element name="wwn"> + <ref name="wwn"/> + </element> + </optional> </interleave> </define> <define name="snapshot"> diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 88a4e9d..7c85815 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -245,12 +245,6 @@ </attribute> </define> - <define name='wwn'> - <data type='string'> - <param name='pattern'>[0-9a-fA-F]{16}</param> - </data> - </define> - <define name='capsfchost'> <attribute name='type'> <value>fc_host</value> -- 1.7.7.3

On Tue, Sep 18, 2012 at 10:47:09AM +0800, Osier Yang wrote:
* docs/formatdomain.html.in: Add document. * docs/schemas/nodedev.rng: Move definition of "wwn" to ... * docs/schemas/basictypes.rng: ...Here * docs/schemas/domaincommon.rng: Add schema for disk <wwn> --- docs/formatdomain.html.in | 6 ++++++ docs/schemas/basictypes.rng | 6 ++++++ docs/schemas/domaincommon.rng | 5 +++++ docs/schemas/nodedev.rng | 6 ------ 4 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index c05f3df..8bdfbf1 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1582,6 +1582,12 @@ like <code><serial>WD-WMAP9A966149</serial></code>. <span class="since">Since 0.7.1</span> </dd> + <dt><code>wwn</code></dt> + <dd>If present, this element specifies the WWN (World Wide Name) + of a virtual hard disk or CD-ROM drive. It must be composed + of 16 hexadecimal digits. + <span class='since'>Since 0.10.1</span> + </dd> <dt><code>host</code></dt> <dd>The <code>host</code> element has two attributes "name" and "port", which specify the hostname and the port number. The meaning of this diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index 766f9a0..38cab16 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -213,4 +213,10 @@ </data> </define>
+ <define name='wwn'> + <data type='string'> + <param name='pattern'>[0-9a-fA-F]{16}</param> + </data> + </define> + </grammar> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index d70f0c2..aafb10c 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -892,6 +892,11 @@ <optional> <ref name="diskBlockIo"/> </optional> + <optional> + <element name="wwn"> + <ref name="wwn"/> + </element> + </optional> </interleave> </define> <define name="snapshot"> diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 88a4e9d..7c85815 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -245,12 +245,6 @@ </attribute> </define>
- <define name='wwn'> - <data type='string'> - <param name='pattern'>[0-9a-fA-F]{16}</param> - </data> - </define> - <define name='capsfchost'> <attribute name='type'> <value>fc_host</value>
Looks fine, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Validates the wwn while parsing, error out if it's malformed. * src/util/util.h: Declare virValidateWWN * src/util/util.c: Implement virValidateWWN * src/libvirt_private.syms: Export virValidateWWN. * src/conf/domain_conf.h: New member 'wwn' for disk def. * src/conf/domain_conf.c: Parse and format disk <wwn> --- src/conf/domain_conf.c | 12 ++++++++++++ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 1 + src/util/util.c | 17 +++++++++++++++++ src/util/util.h | 2 ++ 5 files changed, 33 insertions(+), 0 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 98c0cad..b8ba0e2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -960,6 +960,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def) VIR_FREE(def->mirror); VIR_FREE(def->mirrorFormat); VIR_FREE(def->auth.username); + VIR_FREE(def->wwn); if (def->auth.secretType == VIR_DOMAIN_DISK_SECRET_TYPE_USAGE) VIR_FREE(def->auth.secret.usage); virStorageEncryptionFree(def->encryption); @@ -3463,6 +3464,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *tray = NULL; char *logical_block_size = NULL; char *physical_block_size = NULL; + char *wwn = NULL; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -3789,6 +3791,12 @@ virDomainDiskDefParseXML(virCapsPtr caps, } else if (!serial && xmlStrEqual(cur->name, BAD_CAST "serial")) { serial = (char *)xmlNodeGetContent(cur); + } else if (!wwn && + xmlStrEqual(cur->name, BAD_CAST "wwn")) { + wwn = (char *)xmlNodeGetContent(cur); + + if (!virValidateWWN(wwn)) + goto error; } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) { /* boot is parsed as part of virDomainDeviceInfoParseXML */ } @@ -4085,6 +4093,8 @@ virDomainDiskDefParseXML(virCapsPtr caps, encryption = NULL; def->serial = serial; serial = NULL; + def->wwn = wwn; + wwn = NULL; if (!def->driverType && caps->defaultDiskDriverType && @@ -4143,6 +4153,7 @@ cleanup: VIR_FREE(startupPolicy); VIR_FREE(logical_block_size); VIR_FREE(physical_block_size); + VIR_FREE(wwn); ctxt->node = save_ctxt; return def; @@ -11742,6 +11753,7 @@ virDomainDiskDefFormat(virBufferPtr buf, if (def->transient) virBufferAddLit(buf, " <transient/>\n"); virBufferEscapeString(buf, " <serial>%s</serial>\n", def->serial); + virBufferEscapeString(buf, " <wwn>%s</wwn>\n", def->wwn); if (def->encryption) { virBufferAdjustIndent(buf, 6); if (virStorageEncryptionFormat(buf, def->encryption) < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 52c9937..f0dea48 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -584,6 +584,7 @@ struct _virDomainDiskDef { virDomainBlockIoTuneInfo blkdeviotune; char *serial; + char *wwn; int cachemode; int error_policy; /* enum virDomainDiskErrorPolicy */ int rerror_policy; /* enum virDomainDiskErrorPolicy */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ad2534b..e8f3fa5 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1259,6 +1259,7 @@ virStrToLong_ull; virStrcpy; virStrncpy; virTrimSpaces; +virValidateWWN; virVasprintf; diff --git a/src/util/util.c b/src/util/util.c index 91eab72..8b1f0dc 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -3052,3 +3052,20 @@ bool virIsDevMapperDevice(const char *dev_name ATTRIBUTE_UNUSED) return false; } #endif + +bool +virValidateWWN(const char *wwn) { + int i; + + for (i = 0; wwn[i]; i++) + if (!c_isxdigit(wwn[i])) + break; + + if (i != 16 || wwn[i]) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Malformed wwn: %s")); + return false; + } + + return true; +} diff --git a/src/util/util.h b/src/util/util.h index a5d892d..0c0efad 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -277,4 +277,6 @@ int virBuildPathInternal(char **path, ...) ATTRIBUTE_SENTINEL; bool virIsDevMapperDevice(const char *dev_name) ATTRIBUTE_NONNULL(1); +bool virValidateWWN(const char *wwn); + #endif /* __VIR_UTIL_H__ */ -- 1.7.7.3

On Tue, Sep 18, 2012 at 10:47:10AM +0800, Osier Yang wrote:
Validates the wwn while parsing, error out if it's malformed.
* src/util/util.h: Declare virValidateWWN * src/util/util.c: Implement virValidateWWN * src/libvirt_private.syms: Export virValidateWWN. * src/conf/domain_conf.h: New member 'wwn' for disk def. * src/conf/domain_conf.c: Parse and format disk <wwn> --- src/conf/domain_conf.c | 12 ++++++++++++ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 1 + src/util/util.c | 17 +++++++++++++++++ src/util/util.h | 2 ++ 5 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 98c0cad..b8ba0e2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -960,6 +960,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def) VIR_FREE(def->mirror); VIR_FREE(def->mirrorFormat); VIR_FREE(def->auth.username); + VIR_FREE(def->wwn); if (def->auth.secretType == VIR_DOMAIN_DISK_SECRET_TYPE_USAGE) VIR_FREE(def->auth.secret.usage); virStorageEncryptionFree(def->encryption); @@ -3463,6 +3464,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *tray = NULL; char *logical_block_size = NULL; char *physical_block_size = NULL; + char *wwn = NULL;
if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -3789,6 +3791,12 @@ virDomainDiskDefParseXML(virCapsPtr caps, } else if (!serial && xmlStrEqual(cur->name, BAD_CAST "serial")) { serial = (char *)xmlNodeGetContent(cur); + } else if (!wwn && + xmlStrEqual(cur->name, BAD_CAST "wwn")) { + wwn = (char *)xmlNodeGetContent(cur); + + if (!virValidateWWN(wwn)) + goto error; } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) { /* boot is parsed as part of virDomainDeviceInfoParseXML */ } @@ -4085,6 +4093,8 @@ virDomainDiskDefParseXML(virCapsPtr caps, encryption = NULL; def->serial = serial; serial = NULL; + def->wwn = wwn; + wwn = NULL;
if (!def->driverType && caps->defaultDiskDriverType && @@ -4143,6 +4153,7 @@ cleanup: VIR_FREE(startupPolicy); VIR_FREE(logical_block_size); VIR_FREE(physical_block_size); + VIR_FREE(wwn);
ctxt->node = save_ctxt; return def; @@ -11742,6 +11753,7 @@ virDomainDiskDefFormat(virBufferPtr buf, if (def->transient) virBufferAddLit(buf, " <transient/>\n"); virBufferEscapeString(buf, " <serial>%s</serial>\n", def->serial); + virBufferEscapeString(buf, " <wwn>%s</wwn>\n", def->wwn); if (def->encryption) { virBufferAdjustIndent(buf, 6); if (virStorageEncryptionFormat(buf, def->encryption) < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 52c9937..f0dea48 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -584,6 +584,7 @@ struct _virDomainDiskDef { virDomainBlockIoTuneInfo blkdeviotune;
char *serial; + char *wwn; int cachemode; int error_policy; /* enum virDomainDiskErrorPolicy */ int rerror_policy; /* enum virDomainDiskErrorPolicy */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ad2534b..e8f3fa5 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1259,6 +1259,7 @@ virStrToLong_ull; virStrcpy; virStrncpy; virTrimSpaces; +virValidateWWN; virVasprintf;
diff --git a/src/util/util.c b/src/util/util.c index 91eab72..8b1f0dc 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -3052,3 +3052,20 @@ bool virIsDevMapperDevice(const char *dev_name ATTRIBUTE_UNUSED) return false; } #endif + +bool +virValidateWWN(const char *wwn) { + int i; + + for (i = 0; wwn[i]; i++) + if (!c_isxdigit(wwn[i])) + break; + + if (i != 16 || wwn[i]) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Malformed wwn: %s")); + return false; + } + + return true; +} diff --git a/src/util/util.h b/src/util/util.h index a5d892d..0c0efad 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -277,4 +277,6 @@ int virBuildPathInternal(char **path, ...) ATTRIBUTE_SENTINEL;
bool virIsDevMapperDevice(const char *dev_name) ATTRIBUTE_NONNULL(1);
+bool virValidateWWN(const char *wwn); + #endif /* __VIR_UTIL_H__ */ -- 1.7.7.3
Looks correct, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

This assumes ide-drive.wwn, ide-hd.wwn, ide-cd.wwn were supported at the same time, similar for scsi-disk.wwn, scsi-hd.wwn, and scsi-cd.wwn. So only two new caps (QEMU_CAPS_IDE_DRIVE_WWN, and QEMU_CAPS_SCSI_DISK_WWN) are introduced. --- src/qemu/qemu_capabilities.c | 8 ++++++++ src/qemu/qemu_capabilities.h | 2 ++ 2 files changed, 10 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 7742db5..edfe1e7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -177,6 +177,8 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST, "disable-s4", /* 105 */ "usb-redir.filter", + "ide-drive.wwn", + "scsi-disk.wwn", ); struct _qemuCaps { @@ -1466,6 +1468,7 @@ qemuCapsExtractDeviceStr(const char *qemu, "-device", "scsi-disk,?", "-device", "PIIX4_PM,?", "-device", "usb-redir,?", + "-device", "ide-drive,?", NULL); /* qemu -help goes to stdout, but qemu -device ? goes to stderr. */ virCommandSetErrorBuffer(cmd, &output); @@ -1558,12 +1561,17 @@ qemuCapsParseDeviceStr(const char *str, qemuCapsPtr caps) qemuCapsSet(caps, QEMU_CAPS_VIRTIO_BLK_SCSI); if (strstr(str, "scsi-disk.channel")) qemuCapsSet(caps, QEMU_CAPS_SCSI_DISK_CHANNEL); + if (strstr(str, "scsi-disk.wwn")) + qemuCapsSet(caps, QEMU_CAPS_SCSI_DISK_WWN); if (strstr(str, "scsi-block")) qemuCapsSet(caps, QEMU_CAPS_SCSI_BLOCK); if (strstr(str, "scsi-cd")) qemuCapsSet(caps, QEMU_CAPS_SCSI_CD); if (strstr(str, "ide-cd")) qemuCapsSet(caps, QEMU_CAPS_IDE_CD); + if (strstr(str, "ide-drive.wwn")) + qemuCapsSet(caps, QEMU_CAPS_IDE_DRIVE_WWN); + /* * the iolimit detection is not really straight forward: * in qemu this is a capability of the block layer, if diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index c1519ed..fb1841a 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -142,6 +142,8 @@ enum qemuCapsFlags { QEMU_CAPS_DISABLE_S3 = 104, /* S3 BIOS Advertisement on/off */ QEMU_CAPS_DISABLE_S4 = 105, /* S4 BIOS Advertisement on/off */ QEMU_CAPS_USB_REDIR_FILTER = 106, /* usb-redir.filter */ + QEMU_CAPS_IDE_DRIVE_WWN = 107, /* Is ide-drive.wwn available? */ + QEMU_CAPS_SCSI_DISK_WWN = 108, /* Is scsi-disk.wwn available? */ QEMU_CAPS_LAST, /* this must always be the last item */ }; -- 1.7.7.3

On Tue, Sep 18, 2012 at 10:47:11AM +0800, Osier Yang wrote:
This assumes ide-drive.wwn, ide-hd.wwn, ide-cd.wwn were supported at the same time, similar for scsi-disk.wwn, scsi-hd.wwn, and scsi-cd.wwn. So only two new caps (QEMU_CAPS_IDE_DRIVE_WWN, and QEMU_CAPS_SCSI_DISK_WWN) are introduced. --- src/qemu/qemu_capabilities.c | 8 ++++++++ src/qemu/qemu_capabilities.h | 2 ++ 2 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 7742db5..edfe1e7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -177,6 +177,8 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
"disable-s4", /* 105 */ "usb-redir.filter", + "ide-drive.wwn", + "scsi-disk.wwn", );
struct _qemuCaps { @@ -1466,6 +1468,7 @@ qemuCapsExtractDeviceStr(const char *qemu, "-device", "scsi-disk,?", "-device", "PIIX4_PM,?", "-device", "usb-redir,?", + "-device", "ide-drive,?", NULL); /* qemu -help goes to stdout, but qemu -device ? goes to stderr. */ virCommandSetErrorBuffer(cmd, &output); @@ -1558,12 +1561,17 @@ qemuCapsParseDeviceStr(const char *str, qemuCapsPtr caps) qemuCapsSet(caps, QEMU_CAPS_VIRTIO_BLK_SCSI); if (strstr(str, "scsi-disk.channel")) qemuCapsSet(caps, QEMU_CAPS_SCSI_DISK_CHANNEL); + if (strstr(str, "scsi-disk.wwn")) + qemuCapsSet(caps, QEMU_CAPS_SCSI_DISK_WWN); if (strstr(str, "scsi-block")) qemuCapsSet(caps, QEMU_CAPS_SCSI_BLOCK); if (strstr(str, "scsi-cd")) qemuCapsSet(caps, QEMU_CAPS_SCSI_CD); if (strstr(str, "ide-cd")) qemuCapsSet(caps, QEMU_CAPS_IDE_CD); + if (strstr(str, "ide-drive.wwn")) + qemuCapsSet(caps, QEMU_CAPS_IDE_DRIVE_WWN); + /* * the iolimit detection is not really straight forward: * in qemu this is a capability of the block layer, if diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index c1519ed..fb1841a 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -142,6 +142,8 @@ enum qemuCapsFlags { QEMU_CAPS_DISABLE_S3 = 104, /* S3 BIOS Advertisement on/off */ QEMU_CAPS_DISABLE_S4 = 105, /* S4 BIOS Advertisement on/off */ QEMU_CAPS_USB_REDIR_FILTER = 106, /* usb-redir.filter */ + QEMU_CAPS_IDE_DRIVE_WWN = 107, /* Is ide-drive.wwn available? */ + QEMU_CAPS_SCSI_DISK_WWN = 108, /* Is scsi-disk.wwn available? */
QEMU_CAPS_LAST, /* this must always be the last item */ };
ACK, but we will need to make sure that capability is still handled when we switch over to the new mechanism to find capabilities with QEmu Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

All of ide-drive, ide-hd, ide-cd, scsi-disk, scsi-hd, and scsi-cd supports wwn property. (NB, scsi-block doesn't support to set wwn). * src/qemu/qemu_command.c: Error out if underlying QEMU doesn't support wwn property for the device; Set wwn for the device otherwise. * tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args: New test * tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml: Likewise * tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args: Likewise * tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml: Likewise * tests/qemuxml2argvtest.c: Add the new tests. --- src/qemu/qemu_command.c | 33 ++++++++++++++++++ .../qemuxml2argv-disk-ide-wwn.args | 6 +++ .../qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml | 28 ++++++++++++++++ .../qemuxml2argv-disk-scsi-disk-wwn.args | 10 ++++++ .../qemuxml2argv-disk-scsi-disk-wwn.xml | 35 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 7 ++++ 6 files changed, 119 insertions(+), 0 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 06a4bac..7511ad3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2453,6 +2453,15 @@ qemuBuildDriveDevStr(virDomainDefPtr def, goto error; } + if (disk->wwn) { + if ((disk->bus != VIR_DOMAIN_DISK_BUS_IDE) && + (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only ide and scsi disk support wwn")); + goto error; + } + } + if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { /* make sure that both the bus and the qemu binary support * type='lun' (SG_IO). @@ -2475,6 +2484,11 @@ qemuBuildDriveDevStr(virDomainDefPtr def, _("disk device='lun' is not supported by this QEMU")); goto error; } + if (disk->wwn) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting wwn is not supported for lun device")); + goto error; + } } switch (disk->bus) { @@ -2485,6 +2499,14 @@ qemuBuildDriveDevStr(virDomainDefPtr def, goto error; } + if (disk->wwn && + !qemuCapsGet(qemuCaps, QEMU_CAPS_IDE_DRIVE_WWN)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting wwn for ide disk is not supported " + "by this QEMU")); + goto error; + } + if (qemuCapsGet(caps, QEMU_CAPS_IDE_CD)) { if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) virBufferAddLit(&opt, "ide-cd"); @@ -2508,6 +2530,14 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } } + if (disk->wwn && + !qemuCapsGet(qemuCaps, QEMU_CAPS_SCSI_DISK_WWN)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting wwn for scsi disk is not supported " + "by this QEMU")); + goto error; + } + controllerModel = virDomainDiskFindControllerModel(def, disk, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); @@ -2647,6 +2677,9 @@ qemuBuildDriveDevStr(virDomainDefPtr def, disk->blockio.physical_block_size); } + if (disk->wwn) + virBufferAsprintf(&opt, ",wwn=%s", disk->wwn); + if (virBufferError(&opt)) { virReportOOMError(); goto error; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args new file mode 100644 index 0000000..4b8a543 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args @@ -0,0 +1,6 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-1,serial=WD-WMAP9A966149 \ +-device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,wwn=5000c50015ea71ad \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml new file mode 100644 index 0000000..dccec95 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <serial>WD-WMAP9A966149</serial> + <wwn>5000c50015ea71ad</wwn> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args new file mode 100644 index 0000000..fe4591b --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args @@ -0,0 +1,10 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 \ +-device lsi,id=scsi1,bus=pci.0,addr=0x4 \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-scsi0-0-1-0 \ +-device scsi-cd,bus=scsi0.0,channel=0,scsi-id=1,lun=0,drive=drive-scsi0-0-1-0,id=scsi0-0-1-0,wwn=5000c50015ea71ac \ +-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-scsi0-0-0-0 \ +-device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,wwn=5000c50015ea71ad \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml new file mode 100644 index 0000000..dc35548 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml @@ -0,0 +1,35 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='cdrom'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='sda' bus='scsi'/> + <address type='drive' controller='0' bus='0' target='1' unit='0'/> + <serial>WD-WMAP9A966149</serial> + <wwn>5000c50015ea71ac</wwn> + </disk> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest2'/> + <target dev='sdb' bus='scsi'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + <wwn>5000c50015ea71ad</wwn> + </disk> + <controller type='usb' index='0'/> + <controller type='scsi' index='0' model='virtio-scsi'/> + <controller type='scsi' index='1' model='lsilogic'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4daa68d..0ec3c2c 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -471,6 +471,10 @@ mymain(void) DO_TEST("disk-scsi-disk-split", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI_PCI); + DO_TEST("disk-scsi-disk-wwn", + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, + QEMU_CAPS_SCSI_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI_PCI, + QEMU_CAPS_SCSI_DISK_WWN); DO_TEST("disk-scsi-vscsi", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); DO_TEST("disk-scsi-virtio-scsi", @@ -802,6 +806,9 @@ mymain(void) DO_TEST("disk-ide-drive-split", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_IDE_CD); + DO_TEST("disk-ide-wwn", + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_IDE_CD, + QEMU_CAPS_DRIVE_SERIAL, QEMU_CAPS_IDE_DRIVE_WWN); DO_TEST("disk-geometry", QEMU_CAPS_DRIVE); DO_TEST("disk-blockio", -- 1.7.7.3

On Tue, Sep 18, 2012 at 10:47:12AM +0800, Osier Yang wrote:
All of ide-drive, ide-hd, ide-cd, scsi-disk, scsi-hd, and scsi-cd supports wwn property. (NB, scsi-block doesn't support to set wwn).
* src/qemu/qemu_command.c: Error out if underlying QEMU doesn't support wwn property for the device; Set wwn for the device otherwise.
* tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args: New test * tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml: Likewise * tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args: Likewise * tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml: Likewise * tests/qemuxml2argvtest.c: Add the new tests. --- src/qemu/qemu_command.c | 33 ++++++++++++++++++ .../qemuxml2argv-disk-ide-wwn.args | 6 +++ .../qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml | 28 ++++++++++++++++ .../qemuxml2argv-disk-scsi-disk-wwn.args | 10 ++++++ .../qemuxml2argv-disk-scsi-disk-wwn.xml | 35 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 7 ++++ 6 files changed, 119 insertions(+), 0 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 06a4bac..7511ad3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2453,6 +2453,15 @@ qemuBuildDriveDevStr(virDomainDefPtr def, goto error; }
+ if (disk->wwn) { + if ((disk->bus != VIR_DOMAIN_DISK_BUS_IDE) && + (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only ide and scsi disk support wwn")); + goto error; + } + } + if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { /* make sure that both the bus and the qemu binary support * type='lun' (SG_IO). @@ -2475,6 +2484,11 @@ qemuBuildDriveDevStr(virDomainDefPtr def, _("disk device='lun' is not supported by this QEMU")); goto error; } + if (disk->wwn) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting wwn is not supported for lun device")); + goto error; + } }
switch (disk->bus) { @@ -2485,6 +2499,14 @@ qemuBuildDriveDevStr(virDomainDefPtr def, goto error; }
+ if (disk->wwn && + !qemuCapsGet(qemuCaps, QEMU_CAPS_IDE_DRIVE_WWN)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting wwn for ide disk is not supported " + "by this QEMU")); + goto error; + } + if (qemuCapsGet(caps, QEMU_CAPS_IDE_CD)) { if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) virBufferAddLit(&opt, "ide-cd"); @@ -2508,6 +2530,14 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } }
+ if (disk->wwn && + !qemuCapsGet(qemuCaps, QEMU_CAPS_SCSI_DISK_WWN)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting wwn for scsi disk is not supported " + "by this QEMU")); + goto error; + } + controllerModel = virDomainDiskFindControllerModel(def, disk, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); @@ -2647,6 +2677,9 @@ qemuBuildDriveDevStr(virDomainDefPtr def, disk->blockio.physical_block_size); }
+ if (disk->wwn) + virBufferAsprintf(&opt, ",wwn=%s", disk->wwn); + if (virBufferError(&opt)) { virReportOOMError(); goto error; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args new file mode 100644 index 0000000..4b8a543 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args @@ -0,0 +1,6 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-1,serial=WD-WMAP9A966149 \ +-device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,wwn=5000c50015ea71ad \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml new file mode 100644 index 0000000..dccec95 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <serial>WD-WMAP9A966149</serial> + <wwn>5000c50015ea71ad</wwn> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args new file mode 100644 index 0000000..fe4591b --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args @@ -0,0 +1,10 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 \ +-device lsi,id=scsi1,bus=pci.0,addr=0x4 \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-scsi0-0-1-0 \ +-device scsi-cd,bus=scsi0.0,channel=0,scsi-id=1,lun=0,drive=drive-scsi0-0-1-0,id=scsi0-0-1-0,wwn=5000c50015ea71ac \ +-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-scsi0-0-0-0 \ +-device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,wwn=5000c50015ea71ad \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml new file mode 100644 index 0000000..dc35548 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml @@ -0,0 +1,35 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='cdrom'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='sda' bus='scsi'/> + <address type='drive' controller='0' bus='0' target='1' unit='0'/> + <serial>WD-WMAP9A966149</serial> + <wwn>5000c50015ea71ac</wwn> + </disk> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest2'/> + <target dev='sdb' bus='scsi'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + <wwn>5000c50015ea71ad</wwn> + </disk> + <controller type='usb' index='0'/> + <controller type='scsi' index='0' model='virtio-scsi'/> + <controller type='scsi' index='1' model='lsilogic'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4daa68d..0ec3c2c 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -471,6 +471,10 @@ mymain(void) DO_TEST("disk-scsi-disk-split", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI_PCI); + DO_TEST("disk-scsi-disk-wwn", + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, + QEMU_CAPS_SCSI_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI_PCI, + QEMU_CAPS_SCSI_DISK_WWN); DO_TEST("disk-scsi-vscsi", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); DO_TEST("disk-scsi-virtio-scsi", @@ -802,6 +806,9 @@ mymain(void) DO_TEST("disk-ide-drive-split", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_IDE_CD); + DO_TEST("disk-ide-wwn", + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_IDE_CD, + QEMU_CAPS_DRIVE_SERIAL, QEMU_CAPS_IDE_DRIVE_WWN);
DO_TEST("disk-geometry", QEMU_CAPS_DRIVE); DO_TEST("disk-blockio",
ACK, please push ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On 2012年09月18日 10:47, Osier Yang wrote:
v2 - v3: * Just rebase on the top.
v1 - v2: * Validate wwn while parsing * Error out earlier "if (disk->device == "lun"&& disk->wwn)", no logic change.
This introduces new element<wwn> for disk, to allow to set wwn (just like setting serial number) for the virtual disk (Only QEMU devices like ide-drive, ide-hd, ide-cd, scsi-disk, scsi-hd, and scsi-cd support it).
Osier Yang (4): schema: Add schema for disk<wwn> conf: Parse and format disk<wwn> qemu: Add caps to indentify if setting wwn is supported by qemu qemu: Use disk wwn in qemu command line
docs/formatdomain.html.in | 6 +++ docs/schemas/basictypes.rng | 6 +++ docs/schemas/domaincommon.rng | 5 +++ docs/schemas/nodedev.rng | 6 --- src/conf/domain_conf.c | 12 +++++++ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 1 + src/qemu/qemu_capabilities.c | 8 ++++ src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 33 ++++++++++++++++++ src/util/util.c | 17 +++++++++ src/util/util.h | 2 + .../qemuxml2argv-disk-ide-wwn.args | 6 +++ .../qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml | 28 ++++++++++++++++ .../qemuxml2argv-disk-scsi-disk-wwn.args | 10 ++++++ .../qemuxml2argv-disk-scsi-disk-wwn.xml | 35 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 7 ++++ 17 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.xml
Pushed the test, thanks. Regards, Osier
participants (2)
-
Daniel Veillard
-
Osier Yang