On 2013年03月04日 14:01, Han Cheng wrote:
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),
I think the "readonly" tag for hostdev can just always be exposed,
as don't see any special reason to keep it internally.
} 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;
And why it's of DeviceInfo struct?
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,
Not a good name. How about changing into:
virDomainDeviceFindControllerModel.
+ 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;
This should be a member of virDomainHostdevDef instead.
};
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;
You need new tests for the new XML.