Thanks for your comments~ Please correct me if I'm wrong. As I know, <source> in <hostdev> is parsed by virDomainHostdevSubsys(Pci/Usb)DefParseXML. Everything else in <hostdev> is parsed by virDomainDeviceInfoParseXML. I add readonly follow this. And this XML is tested by hostdev-scsi-readonly(named by your advice). Other problems will be fixed by next version. On 03/06/2013 01:40 PM, Osier Yang wrote: > 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. > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list