[libvirt] [PATCH 04/25] qemu: Build qemu command line for scsi host device

Osier Yang jyang at redhat.com
Mon May 13 10:50:45 UTC 2013


On 07/05/13 01:37, John Ferlan wrote:
> On 05/03/2013 02:07 PM, Osier Yang wrote:
>> From: Han Cheng <hanc.fnst at cn.fujitsu.com>
>>
>> Except the scsi host device's controller is "lsilogic", mapping
>> between the libvirt attributes and scsi-generic properties is:
>>
>>    libvirt     qemu
>> -----------------------------------------
>>    controller  bus ($libvirt_controller.0)
>>    bus         channel
>>    target      scsi-id
>>    unit        lun
>>
>> For scsi host device with "lsilogic" controller, the mapping is:
>> ('target (libvirt)' must be 0, as it's not used; 'unit (libvirt)
>> must <= 7).
>>
>>    libvirt            qemu
>> ----------------------------------------------------------
>>    controller && bus  bus ($libvirt_controller.$libvirt_bus)
>>    unit               scsi-id
>>
> Might be nice to include this mapping in the code comments especially
> for those looking for this type of information some day that may not
> think to look in a git commit log...
>
>> It's not good to hardcode/hard-check limits of these attributes,
>> and even worse, these limits are not documented, one has to find
>> out by either testing or reading the qemu code, I'm looking forward
>> to qemu expose limits like these one day). For example, exposing
>> "max_target", "max_lun" for megasas:
>>
>> static const struct SCSIBusInfo megasas_scsi_info = {
>>      .tcq = true,
>>      .max_target = MFI_MAX_LD,
>>      .max_lun = 255,
>>
>>      .transfer_data = megasas_xfer_complete,
>>      .get_sg_list = megasas_get_sg_list,
>>      .complete = megasas_command_complete,
>>      .cancel = megasas_command_cancel,
>> };
>>
>> Example of the qemu command line (lsilogic controller):
>>
>>    -drive file=/dev/sg2,if=none,id=drive-hostdev-scsi_host7-0-0-0 \
>>    -device scsi-generic,bus=scsi0.0,scsi-id=8,\
>>    drive=drive-hostdev-scsi_host7-0-0-0,id=hostdev-scsi_host7-0-0-0
>>
>> Example of the qemu command line (virtio-scsi controller):
>>
>>    -drive file=/dev/sg2,if=none,id=drive-hostdev-scsi_host7-0-0-0 \
>>    -device scsi-generic,bus=scsi0.0,channel=0,scsi-id=128,lun=128,\
>>    drive=drive-hostdev-scsi_host7-0-0-0,id=hostdev-scsi_host7-0-0-0
>>
>> Signed-off-by: Han Cheng <hanc.fnst at cn.fujitsu.com>
>> Signed-off-by: Osier Yang <jyang at redhat.com>
>>
>> ---
>> v3 - v4:
>>    * Remove checking for "bug == 0"
>>    * Split "bootindex" and "readonly" support into another patch
>>
>> v2.5 - v3:
>>    * Add support for all other controllers, but not only virtio-scsi
>>    * Add checking for "bus == 0"
>>    * Add checking for "target == 0" && "unit <= 7" for scsi host device
>>      which is on "lsilogic" controller.
>>    * Integrate xml2argv test from 10/10 of v2.5 into this patch
>> ---
>>   src/qemu/qemu_command.c                            | 132 ++++++++++++++++++++-
>>   src/qemu/qemu_command.h                            |   6 +
>>   .../qemuxml2argv-hostdev-scsi-lsi.args             |   9 ++
>>   .../qemuxml2argv-hostdev-scsi-lsi.xml              |  35 ++++++
>>   .../qemuxml2argv-hostdev-scsi-virtio-scsi.args     |   9 ++
>>   ...l => qemuxml2argv-hostdev-scsi-virtio-scsi.xml} |   0
>>   tests/qemuxml2argvtest.c                           |   9 ++
>>   tests/qemuxml2xmltest.c                            |   3 +-
>>   8 files changed, 199 insertions(+), 4 deletions(-)
>>   create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi.args
>>   create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi.xml
>>   create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-scsi.args
>>   rename tests/qemuxml2argvdata/{qemuxml2argv-hostdev-scsi.xml => qemuxml2argv-hostdev-scsi-virtio-scsi.xml} (100%)
>>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 575dce1..df896aa 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -48,6 +48,7 @@
>>   #include "device_conf.h"
>>   #include "virstoragefile.h"
>>   #include "virtpm.h"
>> +#include "virscsi.h"
>>   #if defined(__linux__)
>>   # include <linux/capability.h>
>>   #endif
>> @@ -745,7 +746,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;
>>       }
>> @@ -4673,7 +4683,96 @@ qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
>>       return ret;
>>   }
>>   
>> +char *
>> +qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
>> +                           virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED)
>> +{
>> +    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 (virBufferError(&buf)) {
>> +        virReportOOMError();
>> +        goto error;
>> +    }
>> +
> VIR_FREE(sg);
>
>
> No comments on remainder. I assume the test config is good - at least
> it's there!
>
Fixed, and pushed.




More information about the libvir-list mailing list