Re: [libvirt] [PATCH v2 06/10] qemu: Build qemu command line for scsi-generic
On 01/04/13 20:00, Han Cheng wrote: For scsi-generic, the command line will be like: -drive file=/dev/sg0,if=none,id=drive-hostdev-scsi_host0-0-0-0 \ -device scsi-generic,bus=scsi0.0,channel=0,scsi-id=4,lun=8,\ drive=drive-hostdev-scsi_host0-0-0-0,id=hostdev-scsi_host0-0-0-0 The relationship between the libvirt address attrs and the qdev properties are(channel should always be 0): bus=scsicontroller.0 scsi-id=target lun=unit Signed-off-by: Han Cheng hanc.f...@cn.fujitsu.com --- src/qemu/qemu_command.c | 133 +-- src/qemu/qemu_command.h |6 ++ 2 files changed, 134 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index eac72c2..e1af64f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -557,7 +557,7 @@ qemuAssignDeviceDiskAliasCustom(virDomainDefPtr def, if (disk-info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { if (disk-bus == VIR_DOMAIN_DISK_BUS_SCSI) { controllerModel = -virDomainInfoFindControllerModel(def, disk-info, +virDomainDeviceFindControllerModel(def, disk-info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); Indention. if ((qemuSetScsiControllerModel(def, qemuCaps, controllerModel)) 0) @@ -659,7 +659,16 @@ qemuAssignDeviceHostdevAlias(virDomainDefPtr def, virDomainHostdevDefPtr hostdev } } -if (virAsprintf(hostdev-info-alias, hostdev%d, idx) 0) { +if (hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) { +if (virAsprintf(hostdev-info-alias, hostdev-%s-%d-%d-%d, +hostdev-source.subsys.u.scsi.adapter, +hostdev-source.subsys.u.scsi.bus, +hostdev-source.subsys.u.scsi.target, +hostdev-source.subsys.u.scsi.unit) 0) { +virReportOOMError(); +return -1; +} +} else if (virAsprintf(hostdev-info-alias, hostdev%d, idx) 0) { virReportOOMError(); return -1; } @@ -3179,7 +3188,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } controllerModel = -virDomainInfoFindControllerModel(def, disk-info, +virDomainDeviceFindControllerModel(def, disk-info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); And this. if ((qemuSetScsiControllerModel(def, qemuCaps, controllerModel)) 0) goto error; @@ -4370,6 +4379,86 @@ qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev) return ret; } +char * +qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev, virQEMUCapsPtr qemuCaps) +{ +virBuffer buf = VIR_BUFFER_INITIALIZER; +char *sg = NULL; + +if (!(sg = virSCSIDeviceGetDevStr(dev-source.subsys.u.scsi.adapter, + dev-source.subsys.u.scsi.bus, + dev-source.subsys.u.scsi.target, + dev-source.subsys.u.scsi.unit))) { Indentions? +goto error; +} + +virBufferAsprintf(buf, file=/dev/%s,if=none, sg); +virBufferAsprintf(buf, ,id=%s-%s, + virDomainDeviceAddressTypeToString(dev-info-type), + dev-info-alias); +if (dev-readonly +virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY)) +virBufferAsprintf(buf, ,readonly=on); +if (virBufferError(buf)) { +virReportOOMError(); +goto error; +} +VIR_FREE(sg); Like what I commented in 5/10 for the frees. This can be simplified. + +return virBufferContentAndReset(buf); + +error: +VIR_FREE(sg); +virBufferFreeAndReset(buf); +return NULL; +} + + +char * +qemuBuildSCSIHostdevDevStr(virDomainDefPtr def, virDomainHostdevDefPtr dev, + virQEMUCapsPtr qemuCaps) +{ +virBuffer buf = VIR_BUFFER_INITIALIZER; +int controllerModel = -1; + +controllerModel = virDomainDeviceFindControllerModel(def, dev-info, + VIR_DOMAIN_CONTROLLER_TYPE_SCSI); +if (qemuSetScsiControllerModel(def, qemuCaps, controllerModel) 0) +goto error; +/* TODO: deal with lsi or ibm controller */ +if (controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI) { +virBufferAsprintf(buf, scsi-generic); +if (dev-info-addr.drive.bus != 0) { +virReportError(VIR_ERR_XML_ERROR, + %s, _(SCSI controller only supports 1 bus)); +goto error; +} +/* TODO: deal with early version qemu which does not support bus... */ +virBufferAsprintf(buf, + ,bus=scsi%d.0,channel=0,scsi-id=%d,lun=%d, + dev-info-addr.drive.controller, + dev-info-addr.drive.target, +
Re: [libvirt] [PATCH v2 06/10] qemu: Build qemu command line for scsi-generic
On 04/01/2013 08:00 PM, Han Cheng wrote: diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index eac72c2..e1af64f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -557,7 +557,7 @@ qemuAssignDeviceDiskAliasCustom(virDomainDefPtr def, if (disk-info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { if (disk-bus == VIR_DOMAIN_DISK_BUS_SCSI) { controllerModel = -virDomainInfoFindControllerModel(def,disk-info, +virDomainDeviceFindControllerModel(def,disk-info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuSetScsiControllerModel(def, qemuCaps,controllerModel)) 0) Oh, God. I changed the reference place here. It must be a rebase mistake. @@ -3179,7 +3188,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } controllerModel = -virDomainInfoFindControllerModel(def,disk-info, +virDomainDeviceFindControllerModel(def,disk-info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuSetScsiControllerModel(def, qemuCaps,controllerModel)) 0) goto error; And here. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 06/10] qemu: Build qemu command line for scsi-generic
For scsi-generic, the command line will be like: -drive file=/dev/sg0,if=none,id=drive-hostdev-scsi_host0-0-0-0 \ -device scsi-generic,bus=scsi0.0,channel=0,scsi-id=4,lun=8,\ drive=drive-hostdev-scsi_host0-0-0-0,id=hostdev-scsi_host0-0-0-0 The relationship between the libvirt address attrs and the qdev properties are(channel should always be 0): bus=scsicontroller.0 scsi-id=target lun=unit Signed-off-by: Han Cheng hanc.f...@cn.fujitsu.com --- src/qemu/qemu_command.c | 133 +-- src/qemu/qemu_command.h |6 ++ 2 files changed, 134 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index eac72c2..e1af64f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -557,7 +557,7 @@ qemuAssignDeviceDiskAliasCustom(virDomainDefPtr def, if (disk-info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { if (disk-bus == VIR_DOMAIN_DISK_BUS_SCSI) { controllerModel = -virDomainInfoFindControllerModel(def, disk-info, +virDomainDeviceFindControllerModel(def, disk-info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuSetScsiControllerModel(def, qemuCaps, controllerModel)) 0) @@ -659,7 +659,16 @@ qemuAssignDeviceHostdevAlias(virDomainDefPtr def, virDomainHostdevDefPtr hostdev } } -if (virAsprintf(hostdev-info-alias, hostdev%d, idx) 0) { +if (hostdev-source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) { +if (virAsprintf(hostdev-info-alias, hostdev-%s-%d-%d-%d, +hostdev-source.subsys.u.scsi.adapter, +hostdev-source.subsys.u.scsi.bus, +hostdev-source.subsys.u.scsi.target, +hostdev-source.subsys.u.scsi.unit) 0) { +virReportOOMError(); +return -1; +} +} else if (virAsprintf(hostdev-info-alias, hostdev%d, idx) 0) { virReportOOMError(); return -1; } @@ -3179,7 +3188,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } controllerModel = -virDomainInfoFindControllerModel(def, disk-info, +virDomainDeviceFindControllerModel(def, disk-info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuSetScsiControllerModel(def, qemuCaps, controllerModel)) 0) goto error; @@ -4370,6 +4379,86 @@ qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev) return ret; } +char * +qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev, virQEMUCapsPtr qemuCaps) +{ +virBuffer buf = VIR_BUFFER_INITIALIZER; +char *sg = NULL; + +if (!(sg = virSCSIDeviceGetDevStr(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; +} + +virBufferAsprintf(buf, file=/dev/%s,if=none, sg); +virBufferAsprintf(buf, ,id=%s-%s, + virDomainDeviceAddressTypeToString(dev-info-type), + dev-info-alias); +if (dev-readonly +virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY)) +virBufferAsprintf(buf, ,readonly=on); +if (virBufferError(buf)) { +virReportOOMError(); +goto error; +} +VIR_FREE(sg); + +return virBufferContentAndReset(buf); + +error: +VIR_FREE(sg); +virBufferFreeAndReset(buf); +return NULL; +} + + +char * +qemuBuildSCSIHostdevDevStr(virDomainDefPtr def, virDomainHostdevDefPtr dev, + virQEMUCapsPtr qemuCaps) +{ +virBuffer buf = VIR_BUFFER_INITIALIZER; +int controllerModel = -1; + +controllerModel = virDomainDeviceFindControllerModel(def, dev-info, + VIR_DOMAIN_CONTROLLER_TYPE_SCSI); +if (qemuSetScsiControllerModel(def, qemuCaps, controllerModel) 0) +goto error; +/* TODO: deal with lsi or ibm controller */ +if (controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI) { +virBufferAsprintf(buf, scsi-generic); +if (dev-info-addr.drive.bus != 0) { +virReportError(VIR_ERR_XML_ERROR, + %s, _(SCSI controller only supports 1 bus)); +goto error; +} +/* TODO: deal with early version qemu which does not support bus... */ +virBufferAsprintf(buf, + ,bus=scsi%d.0,channel=0,scsi-id=%d,lun=%d, + dev-info-addr.drive.controller, + dev-info-addr.drive.target, + dev-info-addr.drive.unit); +virBufferAsprintf(buf, ,drive=%s-%s,id=%s, + virDomainDeviceAddressTypeToString(dev-info-type), +