On 17/05/13 18:12, Daniel P. Berrange wrote:
On Thu, May 16, 2013 at 11:02:00PM +0800, Osier Yang wrote:
> Since 0d70656afded, it starts to access the sysfs files to build
> the qemu command line (by virSCSIDeviceGetSgName, which is to find
> out the scsi generic device name by adpater:bus:target:unit), there
> is no way to work around, qemu wants to see the scsi generic device
> like "/dev/sg6" anyway.
>
> And there might be other places which need to access sysfs files
> when building qemu command line in future.
>
> Instead of increasing the arguments of qemuBuildCommandLine, this
> introduces a new callback for qemuBuildCommandLine, and thus tests
> can register their own callbacks for sysfs test input files accessing.
>
> * src/qemu/qemu_command.h: (New callback struct
> qemuBuildCommandLineCallbacks;
> extern buildCommandLineCallbacks)
> * src/qemu/qemu_command.c: (wire up the callback struct)
> * src/qemu/qemu_driver.c: (Use the new syntax of qemuBuildCommandLine)
> * src/qemu/qemu_hotplug.c: Likewise
> * src/qemu/qemu_process.c: Likewise
> * tests/qemuxml2argvtest.c: (Helper testSCSIDeviceGetSgName;
> callback struct testCallbacks;
> Use the callback struct)
> * src/tests/qemuxmlnstest.c Use the new syntax of qemuBuildCommandLine)
> ---
> src/qemu/qemu_command.c | 28 ++++++++++++++++++++--------
> src/qemu/qemu_command.h | 16 ++++++++++++++--
> src/qemu/qemu_driver.c | 3 ++-
> src/qemu/qemu_hotplug.c | 6 ++++--
> src/qemu/qemu_process.c | 3 ++-
> tests/qemuxml2argvtest.c | 21 ++++++++++++++++++++-
> tests/qemuxmlnstest.c | 3 ++-
> 7 files changed, 64 insertions(+), 16 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 5b95c07..e775479 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4757,18 +4757,25 @@ qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
>
> char *
> qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
> - virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED)
> + virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED,
> + qemuBuildCommandLineCallbacksPtr callbacks)
> {
> virBuffer buf = VIR_BUFFER_INITIALIZER;
> char *sg = NULL;
>
> - if (!(sg = virSCSIDeviceGetSgName(dev->source.subsys.u.scsi.adapter,
> - dev->source.subsys.u.scsi.bus,
> - dev->source.subsys.u.scsi.target,
> - dev->source.subsys.u.scsi.unit))) {
> - goto error;
> + if (!callbacks) {
> + virReportError(VIR_ERR_INVALID_ARG, "%s",
> + _("callbacks cannot be NULL"));
> + return NULL;
I think I'd remove this check and....
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 36dfa6b..23b6af3 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -61,7 +71,8 @@ virCommandPtr qemuBuildCommandLine(virConnectPtr conn,
> const char *migrateFrom,
> int migrateFd,
> virDomainSnapshotObjPtr current_snapshot,
> - enum virNetDevVPortProfileOp vmop)
> + enum virNetDevVPortProfileOp vmop,
> + qemuBuildCommandLineCallbacksPtr callbacks)
> ATTRIBUTE_NONNULL(1);
...add another ATTRIBUTE_NONNULL here and...
Do we need ATTRIBUT_NONULL for qemuBuildCommandLine too? the
callbacks could be NULL in case of it won't call qemuBuildSCSIHostdevDrvStr,
or something else in future.
If it should be NONNULL, I have to set up the callback from qemuxmlnstest.c
too, the callbacks is meaningless for it though.
>
> /* Generate string for arch-specific '-device' parameter */
> @@ -142,7 +153,8 @@ char * qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev,
> virQEMUCapsPtr qemuCaps);
>
> char * qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
> - virQEMUCapsPtr qemuCaps);
> + virQEMUCapsPtr qemuCaps,
> + qemuBuildCommandLineCallbacksPtr callbacks);
...the same here.
Agreed.