[libvirt] [PATCH 1/6] storage: Add flags to allow building pool during create processing

Michal Privoznik mprivozn at redhat.com
Wed Dec 16 13:18:34 UTC 2015


On 25.11.2015 20:11, John Ferlan wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=830056
> 
> Add flags handling to the virStoragePoolCreate and virStoragePoolCreateXML
> API's which will allow the caller to provide the capability for the storage
> pool create API's to also perform a pool build during creation rather than
> requiring the additional buildPool step. This will allow transient pools
> to be defined, built, and started.
> 
> The new flags are:
> 
>     * VIR_STORAGE_POOL_CREATE_WITH_BUILD
>       Perform buildPool without any flags passed.
> 
>     * VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE
>       Perform buildPool using VIR_STORAGE_POOL_BUILD_OVERWRITE flag.
> 
>     * VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE
>       Perform buildPool using VIR_STORAGE_POOL_BUILD_NO_OVERWRITE flag.
> 
> It is up to the backend to handle the processing of build flags. The
> overwrite and no-overwrite flags are mutually exclusive.
> 
> NB:
> This patch is loosely based upon code originally authored by Osier
> Yang that were not reviewed and pushed, see:
> 
> https://www.redhat.com/archives/libvir-list/2012-July/msg01328.html
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  include/libvirt/libvirt-storage.h | 16 ++++++++++++++-
>  src/libvirt-storage.c             |  4 ++--
>  src/storage/storage_driver.c      | 42 +++++++++++++++++++++++++++++++++++++--
>  3 files changed, 57 insertions(+), 5 deletions(-)
> 
> diff --git a/include/libvirt/libvirt-storage.h b/include/libvirt/libvirt-storage.h
> index 9fc3c2d..996a726 100644
> --- a/include/libvirt/libvirt-storage.h
> +++ b/include/libvirt/libvirt-storage.h
> @@ -57,7 +57,6 @@ typedef enum {
>  # endif
>  } virStoragePoolState;
>  
> -
>  typedef enum {
>      VIR_STORAGE_POOL_BUILD_NEW  = 0,   /* Regular build from scratch */
>      VIR_STORAGE_POOL_BUILD_REPAIR = (1 << 0), /* Repair / reinitialize */
> @@ -71,6 +70,21 @@ typedef enum {
>      VIR_STORAGE_POOL_DELETE_ZEROED = 1 << 0,  /* Clear all data to zeros (slow) */
>  } virStoragePoolDeleteFlags;
>  
> +typedef enum {
> +    VIR_STORAGE_POOL_CREATE_NORMAL = 0,
> +
> +    /* Create the pool and perform pool build without any flags */
> +    VIR_STORAGE_POOL_CREATE_WITH_BUILD = 1 << 0,
> +
> +    /* Create the pool and perform pool build using the
> +     * VIR_STORAGE_POOL_BUILD_OVERWRITE flag */
> +    VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE = 1 << 1,
> +
> +    /* Create the pool and perform pool build using the
> +     * VIR_STORAGE_POOL_BUILD_NO_OVERWRITE flag */
> +    VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE = 1 << 2,

So _OVERWRITE and _NO_OVERWRITE flags are mutually exclusive then,
right? Probably worth noting.

> +} virStoragePoolCreateFlags;
> +
>  typedef struct _virStoragePoolInfo virStoragePoolInfo;
>  
>  struct _virStoragePoolInfo {
> diff --git a/src/libvirt-storage.c b/src/libvirt-storage.c
> index 66dd9f0..238a6cd 100644
> --- a/src/libvirt-storage.c
> +++ b/src/libvirt-storage.c
> @@ -505,7 +505,7 @@ virStoragePoolLookupByVolume(virStorageVolPtr vol)
>   * virStoragePoolCreateXML:
>   * @conn: pointer to hypervisor connection
>   * @xmlDesc: XML description for new pool
> - * @flags: extra flags; not used yet, so callers should always pass 0
> + * @flags: bitwise-OR of virStoragePoolCreateFlags
>   *
>   * Create a new storage based on its XML description. The
>   * pool is not persistent, so its definition will disappear
> @@ -670,7 +670,7 @@ virStoragePoolUndefine(virStoragePoolPtr pool)
>  /**
>   * virStoragePoolCreate:
>   * @pool: pointer to storage pool
> - * @flags: extra flags; not used yet, so callers should always pass 0
> + * @flags: bitwise-OR of virStoragePoolCreateFlags
>   *
>   * Starts an inactive storage pool
>   *
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index bbf21f6..59a18bf 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -671,8 +671,11 @@ storagePoolCreateXML(virConnectPtr conn,
>      virStoragePoolPtr ret = NULL;
>      virStorageBackendPtr backend;
>      char *stateFile = NULL;
> +    unsigned int build_flags = 0;
>  
> -    virCheckFlags(0, NULL);
> +    virCheckFlags(VIR_STORAGE_POOL_CREATE_WITH_BUILD |
> +                  VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE |
> +                  VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE, NULL);

How about VIR_EXCLUSIVE_FLAGS_RET(_OVERWRITE, _NO_OVERWRITE, NULL);

>  
>      storageDriverLock();
>      if (!(def = virStoragePoolDefParseString(xml)))
> @@ -694,6 +697,22 @@ storagePoolCreateXML(virConnectPtr conn,
>          goto cleanup;
>      def = NULL;
>  
> +    if (backend->buildPool) {
> +        if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE)
> +            build_flags |= VIR_STORAGE_POOL_BUILD_OVERWRITE;
> +        else if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE)
> +            build_flags |= VIR_STORAGE_POOL_BUILD_NO_OVERWRITE;
> +
> +        if (build_flags ||
> +            (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD)) {

a-ha! So I need to pass _BUILD flag, and optionally one of _OVERWRITE
and _NO_OVERWRITE too. Okay.

> +            if (backend->buildPool(conn, pool, build_flags) < 0) {
> +                virStoragePoolObjRemove(&driver->pools, pool);
> +                pool = NULL;
> +                goto cleanup;
> +            }
> +        }
> +    }
> +
>      if (backend->startPool &&
>          backend->startPool(conn, pool) < 0) {
>          virStoragePoolObjRemove(&driver->pools, pool);
> @@ -845,8 +864,11 @@ storagePoolCreate(virStoragePoolPtr obj,
>      virStorageBackendPtr backend;
>      int ret = -1;
>      char *stateFile = NULL;
> +    unsigned int build_flags = 0;
>  
> -    virCheckFlags(0, -1);
> +    virCheckFlags(VIR_STORAGE_POOL_CREATE_WITH_BUILD |
> +                  VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE |
> +                  VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE, NULL);

s/NULL/-1/. The function is returning an integer, not a pointer.

Plus it would be nice if we check the mutually exclusive flags here too.

>  
>      if (!(pool = virStoragePoolObjFromStoragePool(obj)))
>          return -1;
> @@ -864,6 +886,22 @@ storagePoolCreate(virStoragePoolPtr obj,
>          goto cleanup;
>      }
>  
> +    if (backend->buildPool) {
> +        if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE)
> +            build_flags |= VIR_STORAGE_POOL_BUILD_OVERWRITE;
> +        else if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE)
> +            build_flags |= VIR_STORAGE_POOL_BUILD_NO_OVERWRITE;
> +
> +        if (build_flags ||
> +            (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD)) {
> +            if (backend->buildPool(obj->conn, pool, build_flags) < 0) {
> +                virStoragePoolObjRemove(&driver->pools, pool);
> +                pool = NULL;
> +                goto cleanup;
> +            }
> +        }
> +    }
> +
>      VIR_INFO("Starting up storage pool '%s'", pool->def->name);
>      if (backend->startPool &&
>          backend->startPool(obj->conn, pool) < 0)
> 

Otherwise looking good. ACK.

Michal




More information about the libvir-list mailing list