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:
Osier Yang 2013-01-08 01:05:34 +08:00
parent 448be8f706
commit 96d3086a4f
4 changed files with 104 additions and 93 deletions

View File

@ -1867,6 +1867,7 @@ virIndexToDiskName;
virIsCapableFCHost;
virIsCapableVport;
virIsDevMapperDevice;
virManageVport;
virParseNumber;
virParseVersionString;
virPipeReadUntilEOF;

View File

@ -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;
}

View File

@ -3497,6 +3497,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,
@ -3522,4 +3595,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__ */

View File

@ -306,4 +306,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__ */