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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list