[libvirt] [PATCH v2 02/12] storage: Introduce virStoragePoolObjNew
Michal Privoznik
mprivozn at redhat.com
Tue Sep 19 06:39:01 UTC 2017
On 08/24/2017 03:08 PM, John Ferlan wrote:
> Create/use a helper to perform object allocation.
>
> Adjust storagevolxml2argvtest.c in order to use the allocator and
> setting of the obj->def.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/conf/virstorageobj.c | 31 +++++++++++++++++++++----------
> src/conf/virstorageobj.h | 3 +++
> src/libvirt_private.syms | 1 +
> tests/storagevolxml2argvtest.c | 20 +++++++++++---------
> 4 files changed, 36 insertions(+), 19 deletions(-)
>
> diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
> index ebda9fe..eb7664c 100644
> --- a/src/conf/virstorageobj.c
> +++ b/src/conf/virstorageobj.c
> @@ -37,6 +37,26 @@
> VIR_LOG_INIT("conf.virstorageobj");
>
>
> +virStoragePoolObjPtr
> +virStoragePoolObjNew(void)
> +{
> + virStoragePoolObjPtr obj;
> +
> + if (VIR_ALLOC(obj) < 0)
> + return NULL;
> +
> + if (virMutexInit(&obj->lock) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("cannot initialize mutex"));
> + VIR_FREE(obj);
> + return NULL;
> + }
> + virStoragePoolObjLock(obj);
> + obj->active = 0;
> + return obj;
> +}
> +
> +
> virStoragePoolDefPtr
> virStoragePoolObjGetDef(virStoragePoolObjPtr obj)
> {
> @@ -421,17 +441,8 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
> return obj;
> }
>
> - if (VIR_ALLOC(obj) < 0)
> - return NULL;
> -
> - if (virMutexInit(&obj->lock) < 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("cannot initialize mutex"));
> - VIR_FREE(obj);
> + if (!(obj = virStoragePoolObjNew()))
> return NULL;
> - }
> - virStoragePoolObjLock(obj);
> - obj->active = 0;
>
> if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, obj) < 0) {
> virStoragePoolObjUnlock(obj);
> diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h
> index a5ed8f8..401c4d5 100644
> --- a/src/conf/virstorageobj.h
> +++ b/src/conf/virstorageobj.h
> @@ -70,6 +70,9 @@ typedef bool
> (*virStoragePoolObjListFilter)(virConnectPtr conn,
> virStoragePoolDefPtr def);
>
> +virStoragePoolObjPtr
> +virStoragePoolObjNew(void);
> +
> virStoragePoolDefPtr
> virStoragePoolObjGetDef(virStoragePoolObjPtr obj);
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 8bb1cbc..fc884fa 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1071,6 +1071,7 @@ virStoragePoolObjListFree;
> virStoragePoolObjLoadAllConfigs;
> virStoragePoolObjLoadAllState;
> virStoragePoolObjLock;
> +virStoragePoolObjNew;
> virStoragePoolObjNumOfStoragePools;
> virStoragePoolObjNumOfVolumes;
> virStoragePoolObjRemove;
> diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
> index 9e43204..2ee3dba 100644
> --- a/tests/storagevolxml2argvtest.c
> +++ b/tests/storagevolxml2argvtest.c
> @@ -50,18 +50,19 @@ testCompareXMLToArgvFiles(bool shouldFail,
> virConnectPtr conn;
>
> virStorageVolDefPtr vol = NULL, inputvol = NULL;
> - virStoragePoolDefPtr pool = NULL;
> + virStoragePoolDefPtr def = NULL;
> virStoragePoolDefPtr inputpool = NULL;
> - virStoragePoolObj poolobj = {.def = NULL };
> -
> + virStoragePoolObjPtr obj = NULL;
>
> if (!(conn = virGetConnect()))
> goto cleanup;
>
> - if (!(pool = virStoragePoolDefParseFile(poolxml)))
> + if (!(def = virStoragePoolDefParseFile(poolxml)))
> goto cleanup;
>
> - poolobj.def = pool;
> + if (!(obj = virStoragePoolObjNew()))
> + goto cleanup;
> + virStoragePoolObjSetDef(obj, def);
>
> if (inputpoolxml) {
> if (!(inputpool = virStoragePoolDefParseFile(inputpoolxml)))
> @@ -71,17 +72,17 @@ testCompareXMLToArgvFiles(bool shouldFail,
> if (inputvolxml)
> parse_flags |= VIR_VOL_XML_PARSE_NO_CAPACITY;
>
> - if (!(vol = virStorageVolDefParseFile(pool, volxml, parse_flags)))
> + if (!(vol = virStorageVolDefParseFile(def, volxml, parse_flags)))
> goto cleanup;
>
> if (inputvolxml &&
> !(inputvol = virStorageVolDefParseFile(inputpool, inputvolxml, 0)))
> goto cleanup;
>
> - testSetVolumeType(vol, pool);
> + testSetVolumeType(vol, def);
> testSetVolumeType(inputvol, inputpool);
>
> - cmd = virStorageBackendCreateQemuImgCmdFromVol(conn, &poolobj, vol,
> + cmd = virStorageBackendCreateQemuImgCmdFromVol(conn, obj, vol,
> inputvol, flags,
> create_tool, imgformat,
> NULL);
> @@ -102,12 +103,13 @@ testCompareXMLToArgvFiles(bool shouldFail,
> ret = 0;
>
> cleanup:
> - virStoragePoolDefFree(pool);
> + virStoragePoolDefFree(def);
> virStoragePoolDefFree(inputpool);
> virStorageVolDefFree(vol);
> virStorageVolDefFree(inputvol);
> virCommandFree(cmd);
> VIR_FREE(actualCmdline);
> + virStoragePoolObjUnlock(obj);
Almost. Firstly, @def is now part of @obj so it shouldn't be freed
separately. Secondly, @obj is leaked. ACK if you squash this in:
diff --git i/tests/Makefile.am w/tests/Makefile.am
index 1f8c4cd42..813888575 100644
--- i/tests/Makefile.am
+++ w/tests/Makefile.am
@@ -885,7 +885,10 @@ storagevolxml2argvtest_SOURCES = \
testutils.c testutils.h
storagevolxml2argvtest_LDADD = \
$(LIBXML_LIBS) \
- ../src/libvirt_driver_storage_impl.la $(LDADDS)
+ ../src/libvirt_driver_storage_impl.la \
+ ../src/libvirt_conf.la \
+ ../src/libvirt_util.la \
+ $(LDADDS)
else ! WITH_STORAGE
EXTRA_DIST += storagevolxml2argvtest.c
diff --git i/tests/storagevolxml2argvtest.c w/tests/storagevolxml2argvtest.c
index 2ee3dbad9..1b3003216 100644
--- i/tests/storagevolxml2argvtest.c
+++ w/tests/storagevolxml2argvtest.c
@@ -60,8 +60,10 @@ testCompareXMLToArgvFiles(bool shouldFail,
if (!(def = virStoragePoolDefParseFile(poolxml)))
goto cleanup;
- if (!(obj = virStoragePoolObjNew()))
+ if (!(obj = virStoragePoolObjNew())) {
+ virStoragePoolDefFree(def);
goto cleanup;
+ }
virStoragePoolObjSetDef(obj, def);
if (inputpoolxml) {
@@ -103,13 +105,13 @@ testCompareXMLToArgvFiles(bool shouldFail,
ret = 0;
cleanup:
- virStoragePoolDefFree(def);
virStoragePoolDefFree(inputpool);
virStorageVolDefFree(vol);
virStorageVolDefFree(inputvol);
virCommandFree(cmd);
VIR_FREE(actualCmdline);
virStoragePoolObjUnlock(obj);
+ virStoragePoolObjFree(obj);
virObjectUnref(conn);
return ret;
}
Alternatively, you can leave the virStoragePoolDefFree() call as is and
just set @def = NULL right after virStoragePoolObjSetDef(). I'll leave it
up to you which one you prefer.
Michal
More information about the libvir-list
mailing list