[libvirt] [PATCH v4 07/13] parallels: add info about volumes
Daniel Veillard
veillard at redhat.com
Tue Dec 11 08:00:08 UTC 2012
On Tue, Dec 04, 2012 at 05:43:07PM +0400, Dmitry Guryanov wrote:
> Disk images in Parallels Cloud Server stored in directories. Each
> one has files with data and xml description of an image stored in
> file DiskDescriptior.xml.
>
> Since we have to support 'detached' images, which are not used by
> any VM, the better way to collect info about volumes is searching for
> directories with a file DiskDescriptior.xml in each VM directory.
typo it's DiskDescriptor.xml based on the patch
> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
> ---
> src/parallels/parallels_storage.c | 107 ++++++++++++++++++++++++++++++++++++-
> 1 files changed, 106 insertions(+), 1 deletions(-)
>
> diff --git a/src/parallels/parallels_storage.c b/src/parallels/parallels_storage.c
> index 0d59cce..4d71eb1 100644
> --- a/src/parallels/parallels_storage.c
> +++ b/src/parallels/parallels_storage.c
> @@ -25,6 +25,9 @@
> #include <stdlib.h>
> #include <dirent.h>
> #include <sys/statvfs.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> #include <libgen.h>
>
> #include "datatypes.h"
> @@ -250,6 +253,101 @@ parallelsPoolAddByDomain(virConnectPtr conn, virDomainObjPtr dom)
> return pool;
> }
>
> +static int parallelsAddDiskVolume(virStoragePoolObjPtr pool,
> + virDomainObjPtr dom,
> + const char *diskName,
> + const char *diskPath)
> +{
> + virStorageVolDefPtr def = NULL;
> +
> + if (VIR_ALLOC(def))
> + goto no_memory;
> +
> + virAsprintf(&def->name, "%s-%s", dom->def->name, diskName);
> + if (!def->name)
> + goto no_memory;
> +
> + def->type = VIR_STORAGE_VOL_FILE;
> +
> + if (!(def->target.path = realpath(diskPath, NULL)))
> + goto no_memory;
> +
> + if (!(def->key = strdup(def->target.path)))
> + goto no_memory;
> +
> + if (VIR_REALLOC_N(pool->volumes.objs, pool->volumes.count + 1) < 0)
> + goto no_memory;
> +
> + pool->volumes.objs[pool->volumes.count++] = def;
> +
> + return 0;
> +no_memory:
> + virStorageVolDefFree(def);
> + virReportOOMError();
> + return -1;
> +}
> +
> +static int parallelsFindVmVolumes(virStoragePoolObjPtr pool,
> + virDomainObjPtr dom)
> +{
> + parallelsDomObjPtr pdom = dom->privateData;
> + DIR *dir;
> + struct dirent *ent;
> + char *diskPath = NULL, *diskDescPath = NULL;
> + struct stat sb;
> + int ret = -1;
> +
> + if (!(dir = opendir(pdom->home))) {
> + virReportSystemError(errno,
> + _("cannot open path '%s'"),
> + pdom->home);
> + goto cleanup;
> + }
> +
> + while ((ent = readdir(dir)) != NULL) {
> + VIR_FREE(diskPath);
> + VIR_FREE(diskDescPath);
> +
> + if (!(diskPath = virFileBuildPath(pdom->home, ent->d_name, NULL))) {
> + virReportOOMError();
> + goto cleanup;
> + }
> +
> + if (lstat(diskPath, &sb) < 0) {
> + virReportSystemError(errno,
> + _("cannot stat path '%s'"),
> + ent->d_name);
> + goto cleanup;
> + }
> +
> + if (!S_ISDIR(sb.st_mode))
> + continue;
> +
> + if (!(diskDescPath = virFileBuildPath(diskPath,
> + "DiskDescriptor", ".xml"))) {
> + virReportOOMError();
> + goto cleanup;
> + }
> +
> + if (access(diskDescPath, F_OK))
> + continue;
> +
> + /* here we know, that ent->d_name is a disk image directory */
> +
> + if (parallelsAddDiskVolume(pool, dom, ent->d_name, diskPath))
> + goto cleanup;
> +
> + }
> +
> + ret = 0;
> +cleanup:
> + VIR_FREE(diskPath);
> + VIR_FREE(diskDescPath);
> + closedir(dir);
> + return ret;
> +
> +}
> +
> static void
> parallelsPoolsAdd(void *payload,
> const void *name ATTRIBUTE_UNUSED,
> @@ -259,8 +357,15 @@ parallelsPoolsAdd(void *payload,
> virDomainObjPtr dom = payload;
> virStoragePoolObjPtr pool;
>
> - if (!(pool = parallelsPoolAddByDomain(data->conn, dom)))
> + if (!(pool = parallelsPoolAddByDomain(data->conn, dom))) {
> data->failed = true;
> + return;
> + }
> +
> + if (parallelsFindVmVolumes(pool, dom)) {
> + data->failed = true;
> + return;
> + }
>
> return;
> }
Okay, 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