[libvirt] [PATCH 2/3] qemu: add two qemu caps for lsi and virtio-scsi SCSI controllers
Eric Blake
eblake at redhat.com
Tue Aug 7 21:55:22 UTC 2012
On 08/07/2012 11:21 AM, Guannan Ren wrote:
> Rename qemuDefaultScsiControllerModel to qemuCheckScsiControllerModel.
> When scsi model is given explicitly in XML(model > 0) checking if the
> underlying QEMU supports it or not first, raise an error on checking
> failure.
> When the model is not given(mode <= 0), return LSI by default, if
> the QEMU doesn't support it, raise an error.
> ---
> src/qemu/qemu_command.c | 106 +++++++++++++++++++++++++++++++++++-----------
> src/qemu/qemu_command.h | 3 +-
> src/qemu/qemu_process.c | 9 +++-
> 3 files changed, 88 insertions(+), 30 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 9999a05..d4791c6 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -469,19 +469,58 @@ static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk)
> }
>
> static int
> -qemuDefaultScsiControllerModel(virDomainDefPtr def) {
> - if (STREQ(def->os.arch, "ppc64") &&
> - STREQ(def->os.machine, "pseries")) {
> - return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI;
> +qemuCheckScsiControllerModel(virDomainDefPtr def,
> + virBitmapPtr qemuCaps,
> + int *model)
> +{
> + if (*model > 0) {
> + switch (*model) {
This looks a bit odd; why not just:
switch (*model) {
...
> + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC:
> + if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("This QEMU doesn't support "
> + "lsi scsi controller"));
> + return -1;
> + }
> + break;
> + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI:
> + if (!qemuCapsGet(qemuCaps, QEMU_CAPS_VIRIO_SCSI_PCI)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("This QEMU doesn't support "
> + "virtio scsi controller"));
> + return -1;
> + }
> + break;
> + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI:
> + /*TODO: need checking work here if necessary */
> + break;
> + default:
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Unsupported controller model: %s"),
> + virDomainControllerModelSCSITypeToString(*model));
> + return -1;
> + }
> } else {
...then fold this else branch into:
case 0:
> - return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC;
> + if (STREQ(def->os.arch, "ppc64") &&
> + STREQ(def->os.machine, "pseries")) {
> + *model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI;
> + } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) {
> + *model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC;
> + } else {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Unable to determine model for scsi controller"));
> + return -1;
> + }
> }
> +
> + return 0;
> }
But that's just a formatting recommendation, and not a bug in your code,
so I'm okay if you leave it as written.
> +int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
> + virBitmapPtr qemuCaps)
> {
> int i, rc;
> int model;
> + virBitmapPtr localCaps = NULL;
>
> /* Default values match QEMU. See spapr_(llan|vscsi|vty).c */
>
> + if (!qemuCaps) {
> + /* need to get information from real environment */
> + if (qemuCapsExtractVersionInfo(def->emulator, def->os.arch,
> + false, NULL,
> + &localCaps) < 0)
> + goto cleanup;
> + qemuCaps = localCaps;
> + }
Yet more evidence why we need to rewrite the capabilities collection
code to be caching, but that's a project for another day.
ACK.
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120807/c27af20d/attachment-0001.sig>
More information about the libvir-list
mailing list