Signed-off-by: Cole Robinson <crobinso@xxxxxxxxxx> --- include/libvirt/libvirt.h | 4 +++ include/libvirt/libvirt.h.in | 4 +++ src/driver.h | 6 ++++ src/libvirt.c | 61 ++++++++++++++++++++++++++++++++++++++++- src/libvirt_public.syms | 5 +++ 5 files changed, 78 insertions(+), 2 deletions(-) diff --git a/include/libvirt/libvirt.h b/include/libvirt/libvirt.h index 30f559d..b1e45e4 100644 --- a/include/libvirt/libvirt.h +++ b/include/libvirt/libvirt.h @@ -1047,6 +1047,10 @@ const char* virStorageVolGetKey (virStorageVolPtr vol); virStorageVolPtr virStorageVolCreateXML (virStoragePoolPtr pool, const char *xmldesc, unsigned int flags); +virStorageVolPtr virStorageVolCreateXMLFrom (virStoragePoolPtr pool, + const char *xmldesc, + unsigned int flags, + virStorageVolPtr clonevol); int virStorageVolDelete (virStorageVolPtr vol, unsigned int flags); int virStorageVolRef (virStorageVolPtr vol); diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 2f7076f..f5cadb4 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -1047,6 +1047,10 @@ const char* virStorageVolGetKey (virStorageVolPtr vol); virStorageVolPtr virStorageVolCreateXML (virStoragePoolPtr pool, const char *xmldesc, unsigned int flags); +virStorageVolPtr virStorageVolCreateXMLFrom (virStoragePoolPtr pool, + const char *xmldesc, + unsigned int flags, + virStorageVolPtr clonevol); int virStorageVolDelete (virStorageVolPtr vol, unsigned int flags); int virStorageVolRef (virStorageVolPtr vol); diff --git a/src/driver.h b/src/driver.h index c357b76..ff12ada 100644 --- a/src/driver.h +++ b/src/driver.h @@ -586,6 +586,11 @@ typedef char * typedef char * (*virDrvStorageVolGetPath) (virStorageVolPtr vol); +typedef virStorageVolPtr + (*virDrvStorageVolCreateXMLFrom) (virStoragePoolPtr pool, + const char *xmldesc, + unsigned int flags, + virStorageVolPtr clone); typedef struct _virStorageDriver virStorageDriver; @@ -633,6 +638,7 @@ struct _virStorageDriver { virDrvStorageVolLookupByKey volLookupByKey; virDrvStorageVolLookupByPath volLookupByPath; virDrvStorageVolCreateXML volCreateXML; + virDrvStorageVolCreateXMLFrom volCreateXMLFrom; virDrvStorageVolDelete volDelete; virDrvStorageVolGetInfo volGetInfo; virDrvStorageVolGetXMLDesc volGetXMLDesc; diff --git a/src/libvirt.c b/src/libvirt.c index ded18a7..5a51c45 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -6767,6 +6767,65 @@ error: /** + * virStorageVolCreateXMLFrom: + * @pool: pointer to parent pool for the new volume + * @xmldesc: description of volume to create + * @flags: flags for creation (unused, pass 0) + * @clonevol: storage volume to use as input + * + * Create a storage volume in the parent pool, using the + * 'clonevol' volume as input. Information for the new + * volume (name, perms) are passed via a typical volume + * XML description. + * + * return the storage volume, or NULL on error + */ +virStorageVolPtr +virStorageVolCreateXMLFrom(virStoragePoolPtr pool, + const char *xmldesc, + unsigned int flags, + virStorageVolPtr clonevol) +{ + DEBUG("pool=%p, flags=%u, clonevol=%p", pool, flags, clonevol); + + virResetLastError(); + + if (!VIR_IS_STORAGE_POOL(pool)) { + virLibConnError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__); + return (NULL); + } + + if (!VIR_IS_STORAGE_VOL(clonevol)) { + virLibConnError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__); + return (NULL); + } + + if (pool->conn->flags & VIR_CONNECT_RO || + clonevol->conn->flags & VIR_CONNECT_RO) { + virLibConnError(pool->conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (pool->conn->storageDriver && + pool->conn->storageDriver->volCreateXMLFrom) { + virStorageVolPtr ret; + ret = pool->conn->storageDriver->volCreateXMLFrom (pool, xmldesc, + flags, clonevol); + if (!ret) + goto error; + return ret; + } + + virLibConnError (pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(pool->conn); + return NULL; +} + + +/** * virStorageVolDelete: * @vol: pointer to storage volume * @flags: future flags, use 0 for now @@ -7009,8 +7068,6 @@ error: } - - /** * virNodeNumOfDevices: * @conn: pointer to the hypervisor connection diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index b8f9128..0ea130f 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -265,3 +265,8 @@ LIBVIRT_0.6.3 { } LIBVIRT_0.6.1; # .... define new API here using predicted next version number .... + +LIBVIRT_0.6.4 { + global: + virStorageVolCreateXMLFrom; +} LIBVIRT_0.6.3; -- 1.6.0.6 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list