[libvirt] The quest for virStorageVolResize()

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! -- Regards, Zeeshan Ali (Khattak) FSF member#5124 [1] Yes, I know there is a virDomainBlockResize but thats limited to running domains and I haven't yet figured if it can be nicely binded in libvirt-glib. Probably we'll want one function in libvirt-glib that will abstract both virDomainBlockResize() and virStorageVolResize().

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 :|

On Thu, Jan 26, 2012 at 12:55 PM, Daniel P. Berrange <berrange@redhat.com> wrote:
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 !
Glad to hear. :) Thanks for the detailed advice, I should have a reviewable patch soon.
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.
I'll try not to forget to rebase on latest git master before sending out my patch for review. -- Regards, Zeeshan Ali (Khattak) FSF member#5124
participants (2)
-
Daniel P. Berrange
-
Zeeshan Ali (Khattak)