}
-static char *
-qemuBuildSCSIHostHostdevDrvStr(virDomainHostdevDefPtr dev)
-{
- virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi;
- virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
-
- return virSCSIDeviceGetSgName(NULL,
- scsihostsrc->adapter,
- scsihostsrc->bus,
- scsihostsrc->target,
- scsihostsrc->unit);
-}
-
static char *
qemuBuildSCSIiSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
virQEMUCapsPtr qemuCaps)
return NULL;
virBufferAdd(&buf, source, -1);
} else {
- if (!(source = qemuBuildSCSIHostHostdevDrvStr(dev)))
- return NULL;
- virBufferAsprintf(&buf, "file=/dev/%s,if=none,format=raw", source);
+ virBufferAsprintf(&buf, "file=%s,if=none,format=raw", scsisrc->u.host.src->path);
}
if (!(drivealias = qemuAliasFromHostdev(dev)))
virStorageSourcePtr src = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI)) {
- g_autofree char *devstr = NULL;
-
switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE:
- if (!scsisrc->u.host.src) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("SCSI host device data structure was not initialized"));
- return NULL;
- }
-
- if (!(devstr = qemuBuildSCSIHostHostdevDrvStr(hostdev)))
- return NULL;
-
src = scsisrc->u.host.src;
-
- src->path = g_strdup_printf("/dev/%s", devstr);
-
break;
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
}
+static int
+qemuConnectDomainXMLToNativePrepareHostHostdev(virDomainHostdevDefPtr hostdev)
+{
+ if (virHostdevIsSCSIDevice(hostdev)) {
+ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
+
+ switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE: {
+ virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
+ virStorageSourcePtr src = scsisrc->u.host.src;
+ g_autofree char *devstr = NULL;
+
+ if (!(devstr = virSCSIDeviceGetSgName(NULL,
+ scsihostsrc->adapter,
+ scsihostsrc->bus,
+ scsihostsrc->target,
+ scsihostsrc->unit)))
+ return -1;
+
+ src->path = g_strdup_printf("/dev/%s", devstr);
+ break;
+ }
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainHostdevSCSIProtocolType, scsisrc->protocol);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+static int
+qemuConnectDomainXMLToNativePrepareHost(virDomainObjPtr vm)
+{
+ size_t i;
+
+ for (i = 0; i < vm->def->nhostdevs; i++) {
+ virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i];
+
+ if (qemuConnectDomainXMLToNativePrepareHostHostdev(hostdev) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
const char *format,
const char *xmlData,
VIR_QEMU_PROCESS_START_COLD) < 0)
goto cleanup;
+ if (qemuConnectDomainXMLToNativePrepareHost(vm) < 0)
+ goto cleanup;
+
if (!(cmd = qemuProcessCreatePretendCmdBuild(driver, vm, NULL,
qemuCheckFips(), true, false)))
goto cleanup;
if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
goto cleanup;
+ if (qemuProcessPrepareHostHostdev(hostdev) < 0)
+ goto cleanup;
+
if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendalias,
priv->qemuCaps)))
goto cleanup;
}
+int
+qemuProcessPrepareHostHostdev(virDomainHostdevDefPtr hostdev)
+{
+ if (virHostdevIsSCSIDevice(hostdev)) {
+ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
+
+ switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE: {
+ virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
+ virStorageSourcePtr src = scsisrc->u.host.src;
+ g_autofree char *devstr = NULL;
+
+ if (!(devstr = virSCSIDeviceGetSgName(NULL,
+ scsihostsrc->adapter,
+ scsihostsrc->bus,
+ scsihostsrc->target,
+ scsihostsrc->unit)))
+ return -1;
+
+ src->path = g_strdup_printf("/dev/%s", devstr);
+ break;
+ }
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainHostdevSCSIProtocolType, scsisrc->protocol);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+static int
+qemuProcessPrepareHostHostdevs(virDomainObjPtr vm)
+{
+ size_t i;
+
+ for (i = 0; i < vm->def->nhostdevs; i++) {
+ virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i];
+
+ if (qemuProcessPrepareHostHostdev(hostdev) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
static void
qemuProcessPrepareAllowReboot(virDomainObjPtr vm)
{
if (qemuProcessPrepareHostStorage(driver, vm, flags) < 0)
return -1;
+ VIR_DEBUG("Preparing hostdevs (host-side)");
+ if (qemuProcessPrepareHostHostdevs(vm) < 0)
+ return -1;
+
VIR_DEBUG("Preparing external devices");
if (qemuExtDevicesPrepareHost(driver, vm) < 0)
return -1;
int qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock);
+int qemuProcessPrepareHostHostdev(virDomainHostdevDefPtr hostdev);
+
int qemuProcessPrepareHost(virQEMUDriverPtr driver,
virDomainObjPtr vm,
unsigned int flags);
hostdev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) {
hostdev->source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
}
+
+ if (virHostdevIsSCSIDevice(hostdev)) {
+ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
+
+ switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE:
+ scsisrc->u.host.src->path = g_strdup("/dev/sg0");
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainHostdevSCSIProtocolType, scsisrc->protocol);
+ return NULL;
+ }
+ }
}
for (i = 0; i < vm->def->nfss; i++) {