[libvirt] [PATCH 2/2] vz: support virDomainBlockResize

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Fri Apr 14 13:18:24 UTC 2017



On 14.04.2017 13:01, Konstantin Neumoin wrote:
> Signed-off-by: Konstantin Neumoin <kneumoin at virtuozzo.com>
> ---
>  src/vz/vz_driver.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/vz/vz_sdk.c    | 37 ++++++++++++++++++++++++++++++++++
>  src/vz/vz_sdk.h    |  1 +
>  3 files changed, 96 insertions(+)
> 
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index ed7132f..24156ca 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -3945,6 +3945,63 @@ static int vzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
>      return vzDomainSetVcpusFlags(dom, nvcpus,
>                                   VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG);
>  }
> +static int
> +vzDomainBlockResize(virDomainPtr domain,
> +                    const char *path,
> +                    unsigned long long size,
> +                    unsigned int flags)
> +{
> +    virDomainObjPtr dom = NULL;
> +    virDomainDiskDefPtr disk = NULL;
> +    int ret = -1;
> +    bool job = false;
> +
> +    virCheckFlags(VIR_DOMAIN_BLOCK_RESIZE_BYTES, -1);
> +
> +    if (!(dom = vzDomObjFromDomainRef(domain)))
> +        goto cleanup;
> +
> +    if (virDomainSetVcpusFlagsEnsureACL(domain->conn, dom->def, flags) < 0)
> +        goto cleanup;

wrong ACL, otherwise ACK

> +
> +    if (path[0] == '\0') {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       "%s", _("empty path"));
> +        goto cleanup;
> +    }
> +
> +    /* sdk wants Mb */
> +    if (flags & VIR_DOMAIN_BLOCK_RESIZE_BYTES)
> +        size /= 1024;
> +    size /= 1024;
> +
> +    if (!(disk = virDomainDiskByName(dom->def, path, false))) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("invalid path: %s"), path);
> +        goto cleanup;
> +    }
> +
> +    if (vzDomainObjBeginJob(dom) < 0)
> +        goto cleanup;
> +    job = true;
> +
> +    if (vzEnsureDomainExists(dom) < 0)
> +        goto cleanup;
> +
> +    if (!virDomainObjIsActive(dom)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("domain is not running"));
> +        goto cleanup;
> +    }
> +
> +    ret = prlsdkResizeImage(dom, disk, size);
> +
> + cleanup:
> +    if (job)
> +        vzDomainObjEndJob(dom);
> +    virDomainObjEndAPI(&dom);
> +    return ret;
> +}
>  
>  static virHypervisorDriver vzHypervisorDriver = {
>      .name = "vz",
> @@ -4046,6 +4103,7 @@ static virHypervisorDriver vzHypervisorDriver = {
>      .connectGetAllDomainStats = vzConnectGetAllDomainStats, /* 3.1.0 */
>      .domainAbortJob = vzDomainAbortJob, /* 3.1.0 */
>      .domainReset = vzDomainReset, /* 3.1.0 */
> +    .domainBlockResize = vzDomainBlockResize, /* 3.3.0 */
>  };
>  
>  static virConnectDriver vzConnectDriver = {
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index 2daa44a..4d2c6b0 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -4925,3 +4925,40 @@ int prlsdkSetCpuCount(virDomainObjPtr dom, unsigned int count)
>   error:
>      return -1;
>  }
> +
> +int prlsdkResizeImage(virDomainObjPtr dom, virDomainDiskDefPtr disk,
> +                      unsigned long long newsize)
> +{
> +    int ret = -1;
> +    PRL_RESULT pret;
> +    vzDomObjPtr privdom = dom->privateData;
> +    PRL_UINT32 emulatedType;
> +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> +    PRL_HANDLE prldisk = PRL_INVALID_HANDLE;
> +
> +    prldisk = prlsdkGetDisk(privdom->sdkdom, disk);
> +    if (prldisk == PRL_INVALID_HANDLE)
> +        goto cleanup;
> +
> +    pret = PrlVmDev_GetEmulatedType(prldisk, &emulatedType);
> +    prlsdkCheckRetGoto(pret, cleanup);
> +
> +    if (emulatedType != PDT_USE_IMAGE_FILE &&
> +        emulatedType != PDT_USE_FILE_SYSTEM) {
> +        virReportError(VIR_ERR_INVALID_ARG, "%s",
> +                       _("Only disk image supported for resize"));
> +        goto cleanup;
> +    }
> +
> +    job = PrlVmDev_ResizeImage(prldisk, newsize,
> +                               PRIF_RESIZE_LAST_PARTITION);
> +    if (PRL_FAILED(waitJob(job)))
> +        goto cleanup;
> +
> +    ret = 0;
> +
> + cleanup:
> +
> +    PrlHandle_Free(prldisk);
> +    return ret;
> +}
> diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
> index 100a5e3..0a77431 100644
> --- a/src/vz/vz_sdk.h
> +++ b/src/vz/vz_sdk.h
> @@ -90,3 +90,4 @@ prlsdkMigrate(virDomainObjPtr dom,
>  PRL_HANDLE
>  prlsdkSdkDomainLookupByName(vzDriverPtr driver, const char *name);
>  int prlsdkCancelJob(virDomainObjPtr dom);
> +int prlsdkResizeImage(virDomainObjPtr dom, virDomainDiskDefPtr disk, unsigned long long newsize);
> 




More information about the libvir-list mailing list