[libvirt] [PATCH 2/3] tests: Feed the fake sysfs root to qemuBuildCommandLine
Guido Günther
agx at sigxcpu.org
Wed May 15 13:18:29 UTC 2013
On Wed, May 15, 2013 at 06:52:45PM +0800, Osier Yang wrote:
> This creates a new directory "sysfsroot" under "tests", any sysfs
> test input files should be put into it in future. Currently only
> the scsi-generic tests need to use it, so only one file path is
> created (bus/scsi/devices/0:0:0:0/scsi_generic/sg0/dev).
> ---
> src/qemu/qemu_cgroup.c | 3 +-
> src/qemu/qemu_command.c | 11 +++--
> src/qemu/qemu_command.h | 3 +-
> src/qemu/qemu_hostdev.c | 9 ++--
> src/qemu/qemu_hotplug.c | 4 +-
> src/security/security_dac.c | 6 ++-
> src/security/security_selinux.c | 6 ++-
> src/util/virscsi.c | 51 ++++++++++++++++++----
> src/util/virscsi.h | 6 ++-
> tests/qemuxml2argvtest.c | 4 +-
> .../bus/scsi/devices/0:0:0:0/scsi_generic/sg0/dev | 1 +
> 11 files changed, 77 insertions(+), 27 deletions(-)
> create mode 100644 tests/sysfsroot/bus/scsi/devices/0:0:0:0/scsi_generic/sg0/dev
>
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index aaf94cf..55593e2 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -321,7 +321,8 @@ qemuSetupHostdevCGroup(virDomainObjPtr vm,
> dev->source.subsys.u.scsi.bus,
> dev->source.subsys.u.scsi.target,
> dev->source.subsys.u.scsi.unit,
> - dev->readonly)) == NULL)
> + dev->readonly,
> + NULL)) == NULL)
> goto cleanup;
>
> if (virSCSIDeviceFileIterate(scsi,
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index e054c1f..9f49a7d 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4746,7 +4746,8 @@ qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
>
> char *
> qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
> - virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED)
> + virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED,
> + const char *sysfs_root)
> {
> virBuffer buf = VIR_BUFFER_INITIALIZER;
> char *sg = NULL;
> @@ -4754,7 +4755,8 @@ qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
> 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))) {
> + dev->source.subsys.u.scsi.unit,
> + sysfs_root))) {
> goto error;
> }
>
> @@ -6401,7 +6403,7 @@ qemuBuildCommandLine(virConnectPtr conn,
> int migrateFd,
> virDomainSnapshotObjPtr snapshot,
> enum virNetDevVPortProfileOp vmop,
> - const char *sysfs_root ATTRIBUTE_UNUSED)
> + const char *sysfs_root)
> {
> virErrorPtr originalError = NULL;
> int i, j;
> @@ -8213,7 +8215,8 @@ qemuBuildCommandLine(virConnectPtr conn,
> char *drvstr;
>
> virCommandAddArg(cmd, "-drive");
> - if (!(drvstr = qemuBuildSCSIHostdevDrvStr(hostdev, qemuCaps)))
> + if (!(drvstr = qemuBuildSCSIHostdevDrvStr(hostdev, qemuCaps,
> + sysfs_root)))
> goto error;
> virCommandAddArg(cmd, drvstr);
> VIR_FREE(drvstr);
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 360d8cf..23a0fa5 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -140,7 +140,8 @@ char * qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev,
> virQEMUCapsPtr qemuCaps);
>
> char * qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
> - virQEMUCapsPtr qemuCaps);
> + virQEMUCapsPtr qemuCaps,
> + const char *sysfs_root);
> char * qemuBuildSCSIHostdevDevStr(virDomainDefPtr def,
> virDomainHostdevDefPtr dev,
> virQEMUCapsPtr qemuCaps);
> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
> index d5f94d5..44657d3 100644
> --- a/src/qemu/qemu_hostdev.c
> +++ b/src/qemu/qemu_hostdev.c
> @@ -251,7 +251,8 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver,
> hostdev->source.subsys.u.scsi.bus,
> hostdev->source.subsys.u.scsi.target,
> hostdev->source.subsys.u.scsi.unit,
> - hostdev->readonly)))
> + hostdev->readonly,
> + NULL)))
> goto cleanup;
>
> virSCSIDeviceSetUsedBy(scsi, def->name);
> @@ -906,7 +907,8 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver,
> hostdev->source.subsys.u.scsi.bus,
> hostdev->source.subsys.u.scsi.target,
> hostdev->source.subsys.u.scsi.unit,
> - hostdev->readonly)))
> + hostdev->readonly,
> + NULL)))
> goto cleanup;
>
> if (scsi && virSCSIDeviceListAdd(list, scsi) < 0) {
> @@ -1194,7 +1196,8 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver,
> hostdev->source.subsys.u.scsi.bus,
> hostdev->source.subsys.u.scsi.target,
> hostdev->source.subsys.u.scsi.unit,
> - hostdev->readonly))) {
> + hostdev->readonly,
> + NULL))) {
> VIR_WARN("Unable to reattach SCSI device %s:%d:%d:%d on domain %s",
> hostdev->source.subsys.u.scsi.adapter,
> hostdev->source.subsys.u.scsi.bus,
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index d037c9d..85d6ccb 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1226,7 +1226,7 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver,
> if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, 0) < 0)
> goto cleanup;
>
> - if (!(drvstr = qemuBuildSCSIHostdevDrvStr(hostdev, priv->qemuCaps)))
> + if (!(drvstr = qemuBuildSCSIHostdevDrvStr(hostdev, priv->qemuCaps, NULL)))
> goto cleanup;
>
> if (!(devstr = qemuBuildSCSIHostdevDevStr(vm->def, hostdev, priv->qemuCaps)))
> @@ -2543,7 +2543,7 @@ qemuDomainDetachHostScsiDevice(virQEMUDriverPtr driver,
> return -1;
> }
>
> - if (!(drvstr = qemuBuildSCSIHostdevDrvStr(detach, priv->qemuCaps)))
> + if (!(drvstr = qemuBuildSCSIHostdevDrvStr(detach, priv->qemuCaps, NULL)))
> goto cleanup;
> if (!(devstr = qemuBuildSCSIHostdevDevStr(vm->def, detach, priv->qemuCaps)))
> goto cleanup;
> diff --git a/src/security/security_dac.c b/src/security/security_dac.c
> index 6e6fcad..e896a1c 100644
> --- a/src/security/security_dac.c
> +++ b/src/security/security_dac.c
> @@ -550,7 +550,8 @@ virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
> dev->source.subsys.u.scsi.bus,
> dev->source.subsys.u.scsi.target,
> dev->source.subsys.u.scsi.unit,
> - dev->readonly);
> + dev->readonly,
> + NULL);
>
> if (!scsi)
> goto done;
> @@ -667,7 +668,8 @@ virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
> dev->source.subsys.u.scsi.bus,
> dev->source.subsys.u.scsi.target,
> dev->source.subsys.u.scsi.unit,
> - dev->readonly);
> + dev->readonly,
> + NULL);
>
> if (!scsi)
> goto done;
> diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
> index 5d108b9..298a66f 100644
> --- a/src/security/security_selinux.c
> +++ b/src/security/security_selinux.c
> @@ -1370,7 +1370,8 @@ virSecuritySELinuxSetSecurityHostdevSubsysLabel(virDomainDefPtr def,
> dev->source.subsys.u.scsi.bus,
> dev->source.subsys.u.scsi.target,
> dev->source.subsys.u.scsi.unit,
> - dev->readonly);
> + dev->readonly,
> + NULL);
>
> if (!scsi)
> goto done;
> @@ -1569,7 +1570,8 @@ virSecuritySELinuxRestoreSecurityHostdevSubsysLabel(virSecurityManagerPtr mgr,
> dev->source.subsys.u.scsi.bus,
> dev->source.subsys.u.scsi.target,
> dev->source.subsys.u.scsi.unit,
> - dev->readonly);
> + dev->readonly,
> + NULL);
>
> if (!scsi)
> goto done;
> diff --git a/src/util/virscsi.c b/src/util/virscsi.c
> index d6685fa..dca9a8d 100644
> --- a/src/util/virscsi.c
> +++ b/src/util/virscsi.c
> @@ -100,26 +100,50 @@ virSCSIDeviceGetAdapterId(const char *adapter,
> return 0;
> }
>
> +static char *
> +virSCSIDeviceSysfsRoot(const char *sysfs_root)
> +{
> + char *ret = NULL;
> +
> + if (sysfs_root) {
> + if (virAsprintf(&ret, "%s/bus/scsi/devices", sysfs_root) < 0) {
> + virReportOOMError();
> + return NULL;
> + }
> + } else {
> + if (VIR_STRDUP(ret, SYSFS_SCSI_DEVICES) < 0)
> + return NULL;
> + }
> +
> + return ret;
> +}
> +
> char *
> virSCSIDeviceGetSgName(const char *adapter,
> unsigned int bus,
> unsigned int target,
> - unsigned int unit)
> + unsigned int unit,
> + const char *sysfs_root)
> {
> DIR *dir = NULL;
> struct dirent *entry;
> char *path = NULL;
> char *sg = NULL;
> unsigned int adapter_id;
> + char *sysfs_prefix = NULL;
>
> if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0)
> return NULL;
>
> + if (!(sysfs_prefix = virSCSIDeviceSysfsRoot(sysfs_root)))
> + return NULL;
> +
> if (virAsprintf(&path,
> - SYSFS_SCSI_DEVICES "/%d:%d:%d:%d/scsi_generic",
> + "%s/%d:%d:%d:%d/scsi_generic",
> + sysfs_prefix,
> adapter_id, bus, target, unit) < 0) {
> virReportOOMError();
> - return NULL;
> + goto cleanup;
> }
>
> if (!(dir = opendir(path))) {
> @@ -138,6 +162,7 @@ virSCSIDeviceGetSgName(const char *adapter,
>
> cleanup:
> closedir(dir);
> + VIR_FREE(sysfs_prefix);
> VIR_FREE(path);
> return sg;
> }
> @@ -147,7 +172,8 @@ virSCSIDeviceNew(const char *adapter,
> unsigned int bus,
> unsigned int target,
> unsigned int unit,
> - bool readonly)
> + bool readonly,
> + const char *sysfs_root)
> {
> virSCSIDevicePtr dev, ret = NULL;
> char *sg = NULL;
> @@ -155,6 +181,7 @@ virSCSIDeviceNew(const char *adapter,
> char *model_path = NULL;
> char *vendor = NULL;
> char *model = NULL;
> + char *sysfs_prefix = NULL;
>
> if (VIR_ALLOC(dev) < 0) {
> virReportOOMError();
> @@ -166,7 +193,7 @@ virSCSIDeviceNew(const char *adapter,
> dev->unit = unit;
> dev->readonly = readonly;
>
> - if (!(sg = virSCSIDeviceGetSgName(adapter, bus, target, unit)))
> + if (!(sg = virSCSIDeviceGetSgName(adapter, bus, target, unit, sysfs_root)))
> goto cleanup;
>
> if (virSCSIDeviceGetAdapterId(adapter, &dev->adapter) < 0)
> @@ -186,10 +213,15 @@ virSCSIDeviceNew(const char *adapter,
> goto cleanup;
> }
>
> - if (virAsprintf(&vendor_path,
> - SYSFS_SCSI_DEVICES "/%s/vendor", dev->name) < 0 ||
> - virAsprintf(&model_path,
> - SYSFS_SCSI_DEVICES "/%s/model", dev->name) < 0) {
> + if (!(sysfs_prefix = virSCSIDeviceSysfsRoot(sysfs_root)))
> + goto cleanup;
> +
> + if (virAsprintf(&vendor_path, "%s/%s/vendor",
> + sysfs_prefix,
> + dev->name) < 0 ||
> + virAsprintf(&model_path, "%s/%s/model",
> + sysfs_prefix,
> + dev->name) < 0) {
> virReportOOMError();
> goto cleanup;
> }
> @@ -210,6 +242,7 @@ virSCSIDeviceNew(const char *adapter,
>
> ret = dev;
> cleanup:
> + VIR_FREE(sysfs_prefix);
> VIR_FREE(sg);
> VIR_FREE(vendor);
> VIR_FREE(model);
> diff --git a/src/util/virscsi.h b/src/util/virscsi.h
> index 8268cdf..4e51d5e 100644
> --- a/src/util/virscsi.h
> +++ b/src/util/virscsi.h
> @@ -36,13 +36,15 @@ typedef virSCSIDeviceList *virSCSIDeviceListPtr;
> char *virSCSIDeviceGetSgName(const char *adapter,
> unsigned int bus,
> unsigned int target,
> - unsigned int unit);
> + unsigned int unit,
> + const char *sysfs_prefix);
>
> virSCSIDevicePtr virSCSIDeviceNew(const char *adapter,
> unsigned int bus,
> unsigned int target,
> unsigned int unit,
> - bool readonly);
> + bool readonly,
> + const char *sysfs_prefix);
>
> void virSCSIDeviceFree(virSCSIDevicePtr dev);
> void virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev, const char *name);
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 790857a..a975410 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -82,6 +82,8 @@ typedef enum {
> FLAG_JSON = 1 << 3,
> } virQemuXML2ArgvTestFlags;
>
> +# define SYSFS_ROOT "./sysfsroot"
> +
> static int testCompareXMLToArgvFiles(const char *xml,
> const char *cmdline,
> virQEMUCapsPtr extraFlags,
> @@ -158,7 +160,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
> (flags & FLAG_JSON), extraFlags,
> migrateFrom, migrateFd, NULL,
> VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
> - NULL))) {
> + SYSFS_ROOT))) {
> if (flags & FLAG_EXPECT_FAILURE) {
> ret = 0;
> if (virTestGetDebug() > 1)
> diff --git a/tests/sysfsroot/bus/scsi/devices/0:0:0:0/scsi_generic/sg0/dev b/tests/sysfsroot/bus/scsi/devices/0:0:0:0/scsi_generic/sg0/dev
> new file mode 100644
> index 0000000..992e920
> --- /dev/null
> +++ b/tests/sysfsroot/bus/scsi/devices/0:0:0:0/scsi_generic/sg0/dev
> @@ -0,0 +1 @@
> +21:0
ACK
> --
> 1.8.1.4
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>
More information about the libvir-list
mailing list