virDomainHostdevDefPtr *hostdevs,
int nhostdevs)
{
- size_t i, j;
- int count;
VIR_AUTOUNREF(virSCSIVHostDeviceListPtr) list = NULL;
- virSCSIVHostDevicePtr host, tmp;
+ virSCSIVHostDevicePtr tmp;
+ size_t i, j;
if (!nhostdevs)
return 0;
for (i = 0; i < nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = hostdevs[i];
virDomainHostdevSubsysSCSIVHostPtr hostsrc = &hostdev->source.subsys.u.scsi_host;
+ VIR_AUTOPTR(virSCSIVHostDevice) host = NULL;
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST)
if (!(host = virSCSIVHostDeviceNew(hostsrc->wwpn)))
return -1;
- if (virSCSIVHostDeviceListAdd(list, host) < 0) {
- virSCSIVHostDeviceFree(host);
+ if (virSCSIVHostDeviceSetUsedBy(host, drv_name, dom_name) < 0)
return -1;
- }
+
+ if (virSCSIVHostDeviceListAdd(list, host) < 0)
+ return -1;
+ host = NULL;
}
/* Loop 2: Mark devices in temporary list as used by @name
* wrong, perform rollback.
*/
virObjectLock(mgr->activeSCSIVHostHostdevs);
- count = virSCSIVHostDeviceListCount(list);
- for (i = 0; i < count; i++) {
- host = virSCSIVHostDeviceListGet(list, i);
- if ((tmp = virSCSIVHostDeviceListFind(mgr->activeSCSIVHostHostdevs,
- host))) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("SCSI_host device %s is already in use by "
- "another domain"),
- virSCSIVHostDeviceGetName(tmp));
- goto error;
- } else {
- if (virSCSIVHostDeviceSetUsedBy(host, drv_name, dom_name) < 0)
- goto error;
+ for (i = 0; i < virSCSIVHostDeviceListCount(list); i++) {
+ tmp = virSCSIVHostDeviceListGet(list, i);
- VIR_DEBUG("Adding %s to activeSCSIVHostHostdevs",
- virSCSIVHostDeviceGetName(host));
+ VIR_DEBUG("Adding %s to activeSCSIVHostHostdevs",
+ virSCSIVHostDeviceGetName(tmp));
- if (virSCSIVHostDeviceListAdd(mgr->activeSCSIVHostHostdevs, host) < 0)
- goto error;
- }
+ if (virSCSIVHostDeviceListAdd(mgr->activeSCSIVHostHostdevs, tmp) < 0)
+ goto rollback;
}
virObjectUnlock(mgr->activeSCSIVHostHostdevs);
}
return 0;
- error:
+
+ rollback:
for (j = 0; j < i; j++) {
tmp = virSCSIVHostDeviceListGet(list, i);
virSCSIVHostDeviceListSteal(mgr->activeSCSIVHostHostdevs, tmp);