This abstracts nodeDeviceVportCreateDelete as an util function virManageVport, which can be further used by later storage patches (to support persistent vHBA, I don't want to create the vHBA using the public API, that's awkful). --- src/libvirt_private.syms | 1 + src/node_device/node_device_driver.c | 101 +++------------------------------- src/node_device/node_device_driver.h | 5 -- src/util/virutil.c | 84 ++++++++++++++++++++++++++++ src/util/virutil.h | 11 ++++ 5 files changed, 104 insertions(+), 98 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 41c0d84..90e16f3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1296,6 +1296,7 @@ virIndexToDiskName; virIsCapableFCHost; virIsCapableVport; virIsDevMapperDevice; +virManageVport; virParseNumber; virParseVersionString; virPipeReadUntilEOF; diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c index db2f922..75b07c5 100644 --- a/src/node_device/node_device_driver.c +++ b/src/node_device/node_device_driver.c @@ -408,91 +408,6 @@ cleanup: return ret; } - -static int -nodeDeviceVportCreateDelete(const int parent_host, - const char *wwpn, - const char *wwnn, - int operation) -{ - int retval = 0; - char *operation_path = NULL, *vport_name = NULL; - const char *operation_file = NULL; - - switch (operation) { - case VPORT_CREATE: - operation_file = LINUX_SYSFS_VPORT_CREATE_POSTFIX; - break; - case VPORT_DELETE: - operation_file = LINUX_SYSFS_VPORT_DELETE_POSTFIX; - break; - default: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Invalid vport operation (%d)"), operation); - retval = -1; - goto cleanup; - break; - } - - if (virAsprintf(&operation_path, - "%shost%d%s", - LINUX_SYSFS_FC_HOST_PREFIX, - parent_host, - operation_file) < 0) { - - virReportOOMError(); - retval = -1; - goto cleanup; - } - - if (!virFileExists(operation_path)) { - VIR_FREE(operation_path); - if (virAsprintf(&operation_path, - "%shost%d%s", - LINUX_SYSFS_SCSI_HOST_PREFIX, - parent_host, - operation_file) < 0) { - virReportOOMError(); - retval = -1; - goto cleanup; - } - - if (!virFileExists(operation_path)) { - VIR_ERROR(_("No vport operation path found for host%d"), - parent_host); - retval = -1; - goto cleanup; - } - } - - VIR_DEBUG("Vport operation path is '%s'", operation_path); - - if (virAsprintf(&vport_name, - "%s:%s", - wwpn, - wwnn) < 0) { - - virReportOOMError(); - retval = -1; - goto cleanup; - } - - if (virFileWriteStr(operation_path, vport_name, 0) == -1) { - virReportSystemError(errno, - _("Write of '%s' to '%s' during " - "vport create/delete failed"), - vport_name, operation_path); - retval = -1; - } - -cleanup: - VIR_FREE(vport_name); - VIR_FREE(operation_path); - VIR_DEBUG("%s", _("Vport operation complete")); - return retval; -} - - static int get_time(time_t *t) { @@ -594,10 +509,10 @@ nodeDeviceCreateXML(virConnectPtr conn, goto cleanup; } - if (nodeDeviceVportCreateDelete(parent_host, - wwpn, - wwnn, - VPORT_CREATE) == -1) { + if (virManageVport(parent_host, + wwpn, + wwnn, + VPORT_CREATE) == -1) { goto cleanup; } @@ -661,10 +576,10 @@ nodeDeviceDestroy(virNodeDevicePtr dev) goto out; } - if (nodeDeviceVportCreateDelete(parent_host, - wwpn, - wwnn, - VPORT_DELETE) == -1) { + if (virManageVport(parent_host, + wwpn, + wwnn, + VPORT_DELETE) == -1) { goto out; } diff --git a/src/node_device/node_device_driver.h b/src/node_device/node_device_driver.h index 17bd020..d5f5ded 100644 --- a/src/node_device/node_device_driver.h +++ b/src/node_device/node_device_driver.h @@ -32,11 +32,6 @@ # define LINUX_SYSFS_SCSI_HOST_POSTFIX "device" # define LINUX_SYSFS_FC_HOST_PREFIX "/sys/class/fc_host/" -# define VPORT_CREATE 0 -# define VPORT_DELETE 1 -# define LINUX_SYSFS_VPORT_CREATE_POSTFIX "/vport_create" -# define LINUX_SYSFS_VPORT_DELETE_POSTFIX "/vport_delete" - # define LINUX_NEW_DEVICE_WAIT_TIME 60 # ifdef HAVE_HAL diff --git a/src/util/virutil.c b/src/util/virutil.c index 95c5b81..f804521 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -3383,6 +3383,79 @@ cleanup: VIR_FREE(scsi_host_path); return ret; } + +int +virManageVport(const int parent_host, + const char *wwpn, + const char *wwnn, + int operation) +{ + int ret = -1; + char *operation_path = NULL, *vport_name = NULL; + const char *operation_file = NULL; + + switch (operation) { + case VPORT_CREATE: + operation_file = "vport_create"; + break; + case VPORT_DELETE: + operation_file = "vport_delete"; + break; + default: + virReportError(VIR_ERR_OPERATION_INVALID, + _("Invalid vport operation (%d)"), operation); + goto cleanup; + } + + if (virAsprintf(&operation_path, + "%shost%d%s", + SYSFS_FC_HOST_PATH, + parent_host, + operation_file) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (!virFileExists(operation_path)) { + VIR_FREE(operation_path); + if (virAsprintf(&operation_path, + "%shost%d%s", + SYSFS_SCSI_HOST_PATH, + parent_host, + operation_file) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (!virFileExists(operation_path)) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("vport operation '%s' is not supported for host%d"), + operation_file, parent_host); + goto cleanup; + } + } + + if (virAsprintf(&vport_name, + "%s:%s", + wwpn, + wwnn) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (virFileWriteStr(operation_path, vport_name, 0) == 0) + ret = 0; + else + virReportSystemError(errno, + _("Write of '%s' to '%s' during " + "vport create/delete failed"), + vport_name, operation_path); + +cleanup: + VIR_FREE(vport_name); + VIR_FREE(operation_path); + return ret; +} #else int virReadFCHost(const char *sysfs_prefix ATTRIBUTE_UNUSED, @@ -3408,4 +3481,15 @@ virIsCapbleVport(const char *sysfs_prefix ATTRIBUTE_UNUSED, virReportSystemError(ENOSYS, "%s", _("Not supported on this platform")); return -1; } + +int +virManageVport(const int parent_host ATTRIBUTE_UNUSED, + const char *wwpn ATTRIBUTE_UNUSED, + const char *wwnn ATTRIBUTE_UNUSED, + int operation ATTRIBUTE_UNUSED) +{ + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform")); + return -1; +} + #endif /* __linux__ */ diff --git a/src/util/virutil.h b/src/util/virutil.h index d87aa92..c07417c 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -302,4 +302,15 @@ int virReadFCHost(const char *sysfs_prefix, int virIsCapableFCHost(const char *sysfs_prefix, int host); int virIsCapableVport(const char *sysfs_prefix, int host); +enum { + VPORT_CREATE, + VPORT_DELETE, +}; + +int virManageVport(const int parent_host, + const char *wwpn, + const char *wwnn, + int operation) + ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); + #endif /* __VIR_UTIL_H__ */ -- 1.7.7.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list