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@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list