[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