conf: add support for disk "rotation_rate" property

This lets the app expose the virtual SCSI or IDE disks as solid state
devices by setting a rate of '1', or rotational media by setting a
rate between 1025 and 65534.

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

Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2021-03-31 10:14:12 +01:00
parent 4e83722a60
commit feac14fa2e
4 changed files with 27 additions and 3 deletions

View File

@ -2372,7 +2372,7 @@ paravirtualized driver is specified via the ``disk`` element.
<source protocol="tftp" name="url_path"> <source protocol="tftp" name="url_path">
<host name="hostname" port="69"/> <host name="hostname" port="69"/>
</source> </source>
<target dev='hdi' bus='ide' tray='open'/> <target dev='hdi' bus='ide' tray='open' rotation_rate='7200'/>
<readonly/> <readonly/>
</disk> </disk>
<disk type='block' device='lun'> <disk type='block' device='lun'>
@ -2385,7 +2385,7 @@ paravirtualized driver is specified via the ``disk`` element.
<source type='unix' path='/path/to/qemu-pr-helper' mode='client'/> <source type='unix' path='/path/to/qemu-pr-helper' mode='client'/>
</reservations> </reservations>
</source> </source>
<target dev='sda' bus='scsi'/> <target dev='sda' bus='scsi' rotation_rate='1'/>
<address type='drive' controller='0' bus='0' target='3' unit='0'/> <address type='drive' controller='0' bus='0' target='3' unit='0'/>
</disk> </disk>
<disk type='block' device='disk'> <disk type='block' device='disk'>
@ -2885,10 +2885,17 @@ paravirtualized driver is specified via the ``disk`` element.
to "closed". NB, the value of ``tray`` could be updated while the domain is to "closed". NB, the value of ``tray`` could be updated while the domain is
running. The optional attribute ``removable`` sets the removable flag for USB running. The optional attribute ``removable`` sets the removable flag for USB
disks, and its value can be either "on" or "off", defaulting to "off". disks, and its value can be either "on" or "off", defaulting to "off".
The optional attribute ``rotation_rate`` sets the rotation rate of the
storage for disks on a SCSI, IDE, or SATA bus. Values in the range 1025 to
65534 are used to indicate rotational media speed in revolutions per minute.
A value of one is used to indicate solid state, or otherwise non-rotational,
storage. These values are not required to match the values of the underlying
host storage.
:since:`Since 0.0.3`; ``bus`` attribute :since:`since 0.4.3`; ``tray`` :since:`Since 0.0.3`; ``bus`` attribute :since:`since 0.4.3`; ``tray``
attribute :since:`since 0.9.11`; "usb" attribute value attribute :since:`since 0.9.11`; "usb" attribute value
:since:`since after 0.4.4`; "sata" attribute value :since:`since 0.9.7`; :since:`since after 0.4.4`; "sata" attribute value :since:`since 0.9.7`;
"removable" attribute value :since:`since 1.1.3` "removable" attribute value :since:`since 1.1.3`;
"rotation_rate" attribute value :since:`since 7.3.0`
``iotune`` ``iotune``
The optional ``iotune`` element provides the ability to provide additional The optional ``iotune`` element provides the ability to provide additional
per-device I/O tuning, with values that can vary for each device (contrast per-device I/O tuning, with values that can vary for each device (contrast

View File

@ -2230,6 +2230,11 @@
<ref name="virOnOff"/> <ref name="virOnOff"/>
</attribute> </attribute>
</optional> </optional>
<optional>
<attribute name="rotation_rate">
<ref name="positiveInteger"/>
</attribute>
</optional>
</element> </element>
</define> </define>
<define name="geometry"> <define name="geometry">

View File

@ -9319,6 +9319,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
g_autofree char *vendor = NULL; g_autofree char *vendor = NULL;
g_autofree char *product = NULL; g_autofree char *product = NULL;
g_autofree char *domain_name = NULL; g_autofree char *domain_name = NULL;
g_autofree char *rotation_rate = NULL;
if (!(def = virDomainDiskDefNew(xmlopt))) if (!(def = virDomainDiskDefNew(xmlopt)))
return NULL; return NULL;
@ -9383,6 +9384,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
bus = virXMLPropString(cur, "bus"); bus = virXMLPropString(cur, "bus");
tray = virXMLPropString(cur, "tray"); tray = virXMLPropString(cur, "tray");
removable = virXMLPropString(cur, "removable"); removable = virXMLPropString(cur, "removable");
rotation_rate = virXMLPropString(cur, "rotation_rate");
/* HACK: Work around for compat with Xen /* HACK: Work around for compat with Xen
* driver in previous libvirt releases */ * driver in previous libvirt releases */
@ -9615,6 +9617,13 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
} }
} }
if (rotation_rate &&
virStrToLong_ui(rotation_rate, NULL, 10, &def->rotation_rate) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Cannot parse rotation rate '%s'"), rotation_rate);
return NULL;
}
if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info,
flags | VIR_DOMAIN_DEF_PARSE_ALLOW_BOOT) < 0) { flags | VIR_DOMAIN_DEF_PARSE_ALLOW_BOOT) < 0) {
return NULL; return NULL;
@ -25141,6 +25150,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " removable='%s'", virBufferAsprintf(buf, " removable='%s'",
virTristateSwitchTypeToString(def->removable)); virTristateSwitchTypeToString(def->removable));
} }
if (def->rotation_rate)
virBufferAsprintf(buf, " rotation_rate='%u'", def->rotation_rate);
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
virDomainDiskDefFormatIotune(buf, def); virDomainDiskDefFormatIotune(buf, def);

View File

@ -539,6 +539,7 @@ struct _virDomainDiskDef {
char *dst; char *dst;
int tray_status; /* enum virDomainDiskTray */ int tray_status; /* enum virDomainDiskTray */
int removable; /* enum virTristateSwitch */ int removable; /* enum virTristateSwitch */
unsigned int rotation_rate;
virStorageSourcePtr mirror; virStorageSourcePtr mirror;
int mirrorState; /* enum virDomainDiskMirrorState */ int mirrorState; /* enum virDomainDiskMirrorState */