mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
nodedev: Abstract nodeDeviceVportCreateDelete as util function
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, which is not good).
This commit is contained in:
parent
448be8f706
commit
96d3086a4f
@ -1867,6 +1867,7 @@ virIndexToDiskName;
|
|||||||
virIsCapableFCHost;
|
virIsCapableFCHost;
|
||||||
virIsCapableVport;
|
virIsCapableVport;
|
||||||
virIsDevMapperDevice;
|
virIsDevMapperDevice;
|
||||||
|
virManageVport;
|
||||||
virParseNumber;
|
virParseNumber;
|
||||||
virParseVersionString;
|
virParseVersionString;
|
||||||
virPipeReadUntilEOF;
|
virPipeReadUntilEOF;
|
||||||
|
@ -408,91 +408,6 @@ cleanup:
|
|||||||
return ret;
|
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
|
static int
|
||||||
get_time(time_t *t)
|
get_time(time_t *t)
|
||||||
{
|
{
|
||||||
@ -594,10 +509,10 @@ nodeDeviceCreateXML(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeDeviceVportCreateDelete(parent_host,
|
if (virManageVport(parent_host,
|
||||||
wwpn,
|
wwpn,
|
||||||
wwnn,
|
wwnn,
|
||||||
VPORT_CREATE) == -1) {
|
VPORT_CREATE) == -1) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,10 +576,10 @@ nodeDeviceDestroy(virNodeDevicePtr dev)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeDeviceVportCreateDelete(parent_host,
|
if (virManageVport(parent_host,
|
||||||
wwpn,
|
wwpn,
|
||||||
wwnn,
|
wwnn,
|
||||||
VPORT_DELETE) == -1) {
|
VPORT_DELETE) == -1) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3497,6 +3497,79 @@ cleanup:
|
|||||||
VIR_FREE(scsi_host_path);
|
VIR_FREE(scsi_host_path);
|
||||||
return ret;
|
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
|
#else
|
||||||
int
|
int
|
||||||
virReadFCHost(const char *sysfs_prefix ATTRIBUTE_UNUSED,
|
virReadFCHost(const char *sysfs_prefix ATTRIBUTE_UNUSED,
|
||||||
@ -3522,4 +3595,15 @@ virIsCapbleVport(const char *sysfs_prefix ATTRIBUTE_UNUSED,
|
|||||||
virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
|
virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
|
||||||
return -1;
|
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__ */
|
#endif /* __linux__ */
|
||||||
|
@ -306,4 +306,15 @@ int virReadFCHost(const char *sysfs_prefix,
|
|||||||
int virIsCapableFCHost(const char *sysfs_prefix, int host);
|
int virIsCapableFCHost(const char *sysfs_prefix, int host);
|
||||||
int virIsCapableVport(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__ */
|
#endif /* __VIR_UTIL_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user