[libvirt] [PATCHv2 1/3] snapshot: make virDomainSnapshotObjList opaque

Daniel Veillard veillard at redhat.com
Fri Aug 24 06:52:58 UTC 2012


On Thu, Aug 23, 2012 at 02:54:14PM -0600, Eric Blake wrote:
> We were failing to react to allocation failure when initializing
> a snapshot object list.  Changing things to store a pointer
> instead of a complete object adds one more possible point of
> allocation failure, but at the same time, will make it easier to
> react to failure now, as well as making it easier for a future
> patch to split all virDomainSnapshotPtr handling into a separate
> file, as I continue to add even more snapshot code.
> 
> Luckily, there was only one client outside of domain_conf.c that
> was actually peeking inside the object, and a new wrapper function
> was easy.
> 
> * src/conf/domain_conf.h (_virDomainObj): Use a pointer.
> (virDomainSnapshotObjListInit): Rename.
> (virDomainSnapshotObjListFree, virDomainSnapshotForEach): New
> declarations.
> (_virDomainSnapshotObjList): Move definitions...
> * src/conf/domain_conf.c: ...here.
> (virDomainSnapshotObjListInit, virDomainSnapshotObjListDeinit):
> Rename...
> (virDomainSnapshotObjListNew, virDomainSnapshotObjListFree): ...to
> these.
> (virDomainSnapshotForEach): New function.
> (virDomainObjDispose, virDomainListPopulate): Adjust callers.
> * src/qemu/qemu_domain.c (qemuDomainSnapshotDiscard)
> (qemuDomainSnapshotDiscardAllMetadata): Likewise.
> * src/qemu/qemu_migration.c (qemuMigrationIsAllowed): Likewise.
> * src/qemu/qemu_driver.c (qemuDomainSnapshotLoad)
> (qemuDomainUndefineFlags, qemuDomainSnapshotCreateXML)
> (qemuDomainSnapshotListNames, qemuDomainSnapshotNum)
> (qemuDomainListAllSnapshots)
> (qemuDomainSnapshotListChildrenNames)
> (qemuDomainSnapshotNumChildren)
> (qemuDomainSnapshotListAllChildren)
> (qemuDomainSnapshotLookupByName, qemuDomainSnapshotGetParent)
> (qemuDomainSnapshotGetXMLDesc, qemuDomainSnapshotIsCurrent)
> (qemuDomainSnapshotHasMetadata, qemuDomainRevertToSnapshot)
> (qemuDomainSnapshotDelete): Likewise.
> * src/libvirt_private.syms (domain_conf.h): Export new function.
> ---
>  src/conf/domain_conf.c    | 72 ++++++++++++++++++++++++++++++++---------------
>  src/conf/domain_conf.h    | 14 ++++-----
>  src/libvirt_private.syms  |  1 +
>  src/qemu/qemu_domain.c    |  7 +++--
>  src/qemu/qemu_driver.c    | 50 ++++++++++++++++----------------
>  src/qemu/qemu_migration.c |  2 +-
>  6 files changed, 87 insertions(+), 59 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 419088c..e5711d4 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -661,6 +661,15 @@ VIR_ENUM_IMPL(virDomainNumatuneMemPlacementMode,
>  #define VIR_DOMAIN_XML_WRITE_FLAGS  VIR_DOMAIN_XML_SECURE
>  #define VIR_DOMAIN_XML_READ_FLAGS   VIR_DOMAIN_XML_INACTIVE
> 
> +struct _virDomainSnapshotObjList {
> +    /* name string -> virDomainSnapshotObj  mapping
> +     * for O(1), lockless lookup-by-name */
> +    virHashTable *objs;
> +
> +    virDomainSnapshotObj metaroot; /* Special parent of all root snapshots */
> +};
> +
> +
>  static virClassPtr virDomainObjClass;
>  static void virDomainObjDispose(void *obj);
> 
> @@ -1692,8 +1701,6 @@ void virDomainDefFree(virDomainDefPtr def)
>      VIR_FREE(def);
>  }
> 
> -static void virDomainSnapshotObjListDeinit(virDomainSnapshotObjListPtr snapshots);
> -
>  static void virDomainObjDispose(void *obj)
>  {
>      virDomainObjPtr dom = obj;
> @@ -1707,7 +1714,7 @@ static void virDomainObjDispose(void *obj)
> 
>      virMutexDestroy(&dom->lock);
> 
> -    virDomainSnapshotObjListDeinit(&dom->snapshots);
> +    virDomainSnapshotObjListFree(dom->snapshots);
>  }
> 
> 
> @@ -1721,31 +1728,33 @@ virDomainObjPtr virDomainObjNew(virCapsPtr caps)
>      if (!(domain = virObjectNew(virDomainObjClass)))
>          return NULL;
> 
> -    if (caps->privateDataAllocFunc &&
> -        !(domain->privateData = (caps->privateDataAllocFunc)())) {
> -        virReportOOMError();
> -        VIR_FREE(domain);
> -        return NULL;
> -    }
> -    domain->privateDataFreeFunc = caps->privateDataFreeFunc;
> -
>      if (virMutexInit(&domain->lock) < 0) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         "%s", _("cannot initialize mutex"));
> -        if (domain->privateDataFreeFunc)
> -            (domain->privateDataFreeFunc)(domain->privateData);
>          VIR_FREE(domain);
>          return NULL;
>      }
> 
> +    if (caps->privateDataAllocFunc &&
> +        !(domain->privateData = (caps->privateDataAllocFunc)())) {
> +        virReportOOMError();
> +        goto error;
> +    }
> +    domain->privateDataFreeFunc = caps->privateDataFreeFunc;
> +
> +    if (!(domain->snapshots = virDomainSnapshotObjListNew()))
> +        goto error;
> +
>      virDomainObjLock(domain);
>      virDomainObjSetState(domain, VIR_DOMAIN_SHUTOFF,
>                                   VIR_DOMAIN_SHUTOFF_UNKNOWN);
> 
> -    virDomainSnapshotObjListInit(&domain->snapshots);
> -
>      VIR_DEBUG("obj=%p", domain);
>      return domain;
> +
> +error:
> +    virObjectUnref(domain);
> +    return NULL;
>  }
> 
>  void virDomainObjAssignDef(virDomainObjPtr domain,
> @@ -14685,18 +14694,29 @@ virDomainSnapshotObjListDataFree(void *payload,
>      virDomainSnapshotObjFree(obj);
>  }
> 
> -int virDomainSnapshotObjListInit(virDomainSnapshotObjListPtr snapshots)
> +virDomainSnapshotObjListPtr
> +virDomainSnapshotObjListNew(void)
>  {
> +    virDomainSnapshotObjListPtr snapshots;
> +    if (VIR_ALLOC(snapshots) < 0) {
> +        virReportOOMError();
> +        return NULL;
> +    }
>      snapshots->objs = virHashCreate(50, virDomainSnapshotObjListDataFree);
> -    if (!snapshots->objs)
> -        return -1;
> -    return 0;
> +    if (!snapshots->objs) {
> +        VIR_FREE(snapshots);
> +        return NULL;
> +    }
> +    return snapshots;
>  }
> 
> -static void
> -virDomainSnapshotObjListDeinit(virDomainSnapshotObjListPtr snapshots)
> +void
> +virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots)
>  {
> +    if (!snapshots)
> +        return;
>      virHashFree(snapshots->objs);
> +    VIR_FREE(snapshots);
>  }
> 
>  struct virDomainSnapshotNameData {
> @@ -14817,6 +14837,14 @@ void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots,
>      virHashRemoveEntry(snapshots->objs, snapshot->def->name);
>  }
> 
> +int
> +virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots,
> +                         virHashIterator iter,
> +                         void *data)
> +{
> +    return virHashForEach(snapshots->objs, iter, data);
> +}
> +
>  /* Run iter(data) on all direct children of snapshot, while ignoring all
>   * other entries in snapshots.  Return the number of children
>   * visited.  No particular ordering is guaranteed.  */
> @@ -15738,7 +15766,7 @@ virDomainListPopulate(void *payload,
> 
>      /* filter by snapshot existence */
>      if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) {
> -        int nsnap = virDomainSnapshotObjListNum(&vm->snapshots, NULL, 0);
> +        int nsnap = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0);
>          if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) ||
>                (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT) && nsnap <= 0)))
>              goto cleanup;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 0c3824e..6033641 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1761,13 +1761,9 @@ struct _virDomainSnapshotObj {
> 
>  typedef struct _virDomainSnapshotObjList virDomainSnapshotObjList;
>  typedef virDomainSnapshotObjList *virDomainSnapshotObjListPtr;
> -struct _virDomainSnapshotObjList {
> -    /* name string -> virDomainSnapshotObj  mapping
> -     * for O(1), lockless lookup-by-name */
> -    virHashTable *objs;
> 
> -    virDomainSnapshotObj metaroot; /* Special parent of all root snapshots */
> -};
> +virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void);
> +void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots);
> 
>  typedef enum {
>      VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE = 1 << 0,
> @@ -1790,7 +1786,6 @@ int virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr snapshot,
>  virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjListPtr snapshots,
>                                                     const virDomainSnapshotDefPtr def);
> 
> -int virDomainSnapshotObjListInit(virDomainSnapshotObjListPtr objs);
>  int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
>                                       virDomainSnapshotObjPtr from,
>                                       char **const names, int maxnames,
> @@ -1802,6 +1797,9 @@ virDomainSnapshotObjPtr virDomainSnapshotFindByName(const virDomainSnapshotObjLi
>                                                      const char *name);
>  void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots,
>                                      virDomainSnapshotObjPtr snapshot);
> +int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots,
> +                             virHashIterator iter,
> +                             void *data);
>  int virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot,
>                                    virHashIterator iter,
>                                    void *data);
> @@ -1835,7 +1833,7 @@ struct _virDomainObj {
>      virDomainDefPtr def; /* The current definition */
>      virDomainDefPtr newDef; /* New definition to activate at shutdown */
> 
> -    virDomainSnapshotObjList snapshots;
> +    virDomainSnapshotObjListPtr snapshots;
>      virDomainSnapshotObjPtr current_snapshot;
> 
>      bool hasManagedSave;
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index d91f492..c339664 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -482,6 +482,7 @@ virDomainSnapshotDefFree;
>  virDomainSnapshotDefParseString;
>  virDomainSnapshotDropParent;
>  virDomainSnapshotFindByName;
> +virDomainSnapshotForEach;
>  virDomainSnapshotForEachChild;
>  virDomainSnapshotForEachDescendant;
>  virDomainSnapshotObjListGetNames;
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index c47890b..0ae30b7 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -1750,7 +1750,7 @@ qemuDomainSnapshotDiscard(struct qemud_driver *driver,
> 
>      if (snap == vm->current_snapshot) {
>          if (update_current && snap->def->parent) {
> -            parentsnap = virDomainSnapshotFindByName(&vm->snapshots,
> +            parentsnap = virDomainSnapshotFindByName(vm->snapshots,
>                                                       snap->def->parent);
>              if (!parentsnap) {
>                  VIR_WARN("missing parent snapshot matching name '%s'",
> @@ -1771,7 +1771,7 @@ qemuDomainSnapshotDiscard(struct qemud_driver *driver,
> 
>      if (unlink(snapFile) < 0)
>          VIR_WARN("Failed to unlink %s", snapFile);
> -    virDomainSnapshotObjListRemove(&vm->snapshots, snap);
> +    virDomainSnapshotObjListRemove(vm->snapshots, snap);
> 
>      ret = 0;
> 
> @@ -1808,7 +1808,8 @@ qemuDomainSnapshotDiscardAllMetadata(struct qemud_driver *driver,
>      rem.vm = vm;
>      rem.metadata_only = true;
>      rem.err = 0;
> -    virHashForEach(vm->snapshots.objs, qemuDomainSnapshotDiscardAll, &rem);
> +    virDomainSnapshotForEach(vm->snapshots, qemuDomainSnapshotDiscardAll,
> +                             &rem);
> 
>      return rem.err;
>  }
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 773a989..c1cfa5a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -483,7 +483,7 @@ static void qemuDomainSnapshotLoad(void *payload,
>              continue;
>          }
> 
> -        snap = virDomainSnapshotAssignDef(&vm->snapshots, def);
> +        snap = virDomainSnapshotAssignDef(vm->snapshots, def);
>          if (snap == NULL) {
>              virDomainSnapshotDefFree(def);
>          } else if (snap->def->current) {
> @@ -502,7 +502,7 @@ static void qemuDomainSnapshotLoad(void *payload,
>          vm->current_snapshot = NULL;
>      }
> 
> -    if (virDomainSnapshotUpdateRelations(&vm->snapshots) < 0)
> +    if (virDomainSnapshotUpdateRelations(vm->snapshots) < 0)
>          VIR_ERROR(_("Snapshots have inconsistent relations for domain %s"),
>                    vm->def->name);
> 
> @@ -5629,7 +5629,7 @@ qemuDomainUndefineFlags(virDomainPtr dom,
>      }
> 
>      if (!virDomainObjIsActive(vm) &&
> -        (nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, NULL, 0))) {
> +        (nsnapshots = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0))) {
>          if (!(flags & VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA)) {
>              virReportError(VIR_ERR_OPERATION_INVALID,
>                             _("cannot delete inactive domain with %d "
> @@ -11102,7 +11102,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
>                                 def->name);
>                  goto cleanup;
>              }
> -            other = virDomainSnapshotFindByName(&vm->snapshots, def->parent);
> +            other = virDomainSnapshotFindByName(vm->snapshots, def->parent);
>              if (!other) {
>                  virReportError(VIR_ERR_INVALID_ARG,
>                                 _("parent %s for snapshot %s not found"),
> @@ -11116,7 +11116,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
>                                     other->def->name, def->name);
>                      goto cleanup;
>                  }
> -                other = virDomainSnapshotFindByName(&vm->snapshots,
> +                other = virDomainSnapshotFindByName(vm->snapshots,
>                                                      other->def->parent);
>                  if (!other) {
>                      VIR_WARN("snapshots are inconsistent for %s",
> @@ -11134,7 +11134,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
>                             def->name, uuidstr);
>              goto cleanup;
>          }
> -        other = virDomainSnapshotFindByName(&vm->snapshots, def->name);
> +        other = virDomainSnapshotFindByName(vm->snapshots, def->name);
>          if (other) {
>              if ((other->def->state == VIR_DOMAIN_RUNNING ||
>                   other->def->state == VIR_DOMAIN_PAUSED) !=
> @@ -11223,7 +11223,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
> 
>      if (snap)
>          snap->def = def;
> -    else if (!(snap = virDomainSnapshotAssignDef(&vm->snapshots, def)))
> +    else if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
>          goto cleanup;
>      def = NULL;
> 
> @@ -11280,7 +11280,7 @@ cleanup:
>              } else {
>                  if (update_current)
>                      vm->current_snapshot = snap;
> -                other = virDomainSnapshotFindByName(&vm->snapshots,
> +                other = virDomainSnapshotFindByName(vm->snapshots,
>                                                      snap->def->parent);
>                  snap->parent = other;
>                  other->nchildren++;
> @@ -11288,7 +11288,7 @@ cleanup:
>                  other->first_child = snap;
>              }
>          } else if (snap) {
> -            virDomainSnapshotObjListRemove(&vm->snapshots, snap);
> +            virDomainSnapshotObjListRemove(vm->snapshots, snap);
>          }
>          virDomainObjUnlock(vm);
>      }
> @@ -11319,7 +11319,7 @@ static int qemuDomainSnapshotListNames(virDomainPtr domain, char **names,
>          goto cleanup;
>      }
> 
> -    n = virDomainSnapshotObjListGetNames(&vm->snapshots, NULL, names, nameslen,
> +    n = virDomainSnapshotObjListGetNames(vm->snapshots, NULL, names, nameslen,
>                                           flags);
> 
>  cleanup:
> @@ -11349,7 +11349,7 @@ static int qemuDomainSnapshotNum(virDomainPtr domain,
>          goto cleanup;
>      }
> 
> -    n = virDomainSnapshotObjListNum(&vm->snapshots, NULL, flags);
> +    n = virDomainSnapshotObjListNum(vm->snapshots, NULL, flags);
> 
>  cleanup:
>      if (vm)
> @@ -11379,7 +11379,7 @@ qemuDomainListAllSnapshots(virDomainPtr domain, virDomainSnapshotPtr **snaps,
>          goto cleanup;
>      }
> 
> -    n = virDomainListSnapshots(&vm->snapshots, NULL, domain, snaps, flags);
> +    n = virDomainListSnapshots(vm->snapshots, NULL, domain, snaps, flags);
> 
>  cleanup:
>      if (vm)
> @@ -11412,7 +11412,7 @@ qemuDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11420,7 +11420,7 @@ qemuDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    n = virDomainSnapshotObjListGetNames(&vm->snapshots, snap, names, nameslen,
> +    n = virDomainSnapshotObjListGetNames(vm->snapshots, snap, names, nameslen,
>                                           flags);
> 
>  cleanup:
> @@ -11452,7 +11452,7 @@ qemuDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11460,7 +11460,7 @@ qemuDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    n = virDomainSnapshotObjListNum(&vm->snapshots, snap, flags);
> +    n = virDomainSnapshotObjListNum(vm->snapshots, snap, flags);
> 
>  cleanup:
>      if (vm)
> @@ -11492,7 +11492,7 @@ qemuDomainSnapshotListAllChildren(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11500,7 +11500,7 @@ qemuDomainSnapshotListAllChildren(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    n = virDomainListSnapshots(&vm->snapshots, snap, snapshot->domain, snaps,
> +    n = virDomainListSnapshots(vm->snapshots, snap, snapshot->domain, snaps,
>                                 flags);
> 
>  cleanup:
> @@ -11531,7 +11531,7 @@ static virDomainSnapshotPtr qemuDomainSnapshotLookupByName(virDomainPtr domain,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no snapshot with matching name '%s'"), name);
> @@ -11596,7 +11596,7 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11674,7 +11674,7 @@ static char *qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11712,7 +11712,7 @@ qemuDomainSnapshotIsCurrent(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11752,7 +11752,7 @@ qemuDomainSnapshotHasMetadata(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -11825,7 +11825,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> @@ -12193,7 +12193,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
>          goto cleanup;
>      }
> 
> -    snap = virDomainSnapshotFindByName(&vm->snapshots, snapshot->name);
> +    snap = virDomainSnapshotFindByName(vm->snapshots, snapshot->name);
>      if (!snap) {
>          virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT,
>                         _("no domain snapshot with matching name '%s'"),
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index f65c81a..1b21ef6 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -807,7 +807,7 @@ qemuMigrationIsAllowed(struct qemud_driver *driver, virDomainObjPtr vm,
>                             "%s", _("domain is marked for auto destroy"));
>              return false;
>          }
> -        if ((nsnapshots = virDomainSnapshotObjListNum(&vm->snapshots, NULL,
> +        if ((nsnapshots = virDomainSnapshotObjListNum(vm->snapshots, NULL,
>                                                        0))) {
>              virReportError(VIR_ERR_OPERATION_INVALID,
>                             _("cannot migrate domain with %d snapshots"),
> -- 
> 1.7.11.4

  ACK, that extra level of indirection makes things a bit cleaner IMHO

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list