[libvirt] [PATCH v5 4/9] virstoragefile: Always use virStorageSourceSetBackingStore to set backing store

Matthias Gatto matthias.gatto at outscale.com
Tue May 5 12:03:58 UTC 2015


On Mon, May 4, 2015 at 7:21 PM, John Ferlan <jferlan at redhat.com> wrote:
>
>
> On 04/23/2015 08:41 AM, Matthias Gatto wrote:
>> Replace the parts of the code where a backing store is set manually
>> with virStorageSourceSetBackingStore
>>
>> Signed-off-by: Matthias Gatto <matthias.gatto at outscale.com>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  src/conf/domain_conf.c                |  3 ++-
>>  src/conf/storage_conf.c               | 17 ++++++++++-------
>>  src/qemu/qemu_driver.c                | 17 +++++++++++------
>>  src/storage/storage_backend_fs.c      |  7 +++++--
>>  src/storage/storage_backend_gluster.c |  5 +++--
>>  src/storage/storage_backend_logical.c |  9 ++++++---
>>  src/storage/storage_driver.c          |  3 ++-
>>  src/util/virstoragefile.c             |  8 +++++---
>>  tests/virstoragetest.c                |  4 ++--
>>  9 files changed, 46 insertions(+), 27 deletions(-)
>>
>
> Other than a minor goto error issue in storage_backend_gluster.c - up
> through here things seem fine to me.  Doesn't seem to be any new readers
> or setters of "->backingStore" in recent changes (since patches 5-9
> compile too). The only references are now ->backingStoreRaw fetches and
> saves.
>
> However, for patches 5-9 as I understand it have some concerns from
> Peter which hopefully he can elaborate on.
>
> So that progress can be made and readers/writers of backingStore go
> through the virStorageSource{Get|Set}BackingStore API's until the rest
> of the concerns are understood - I'm of the opinion the patches 1-4 can
> be pushed, but I'll wait until Peter chimes in before doing so...
>
> John
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 2a05291..09f0bca 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -6006,7 +6006,8 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
>>          virDomainDiskBackingStoreParse(ctxt, backingStore) < 0)
>>          goto cleanup;
>>
>> -    src->backingStore = backingStore;
>> +    if (!virStorageSourceSetBackingStore(src, backingStore, 0))
>> +        goto cleanup;
>>      ret = 0;
>>
>>   cleanup:
>> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
>> index 5781374..ca3a6d5 100644
>> --- a/src/conf/storage_conf.c
>> +++ b/src/conf/storage_conf.c
>> @@ -1254,6 +1254,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
>>      char *capacity = NULL;
>>      char *unit = NULL;
>>      char *backingStore = NULL;
>> +    virStorageSourcePtr backingStorePtr;
>>      xmlNodePtr node;
>>      xmlNodePtr *nodes = NULL;
>>      size_t i;
>> @@ -1290,20 +1291,22 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
>>      }
>>
>>      if ((backingStore = virXPathString("string(./backingStore/path)", ctxt))) {
>> -        if (VIR_ALLOC(ret->target.backingStore) < 0)
>> +        if (VIR_ALLOC(backingStorePtr) < 0)
>>              goto error;
>>
>> -        ret->target.backingStore->path = backingStore;
>> +        if (!virStorageSourceSetBackingStore(&ret->target, backingStorePtr, 0))
>> +            goto error;
>> +        backingStorePtr->path = backingStore;
>>          backingStore = NULL;
>>
>>          if (options->formatFromString) {
>>              char *format = virXPathString("string(./backingStore/format/@type)", ctxt);
>>              if (format == NULL)
>> -                ret->target.backingStore->format = options->defaultFormat;
>> +                backingStorePtr->format = options->defaultFormat;
>>              else
>> -                ret->target.backingStore->format = (options->formatFromString)(format);
>> +                backingStorePtr->format = (options->formatFromString)(format);
>>
>> -            if (ret->target.backingStore->format < 0) {
>> +            if (backingStorePtr->format < 0) {
>>                  virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>>                                 _("unknown volume format type %s"), format);
>>                  VIR_FREE(format);
>> @@ -1312,9 +1315,9 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
>>              VIR_FREE(format);
>>          }
>>
>> -        if (VIR_ALLOC(ret->target.backingStore->perms) < 0)
>> +        if (VIR_ALLOC(backingStorePtr->perms) < 0)
>>              goto error;
>> -        if (virStorageDefParsePerms(ctxt, ret->target.backingStore->perms,
>> +        if (virStorageDefParsePerms(ctxt, backingStorePtr->perms,
>>                                      "./backingStore/permissions",
>>                                      DEFAULT_VOL_PERM_MODE) < 0)
>>              goto error;
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 26be9d6..1a98601 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -14274,13 +14274,18 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
>>      /* Update vm in place to match changes.  */
>>      need_unlink = false;
>>
>> -    newDiskSrc->backingStore = disk->src;
>> -    disk->src = newDiskSrc;
>> +    if (!virStorageSourceSetBackingStore(newDiskSrc, disk->src, 0)) {
>> +        ret = -1;
>> +        goto cleanup;
>> +    }
>>      newDiskSrc = NULL;
>>
>>      if (persistDisk) {
>> -        persistDiskSrc->backingStore = persistDisk->src;
>> -        persistDisk->src = persistDiskSrc;
>> +        if (!virStorageSourceSetBackingStore(persistDiskSrc,
>> +                                             persistDisk->src, 0)) {
>> +            ret = -1;
>> +            goto cleanup;
>> +        }
>>          persistDiskSrc = NULL;
>>      }
>>
>> @@ -14323,13 +14328,13 @@ qemuDomainSnapshotUndoSingleDiskActive(virQEMUDriverPtr driver,
>>      /* Update vm in place to match changes. */
>>      tmp = disk->src;
>>      disk->src = virStorageSourceGetBackingStore(tmp, 0);
>> -    tmp->backingStore = NULL;
>> +    ignore_value(virStorageSourceSetBackingStore(tmp, NULL, 0));
>>      virStorageSourceFree(tmp);
>>
>>      if (persistDisk) {
>>          tmp = persistDisk->src;
>>          persistDisk->src = virStorageSourceGetBackingStore(tmp, 0);
>> -        tmp->backingStore = NULL;
>> +        ignore_value(virStorageSourceSetBackingStore(tmp, NULL, 0));
>>          virStorageSourceFree(tmp);
>>      }
>>  }
>> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
>> index 151af47..bab2569 100644
>> --- a/src/storage/storage_backend_fs.c
>> +++ b/src/storage/storage_backend_fs.c
>> @@ -97,7 +97,9 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
>>          goto cleanup;
>>
>>      if (meta->backingStoreRaw) {
>> -        if (!(target->backingStore = virStorageSourceNewFromBacking(meta)))
>> +        if (!virStorageSourceSetBackingStore(target,
>> +                                             virStorageSourceNewFromBacking(meta),
>> +                                             0))
>>              goto cleanup;
>>
>>          backingStore = virStorageSourceGetBackingStore(target, 0);
>> @@ -112,7 +114,8 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
>>              if (VIR_ALLOC(backingStore) < 0)
>>                  goto cleanup;
>>
>> -            target->backingStore = backingStore;
>> +            if (!virStorageSourceSetBackingStore(target, backingStore, 0))
>> +                goto cleanup;
>>              backingStore->type = VIR_STORAGE_TYPE_NETWORK;
>>              backingStore->path = meta->backingStoreRaw;
>>              meta->backingStoreRaw = NULL;
>> diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c
>> index 9bddb3b..f0a3b9b 100644
>> --- a/src/storage/storage_backend_gluster.c
>> +++ b/src/storage/storage_backend_gluster.c
>> @@ -301,9 +301,10 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state,
>>          goto cleanup;
>>
>>      if (meta->backingStoreRaw) {
>> -        if (VIR_ALLOC(vol->target.backingStore) < 0)
>> +        if (VIR_ALLOC(backingStore) < 0)
>>              goto cleanup;
>> -        backingStore = virStorageSourceGetBackingStore(&vol->target, 0);
>> +        if (!virStorageSourceSetBackingStore(&vol->target, backingStore, 0))
>> +            goto error;
>
> Should be goto cleanup - build failure otherwise
>
>>
>>          backingStore->path = meta->backingStoreRaw;
>>
>> diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
>> index 27fdc64..16d508e 100644
>> --- a/src/storage/storage_backend_logical.c
>> +++ b/src/storage/storage_backend_logical.c
>> @@ -88,6 +88,7 @@ virStorageBackendLogicalMakeVol(char **const groups,
>>      size_t i;
>>      int err, nextents, nvars, ret = -1;
>>      const char *attrs = groups[9];
>> +    virStorageSourcePtr backingStore;
>>
>>      /* Skip inactive volume */
>>      if (attrs[4] != 'a')
>> @@ -148,14 +149,16 @@ virStorageBackendLogicalMakeVol(char **const groups,
>>       *  lv is created with "--virtualsize").
>>       */
>>      if (groups[1] && !STREQ(groups[1], "") && (groups[1][0] != '[')) {
>> -        if (VIR_ALLOC(vol->target.backingStore) < 0)
>> +        if (VIR_ALLOC(backingStore) < 0)
>>              goto cleanup;
>>
>> -        if (virAsprintf(&virStorageSourceGetBackingStore(&vol->target, 0)->path, "%s/%s",
>> +        if (!virStorageSourceSetBackingStore(&vol->target, backingStore, 0))
>> +            goto cleanup;
>> +        if (virAsprintf(&backingStore->path, "%s/%s",
>>                          pool->def->target.path, groups[1]) < 0)
>>              goto cleanup;
>>
>> -        virStorageSourceGetBackingStore(&vol->target, 0)->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
>> +        backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
>>      }
>>
>>      if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0)
>> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
>> index 306d98e..cae7484 100644
>> --- a/src/storage/storage_driver.c
>> +++ b/src/storage/storage_driver.c
>> @@ -3044,7 +3044,8 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
>>          goto cleanup;
>>      }
>>
>> -    src->backingStore = backingStore;
>> +    if (!virStorageSourceSetBackingStore(src, backingStore, 0))
>> +        goto cleanup;
>>      backingStore = NULL;
>>      ret = 0;
>>
>> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
>> index d69f49d..234a72b 100644
>> --- a/src/util/virstoragefile.c
>> +++ b/src/util/virstoragefile.c
>> @@ -1902,8 +1902,10 @@ virStorageSourceCopy(const virStorageSource *src,
>>          goto error;
>>
>>      if (backingChain && virStorageSourceGetBackingStore(src, 0)) {
>> -        if (!(ret->backingStore = virStorageSourceCopy(virStorageSourceGetBackingStore(src, 0),
>> -                                                       true)))
>> +        if (!virStorageSourceSetBackingStore(ret,
>> +                                             virStorageSourceCopy(virStorageSourceGetBackingStore(src, 0),
>> +                                                                  true),
>> +                                             0))
>>              goto error;
>>      }
>>
>> @@ -2044,7 +2046,7 @@ virStorageSourceBackingStoreClear(virStorageSourcePtr def)
>>
>>      /* recursively free backing chain */
>>      virStorageSourceFree(virStorageSourceGetBackingStore(def, 0));
>> -    def->backingStore = NULL;
>> +    virStorageSourceSetBackingStore(def, NULL, 0);
>>  }
>>
>>
>> diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
>> index 5bd4637..58f505d 100644
>> --- a/tests/virstoragetest.c
>> +++ b/tests/virstoragetest.c
>> @@ -583,9 +583,9 @@ testPathRelativePrepare(void)
>>
>>      for (i = 0; i < ARRAY_CARDINALITY(backingchain); i++) {
>>          if (i < ARRAY_CARDINALITY(backingchain) - 1)
>> -            backingchain[i].backingStore = &backingchain[i + 1];
>> +            virStorageSourceSetBackingStore(&backingchain[i], &backingchain[i + 1], 0);
>>          else
>> -            backingchain[i].backingStore = NULL;
>> +            virStorageSourceSetBackingStore(&backingchain[i], NULL, 0);
>>
>>          backingchain[i].relPath = NULL;
>>      }
>>

ok sorry for the goto mistake.

If I can help you to understand my I'll be happy to help.




More information about the libvir-list mailing list