[libvirt] [PATCH] esx: Rework datastore path parsing and handling

Eric Blake eblake at redhat.com
Wed Sep 1 16:21:13 UTC 2010


On 08/26/2010 04:37 PM, Matthias Bolte wrote:
> Instead of splitting the path part of a datastore path into
> directory and file name, keep this in one piece. An example:
>
>    "[datastore] directory/file"
>
> was split into this before:
>
>    datastoreName = "datastore"
>    directoryName = "directory"
>    fileName = "file"
>
> Now it's split into this:
>
>    datastoreName = "datastore"
>    directoryName = "directory"
>    directoryAndFileName = "directory/file"

Seems reasonable.

> This simplifies code using esxUtil_ParseDatastorePath, because
> directoryAndFileName is used more often than fileName. Also the
> old approach expected the datastore path to reference a actual

s/ a / an /

> @@ -52,8 +52,7 @@ typedef struct _esxVMX_Data esxVMX_Data;
>
>   struct _esxVMX_Data {
>       esxVI_Context *ctx;
> -    const char *datastoreName;
> -    const char *directoryName;
> +    char *datastorePathWithoutFileName;

I guess losing the const here is okay.

> @@ -2612,8 +2608,9 @@ esxDomainDumpXML(virDomainPtr domain, int flags)
>       esxVI_ObjectContent_Free(&virtualMachine);
>       VIR_FREE(datastoreName);
>       VIR_FREE(directoryName);
> -    VIR_FREE(fileName);
> +    VIR_FREE(directoryAndFileName);
>       VIR_FREE(url);
> +    VIR_FREE(data.datastorePathWithoutFileName);
>       VIR_FREE(vmx);
>       virDomainDefFree(def);
>
> @@ -2640,8 +2637,7 @@ esxDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat,
>       }
>
>       data.ctx = priv->primary;
> -    data.datastoreName = "?";
> -    data.directoryName = "?";
> +    data.datastorePathWithoutFileName = (char *)"[?] ?";

Are you missing a strdup() here?  I'm worried that the 
VIR_FREE(data.datastorePathWithoutFileName) in esxDomainDumpXML will now 
try to free static storage.

> diff --git a/src/esx/esx_storage_driver.c b/src/esx/esx_storage_driver.c
> index af8876a..d2d8f22 100644
> --- a/src/esx/esx_storage_driver.c
> +++ b/src/esx/esx_storage_driver.c
> @@ -611,10 +611,8 @@ esxStoragePoolListStorageVolumes(virStoragePoolPtr pool, char **const names,
>       esxVI_HostDatastoreBrowserSearchResults *searchResultsList = NULL;
>       esxVI_HostDatastoreBrowserSearchResults *searchResults = NULL;
>       esxVI_FileInfo *fileInfo = NULL;
> -    char *datastoreName = NULL;
> -    char *directoryName = NULL;
> -    char *fileName = NULL;
> -    char *prefix = NULL;
> +    char *directoryAndFileName = NULL;
> +    int length;

s/int/size_t/

> +++ b/src/esx/esx_vi.c
> @@ -2946,7 +2946,9 @@ esxVI_LookupFileInfoByDatastorePath(esxVI_Context *ctx,
>       int result = -1;
>       char *datastoreName = NULL;
>       char *directoryName = NULL;
> +    char *directoryAndFileName = NULL;
>       char *fileName = NULL;
> +    int length;

s/int/size_t/

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list