[libvirt] [PATCH 2/4] xen: Fix logic bug in xenDaemon*DeviceFlags

Jiri Denemark jdenemar at redhat.com
Mon Oct 4 12:01:22 UTC 2010


> > ---
> >   src/xen/xend_internal.c |   15 +++++++++------
> >   1 files changed, 9 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> > index 1318bd4..4fba6af 100644
> > --- a/src/xen/xend_internal.c
> > +++ b/src/xen/xend_internal.c
> > @@ -3904,8 +3904,9 @@ xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
> >           /* Xen only supports modifying both live and persistent config if
> >            * xendConfigVersion>= 3
> >            */
> > -        if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
> > -                      VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
> > +        if (priv->xendConfigVersion>= 3&&
> > +            (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
> > +                       VIR_DOMAIN_DEVICE_MODIFY_CONFIG))) {
> >               virXendError(VIR_ERR_OPERATION_INVALID, "%s",
> >                            _("Xend only supports modifying both live and "
> >                              "persistent config"));
> 
> The comment says:
> 
> _LIVE|_CONFIG is supported only if version>=3
>
> logically, this tells me nothing about version < 3, nor about setting 
> one but not both flags.

Not really, the comment say that version >= 3 means only _LIVE|_CONFIG is
supported, nothing else.

> Meanwhile, the code says:
> 
> if version >=3, _LIVE|_CONFIG is the only supported combo

Which is exactly what the comment says IMHO.

> Are we sure this is the right change?  What happens with version < 3?

With a slightly more context the code looks as follows:

        /* Only live config can be changed if xendConfigVersion < 3 */
        if (priv->xendConfigVersion < 3 &&
            (flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT &&
             flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
            virXendError(VIR_ERR_OPERATION_INVALID, "%s",
                         _("Xend version does not support modifying "
                           "persistent config"));
            return -1;
        }
        /* Xen only supports modifying both live and persistent config if
         * xendConfigVersion >= 3
         */
        if (priv->xendConfigVersion >= 3 &&
            (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
                       VIR_DOMAIN_DEVICE_MODIFY_CONFIG))) {
            virXendError(VIR_ERR_OPERATION_INVALID, "%s",
                         _("Xend only supports modifying both live and "
                           "persistent config"));
            return -1;
        }

That is, version < 3 is already taken care of in the previous condition. The
only issue is that the code ignores _CURRENT for version >= 3, it should
rather allow _CONFIG && (_LIVE || _CURRENT). Otherwise, it seems correct to
me.

> It seems like we need a 12-way table (in fact, this is pretty much what 
> I ended up resorting to with my vcpus stuff).  Here's my shot at it, 
> from reading the comments (but not actually testing it); once we fix 
> this attempt to an actual table, then I can answer whether the code 
> matches the table.
> 
>                    _LIVE     _CONFIG      _LIVE|_CONFIG
> xen 2,running     good      unsupported  unsupported
> xen 2,inactive    error     good         error or silently good
> xen 3,running     good      good         good
> xen 3,inactive    error     good         error or silently good

Yeah, this is probably a good idea however we shouldn't forget about _CURRENT
which is an equivalent of either _CONFIG or _LIVE depending on current state
of the guest.

Jirka




More information about the libvir-list mailing list