[libvirt] [PATCH] rbd: Use rbd_create3 to create RBD format 2 images by default

Wido den Hollander wido at widodh.nl
Mon Jan 13 13:05:31 UTC 2014


On 12/11/2013 03:47 PM, Wido den Hollander wrote:
> This new RBD format supports snapshotting and cloning. By having
> libvirt create images in format 2 end-users of the created images
> can benefit of the new RBD format.
>
> Older versions of libvirt can work with this new RBD format as long
> as librbd supports format 2, something that all recent versions of
> librbd do.
>

Could somebody take a look at this patch? We would really like to see 
this in libvirt so it can make it's way into the Linux distributions.

Wido

> Signed-off-by: Wido den Hollander <wido at widodh.nl>
> ---
>   src/storage/storage_backend_rbd.c |   23 +++++++++++++++++++++--
>   1 file changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c
> index 4b6f18c..f3dd7a0 100644
> --- a/src/storage/storage_backend_rbd.c
> +++ b/src/storage/storage_backend_rbd.c
> @@ -435,6 +435,26 @@ cleanup:
>       return ret;
>   }
>
> +static int virStorageBackendRBDCreateImage(rados_ioctx_t io,
> +                                           char *name, long capacity)
> +{
> +    int order = 0;
> +    #if LIBRBD_VERSION_CODE > 260
> +    uint64_t features = 3;
> +    uint64_t stripe_count = 1;
> +    uint64_t stripe_unit = 4194304;
> +
> +    if (rbd_create3(io, name, capacity, features, &order,
> +                    stripe_count, stripe_unit) < 0) {
> +    #else
> +    if (rbd_create(io, name, capacity, &order) < 0) {
> +    #endif
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
>   static int virStorageBackendRBDCreateVol(virConnectPtr conn,
>                                            virStoragePoolObjPtr pool,
>                                            virStorageVolDefPtr vol)
> @@ -442,7 +462,6 @@ static int virStorageBackendRBDCreateVol(virConnectPtr conn,
>       virStorageBackendRBDState ptr;
>       ptr.cluster = NULL;
>       ptr.ioctx = NULL;
> -    int order = 0;
>       int ret = -1;
>
>       VIR_DEBUG("Creating RBD image %s/%s with size %llu",
> @@ -467,7 +486,7 @@ static int virStorageBackendRBDCreateVol(virConnectPtr conn,
>           goto cleanup;
>       }
>
> -    if (rbd_create(ptr.ioctx, vol->name, vol->capacity, &order) < 0) {
> +    if (virStorageBackendRBDCreateImage(ptr.ioctx, vol->name, vol->capacity) < 0) {
>           virReportError(VIR_ERR_INTERNAL_ERROR,
>                          _("failed to create volume '%s/%s'"),
>                          pool->def->source.name,
>




More information about the libvir-list mailing list