static int update_caps(virNodeDeviceObjPtr dev) { virNodeDevCapsDefPtr cap = dev->def->caps; while (cap) { /* The only caps that currently need updating are FC related. */ if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST) { check_fc_host(&dev->def->caps->data); } cap = cap->next; } return 0; }
virNodeDevicePtr nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn, const char *wwnn, const char *wwpn, unsigned int flags) { unsigned int i; virDeviceMonitorStatePtr driver = conn->devMonPrivateData; virNodeDeviceObjListPtr devs = &driver->devs; virNodeDevCapsDefPtr cap = NULL; virNodeDeviceObjPtr obj = NULL; virNodeDevicePtr dev = NULL; virCheckFlags(0, NULL); nodeDeviceLock(driver); for (i = 0; i < devs->count; i++) { obj = devs->objs[i]; virNodeDeviceObjLock(obj); cap = obj->def->caps; while (cap) { if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST) { check_fc_host(&cap->data); if (cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) { if (STREQ(cap->data.scsi_host.wwnn, wwnn) && STREQ(cap->data.scsi_host.wwpn, wwpn)) { dev = virGetNodeDevice(conn, obj->def->name); virNodeDeviceObjUnlock(obj); goto out; } } } cap = cap->next; } virNodeDeviceObjUnlock(obj); } out: nodeDeviceUnlock(driver); return dev; }
static int gather_scsi_host_cap(LibHalContext *ctx, const char *udi, union _virNodeDevCapData *d) { int retval = 0; (void)get_int_prop(ctx, udi, "scsi_host.host", (int *)&d->scsi_host.host); retval = check_fc_host(d); if (retval == -1) { goto out; } retval = check_vport_capable(d); out: return retval; }