[libvirt] [PATCH 5/6] conf: Introduce virStoragePoolLoadAllState && virStoragePoolLoadState

John Ferlan jferlan at redhat.com
Thu Apr 2 14:40:23 UTC 2015



On 04/02/2015 06:10 AM, Erik Skultety wrote:
> These functions operate exactly the same as their network equivalents
> virNetworkLoadAllState, virNetworkLoadState.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1177733

^^ Don't forget to remove...

> ---
>  src/conf/storage_conf.c      | 94 ++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/storage_conf.h      |  7 ++++
>  src/libvirt_private.syms     |  1 +
>  src/storage/storage_driver.c | 13 ++++++
>  4 files changed, 115 insertions(+)
> 
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index ee564f2..e7d6e6b 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -1863,6 +1863,100 @@ virStoragePoolObjLoad(virStoragePoolObjListPtr pools,
>  }
>  
>  
> +virStoragePoolObjPtr
> +virStoragePoolLoadState(virStoragePoolObjListPtr pools,
> +                        const char *stateDir,
> +                        const char *name)
> +{
> +    char *stateFile = NULL;
> +    virStoragePoolDefPtr def = NULL;
> +    virStoragePoolObjPtr pool = NULL;
> +    xmlDocPtr xml = NULL;
> +    xmlXPathContextPtr ctxt = NULL;
> +    xmlNodePtr node = NULL;
> +
> +    if (!(stateFile = virFileBuildPath(stateDir, name, ".xml")))
> +        goto error;
> +
> +    if (!(xml = virXMLParseCtxt(stateFile, NULL, _("(pool state)"), &ctxt)))
> +        goto error;
> +
> +    if (!(node = virXPathNode("//pool", ctxt))) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("Could not find any 'pool' element in state file"));
> +        goto error;
> +    }
> +
> +    ctxt->node = node;
> +    if (!(def = virStoragePoolDefParseXML(ctxt)))
> +        goto error;
> +
> +    if (!STREQ(name, def->name)) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Storage pool state file '%s' does not match "
> +                         "pool name '%s'"),
> +                       stateFile, def->name);
> +        goto error;
> +    }
> +
> +    /* create the object */
> +    if (!(pool = virStoragePoolObjAssignDef(pools, def)))
> +        goto error;
> +
> +    /* XXX: future handling of some additional usefull status data,

s/usefull/useful

ACK with the slight adjustments.

If you want to post a v3 "inline"/as a response to patch 4 - that's fine

John

> +     * for now, if a status file for a pool exists, the pool will be marked
> +     * as active
> +     */
> +
> +    pool->active = 1;
> +
> + cleanup:
> +    VIR_FREE(stateFile);
> +    xmlFree(xml);
> +    xmlXPathFreeContext(ctxt);
> +    return pool;
> +
> + error:
> +    virStoragePoolDefFree(def);
> +    goto cleanup;
> +}
> +
> +
> +int
> +virStoragePoolLoadAllState(virStoragePoolObjListPtr pools,
> +                           const char *stateDir)
> +{
> +    DIR *dir;
> +    struct dirent *entry;
> +    int ret = -1;
> +
> +    if (!(dir = opendir(stateDir))) {
> +        if (errno == ENOENT)
> +            return 0;
> +
> +        virReportSystemError(errno, _("Failed to open dir '%s'"), stateDir);
> +        return -1;
> +    }
> +
> +    while ((ret = virDirRead(dir, &entry, stateDir)) > 0) {
> +        virStoragePoolObjPtr pool;
> +
> +        if (entry->d_name[0] == '.')
> +            continue;
> +
> +        if (!virFileStripSuffix(entry->d_name, ".xml"))
> +            continue;
> +
> +        if (!(pool = virStoragePoolLoadState(pools, stateDir, entry->d_name)))
> +            continue;
> +        virStoragePoolObjUnlock(pool);
> +    }
> +
> +    closedir(dir);
> +    return ret;
> +}
> +
> +
>  int
>  virStoragePoolLoadAllConfigs(virStoragePoolObjListPtr pools,
>                               const char *configDir,
> diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
> index 8d43019..7471006 100644
> --- a/src/conf/storage_conf.h
> +++ b/src/conf/storage_conf.h
> @@ -318,6 +318,13 @@ int virStoragePoolLoadAllConfigs(virStoragePoolObjListPtr pools,
>                                   const char *configDir,
>                                   const char *autostartDir);
>  
> +int virStoragePoolLoadAllState(virStoragePoolObjListPtr pools,
> +                               const char *stateDir);
> +
> +virStoragePoolObjPtr
> +virStoragePoolLoadState(virStoragePoolObjListPtr pools,
> +                        const char *stateDir,
> +                        const char *name);
>  virStoragePoolObjPtr
>  virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
>                              const unsigned char *uuid);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 56acb01..6b95dea 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -800,6 +800,7 @@ virStoragePoolFormatFileSystemNetTypeToString;
>  virStoragePoolFormatFileSystemTypeToString;
>  virStoragePoolGetVhbaSCSIHostParent;
>  virStoragePoolLoadAllConfigs;
> +virStoragePoolLoadAllState;
>  virStoragePoolObjAssignDef;
>  virStoragePoolObjClearVols;
>  virStoragePoolObjDeleteDef;
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 0180fd7..36c05b3 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -199,6 +199,17 @@ storageStateInitialize(bool privileged,
>      }
>      driver->privileged = privileged;
>  
> +    if (virFileMakePath(driver->stateDir) < 0) {
> +        virReportError(errno,
> +                       _("cannot create directory %s"),
> +                       driver->stateDir);
> +        goto error;
> +    }
> +
> +    if (virStoragePoolLoadAllState(&driver->pools,
> +                                   driver->stateDir) < 0)
> +        goto error;
> +
>      if (virStoragePoolLoadAllConfigs(&driver->pools,
>                                       driver->configDir,
>                                       driver->autostartDir) < 0)
> @@ -247,6 +258,8 @@ storageStateReload(void)
>          return -1;
>  
>      storageDriverLock();
> +    virStoragePoolLoadAllState(&driver->pools,
> +                               driver->stateDir);
>      virStoragePoolLoadAllConfigs(&driver->pools,
>                                   driver->configDir,
>                                   driver->autostartDir);
> 




More information about the libvir-list mailing list