[libvirt] [PATCH 07/15] util: Move/rename virStoragePoolGetVhbaSCSIHostParent to virvhba
Pavel Hrdina
phrdina at redhat.com
Fri Feb 17 17:36:22 UTC 2017
On Fri, Feb 17, 2017 at 12:14:51PM -0500, John Ferlan wrote:
>
>
> On 02/17/2017 11:41 AM, Pavel Hrdina wrote:
> > On Wed, Jan 25, 2017 at 03:27:33PM -0500, John Ferlan wrote:
> >> Move the function and rename to simply virVHBAGetParent
> >>
> >> Since I'm changing related code, rather than have a Vhba named function
> >> in storage_backend_scsi rename it to simply checkParent as it's already
> >> within the scope of checking VHBA related features.
> >
> > This is Vhba named function but it isn't only VHBA related code.
> > With some modification it could be generic node device function to
> > get a parent of a device specified by it's name. The only VHBA related
> > code in this function is construction of the node device name.
> >
> > Even without this context we should not import anything from src/conf/*.h
> > in the src/util/* code.
>
> While I agree it's doesn't appear to be VHBA related since it's not
> looking at the sysfs file structure for the answer, but there is a
> reason for it.
>
> One could argue that virStoragePoolGetVhbaSCSIHostParent doesn't really
> belong in storage_conf.c either. IIRC it was placed there because of
> that awful matchFCHostToSCSIHost function (which theoretically could be
> moved too). There are other util functions that query a driver to get an
> answer (auth, closecallbacks), so that part isn't something new. It also
Yes they also include conf headers and it should not happen in
the first place.
> doesn't "do" something _conf specific such as format/alter - it's just
> getting an answer from the node device driver. There's nothing
> storage_conf specific about it.
>
> It is VHBA related if you consider that it's a way to take a name
> ("scsi_hostN") that's already been verified as a VHBA by some other
> virVHBA* sysfs perusing API and return its parent. Since one doesn't get
> the answer of parent via the file system, one must ask the driver.
>
> I'll have to look at my local branches to recall whether or not the
> "next" stages will need this. The next stages being the ability to
> add/define a VHBA to a domain directly with the ultimate goal being to
> add all the LUNs from the VHBA to the domain automagically. I believe
> the reason I made this generic is because it would be "duplicitous" to
> have a domain_conf.c function that does the same thing...
It would be way better to make a generic function that simply gets
a parent for node device specified by its name and place this function
into node_device_conf.c. There would be no duplication and the caller
would be responsible for constructing the correct node device name.
Pavel
> John
>
> >
> > NACK
> >
> > Pavel
> >
> >>
> >> Signed-off-by: John Ferlan <jferlan at redhat.com>
> >> ---
> >> src/conf/storage_conf.c | 61 +----------------------------------
> >> src/conf/storage_conf.h | 5 ---
> >> src/libvirt_private.syms | 2 +-
> >> src/storage/storage_backend_scsi.c | 12 +++----
> >> src/util/virvhba.c | 65 ++++++++++++++++++++++++++++++++++++++
> >> src/util/virvhba.h | 4 +++
> >> 6 files changed, 77 insertions(+), 72 deletions(-)
> >>
> >> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> >> index f8b5228..5e13bbf 100644
> >> --- a/src/conf/storage_conf.c
> >> +++ b/src/conf/storage_conf.c
> >> @@ -2264,64 +2264,6 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
> >> return ret;
> >> }
> >>
> >> -/*
> >> - * virStoragePoolGetVhbaSCSIHostParent:
> >> - *
> >> - * Using the Node Device Driver, find the host# name found via wwnn/wwpn
> >> - * lookup in the fc_host sysfs tree (e.g. virGetFCHostNameByWWN) to get
> >> - * the parent 'scsi_host#'.
> >> - *
> >> - * @conn: Connection pointer (must be non-NULL on entry)
> >> - * @name: Pointer a string from a virGetFCHostNameByWWN (e.g., "host#")
> >> - *
> >> - * Returns a "scsi_host#" string of the parent of the vHBA
> >> - */
> >> -char *
> >> -virStoragePoolGetVhbaSCSIHostParent(virConnectPtr conn,
> >> - const char *name)
> >> -{
> >> - char *nodedev_name = NULL;
> >> - virNodeDevicePtr device = NULL;
> >> - char *xml = NULL;
> >> - virNodeDeviceDefPtr def = NULL;
> >> - char *vhba_parent = NULL;
> >> -
> >> - VIR_DEBUG("conn=%p, name=%s", conn, name);
> >> -
> >> - /* We get passed "host#" from the return from virGetFCHostNameByWWN,
> >> - * so we need to adjust that to what the nodedev lookup expects
> >> - */
> >> - if (virAsprintf(&nodedev_name, "scsi_%s", name) < 0)
> >> - goto cleanup;
> >> -
> >> - /* Compare the scsi_host for the name with the provided parent
> >> - * if not the same, then fail
> >> - */
> >> - if (!(device = virNodeDeviceLookupByName(conn, nodedev_name))) {
> >> - virReportError(VIR_ERR_XML_ERROR,
> >> - _("Cannot find '%s' in node device database"),
> >> - nodedev_name);
> >> - goto cleanup;
> >> - }
> >> -
> >> - if (!(xml = virNodeDeviceGetXMLDesc(device, 0)))
> >> - goto cleanup;
> >> -
> >> - if (!(def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL)))
> >> - goto cleanup;
> >> -
> >> - /* The caller checks whether the returned value is NULL or not
> >> - * before continuing
> >> - */
> >> - ignore_value(VIR_STRDUP(vhba_parent, def->parent));
> >> -
> >> - cleanup:
> >> - VIR_FREE(nodedev_name);
> >> - virNodeDeviceDefFree(def);
> >> - VIR_FREE(xml);
> >> - virObjectUnref(device);
> >> - return vhba_parent;
> >> -}
> >>
> >> static int
> >> getSCSIHostNumber(virStoragePoolSourceAdapter adapter,
> >> @@ -2404,8 +2346,7 @@ matchFCHostToSCSIHost(virConnectPtr conn,
> >> * have a match.
> >> */
> >> if (conn && !fc_adapter.data.fchost.parent) {
> >> - parent_name = virStoragePoolGetVhbaSCSIHostParent(conn, name);
> >> - if (parent_name) {
> >> + if ((parent_name = virVHBAGetParent(conn, name))) {
> >> if (virGetSCSIHostNumber(parent_name, &fc_hostnum) == 0 &&
> >> scsi_hostnum == fc_hostnum) {
> >> VIR_FREE(parent_name);
> >> diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
> >> index b35471d..426e8b8 100644
> >> --- a/src/conf/storage_conf.h
> >> +++ b/src/conf/storage_conf.h
> >> @@ -30,7 +30,6 @@
> >> # include "virbitmap.h"
> >> # include "virthread.h"
> >> # include "device_conf.h"
> >> -# include "node_device_conf.h"
> >> # include "object_event.h"
> >>
> >> # include <libxml/tree.h>
> >> @@ -417,10 +416,6 @@ int virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
> >> virStoragePoolDefPtr def,
> >> unsigned int check_active);
> >>
> >> -char *virStoragePoolGetVhbaSCSIHostParent(virConnectPtr conn,
> >> - const char *name)
> >> - ATTRIBUTE_NONNULL(1);
> >> -
> >> int virStoragePoolSourceFindDuplicate(virConnectPtr conn,
> >> virStoragePoolObjListPtr pools,
> >> virStoragePoolDefPtr def);
> >> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> >> index 429c133..b58742d 100644
> >> --- a/src/libvirt_private.syms
> >> +++ b/src/libvirt_private.syms
> >> @@ -887,7 +887,6 @@ virStoragePoolFormatDiskTypeToString;
> >> virStoragePoolFormatFileSystemNetTypeToString;
> >> virStoragePoolFormatFileSystemTypeToString;
> >> virStoragePoolFormatLogicalTypeToString;
> >> -virStoragePoolGetVhbaSCSIHostParent;
> >> virStoragePoolLoadAllConfigs;
> >> virStoragePoolLoadAllState;
> >> virStoragePoolObjAssignDef;
> >> @@ -2744,6 +2743,7 @@ virVHBAFindVportHost;
> >> virVHBAGetConfig;
> >> virVHBAGetHostByFabricWWN;
> >> virVHBAGetHostByWWN;
> >> +virVHBAGetParent;
> >> virVHBAIsVportCapable;
> >> virVHBAManageVport;
> >> virVHBAPathExists;
> >> diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c
> >> index e037a93..2da15dd 100644
> >> --- a/src/storage/storage_backend_scsi.c
> >> +++ b/src/storage/storage_backend_scsi.c
> >> @@ -214,9 +214,9 @@ getAdapterName(virStoragePoolSourceAdapter adapter)
> >> * sysfs tree to get the parent 'scsi_host#' to ensure it matches.
> >> */
> >> static bool
> >> -checkVhbaSCSIHostParent(virConnectPtr conn,
> >> - const char *name,
> >> - const char *parent_name)
> >> +checkParent(virConnectPtr conn,
> >> + const char *name,
> >> + const char *parent_name)
> >> {
> >> char *vhba_parent = NULL;
> >> bool retval = false;
> >> @@ -227,7 +227,7 @@ checkVhbaSCSIHostParent(virConnectPtr conn,
> >> if (!conn)
> >> return true;
> >>
> >> - if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn, name)))
> >> + if (!(vhba_parent = virVHBAGetParent(conn, name)))
> >> goto cleanup;
> >>
> >> if (STRNEQ(parent_name, vhba_parent)) {
> >> @@ -276,7 +276,7 @@ createVport(virConnectPtr conn,
> >> * retrieved has the same parent
> >> */
> >> if (adapter->data.fchost.parent &&
> >> - checkVhbaSCSIHostParent(conn, name, adapter->data.fchost.parent))
> >> + checkParent(conn, name, adapter->data.fchost.parent))
> >> ret = 0;
> >>
> >> goto cleanup;
> >> @@ -416,7 +416,7 @@ deleteVport(virConnectPtr conn,
> >> if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
> >> goto cleanup;
> >> } else {
> >> - if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn, name)))
> >> + if (!(vhba_parent = virVHBAGetParent(conn, name)))
> >> goto cleanup;
> >>
> >> if (virGetSCSIHostNumber(vhba_parent, &parent_host) < 0)
> >> diff --git a/src/util/virvhba.c b/src/util/virvhba.c
> >> index e5637d7..8c4da3a 100644
> >> --- a/src/util/virvhba.c
> >> +++ b/src/util/virvhba.c
> >> @@ -18,6 +18,8 @@
> >>
> >> #include <config.h>
> >>
> >> +#include "node_device_conf.h"
> >> +
> >> #include "viralloc.h"
> >> #include "virerror.h"
> >> #include "virfile.h"
> >> @@ -530,3 +532,66 @@ virVHBAGetHostByFabricWWN(const char *sysfs_prefix ATTRIBUTE_UNUSED,
> >> }
> >>
> >> #endif /* __linux__ */
> >> +
> >> +
> >> +/* The following will be more generic - using the Node Device driver in
> >> + * order to perform the lookup rather than looking through the file system
> >> + * in order to find the answer */
> >> +/*
> >> + * virVHBAGetParent:
> >> + *
> >> + * Using the Node Device Driver, find the host# name found via wwnn/wwpn
> >> + * lookup in the fc_host sysfs tree (e.g. virGetFCHostNameByWWN) to get
> >> + * the parent 'scsi_host#'.
> >> + *
> >> + * @conn: Connection pointer (must be non-NULL on entry)
> >> + * @name: Pointer a string from a virGetFCHostNameByWWN (e.g., "host#")
> >> + *
> >> + * Returns a "scsi_host#" string of the parent of the vHBA
> >> + */
> >> +char *
> >> +virVHBAGetParent(virConnectPtr conn,
> >> + const char *name)
> >> +{
> >> + char *nodedev_name = NULL;
> >> + virNodeDevicePtr device = NULL;
> >> + char *xml = NULL;
> >> + virNodeDeviceDefPtr def = NULL;
> >> + char *vhba_parent = NULL;
> >> +
> >> + VIR_DEBUG("conn=%p, name=%s", conn, name);
> >> +
> >> + /* We get passed "host#" from the return from virGetFCHostNameByWWN,
> >> + * so we need to adjust that to what the nodedev lookup expects
> >> + */
> >> + if (virAsprintf(&nodedev_name, "scsi_%s", name) < 0)
> >> + goto cleanup;
> >> +
> >> + /* Compare the scsi_host for the name with the provided parent
> >> + * if not the same, then fail
> >> + */
> >> + if (!(device = virNodeDeviceLookupByName(conn, nodedev_name))) {
> >> + virReportError(VIR_ERR_XML_ERROR,
> >> + _("Cannot find '%s' in node device database"),
> >> + nodedev_name);
> >> + goto cleanup;
> >> + }
> >> +
> >> + if (!(xml = virNodeDeviceGetXMLDesc(device, 0)))
> >> + goto cleanup;
> >> +
> >> + if (!(def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL)))
> >> + goto cleanup;
> >> +
> >> + /* The caller checks whether the returned value is NULL or not
> >> + * before continuing
> >> + */
> >> + ignore_value(VIR_STRDUP(vhba_parent, def->parent));
> >> +
> >> + cleanup:
> >> + VIR_FREE(nodedev_name);
> >> + virNodeDeviceDefFree(def);
> >> + VIR_FREE(xml);
> >> + virObjectUnref(device);
> >> + return vhba_parent;
> >> +}
> >> diff --git a/src/util/virvhba.h b/src/util/virvhba.h
> >> index e338f96..b8d73ab 100644
> >> --- a/src/util/virvhba.h
> >> +++ b/src/util/virvhba.h
> >> @@ -52,4 +52,8 @@ char *virVHBAGetHostByFabricWWN(const char *sysfs_prefix,
> >> const char *fabric_wwn)
> >> ATTRIBUTE_NONNULL(2);
> >>
> >> +char *virVHBAGetParent(virConnectPtr conn,
> >> + const char *name)
> >> + ATTRIBUTE_NONNULL(1);
> >> +
> >> #endif /* __VIR_VBHA_H__ */
> >> --
> >> 2.7.4
> >>
> >> --
> >> libvir-list mailing list
> >> libvir-list at redhat.com
> >> https://www.redhat.com/mailman/listinfo/libvir-list
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170217/423225bf/attachment-0001.sig>
More information about the libvir-list
mailing list