From efed366eb738ead959cfbb821d60b370a0dd585d Mon Sep 17 00:00:00 2001 From: Osier Yang Date: Mon, 4 Feb 2013 21:03:09 +0800 Subject: [PATCH] Introduce API virNodeDeviceLookupSCSIHostByWWN Since the name (like scsi_host10) is not stable for vHBA, (it can be changed either after recreating or system rebooting), current API virNodeDeviceLookupByName is not nice to use for management app in this case. (E.g. one wants to destroy the vHBA whose name has been changed after system rebooting, he has to find out current name first). Later patches will support the persistent vHBA via storage pool, with which one can identify the vHBA stably by the wwnn && wwpn pair. So this new API comes. --- include/libvirt/libvirt.h.in | 5 ++++ src/driver.h | 6 +++++ src/libvirt.c | 46 ++++++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 ++++ 4 files changed, 62 insertions(+) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 30762b1be9..ad30cd04c2 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -3257,6 +3257,11 @@ int virConnectListAllNodeDevices (virConnectPtr conn, virNodeDevicePtr virNodeDeviceLookupByName (virConnectPtr conn, const char *name); +virNodeDevicePtr virNodeDeviceLookupSCSIHostByWWN (virConnectPtr conn, + const char *wwnn, + const char *wwpn, + unsigned int flags); + const char * virNodeDeviceGetName (virNodeDevicePtr dev); const char * virNodeDeviceGetParent (virNodeDevicePtr dev); diff --git a/src/driver.h b/src/driver.h index 02ddd83d11..8d0f0a56e1 100644 --- a/src/driver.h +++ b/src/driver.h @@ -1553,6 +1553,11 @@ typedef int (*virDevMonListAllNodeDevices)(virConnectPtr conn, typedef virNodeDevicePtr (*virDevMonDeviceLookupByName)(virConnectPtr conn, const char *name); +typedef virNodeDevicePtr (*virDevMonDeviceLookupSCSIHostByWWN)(virConnectPtr conn, + const char *wwnn, + const char *wwpn, + unsigned int flags); + typedef char * (*virDevMonDeviceGetXMLDesc)(virNodeDevicePtr dev, unsigned int flags); @@ -1584,6 +1589,7 @@ struct _virDeviceMonitor { virDevMonListDevices listDevices; virDevMonListAllNodeDevices listAllNodeDevices; virDevMonDeviceLookupByName deviceLookupByName; + virDevMonDeviceLookupSCSIHostByWWN deviceLookupSCSIHostByWWN; virDevMonDeviceGetXMLDesc deviceGetXMLDesc; virDevMonDeviceGetParent deviceGetParent; virDevMonDeviceNumOfCaps deviceNumOfCaps; diff --git a/src/libvirt.c b/src/libvirt.c index f81a3de76b..1e78500c19 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -14334,6 +14334,52 @@ error: return NULL; } +/** + * virNodeDeviceLookupSCSIHostByWWN: + * @conn: pointer to the hypervisor connection + * @wwnn: WWNN of the SCSI Host. + * @wwpn: WWPN of the SCSI Host. + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * Lookup SCSI Host which is capable with 'fc_host' by its WWNN and WWPN. + * + * Returns a virNodeDevicePtr if found, NULL otherwise. + */ +virNodeDevicePtr +virNodeDeviceLookupSCSIHostByWWN(virConnectPtr conn, + const char *wwnn, + const char *wwpn, + unsigned int flags) +{ + VIR_DEBUG("conn=%p, wwnn=%p, wwpn=%p, flags=%x", conn, wwnn, wwpn, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__); + virDispatchError(NULL); + return NULL; + } + + virCheckNonNullArgGoto(wwnn, error); + virCheckNonNullArgGoto(wwpn, error); + + if (conn->deviceMonitor && + conn->deviceMonitor->deviceLookupSCSIHostByWWN) { + virNodeDevicePtr ret; + ret = conn->deviceMonitor->deviceLookupSCSIHostByWWN(conn, wwnn, + wwpn, flags); + if (!ret) + goto error; + return ret; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + virDispatchError(conn); + return NULL; +} /** * virNodeDeviceGetXMLDesc: diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 9777703a91..3bdfd57dcf 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -603,4 +603,9 @@ LIBVIRT_1.0.2 { virTypedParamsGetULLong; } LIBVIRT_1.0.1; +LIBVIRT_1.0.3 { + global: + virNodeDeviceLookupSCSIHostByWWN; +} LIBVIRT_1.0.2; + # .... define new API here using predicted next version number ....