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