[libvirt] [PATCHv10 4/6] libvirt/qemu support persistent device modification

KAMEZAWA Hiroyuki kamezawa.hiroyu at jp.fujitsu.com
Wed Apr 20 03:05:37 UTC 2011


On Wed, 20 Apr 2011 10:52:41 +0800
Wen Congyang <wency at cn.fujitsu.com> wrote:

> At 04/19/2011 03:46 PM, KAMEZAWA Hiroyuki Write:
> > This patch adds functions for modify domain's persistent definition.
> > To do error recovery in easy way, we use a copy of vmdef and update it.
> > 
> > The whole sequence will be:
> > 
> >   make a copy of domain definition.
> > 
> >   if (flags & MODIFY_CONFIG)
> >       update copied domain definition
> >   if (flags & MODIF_LIVE)
> >       do hotplug.
> >   if (no error)
> >       save copied one to the file and update cached definition.
> >   else
> >       discard copied definition.
> > 
> > This patch is mixuture of Eric Blake's work and mine.
> > From: Eric Blake <eblake at redhat.com>
> > Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>
> > 
> > (virDomainObjCopyPersistentDef): make a copy of persistent vm definition
> > (qemudDomainModifyDeviceFlags): add support for MODIFY_CONFIG and MODIFY_CURRENT
> > (qemudDomainAttach/Detach/UpdateDeviceConfig) : callbacks. now empty
> > ---
> >  src/conf/domain_conf.c   |   18 ++++++
> >  src/conf/domain_conf.h   |    3 +
> >  src/libvirt_private.syms |    1 +
> >  src/qemu/qemu_driver.c   |  148 ++++++++++++++++++++++++++++++++++++----------
> >  4 files changed, 139 insertions(+), 31 deletions(-)
> > 
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 6b733d4..bb8f0a4 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -9510,3 +9510,21 @@ cleanup:
> >  
> >      return ret;
> >  }
> > +
> > +
> > +virDomainDefPtr
> > +virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom)
> > +{
> > +    char *xml;
> > +    virDomainDefPtr cur, ret;
> > +
> > +    cur = virDomainObjGetPersistentDef(caps, dom);
> > +
> > +    xml = virDomainDefFormat(cur, VIR_DOMAIN_XML_WRITE_FLAGS);
> > +    if (!xml)
> > +        return NULL;
> > +
> > +    ret = virDomainDefParseString(caps, xml, VIR_DOMAIN_XML_READ_FLAGS);
> > +
> > +    return ret;
> > +}
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index 6ea30b9..ddf111a 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -1288,6 +1288,9 @@ int virDomainObjSetDefTransient(virCapsPtr caps,
> >  virDomainDefPtr
> >  virDomainObjGetPersistentDef(virCapsPtr caps,
> >                               virDomainObjPtr domain);
> > +virDomainDefPtr
> > +virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom);
> > +
> >  void virDomainRemoveInactive(virDomainObjListPtr doms,
> >                               virDomainObjPtr dom);
> >  
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index ba7739d..f732431 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -287,6 +287,7 @@ virDomainMemballoonModelTypeToString;
> >  virDomainNetDefFree;
> >  virDomainNetTypeToString;
> >  virDomainObjAssignDef;
> > +virDomainObjCopyPersistentDef;
> >  virDomainObjSetDefTransient;
> >  virDomainObjGetPersistentDef;
> >  virDomainObjIsDuplicate;
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 2bdf42e..4ac8f7e 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -4059,6 +4059,48 @@ static int qemudDomainUpdateDeviceLive(virDomainObjPtr vm,
> >      return ret;
> >  }
> >  
> > +static int
> > +qemudDomainAttachDeviceConfig(virDomainDefPtr vmdef ATTRIBUTE_UNUSED,
> > +                              virDomainDeviceDefPtr dev)
> > +{
> > +    switch (dev->type) {
> > +    default:
> > +         qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > +                         _("persistent update of device is not supported"));
> > +         return -1;
> > +    }
> > +    return 0;
> > +}
> > +
> > +
> > +static int
> > +qemudDomainDetachDeviceConfig(virDomainDefPtr vmdef ATTRIBUTE_UNUSED,
> > +                              virDomainDeviceDefPtr dev)
> > +{
> > +    switch (dev->type) {
> > +    default:
> > +        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > +                        _("persistent update of device is not supported"));
> > +        return -1;
> > +    }
> > +    return 0;
> > +}
> > +
> > +static int
> > +qemudDomainUpdateDeviceConfig(virDomainDefPtr vmdef ATTRIBUTE_UNUSED,
> > +                              virDomainDeviceDefPtr dev,
> > +                              bool force ATTRIBUTE_UNUSED)
> > +{
> > +    switch (dev->type) {
> > +    default:
> > +        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > +                         _("persistent update of device is not supported"));
> > +        return -1;
> > +    }
> > +    return 0;
> > +
> > +}
> > +
> >  enum {
> >      QEMUD_DEVICE_ATTACH, QEMUD_DEVICE_DETACH, QEMUD_DEVICE_UPDATE,
> >  };
> > @@ -4069,6 +4111,7 @@ static int qemudDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
> >      struct qemud_driver *driver = dom->conn->privateData;
> >      virBitmapPtr qemuCaps = NULL;
> >      virDomainObjPtr vm = NULL;
> > +    virDomainDefPtr vmdef = NULL;
> >      virDomainDeviceDefPtr dev = NULL;
> >      bool force = (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) != 0;
> >      int ret = -1;
> > @@ -4077,7 +4120,8 @@ static int qemudDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
> >      case QEMUD_DEVICE_ATTACH:
> >      case QEMUD_DEVICE_DETACH:
> >          virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
> > -                      VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
> > +                      VIR_DOMAIN_DEVICE_MODIFY_CONFIG |
> > +                      VIR_DOMAIN_DEVICE_MODIFY_CURRENT, -1);
> >          break;
> >      case QEMUD_DEVICE_UPDATE:
> >          virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_CURRENT |
> > @@ -4089,12 +4133,6 @@ static int qemudDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
> >          break;
> >      }
> >  
> > -    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> > -        qemuReportError(VIR_ERR_OPERATION_INVALID,
> > -                        "%s", _("cannot modify the persistent configuration of a domain"));
> > -        return -1;
> > -    }
> > -
> >      qemuDriverLock(driver);
> >      vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> >      if (!vm) {
> > @@ -4108,11 +4146,29 @@ static int qemudDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
> >      if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
> >          goto cleanup;
> >  
> > -    if (!virDomainObjIsActive(vm)) {
> > -        qemuReportError(VIR_ERR_OPERATION_INVALID,
> > -                        "%s", _("cannot attach device on inactive domain"));
> > -        goto endjob;
> > +    if (virDomainObjIsActive(vm)) {
> > +        if (flags & VIR_DOMAIN_DEVICE_MODIFY_CURRENT)
> > +            flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> 
> VIR_DOMAIN_DEVICE_MODIFY_CURRENT is 0. So you should check 'flags == VIR_DOMAIN_DEVICE_MODIFY_CURRENT'
> instead of 'flags & VIR_DOMAIN_DEVICE_MODIFY_CURRENT'.
> 

Hmm, ok. I missed that.

> > +    } else {
> > +        if (flags & VIR_DOMAIN_DEVICE_MODIFY_CURRENT)
> > +            flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> 
> Tha same as above.
> 

Sure.


Thanks,
-Kame




More information about the libvir-list mailing list