[libvirt] [PATCH] nodedev: Return the parent for a virNodeDevicePtr struct
John Ferlan
jferlan at redhat.com
Thu Feb 16 11:51:00 UTC 2017
ping - no ACK on the only comment...
Tks -
John
On 02/08/2017 05:03 PM, John Ferlan wrote:
> When the 'parent' was added to the virNodeDevicePtr structure
> by commit id 'e8a4ea75a' the 'parent' field was not properly filled
> in when a virGetNodeDevice call was made within driver/config code.
> Only the device name was ever filled in. Fetching the parent required
> a second trip via virNodeDeviceGetParent into the node device lookup
> code was required in order to retrieve the specific parent field (and
> still the parent field was never filled in although it was free'd).
>
> Since we have the data when we initially call virGetNodeDevice from
> within driver/node_config code - let's just fill in the parent field
> as well for anyone that wants it without requiring another trip into
> the node_device lookup just to get the parent.
>
> This will allow API's such as virConnectListAllNodeDevices,
> virNodeDeviceLookupByName, and virNodeDeviceLookupSCSIHostByWWN
> to retrieve both name and parent in the returned virNodeDevicePtr.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>
> Found this while working on some vHBA in the domain code when I was
> thinking about using a virConnectListAllNodeDevices... The returned
> structures didn't have the ->parent filled in...
>
> src/conf/node_device_conf.c | 4 ++--
> src/node_device/node_device_driver.c | 10 ++++++++--
> src/test/test_driver.c | 6 +++++-
> 3 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index 4d3268f..f6d7692 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -2158,8 +2158,8 @@ virNodeDeviceObjListExport(virConnectPtr conn,
> if ((!filter || filter(conn, devobj->def)) &&
> virNodeDeviceMatch(devobj, flags)) {
> if (devices) {
> - if (!(device = virGetNodeDevice(conn,
> - devobj->def->name))) {
> + if (!(device = virGetNodeDevice(conn, devobj->def->name)) ||
> + VIR_STRDUP(device->parent, devobj->def->parent) < 0) {
> virNodeDeviceObjUnlock(devobj);
> goto cleanup;
> }
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index 5238e23..4900e32 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -261,7 +261,10 @@ nodeDeviceLookupByName(virConnectPtr conn, const char *name)
> if (virNodeDeviceLookupByNameEnsureACL(conn, obj->def) < 0)
> goto cleanup;
>
> - ret = virGetNodeDevice(conn, name);
> + if ((ret = virGetNodeDevice(conn, name))) {
> + if (VIR_STRDUP(ret->parent, obj->def->parent) < 0)
> + virObjectUnref(ret);
> + }
>
> cleanup:
> if (obj)
> @@ -302,7 +305,10 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn,
> if (virNodeDeviceLookupSCSIHostByWWNEnsureACL(conn, obj->def) < 0)
> goto out;
>
> - dev = virGetNodeDevice(conn, obj->def->name);
> + if ((dev = virGetNodeDevice(conn, obj->def->name))) {
> + if (VIR_STRDUP(dev->parent, obj->def->parent) < 0)
> + virObjectUnref(dev);
> + }
> virNodeDeviceObjUnlock(obj);
> goto out;
> }
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 6820298..8dd738b 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -5450,7 +5450,10 @@ testNodeDeviceLookupByName(virConnectPtr conn, const char *name)
> goto cleanup;
> }
>
> - ret = virGetNodeDevice(conn, name);
> + if ((ret = virGetNodeDevice(conn, name))) {
> + if (VIR_STRDUP(ret->parent, obj->def->parent) < 0)
> + virObjectUnref(ret);
> + }
>
> cleanup:
> if (obj)
> @@ -5648,6 +5651,7 @@ testNodeDeviceCreateXML(virConnectPtr conn,
> 0);
>
> dev = virGetNodeDevice(conn, def->name);
> + ignore_value(VIR_STRDUP(def->parent, def->parent));
> def = NULL;
> cleanup:
> testDriverUnlock(driver);
>
More information about the libvir-list
mailing list