The only parameter in -drive affect scsi-generic is readonly. Introduce <readonly/> to <hostdev>. The helper function to look up disk controller model may be used by scsi hostdev. But it should be changed to use info. --- docs/schemas/domaincommon.rng | 5 +++++ src/conf/domain_conf.c | 18 ++++++++++++++---- src/conf/domain_conf.h | 6 ++++-- src/libvirt_private.syms | 2 +- src/qemu/qemu_command.c | 4 ++-- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index e7231cc..fbb4001 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2898,6 +2898,11 @@ <ref name="alias"/> </optional> <optional> + <element name='readonly'> + <empty/> + </element> + </optional> + <optional> <ref name="deviceBoot"/> </optional> <optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 995cf0c..5e385e4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -78,6 +78,7 @@ typedef enum { VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES = (1<<18), VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM = (1<<19), VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT = (1<<20), + VIR_DOMAIN_XML_INTERNAL_ALLOW_READONLY = (1<<21), } virDomainXMLInternalFlags; VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST, @@ -2173,6 +2174,8 @@ virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info, unsigned int flags) return true; if (info->bootIndex) return true; + if (info->readonly) + return true; return false; } @@ -2395,6 +2398,8 @@ virDomainDeviceInfoFormat(virBufferPtr buf, virDomainDeviceInfoPtr info, unsigned int flags) { + if ((flags & VIR_DOMAIN_XML_INTERNAL_ALLOW_READONLY) && info->readonly) + virBufferAsprintf(buf, " <readonly/>\n"); if ((flags & VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT) && info->bootIndex) virBufferAsprintf(buf, " <boot order='%d'/>\n", info->bootIndex); @@ -2803,6 +2808,10 @@ virDomainDeviceInfoParseXML(xmlNodePtr node, (flags & VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) && xmlStrEqual(cur->name, BAD_CAST "rom")) { rom = cur; + } else if (info->readonly == 0 && + (flags & VIR_DOMAIN_XML_INTERNAL_ALLOW_READONLY) && + xmlStrEqual(cur->name, BAD_CAST "readonly")) { + info->readonly = 1; } } cur = cur->next; @@ -3291,8 +3300,8 @@ error: } int -virDomainDiskFindControllerModel(virDomainDefPtr def, - virDomainDiskDefPtr disk, +virDomainInfoFindControllerModel(virDomainDefPtr def, + virDomainDeviceInfoPtr info, int controllerType) { int model = -1; @@ -3300,7 +3309,7 @@ virDomainDiskFindControllerModel(virDomainDefPtr def, for (i = 0; i < def->ncontrollers; i++) { if (def->controllers[i]->type == controllerType && - def->controllers[i]->idx == disk->info.addr.drive.controller) + def->controllers[i]->idx == info->addr.drive.controller) model = def->controllers[i]->model; } @@ -7838,7 +7847,8 @@ virDomainHostdevDefParseXML(const xmlNodePtr node, if (def->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { if (virDomainDeviceInfoParseXML(node, bootMap, def->info, flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT - | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0) + | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM + | VIR_DOMAIN_XML_INTERNAL_ALLOW_READONLY) < 0) goto error; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 5828ae2..39c5849 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -286,6 +286,8 @@ struct _virDomainDeviceInfo { /* bootIndex is only used for disk, network interface, hostdev * and redirdev devices */ int bootIndex; + /* readonly is only used for scsi hostdev */ + int readonly; }; enum virDomainSeclabelType { @@ -1951,8 +1953,8 @@ void virDomainInputDefFree(virDomainInputDefPtr def); void virDomainDiskDefFree(virDomainDiskDefPtr def); void virDomainLeaseDefFree(virDomainLeaseDefPtr def); void virDomainDiskHostDefFree(virDomainDiskHostDefPtr def); -int virDomainDiskFindControllerModel(virDomainDefPtr def, - virDomainDiskDefPtr disk, +int virDomainInfoFindControllerModel(virDomainDefPtr def, + virDomainDeviceInfoPtr info, int controllerType); virDomainDiskDefPtr virDomainDiskFindByBusAndDst(virDomainDefPtr def, int bus, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c7bd847..4fc6b32 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -143,7 +143,6 @@ virDomainDiskDeviceTypeToString; virDomainDiskErrorPolicyTypeFromString; virDomainDiskErrorPolicyTypeToString; virDomainDiskFindByBusAndDst; -virDomainDiskFindControllerModel; virDomainDiskGeometryTransTypeFromString; virDomainDiskGeometryTransTypeToString; virDomainDiskHostDefFree; @@ -213,6 +212,7 @@ virDomainHubTypeFromString; virDomainHubTypeToString; virDomainHypervTypeFromString; virDomainHypervTypeToString; +virDomainInfoFindControllerModel; virDomainInputDefFree; virDomainIoEventFdTypeFromString; virDomainIoEventFdTypeToString; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 201fac1..5eb9999 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -549,7 +549,7 @@ qemuAssignDeviceDiskAliasCustom(virDomainDefPtr def, if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) { controllerModel = - virDomainDiskFindControllerModel(def, disk, + virDomainInfoFindControllerModel(def, &disk->info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuSetScsiControllerModel(def, qemuCaps, &controllerModel)) < 0) @@ -2699,7 +2699,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } controllerModel = - virDomainDiskFindControllerModel(def, disk, + virDomainInfoFindControllerModel(def, &disk->info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuSetScsiControllerModel(def, qemuCaps, &controllerModel)) < 0) goto error; -- 1.7.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list