提交 9e2fe245 编写于 作者: C Cole Robinson

node device: Break out get_wwns and get_parent_node helpers

These will be used by the test driver, so move them to a shareable space.
上级 d686056f
...@@ -1215,6 +1215,95 @@ virNodeDeviceDefParseFile(virConnectPtr conn, ...@@ -1215,6 +1215,95 @@ virNodeDeviceDefParseFile(virConnectPtr conn,
return virNodeDeviceDefParse(conn, NULL, filename, create); return virNodeDeviceDefParse(conn, NULL, filename, create);
} }
/*
* Return fc_host dev's WWNN and WWPN
*/
int
virNodeDeviceGetWWNs(virConnectPtr conn,
virNodeDeviceDefPtr def,
char **wwnn,
char **wwpn)
{
virNodeDevCapsDefPtr cap = NULL;
int ret = 0;
cap = def->caps;
while (cap != NULL) {
if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
*wwnn = strdup(cap->data.scsi_host.wwnn);
*wwpn = strdup(cap->data.scsi_host.wwpn);
break;
}
cap = cap->next;
}
if (cap == NULL) {
virNodeDeviceReportError(conn, VIR_ERR_NO_SUPPORT,
"%s", _("Device is not a fibre channel HBA"));
ret = -1;
}
if (*wwnn == NULL || *wwpn == NULL) {
/* Free the other one, if allocated... */
VIR_FREE(wwnn);
VIR_FREE(wwpn);
ret = -1;
virReportOOMError(conn);
}
return ret;
}
/*
* Return the NPIV dev's parent device name
*/
int
virNodeDeviceGetParentHost(virConnectPtr conn,
const virNodeDeviceObjListPtr devs,
const char *dev_name,
const char *parent_name,
int *parent_host)
{
virNodeDeviceObjPtr parent = NULL;
virNodeDevCapsDefPtr cap = NULL;
int ret = 0;
parent = virNodeDeviceFindByName(devs, parent_name);
if (parent == NULL) {
virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
_("Could not find parent HBA for '%s'"),
dev_name);
ret = -1;
goto out;
}
cap = parent->def->caps;
while (cap != NULL) {
if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
(cap->data.scsi_host.flags &
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS)) {
*parent_host = cap->data.scsi_host.host;
break;
}
cap = cap->next;
}
if (cap == NULL) {
virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
_("Parent HBA %s is not capable "
"of vport operations"),
parent->def->name);
ret = -1;
}
virNodeDeviceObjUnlock(parent);
out:
return ret;
}
void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
{ {
......
...@@ -221,6 +221,17 @@ virNodeDeviceDefPtr virNodeDeviceDefParseNode(virConnectPtr conn, ...@@ -221,6 +221,17 @@ virNodeDeviceDefPtr virNodeDeviceDefParseNode(virConnectPtr conn,
xmlNodePtr root, xmlNodePtr root,
int create); int create);
int virNodeDeviceGetWWNs(virConnectPtr conn,
virNodeDeviceDefPtr def,
char **wwnn,
char **wwpn);
int virNodeDeviceGetParentHost(virConnectPtr conn,
const virNodeDeviceObjListPtr devs,
const char *dev_name,
const char *parent_name,
int *parent_host);
void virNodeDeviceDefFree(virNodeDeviceDefPtr def); void virNodeDeviceDefFree(virNodeDeviceDefPtr def);
void virNodeDeviceObjFree(virNodeDeviceObjPtr dev); void virNodeDeviceObjFree(virNodeDeviceObjPtr dev);
......
...@@ -318,6 +318,8 @@ virNodeDeviceDefParseString; ...@@ -318,6 +318,8 @@ virNodeDeviceDefParseString;
virNodeDeviceObjLock; virNodeDeviceObjLock;
virNodeDeviceObjUnlock; virNodeDeviceObjUnlock;
virNodeDeviceAssignDef; virNodeDeviceAssignDef;
virNodeDeviceGetWWNs;
virNodeDeviceGetParentHost;
# pci.h # pci.h
......
...@@ -458,92 +458,6 @@ cleanup: ...@@ -458,92 +458,6 @@ cleanup:
} }
static int
get_wwns(virConnectPtr conn,
virNodeDeviceDefPtr def,
char **wwnn,
char **wwpn)
{
virNodeDevCapsDefPtr cap = NULL;
int ret = 0;
cap = def->caps;
while (cap != NULL) {
if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
*wwnn = strdup(cap->data.scsi_host.wwnn);
*wwpn = strdup(cap->data.scsi_host.wwpn);
break;
}
cap = cap->next;
}
if (cap == NULL) {
virNodeDeviceReportError(conn, VIR_ERR_NO_SUPPORT,
"%s", _("Device is not a fibre channel HBA"));
ret = -1;
}
if (*wwnn == NULL || *wwpn == NULL) {
/* Free the other one, if allocated... */
VIR_FREE(wwnn);
VIR_FREE(wwpn);
ret = -1;
virReportOOMError(conn);
}
return ret;
}
static int
get_parent_host(virConnectPtr conn,
virDeviceMonitorStatePtr driver,
const char *dev_name,
const char *parent_name,
int *parent_host)
{
virNodeDeviceObjPtr parent = NULL;
virNodeDevCapsDefPtr cap = NULL;
int ret = 0;
parent = virNodeDeviceFindByName(&driver->devs, parent_name);
if (parent == NULL) {
virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
_("Could not find parent HBA for '%s'"),
dev_name);
ret = -1;
goto out;
}
cap = parent->def->caps;
while (cap != NULL) {
if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
(cap->data.scsi_host.flags &
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS)) {
*parent_host = cap->data.scsi_host.host;
break;
}
cap = cap->next;
}
if (cap == NULL) {
virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
_("Parent HBA %s is not capable "
"of vport operations"),
parent->def->name);
ret = -1;
}
virNodeDeviceObjUnlock(parent);
out:
return ret;
}
static int static int
get_time(virConnectPtr conn, time_t *t) get_time(virConnectPtr conn, time_t *t)
{ {
...@@ -630,15 +544,15 @@ nodeDeviceCreateXML(virConnectPtr conn, ...@@ -630,15 +544,15 @@ nodeDeviceCreateXML(virConnectPtr conn,
goto cleanup; goto cleanup;
} }
if (get_wwns(conn, def, &wwnn, &wwpn) == -1) { if (virNodeDeviceGetWWNs(conn, def, &wwnn, &wwpn) == -1) {
goto cleanup; goto cleanup;
} }
if (get_parent_host(conn, if (virNodeDeviceGetParentHost(conn,
driver, &driver->devs,
def->name, def->name,
def->parent, def->parent,
&parent_host) == -1) { &parent_host) == -1) {
goto cleanup; goto cleanup;
} }
...@@ -685,13 +599,13 @@ nodeDeviceDestroy(virNodeDevicePtr dev) ...@@ -685,13 +599,13 @@ nodeDeviceDestroy(virNodeDevicePtr dev)
goto out; goto out;
} }
if (get_wwns(dev->conn, obj->def, &wwnn, &wwpn) == -1) { if (virNodeDeviceGetWWNs(dev->conn, obj->def, &wwnn, &wwpn) == -1) {
goto out; goto out;
} }
parent_name = strdup(obj->def->parent); parent_name = strdup(obj->def->parent);
/* get_parent_host will cause the device object's lock to be /* virNodeDeviceGetParentHost will cause the device object's lock to be
* taken, so we have to dup the parent's name and drop the lock * taken, so we have to dup the parent's name and drop the lock
* before calling it. We don't need the reference to the object * before calling it. We don't need the reference to the object
* any more once we have the parent's name. */ * any more once we have the parent's name. */
...@@ -703,11 +617,11 @@ nodeDeviceDestroy(virNodeDevicePtr dev) ...@@ -703,11 +617,11 @@ nodeDeviceDestroy(virNodeDevicePtr dev)
goto out; goto out;
} }
if (get_parent_host(dev->conn, if (virNodeDeviceGetParentHost(dev->conn,
driver, &driver->devs,
dev->name, dev->name,
parent_name, parent_name,
&parent_host) == -1) { &parent_host) == -1) {
goto out; goto out;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册