[libvirt] [PATCH 06/25] Introduce <readonly> for hostdev

Osier Yang jyang at redhat.com
Mon May 13 11:04:37 UTC 2013


On 07/05/13 18:58, Osier Yang wrote:
> On 07/05/13 02:01, John Ferlan wrote:
>> On 05/03/2013 02:07 PM, Osier Yang wrote:
>>> Since it's generic enough to be used by other types in future, I
>>> put it in <hostdev> as sub-element, though now it's only used by
>>> scsi host device.
>>> ---
>>>   docs/formatdomain.html.in                          |  4 +++
>>>   docs/schemas/domaincommon.rng                      |  5 +++
>>>   src/conf/domain_conf.c                             |  6 ++++
>>>   src/conf/domain_conf.h                             |  1 +
>>>   src/qemu/qemu_command.c                            |  4 +++
>>>   .../qemuxml2argv-hostdev-scsi-readonly.args        |  9 ++++++
>>>   .../qemuxml2argv-hostdev-scsi-readonly.xml         | 36 
>>> ++++++++++++++++++++++
>>>   tests/qemuxml2argvtest.c                           |  4 +++
>>>   tests/qemuxml2xmltest.c                            |  1 +
>>>   9 files changed, 70 insertions(+)
>>>   create mode 100644 
>>> tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-readonly.args
>>>   create mode 100644 
>>> tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-readonly.xml
>>>
>>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>>> index 488673f..9cd79e5 100644
>>> --- a/docs/formatdomain.html.in
>>> +++ b/docs/formatdomain.html.in
>>> @@ -2406,6 +2406,10 @@
>>>           could be changed in the future with no impact to domains that
>>>           don't specify anything.
>>>         </dd>
>>> +      <dt><code>readonly</code></dt>
>>> +      <dd>Indicates that the device is readonly, only supported by 
>>> SCSI host
>>> +        device now. <span class="since">Since 1.0.6</span>
>>> +      </dd>
>> I just realized your example in 1/25 has the 'readonly' element listed
>> in the new "<pre> ... </pre> section, but it's not described.  I think
>> you probably need to split that line out of there and then put it into
>> this patch.
>
> Yeah, I missed it, should remove it in 1/25.
>
>>
>> Does anything need to be said here that the underlying QEMU needs to
>> support the readonly too?  That is some version or capability? Since
>> there is a check later on to actually pass/add readonly to the command
>> line, it'd surely raise a question some day if someone defined it as
>> readonly, but then come to find out the domain didn't honor that...
>
> Agreed. QEMU/KVM only.
>
>>
>>
>>>       </dl>
>>>     diff --git a/docs/schemas/domaincommon.rng 
>>> b/docs/schemas/domaincommon.rng
>>> index b8d0d60..4fdacab 100644
>>> --- a/docs/schemas/domaincommon.rng
>>> +++ b/docs/schemas/domaincommon.rng
>>> @@ -3075,6 +3075,11 @@
>>>           <optional>
>>>             <ref name="address"/>
>>>           </optional>
>>> +        <optional>
>>> +          <element name="readonly">
>>> +            <empty/>
>>> +          </element>
>>> +        </optional>
>>>         </interleave>
>>>       </element>
>>>     </define>
>>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>>> index 9e6b65b..31a8c46 100644
>>> --- a/src/conf/domain_conf.c
>>> +++ b/src/conf/domain_conf.c
>>> @@ -8724,6 +8724,9 @@ virDomainHostdevDefParseXML(const xmlNodePtr 
>>> node,
>>>                                  _("SCSI host devices must have 
>>> address specified"));
>>>                   goto error;
>>>               }
>>> +
>>> +            if (virXPathBoolean("boolean(./readonly)", ctxt))
>>> +                def->readonly = true;
>>>               break;
>>>           }
>>>       }
>>> @@ -15342,6 +15345,9 @@ virDomainHostdevDefFormat(virBufferPtr buf,
>>>               return -1;
>>>           break;
>>>       }
>>> +
>>> +    if (def->readonly)
>>> +        virBufferAddLit(buf, "<readonly/>\n");
>>>       virBufferAdjustIndent(buf, -6);
>>>         if (virDomainDeviceInfoFormat(buf, def->info,
>>> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>>> index 1efae69..5471cd3 100644
>>> --- a/src/conf/domain_conf.h
>>> +++ b/src/conf/domain_conf.h
>>> @@ -461,6 +461,7 @@ struct _virDomainHostdevDef {
>>>       int startupPolicy; /* enum virDomainStartupPolicy */
>>>       bool managed;
>>>       bool missing;
>>> +    bool readonly;
>>>       union {
>>>           virDomainHostdevSubsys subsys;
>>>           virDomainHostdevCaps caps;
>>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>>> index df896aa..2b141d1 100644
>>> --- a/src/qemu/qemu_command.c
>>> +++ b/src/qemu/qemu_command.c
>>> @@ -4702,6 +4702,10 @@ 
>>> qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
>>> virDomainDeviceAddressTypeToString(dev->info->type),
>>>                         dev->info->alias);
>>>   +    if (dev->readonly &&
>>> +        virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY))
>>> +        virBufferAsprintf(&buf, ",readonly=on");
>>> +
>> See comment above.  If this is defined as readonly, but the underlying
>> system doesn't support it, then should we fail?  It'd be bad news to
>> have a domain expect something readonly, but still load and potentially
>> write on something it wasn't supposed to.
>>
>> If there's a precedent already that allows a defined readonly element to
>> be used read/write, then I guess it's a weak ACK, but otherwise, I think
>> it might be best to fail.
>
> We don't have a standdard yet, some attributes are just ignored if
> the underlying hypervisor doesn't support it, some will fail. 
> Unfortunately,
> we can't change it simply to error out, as it will introduce "regression"
> from user's p.o.v, though from out p.o.v, it's improvement.
>
> I will let it fail when pushing.
>

Pushed with the nits fixed.




More information about the libvir-list mailing list