mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-05 08:23:48 +00:00
qemuBuildHostdevCommandLine: Generate via JSON
Build the properties of 'vhost-scsi' device via JSON. In comparison to previous similar refactors this also modifies the hotplug code to attach the vhost fd handle explicitly rather than using 'qemuMonitorAddDeviceWithFd'. The 'vhost-scsi' device doesn't have any special (non-string) properties. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
9ac91fcceb
commit
44b52c18e3
@ -4979,30 +4979,33 @@ qemuBuildSCSIiSCSIHostdevDrvStr(virDomainHostdevDef *dev)
|
|||||||
return virBufferContentAndReset(&buf);
|
return virBufferContentAndReset(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
|
||||||
qemuBuildSCSIVHostHostdevDevStr(const virDomainDef *def,
|
virJSONValue *
|
||||||
|
qemuBuildSCSIVHostHostdevDevProps(const virDomainDef *def,
|
||||||
virDomainHostdevDef *dev,
|
virDomainHostdevDef *dev,
|
||||||
virQEMUCaps *qemuCaps,
|
virQEMUCaps *qemuCaps,
|
||||||
char *vhostfdName)
|
char *vhostfdName)
|
||||||
{
|
{
|
||||||
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
|
g_autoptr(virJSONValue) props = NULL;
|
||||||
virDomainHostdevSubsysSCSIVHost *hostsrc = &dev->source.subsys.u.scsi_host;
|
virDomainHostdevSubsysSCSIVHost *hostsrc = &dev->source.subsys.u.scsi_host;
|
||||||
|
|
||||||
if (qemuBuildVirtioDevStr(&buf, qemuCaps, VIR_DOMAIN_DEVICE_HOSTDEV, dev) < 0) {
|
if (!(props = qemuBuildVirtioDevProps(VIR_DOMAIN_DEVICE_HOSTDEV, dev, qemuCaps)))
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virBufferAsprintf(&buf, ",wwpn=%s,vhostfd=%s,id=%s",
|
|
||||||
hostsrc->wwpn,
|
|
||||||
vhostfdName,
|
|
||||||
dev->info->alias);
|
|
||||||
|
|
||||||
if (qemuBuildDeviceAddressStr(&buf, def, dev->info) < 0)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return virBufferContentAndReset(&buf);
|
if (virJSONValueObjectAdd(props,
|
||||||
|
"s:wwpn", hostsrc->wwpn,
|
||||||
|
"s:vhostfd", vhostfdName,
|
||||||
|
"s:id", dev->info->alias,
|
||||||
|
NULL) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_steal_pointer(&props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
qemuBuildSCSIHostdevDrvStr(virDomainHostdevDef *dev)
|
qemuBuildSCSIHostdevDrvStr(virDomainHostdevDef *dev)
|
||||||
{
|
{
|
||||||
@ -5565,7 +5568,6 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
|
|||||||
virDomainHostdevDef *hostdev = def->hostdevs[i];
|
virDomainHostdevDef *hostdev = def->hostdevs[i];
|
||||||
virDomainHostdevSubsys *subsys = &hostdev->source.subsys;
|
virDomainHostdevSubsys *subsys = &hostdev->source.subsys;
|
||||||
virDomainHostdevSubsysMediatedDev *mdevsrc = &subsys->u.mdev;
|
virDomainHostdevSubsysMediatedDev *mdevsrc = &subsys->u.mdev;
|
||||||
g_autofree char *devstr = NULL;
|
|
||||||
g_autoptr(virJSONValue) devprops = NULL;
|
g_autoptr(virJSONValue) devprops = NULL;
|
||||||
g_autofree char *vhostfdName = NULL;
|
g_autofree char *vhostfdName = NULL;
|
||||||
int vhostfd = -1;
|
int vhostfd = -1;
|
||||||
@ -5618,14 +5620,14 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
|
|||||||
virCommandPassFD(cmd, vhostfd,
|
virCommandPassFD(cmd, vhostfd,
|
||||||
VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||||
|
|
||||||
virCommandAddArg(cmd, "-device");
|
if (!(devprops = qemuBuildSCSIVHostHostdevDevProps(def,
|
||||||
if (!(devstr = qemuBuildSCSIVHostHostdevDevStr(def,
|
|
||||||
hostdev,
|
hostdev,
|
||||||
qemuCaps,
|
qemuCaps,
|
||||||
vhostfdName)))
|
vhostfdName)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
virCommandAddArg(cmd, devstr);
|
if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -195,8 +195,8 @@ qemuBlockStorageSourceAttachData *
|
|||||||
qemuBuildHostdevSCSIDetachPrepare(virDomainHostdevDef *hostdev,
|
qemuBuildHostdevSCSIDetachPrepare(virDomainHostdevDef *hostdev,
|
||||||
virQEMUCaps *qemuCaps);
|
virQEMUCaps *qemuCaps);
|
||||||
|
|
||||||
char *
|
virJSONValue *
|
||||||
qemuBuildSCSIVHostHostdevDevStr(const virDomainDef *def,
|
qemuBuildSCSIVHostHostdevDevProps(const virDomainDef *def,
|
||||||
virDomainHostdevDef *dev,
|
virDomainHostdevDef *dev,
|
||||||
virQEMUCaps *qemuCaps,
|
virQEMUCaps *qemuCaps,
|
||||||
char *vhostfdName);
|
char *vhostfdName);
|
||||||
|
@ -2743,7 +2743,9 @@ qemuDomainAttachSCSIVHostDevice(virQEMUDriver *driver,
|
|||||||
virDomainCCWAddressSet *ccwaddrs = NULL;
|
virDomainCCWAddressSet *ccwaddrs = NULL;
|
||||||
g_autofree char *vhostfdName = NULL;
|
g_autofree char *vhostfdName = NULL;
|
||||||
int vhostfd = -1;
|
int vhostfd = -1;
|
||||||
g_autofree char *devstr = NULL;
|
g_autoptr(virJSONValue) devprops = NULL;
|
||||||
|
bool removeextension = false;
|
||||||
|
bool removehandle = false;
|
||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
bool teardownlabel = false;
|
bool teardownlabel = false;
|
||||||
bool teardowndevice = false;
|
bool teardowndevice = false;
|
||||||
@ -2790,7 +2792,7 @@ qemuDomainAttachSCSIVHostDevice(virQEMUDriver *driver,
|
|||||||
if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
|
if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(devstr = qemuBuildSCSIVHostHostdevDevStr(vm->def,
|
if (!(devprops = qemuBuildSCSIVHostHostdevDevProps(vm->def,
|
||||||
hostdev,
|
hostdev,
|
||||||
priv->qemuCaps,
|
priv->qemuCaps,
|
||||||
vhostfdName)))
|
vhostfdName)))
|
||||||
@ -2803,13 +2805,24 @@ qemuDomainAttachSCSIVHostDevice(virQEMUDriver *driver,
|
|||||||
if ((ret = qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)) < 0)
|
if ((ret = qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)) < 0)
|
||||||
goto exit_monitor;
|
goto exit_monitor;
|
||||||
|
|
||||||
if ((ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr, vhostfd,
|
removeextension = true;
|
||||||
vhostfdName)) < 0) {
|
|
||||||
ignore_value(qemuDomainDetachExtensionDevice(priv->mon, hostdev->info));
|
if ((ret = qemuMonitorSendFileHandle(priv->mon, vhostfdName, vhostfd)))
|
||||||
goto exit_monitor;
|
goto exit_monitor;
|
||||||
}
|
|
||||||
|
removehandle = true;
|
||||||
|
|
||||||
|
if ((ret = qemuMonitorAddDeviceProps(priv->mon, &devprops)) < 0)
|
||||||
|
goto exit_monitor;
|
||||||
|
|
||||||
|
removeextension = false;
|
||||||
|
removehandle = false;
|
||||||
|
|
||||||
exit_monitor:
|
exit_monitor:
|
||||||
|
if (removehandle)
|
||||||
|
ignore_value(qemuMonitorCloseFileHandle(priv->mon, vhostfdName));
|
||||||
|
if (removeextension)
|
||||||
|
ignore_value(qemuDomainDetachExtensionDevice(priv->mon, hostdev->info));
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0 || ret < 0)
|
if (qemuDomainObjExitMonitor(driver, vm) < 0 || ret < 0)
|
||||||
goto audit;
|
goto audit;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user