[libvirt] [PATCH v4 02/13] parallels: handle disk devices in parallelsDomainDefineXML
Daniel Veillard
veillard at redhat.com
Tue Dec 11 07:46:46 UTC 2012
On Tue, Dec 04, 2012 at 05:43:02PM +0400, Dmitry Guryanov wrote:
> Allow changing some parameters of the hard disks: bus,
> image and drive address.
>
> Creating new disk devices and removing existing ones
> require changes in the storage driver, so it will be
> implemented later.
>
> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
> ---
> src/parallels/parallels_driver.c | 73 ++++++++++++++++++++++++++++++++++++-
> 1 files changed, 71 insertions(+), 2 deletions(-)
>
> diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
> index 1a5851a..11c5b83 100644
> --- a/src/parallels/parallels_driver.c
> +++ b/src/parallels/parallels_driver.c
> @@ -1478,6 +1478,72 @@ parallelsApplyVideoParams(parallelsDomObjPtr pdom,
> }
>
> static int
> +parallelsApplyDisksParams(parallelsDomObjPtr pdom,
> + virDomainDiskDefPtr *olddisks, int nold,
> + virDomainDiskDefPtr *newdisks, int nnew)
> +{
> + /* TODO: allow creating and removing disks */
> + if (nold != nnew) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("Adding and removing disks is not supported"));
> + return -1;
> + }
> +
> + for (int i = 0; i < nold; i++) {
> + virDomainDiskDefPtr newdisk = NULL;
> + virDomainDiskDefPtr olddisk = olddisks[i];
> + for (int j = 0; j < nnew; j++) {
> + if (STREQ_NULLABLE(newdisks[j]->dst, olddisk->dst)) {
> + newdisk = newdisks[j];
> + break;
> + }
> + }
> +
> + if (!newdisk) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
> + _("There is no disk with source '%s' "
> + "in the specified config"), olddisks[i]->serial);
> + return -1;
> + }
> +
> + if (olddisk->bus != newdisk->bus ||
> + olddisk->info.addr.drive.target != newdisk->info.addr.drive.target ||
> + !STREQ_NULLABLE(olddisk->src, newdisk->src)) {
> +
> + char prlname[16];
> + char strpos[16];
> + const char *strbus;
> +
> + prlname[15] = '\0';
> + snprintf(prlname, 15, "hdd%d", virDiskNameToIndex(newdisk->dst));
> +
> + strpos[15] = '\0';
> + snprintf(strpos, 15, "%d", newdisk->info.addr.drive.target);
> +
> + switch (newdisk->bus) {
> + case VIR_DOMAIN_DISK_BUS_IDE:
> + strbus = "ide";
> + break;
> + case VIR_DOMAIN_DISK_BUS_SATA:
> + strbus = "sata";
> + break;
> + case VIR_DOMAIN_DISK_BUS_SCSI:
> + strbus = "scsi";
> + break;
> + }
> + if (parallelsCmdRun(PRLCTL, "set", pdom->uuid,
> + "--device-set", prlname,
> + "--iface", strbus,
> + "--position", strpos,
> + "--image", newdisk->src, NULL))
> + return -1;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static int
> parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
> {
> char buf[32];
> @@ -1676,8 +1742,7 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
> new->graphics, new->ngraphics) < 0)
> return -1;
>
> - if (new->ndisks != 0 || new->ncontrollers != 0 ||
> - new->nfss != 0 || new->nnets != 0 ||
> + if (new->nfss != 0 || new->nnets != 0 ||
> new->nsounds != 0 || new->nhostdevs != 0 ||
> new->nredirdevs != 0 || new->nsmartcards != 0 ||
> new->nparallels || new->nchannels != 0 ||
> @@ -1712,6 +1777,10 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
> if (parallelsApplyVideoParams(pdom, old->videos, old->nvideos,
> new->videos, new->nvideos) < 0)
> return -1;
> + if (parallelsApplyDisksParams(pdom, old->disks, old->ndisks,
> + new->disks, new->ndisks) < 0)
> + return -1;
> +
> return 0;
> }
ACK,
Daniel
--
Daniel Veillard | Open Source and Standards, Red Hat
veillard at redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list