From aba95c287c58213335d43c4d2fea7ac42281ecd0 Mon Sep 17 00:00:00 2001 From: Dmitry Guryanov Date: Tue, 13 Jan 2015 14:27:39 +0300 Subject: [PATCH] parallels: allow to add filesystems to container Handle information about filesystems in domain config and add corresponding devices to container via parallels sdk. Signed-off-by: Dmitry Guryanov --- src/parallels/parallels_sdk.c | 109 +++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 2 deletions(-) diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c index eefdccad1e..d161a1ca4a 100644 --- a/src/parallels/parallels_sdk.c +++ b/src/parallels/parallels_sdk.c @@ -1921,8 +1921,14 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def) return -1; } - if (def->nfss != 0 || - def->nsounds != 0 || def->nhostdevs != 0 || + if (!IS_CT(def) && def->nfss != 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Filesystems in VMs are not supported " + "by parallels driver")); + return -1; + } + + if (def->nsounds != 0 || def->nhostdevs != 0 || def->nredirdevs != 0 || def->nsmartcards != 0 || def->nparallels || def->nchannels != 0 || def->nleases != 0 || def->nhubs != 0) { @@ -2354,6 +2360,60 @@ static int prlsdkCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) return 0; } +static int prlsdkCheckFSUnsupportedParams(virDomainFSDefPtr fs) +{ + if (fs->type != VIR_DOMAIN_FS_TYPE_FILE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only file based filesystems are " + "supported by parallels driver.")); + return -1; + } + + if (fs->fsdriver != VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only ploop fs driver is " + "supported by parallels driver.")); + return -1; + } + + if (fs->accessmode != VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Changing fs access mode is not " + "supported by parallels driver.")); + return -1; + } + + if (fs->wrpolicy != VIR_DOMAIN_FS_WRPOLICY_DEFAULT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Changing fs write policy is not " + "supported by parallels driver.")); + return -1; + } + + if (fs->format != VIR_STORAGE_FILE_PLOOP) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only ploop disk images are " + "supported by parallels driver.")); + return -1; + } + + if (fs->readonly) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting readonly for filesystems is " + "supported by parallels driver.")); + return -1; + } + + if (fs->space_hard_limit || fs->space_soft_limit) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting fs quotas is not " + "supported by parallels driver.")); + return -1; + } + + return 0; +} + static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom, virDomainDefPtr def) { virDomainGraphicsDefPtr gr; @@ -2660,6 +2720,46 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk) return ret; } +static int +prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs) +{ + PRL_RESULT pret; + PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE; + int ret = -1; + + if (prlsdkCheckFSUnsupportedParams(fs) < 0) + return -1; + + pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_HARD_DISK, &sdkdisk); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDev_SetEnabled(sdkdisk, 1); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDev_SetConnected(sdkdisk, 1); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDev_SetEmulatedType(sdkdisk, PDT_USE_IMAGE_FILE); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDev_SetSysName(sdkdisk, fs->src); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDev_SetImagePath(sdkdisk, fs->src); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDev_SetFriendlyName(sdkdisk, fs->src); + prlsdkCheckRetGoto(pret, cleanup); + + pret = PrlVmDevHd_SetMountPoint(sdkdisk, fs->dst); + prlsdkCheckRetGoto(pret, cleanup); + + ret = 0; + + cleanup: + PrlHandle_Free(sdkdisk); + return ret; +} static int prlsdkDoApplyConfig(PRL_HANDLE sdkdom, virDomainDefPtr def) @@ -2718,6 +2818,11 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom, goto error; } + for (i = 0; i < def->nfss; i++) { + if (prlsdkAddFS(sdkdom, def->fss[i]) < 0) + goto error; + } + return 0; error: