Re: [libvirt] [PATCH v2 13/14] nodedev: Pass @def by reference to create/assign object

2017-05-26 Thread John Ferlan


On 05/26/2017 08:12 AM, Peter Krempa wrote:
> On Thu, May 25, 2017 at 15:57:10 -0400, John Ferlan wrote:
>> Since the @def is consumed by the assignment function, let's pass by
>> reference instead of value and really consume it.
>>
>> Signed-off-by: John Ferlan 
>> ---
>>  src/conf/virnodedeviceobj.c| 8 
>>  src/conf/virnodedeviceobj.h| 2 +-
>>  src/node_device/node_device_hal.c  | 2 +-
>>  src/node_device/node_device_udev.c | 8 +++-
>>  src/test/test_driver.c | 5 ++---
>>  5 files changed, 11 insertions(+), 14 deletions(-)
>>
>> diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
>> index a7e51ef..1648b33 100644
>> --- a/src/conf/virnodedeviceobj.c
>> +++ b/src/conf/virnodedeviceobj.c
>> @@ -268,13 +268,13 @@ virNodeDeviceObjListFree(virNodeDeviceObjListPtr devs)
>>  
>>  virNodeDeviceObjPtr
>>  virNodeDeviceObjAssignDef(virNodeDeviceObjListPtr devs,
>> -  virNodeDeviceDefPtr def)
>> +  virNodeDeviceDefPtr *def)
> 
> I don't really like this. You can documment that this function either
> consumes def always or only on success and the callers can free the
> pointer. Passing the pointer to a pointer just to clear it in some cases
> is overcomplicating stuff.
> 

True, but I ran into in one case (I forget which one now) where the
assumption was that the @def wasn't consumed on a failure, but in
reality it had been.  The obj->def got assigned, then the attempt was
made to add the obj to the list which if it failed would call whatever
cleanup routine was there which free'd @obj->def and returned to the
caller with a failure which would attempt to free @def (again). My first
instinct was to just set obj->def = NULL prior to the cleanup, which
worked for a short time until obj->def was a "real" object and the
cleanup code didn't own obj any more.

So it's the long winded way of saying - I can drop this and the
following patch either be "more careful" as necessary or just claim at
some point in time that @def would be consumed on both success and
failure, which I think follows how virJSONValueObjectCreate eats the
"a:" arguments (and causes many false positives for Coverity).

John

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2 13/14] nodedev: Pass @def by reference to create/assign object

2017-05-26 Thread Peter Krempa
On Thu, May 25, 2017 at 15:57:10 -0400, John Ferlan wrote:
> Since the @def is consumed by the assignment function, let's pass by
> reference instead of value and really consume it.
> 
> Signed-off-by: John Ferlan 
> ---
>  src/conf/virnodedeviceobj.c| 8 
>  src/conf/virnodedeviceobj.h| 2 +-
>  src/node_device/node_device_hal.c  | 2 +-
>  src/node_device/node_device_udev.c | 8 +++-
>  src/test/test_driver.c | 5 ++---
>  5 files changed, 11 insertions(+), 14 deletions(-)
> 
> diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
> index a7e51ef..1648b33 100644
> --- a/src/conf/virnodedeviceobj.c
> +++ b/src/conf/virnodedeviceobj.c
> @@ -268,13 +268,13 @@ virNodeDeviceObjListFree(virNodeDeviceObjListPtr devs)
>  
>  virNodeDeviceObjPtr
>  virNodeDeviceObjAssignDef(virNodeDeviceObjListPtr devs,
> -  virNodeDeviceDefPtr def)
> +  virNodeDeviceDefPtr *def)

I don't really like this. You can documment that this function either
consumes def always or only on success and the callers can free the
pointer. Passing the pointer to a pointer just to clear it in some cases
is overcomplicating stuff.


signature.asc
Description: PGP signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH v2 13/14] nodedev: Pass @def by reference to create/assign object

2017-05-25 Thread John Ferlan
Since the @def is consumed by the assignment function, let's pass by
reference instead of value and really consume it.

Signed-off-by: John Ferlan 
---
 src/conf/virnodedeviceobj.c| 8 
 src/conf/virnodedeviceobj.h| 2 +-
 src/node_device/node_device_hal.c  | 2 +-
 src/node_device/node_device_udev.c | 8 +++-
 src/test/test_driver.c | 5 ++---
 5 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
