[libvirt] The quest for virStorageVolResize()

Daniel P. Berrange berrange at redhat.com
Thu Jan 26 10:55:01 UTC 2012


On Thu, Jan 26, 2012 at 04:00:10AM +0200, Zeeshan Ali (Khattak) wrote:
> Hi everyone,
>    In Boxes we'll need to change the size of the storage volumes (we
> use qcow2 files) but turns out that there is no virStorageVolResize()
> yet[1]. In my chat with Daniel on IRC, he mentioned that this would be
> a trivial task so I thought I should try to do it myself. I've been
> looking into this for several hours now and haven't gotten very far. I
> guess Daniel overestimated my skills of deciphering complicated code.
> :) Attached is my very much WIP patch that at least builds but doesn't
> exactly work yet:
> 
> virsh # vol-resize 'Microsoft Windows XP.qcow2' '4G' gnome-boxes
> error: Failed to change size of volume 'Microsoft Windows XP.qcow2' to 4G
> 
> error: this function is not supported by the connection driver:
> virStorageVolResize
> ---------------------
> 
> If anyone can have a look and tell me if I'm going anywhere towards
> the right direction and what level of indirection I'm missing here,
> that would be awesome!

You were so close !

You've done the public API, and you've done the daemon storage
driver bits too. What is missing is the RPC part which allows
libvirt.so to communicate with the storage driver, which runs
inside libvirtd.  For something as sane as the virStorageVolResize
API, most of this code will auto-generate. So you need to touch

 src/remote/remote_protocol.x
 src/remote_protocol-structs

to define the wire format.

Then, just add the auto-generated dispatcher to src/remote/remote_driver.h
API table at the end of the file.


> +int
> +virStorageVolResize(virStorageVolPtr vol,
> +                    unsigned long long capacity,
> +                    unsigned int flags)
> +{
> +    virConnectPtr conn;
> +    VIR_DEBUG("vol=%p", vol);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_STORAGE_VOL(vol)) {
> +        virLibStorageVolError(VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }

You need to check add this in, since this API is dangerous in readonly
mode

    if (conn->flags & VIR_CONNECT_RO) {
        virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
        goto error;
    }


> +
> +    conn = vol->conn;
> +
> +    if (conn->storageDriver && conn->storageDriver->volResize) {
> +        int ret;
> +        ret = conn->storageDriver->volResize(vol, capacity, flags);
> +        if (!ret)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(vol->conn);
> +    return -1;
> +}
>  
>  /**
>   * virNodeNumOfDevices:
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index 4ca7216..5155022 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -516,4 +516,9 @@ LIBVIRT_0.9.9 {
>          virDomainSetNumaParameters;
>  } LIBVIRT_0.9.8;
>  
> +LIBVIRT_0.9.10 {
> +    global:
> +	virStorageVolResize;
> +} LIBVIRT_0.9.9;

I think you'll have a merge conflict if you rebase to latest
GIT, since we pushed a couple of APIs yesterday.



Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list