index a7e51ef..1648b33 100644
--- a/src/conf/virnodedeviceobj.c
+++ b/src/conf/virnodedeviceobj.c
@@ -268,13 +268,13 @@ virNodeDeviceObjListFree(virNodeDeviceObjListPtr devs)
 
 virNodeDeviceObjPtr
 virNodeDeviceObjAssignDef(virNodeDeviceObjListPtr devs,
-  virNodeDeviceDefPtr def)
+  virNodeDeviceDefPtr *def)
 {
 virNodeDeviceObjPtr obj;
 
-if ((obj = virNodeDeviceObjFindByName(devs, def->name))) {
+if ((obj = virNodeDeviceObjFindByName(devs, (*def)->name))) {
 virNodeDeviceDefFree(obj->def);
-obj->def = def;
+VIR_STEAL_PTR(obj->def, *def);
 return obj;
 }
 
@@ -294,7 +294,7 @@ virNodeDeviceObjAssignDef(virNodeDeviceObjListPtr devs,
 virNodeDeviceObjFree(obj);
 return NULL;
 }
-obj->def = def;
+VIR_STEAL_PTR(obj->def, *def);
 
 return obj;
 
diff --git a/src/conf/virnodedeviceobj.h b/src/conf/virnodedeviceobj.h
index 135a424..49c28e7 100644
--- a/src/conf/virnodedeviceobj.h
+++ b/src/conf/virnodedeviceobj.h
@@ -53,7 +53,7 @@ virNodeDeviceObjFindBySysfsPath(virNodeDeviceObjListPtr devs,
 
 virNodeDeviceObjPtr
 virNodeDeviceObjAssignDef(virNodeDeviceObjListPtr devs,
-  virNodeDeviceDefPtr def);
+  virNodeDeviceDefPtr *def);
 
 void
 virNodeDeviceObjRemove(virNodeDeviceObjListPtr devs,
diff --git a/src/node_device/node_device_hal.c 
b/src/node_device/node_device_hal.c
index e9031ea..2d996a9 100644
--- a/src/node_device/node_device_hal.c
+++ b/src/node_device/node_device_hal.c
@@ -482,7 +482,7 @@ dev_create(const char *udi)
 /* Some devices don't have a path in sysfs, so ignore failure */
 (void)get_str_prop(ctx, udi, "linux.sysfs_path", );
 
-if (!(obj = virNodeDeviceObjAssignDef(>devs, def))) {
+if (!(obj = virNodeDeviceObjAssignDef(>devs, ))) {
 VIR_FREE(devicePath);
 goto failure;
 }
diff --git a/src/node_device/node_device_udev.c 
b/src/node_device/node_device_udev.c
index 83a8fcc..0250aab 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1395,7 +1395,7 @@ udevAddOneDevice(struct udev_device *device)
 
 /* If this is a device change, the old definition will be freed
  * and the current definition will take its place. */
-if (!(obj = virNodeDeviceObjAssignDef(>devs, def)))
+if (!(obj = virNodeDeviceObjAssignDef(>devs, )))
 goto cleanup;
 objdef = virNodeDeviceObjGetDef(obj);
 
@@ -1685,8 +1685,7 @@ udevSetupSystemDev(void)
 udevGetDMIData(>caps->data.system);
 #endif
 
-obj = virNodeDeviceObjAssignDef(>devs, def);
-if (obj == NULL)
+if (!(obj = virNodeDeviceObjAssignDef(>devs, )))
 goto cleanup;
 
 virNodeDeviceObjUnlock(obj);
@@ -1694,8 +1693,7 @@ udevSetupSystemDev(void)
 ret = 0;
 
  cleanup:
-if (ret == -1)
-virNodeDeviceDefFree(def);
+virNodeDeviceDefFree(def);
 
 return ret;
 }
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 206fdf9..84ff1de 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1168,7 +1168,7 @@ testParseNodedevs(testDriverPtr privconn,
 if (!def)
 goto error;
 
-if (!(obj = virNodeDeviceObjAssignDef(>devs, def))) {
+if (!(obj = virNodeDeviceObjAssignDef(>devs, ))) {
 virNodeDeviceDefFree(def);
 goto error;
 }
@@ -5491,9 +5491,8 @@ testNodeDeviceMockCreateVport(testDriverPtr driver,
 caps = caps->next;
 }
 
-if (!(obj = virNodeDeviceObjAssignDef(>devs, def)))
+if (!(obj = virNodeDeviceObjAssignDef(>devs, )))
 goto cleanup;
-def = NULL;
 objdef = virNodeDeviceObjGetDef(obj);
 
 event = virNodeDeviceEventLifecycleNew(objdef->name,
-- 
2.9.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list