On 12/03/2015 09:35 AM, Matthias Gatto wrote: > Uniformize backing store usage by calling virStorageSourceGetBackingStore > instead of setting backing store manually. > > Signed-off-by: Matthias Gatto <matthias.gatto@xxxxxxxxxxxx> > Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> > --- > src/conf/domain_conf.c | 7 ++++--- > src/conf/storage_conf.c | 6 +++--- > src/qemu/qemu_cgroup.c | 4 ++-- > src/qemu/qemu_domain.c | 2 +- > src/qemu/qemu_driver.c | 18 +++++++++-------- > src/qemu/qemu_monitor_json.c | 4 +++- > src/security/security_dac.c | 2 +- > src/security/security_selinux.c | 4 ++-- > src/security/virt-aa-helper.c | 2 +- > src/storage/storage_backend.c | 22 ++++++++++++-------- > src/storage/storage_backend_fs.c | 38 ++++++++++++++++++++--------------- > src/storage/storage_backend_gluster.c | 8 +++++--- > src/storage/storage_backend_logical.c | 12 +++++++---- > src/util/virstoragefile.c | 20 +++++++++--------- > tests/virstoragetest.c | 14 ++++++------- > 15 files changed, 93 insertions(+), 70 deletions(-) > storage_backend_fs.c needed a slight merge with some changes I made... There's also still a bunch of long lines. I've noted them below. For each of them I propose adjusting the code a bit to do something like: virStorageSourcePtr bsp; ... bsp = virStorageSourceGetBackingStore(backingStore, 0); then use bsp instead. I'll add a "merge" patch to this response - it probably won't apply cleanly since I had the merge issue to deal with first (in storage_backend_fs.c - virStorageBackendFileSystemRefresh and call to virStorageBackendUpdateVolTargetInfo). But I think if you update to top of tree and then apply, a git am should work John I only worked on/through the first 2 patches, but can continue through patch 5 - that'll at least get part of this series in > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index e6102a0..5b413b5 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -18625,7 +18625,7 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf, > /* We currently don't output seclabels for backing chain element */ > if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, 0, true) < 0 || > virDomainDiskBackingStoreFormat(buf, > - backingStore->backingStore, > + virStorageSourceGetBackingStore(backingStore, 0), Long line > backingStore->backingStoreRaw, > idx + 1) < 0) > return -1; > @@ -18746,7 +18746,8 @@ virDomainDiskDefFormat(virBufferPtr buf, > /* Don't format backingStore to inactive XMLs until the code for > * persistent storage of backing chains is ready. */ > if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) && > - virDomainDiskBackingStoreFormat(buf, def->src->backingStore, > + virDomainDiskBackingStoreFormat(buf, > + virStorageSourceGetBackingStore(def->src, 0), Long line > def->src->backingStoreRaw, 1) < 0) > return -1; > > @@ -22714,7 +22715,7 @@ virDomainDiskDefForeachPath(virDomainDiskDefPtr disk, > } > } > > - for (tmp = disk->src; tmp; tmp = tmp->backingStore) { > + for (tmp = disk->src; tmp; tmp = virStorageSourceGetBackingStore(tmp, 0)) { > int actualType = virStorageSourceGetActualType(tmp); > /* execute the callback only for local storage */ > if (actualType != VIR_STORAGE_TYPE_NETWORK && > diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c > index 9b8abea..d048e39 100644 > --- a/src/conf/storage_conf.c > +++ b/src/conf/storage_conf.c > @@ -1330,7 +1330,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, > if (virStorageSize(unit, capacity, &ret->target.capacity) < 0) > goto error; > } else if (!(flags & VIR_VOL_XML_PARSE_NO_CAPACITY) && > - !((flags & VIR_VOL_XML_PARSE_OPT_CAPACITY) && ret->target.backingStore)) { > + !((flags & VIR_VOL_XML_PARSE_OPT_CAPACITY) && virStorageSourceGetBackingStore(&ret->target, 0))) { Really long line > virReportError(VIR_ERR_XML_ERROR, "%s", _("missing capacity element")); > goto error; > } > @@ -1644,9 +1644,9 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool, > &def->target, "target") < 0) > goto cleanup; > > - if (def->target.backingStore && > + if (virStorageSourceGetBackingStore(&def->target, 0) && > virStorageVolTargetDefFormat(options, &buf, > - def->target.backingStore, > + virStorageSourceGetBackingStore(&def->target, 0), long line > "backingStore") < 0) > goto cleanup; > > diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c > index b52ce3a..6405944 100644 > --- a/src/qemu/qemu_cgroup.c > +++ b/src/qemu/qemu_cgroup.c > @@ -121,7 +121,7 @@ qemuSetupDiskCgroup(virDomainObjPtr vm, > virStorageSourcePtr next; > bool forceReadonly = false; > > - for (next = disk->src; next; next = next->backingStore) { > + for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { long line > if (qemuSetImageCgroupInternal(vm, next, false, forceReadonly) < 0) > return -1; > > @@ -139,7 +139,7 @@ qemuTeardownDiskCgroup(virDomainObjPtr vm, > { > virStorageSourcePtr next; > > - for (next = disk->src; next; next = next->backingStore) { > + for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { long line > if (qemuSetImageCgroup(vm, next, true) < 0) > return -1; > } > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c > index ed21245..28bbe3f 100644 > --- a/src/qemu/qemu_domain.c > +++ b/src/qemu/qemu_domain.c > @@ -3101,7 +3101,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, > if (virStorageSourceIsEmpty(disk->src)) > goto cleanup; > > - if (disk->src->backingStore) { > + if (virStorageSourceGetBackingStore(disk->src, 0)) { > if (force_probe) > virStorageSourceBackingStoreClear(disk->src); > else > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index ae1d8e7..8ba7566 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -14309,13 +14309,13 @@ qemuDomainSnapshotUndoSingleDiskActive(virQEMUDriverPtr driver, > > /* Update vm in place to match changes. */ > tmp = disk->src; > - disk->src = tmp->backingStore; > + disk->src = virStorageSourceGetBackingStore(tmp, 0); > tmp->backingStore = NULL; > virStorageSourceFree(tmp); > > if (persistDisk) { > tmp = persistDisk->src; > - persistDisk->src = tmp->backingStore; > + persistDisk->src = virStorageSourceGetBackingStore(tmp, 0); > tmp->backingStore = NULL; > virStorageSourceFree(tmp); > } > @@ -16309,7 +16309,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver, > goto endjob; > } > > - if (virStorageFileGetRelativeBackingPath(disk->src->backingStore, > + if (virStorageFileGetRelativeBackingPath(virStorageSourceGetBackingStore(disk->src, 0), long line > baseSource, > &backingPath) < 0) > goto endjob; > @@ -16662,6 +16662,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, > virQEMUDriverConfigPtr cfg = NULL; > const char *format = NULL; > int desttype = virStorageSourceGetActualType(mirror); > + virStorageSourcePtr backingStore; > > /* Preliminaries: find the disk we are editing, sanity checks */ > virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW | > @@ -16705,8 +16706,9 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, > if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0) > goto endjob; > > + backingStore = virStorageSourceGetBackingStore(disk->src, 0); > /* clear the _SHALLOW flag if there is only one layer */ > - if (!disk->src->backingStore) > + if (!backingStore) > flags &= ~VIR_DOMAIN_BLOCK_COPY_SHALLOW; > > /* unless the user provides a pre-created file, shallow copy into a raw > @@ -17113,7 +17115,7 @@ qemuDomainBlockCommit(virDomainPtr dom, > goto endjob; > } > > - if (!topSource->backingStore) { > + if (!virStorageSourceGetBackingStore(topSource, 0)) { > virReportError(VIR_ERR_INVALID_ARG, > _("top '%s' in chain for '%s' has no backing file"), > topSource->path, path); > @@ -17121,14 +17123,14 @@ qemuDomainBlockCommit(virDomainPtr dom, > } > > if (!base && (flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW)) > - baseSource = topSource->backingStore; > + baseSource = virStorageSourceGetBackingStore(topSource, 0); > else if (virStorageFileParseChainIndex(disk->dst, base, &baseIndex) < 0 || > !(baseSource = virStorageFileChainLookup(disk->src, topSource, > base, baseIndex, NULL))) > goto endjob; > > if ((flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW) && > - baseSource != topSource->backingStore) { > + baseSource != virStorageSourceGetBackingStore(topSource, 0)) { > virReportError(VIR_ERR_INVALID_ARG, > _("base '%s' is not immediately below '%s' in chain " > "for '%s'"), > @@ -19406,7 +19408,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, > goto cleanup; > visited++; > backing_idx++; > - src = src->backingStore; > + src = virStorageSourceGetBackingStore(src, 0); > } > } > > diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c > index 86b8c7b..790d7bc 100644 > --- a/src/qemu/qemu_monitor_json.c > +++ b/src/qemu/qemu_monitor_json.c > @@ -3785,7 +3785,9 @@ qemuMonitorJSONDiskNameLookupOne(virJSONValuePtr image, > return NULL; > if (top != target) { > backing = virJSONValueObjectGetObject(image, "backing-image"); > - return qemuMonitorJSONDiskNameLookupOne(backing, top->backingStore, > + virStorageSourcePtr backingStore = > + virStorageSourceGetBackingStore(top, 0); > + return qemuMonitorJSONDiskNameLookupOne(backing, backingStore, > target); > } > if (VIR_STRDUP(ret, virJSONValueObjectGetString(image, "filename")) < 0) > diff --git a/src/security/security_dac.c b/src/security/security_dac.c > index cdde34e..7fdf40f 100644 > --- a/src/security/security_dac.c > +++ b/src/security/security_dac.c > @@ -454,7 +454,7 @@ virSecurityDACSetSecurityDiskLabel(virSecurityManagerPtr mgr, > { > virStorageSourcePtr next; > > - for (next = disk->src; next; next = next->backingStore) { > + for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { long line > if (virSecurityDACSetSecurityImageLabel(mgr, def, next) < 0) > return -1; > } > diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c > index b8ebdcc..5d694d8 100644 > --- a/src/security/security_selinux.c > +++ b/src/security/security_selinux.c > @@ -1216,7 +1216,7 @@ virSecuritySELinuxRestoreSecurityImageLabelInt(virSecurityManagerPtr mgr, > * be tracked in domain XML, at which point labelskip should be a > * per-file attribute instead of a disk attribute. */ > if (disk_seclabel && disk_seclabel->labelskip && > - !src->backingStore) > + !virStorageSourceGetBackingStore(src, 0)) > return 0; > > /* Don't restore labels on readonly/shared disks, because other VMs may > @@ -1350,7 +1350,7 @@ virSecuritySELinuxSetSecurityDiskLabel(virSecurityManagerPtr mgr, > bool first = true; > virStorageSourcePtr next; > > - for (next = disk->src; next; next = next->backingStore) { > + for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { long line > if (virSecuritySELinuxSetSecurityImageLabelInternal(mgr, def, next, > first) < 0) > return -1; > diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c > index 5de56e5..dddde1c 100644 > --- a/src/security/virt-aa-helper.c > +++ b/src/security/virt-aa-helper.c > @@ -967,7 +967,7 @@ get_files(vahControl * ctl) > /* XXX - if we knew the qemu user:group here we could send it in > * so that the open could be re-tried as that user:group. > */ > - if (!disk->src->backingStore) { > + if (!virStorageSourceGetBackingStore(disk->src, 0)) { > bool probe = ctl->allowDiskFormatProbing; > virStorageFileGetMetadata(disk->src, -1, -1, probe, false); > } > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c > index 194736b..08ed1dd 100644 > --- a/src/storage/storage_backend.c > +++ b/src/storage/storage_backend.c > @@ -940,6 +940,7 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn, > .features = vol->target.features, > .nocow = vol->target.nocow, > }; > + virStorageSourcePtr backingStore; > > virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL); > > @@ -988,12 +989,13 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn, > } > } > > - if (vol->target.backingStore) { > + backingStore = virStorageSourceGetBackingStore(&vol->target, 0); > + if (backingStore) { > int accessRetCode = -1; > char *absolutePath = NULL; > > - info.backingFormat = vol->target.backingStore->format; > - info.backingPath = vol->target.backingStore->path; > + info.backingFormat = backingStore->format; > + info.backingPath = backingStore->path; > > if (info.preallocate) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > @@ -1006,8 +1008,10 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn, > * backing store, not really sure what use it serves though, and it > * may cause issues with lvm. Untested essentially. > */ > - if (inputvol && inputvol->target.backingStore && > - STRNEQ_NULLABLE(inputvol->target.backingStore->path, info.backingPath)) { > + if (inputvol && > + virStorageSourceGetBackingStore(&inputvol->target, 0) && > + STRNEQ_NULLABLE(virStorageSourceGetBackingStore(&inputvol->target, 0)->path, > + info.backingPath)) { long line This is also another one of those cases where using a temp variable is going to help. > virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > _("a different backing store cannot be specified.")); > return NULL; > @@ -1197,7 +1201,7 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED, > vol->target.format); > return -1; > } > - if (vol->target.backingStore != NULL) { > + if (virStorageSourceGetBackingStore(&vol->target, 0) != NULL) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > _("copy-on-write image not supported with " > "qcow-create")); > @@ -1639,14 +1643,16 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol, > unsigned int openflags) > { > int ret; > + virStorageSourcePtr backingStore; > > if ((ret = virStorageBackendUpdateVolTargetInfo(&vol->target, > withBlockVolFormat, > openflags)) < 0) > return ret; > > - if (vol->target.backingStore && > - (ret = virStorageBackendUpdateVolTargetInfo(vol->target.backingStore, > + backingStore = virStorageSourceGetBackingStore(&vol->target, 0); > + if (backingStore && > + (ret = virStorageBackendUpdateVolTargetInfo(backingStore, > withBlockVolFormat, > VIR_STORAGE_VOL_OPEN_DEFAULT | > VIR_STORAGE_VOL_OPEN_NOERROR) < 0)) > diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c > index 99ea394..7b05d4d 100644 > --- a/src/storage/storage_backend_fs.c > +++ b/src/storage/storage_backend_fs.c > @@ -70,6 +70,7 @@ virStorageBackendProbeTarget(virStorageSourcePtr target, > int ret = -1; > int rc; > virStorageSourcePtr meta = NULL; > + virStorageSourcePtr backingStore; > struct stat sb; > > if (encryption) > @@ -99,37 +100,39 @@ virStorageBackendProbeTarget(virStorageSourcePtr target, > if (!(target->backingStore = virStorageSourceNewFromBacking(meta))) > goto cleanup; > > - target->backingStore->format = backingStoreFormat; > + backingStore = virStorageSourceGetBackingStore(target, 0); > + backingStore->format = backingStoreFormat; > > /* XXX: Remote storage doesn't play nicely with volumes backed by > * remote storage. To avoid trouble, just fake the backing store is RAW > * and put the string from the metadata as the path of the target. */ > - if (!virStorageSourceIsLocalStorage(target->backingStore)) { > - virStorageSourceFree(target->backingStore); > + if (!virStorageSourceIsLocalStorage(backingStore)) { > + virStorageSourceFree(backingStore); Although you cleaned up the reference Peter noted before - there's double free problem here if the VIR_ALLOC fails. Currently backingStore is just the local copy of target->backingStore. If we free it here, then target->backingStore still contains the address/pointer. If we jump to cleanup, then target->backingStore could be free'd again Perhaps one way around this is to do the 'set' code first, but I think at least the following would be OK after the SourceFree target->backingStore = NULL; > > - if (VIR_ALLOC(target->backingStore) < 0) > + if (VIR_ALLOC(backingStore) < 0) > goto cleanup; > > - target->backingStore->type = VIR_STORAGE_TYPE_NETWORK; > - target->backingStore->path = meta->backingStoreRaw; > + target->backingStore = backingStore; > + backingStore->type = VIR_STORAGE_TYPE_NETWORK; > + backingStore->path = meta->backingStoreRaw; > meta->backingStoreRaw = NULL; > - target->backingStore->format = VIR_STORAGE_FILE_RAW; > + backingStore->format = VIR_STORAGE_FILE_RAW; > } > > - if (target->backingStore->format == VIR_STORAGE_FILE_AUTO) { > - if ((rc = virStorageFileProbeFormat(target->backingStore->path, > + if (backingStore->format == VIR_STORAGE_FILE_AUTO) { > + if ((rc = virStorageFileProbeFormat(backingStore->path, > -1, -1)) < 0) { > /* If the backing file is currently unavailable or is > * accessed via remote protocol only log an error, fake the > * format as RAW and continue. Returning -1 here would > * disable the whole storage pool, making it unavailable for > * even maintenance. */ > - target->backingStore->format = VIR_STORAGE_FILE_RAW; > + backingStore->format = VIR_STORAGE_FILE_RAW; > virReportError(VIR_ERR_INTERNAL_ERROR, > _("cannot probe backing volume format: %s"), > - target->backingStore->path); > + backingStore->path); > } else { > - target->backingStore->format = rc; > + backingStore->format = rc; > } > } > } > @@ -860,6 +863,7 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED, > struct stat statbuf; > virStorageVolDefPtr vol = NULL; > virStorageSourcePtr target = NULL; > + virStorageSourcePtr backingStore; > int direrr; > int fd = -1, ret = -1; > > @@ -918,10 +922,12 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED, > if (vol->target.format == VIR_STORAGE_FILE_DIR) > vol->type = VIR_STORAGE_VOL_DIR; > > - if (vol->target.backingStore) { > - ignore_value(virStorageBackendUpdateVolTargetInfo(vol->target.backingStore, > - false, > - VIR_STORAGE_VOL_OPEN_DEFAULT)); > + backingStore = virStorageSourceGetBackingStore(&vol->target, 0); > + if (backingStore) { > + ignore_value(virStorageBackendUpdateVolTargetInfo( > + backingStore, > + false, > + VIR_STORAGE_VOL_OPEN_DEFAULT)); > /* If this failed, the backing file is currently unavailable, > * the capacity, allocation, owner, group and mode are unknown. > * An error message was raised, but we just continue. */ > diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c > index d2e79bc..9bddb3b 100644 > --- a/src/storage/storage_backend_gluster.c > +++ b/src/storage/storage_backend_gluster.c > @@ -247,6 +247,7 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state, > char *header = NULL; > ssize_t len = VIR_STORAGE_MAX_HEADER; > int backingFormat; > + virStorageSourcePtr backingStore; > > *volptr = NULL; > > @@ -302,13 +303,14 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state, > if (meta->backingStoreRaw) { > if (VIR_ALLOC(vol->target.backingStore) < 0) > goto cleanup; > + backingStore = virStorageSourceGetBackingStore(&vol->target, 0); > > - vol->target.backingStore->path = meta->backingStoreRaw; > + backingStore->path = meta->backingStoreRaw; > > if (backingFormat < 0) > - vol->target.backingStore->format = VIR_STORAGE_FILE_RAW; > + backingStore->format = VIR_STORAGE_FILE_RAW; > else > - vol->target.backingStore->format = backingFormat; > + backingStore->format = backingFormat; > meta->backingStoreRaw = NULL; > } > > diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c > index 536e617..e2a287d 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') > @@ -151,11 +152,12 @@ virStorageBackendLogicalMakeVol(char **const groups, > if (VIR_ALLOC(vol->target.backingStore) < 0) > goto cleanup; > > - if (virAsprintf(&vol->target.backingStore->path, "%s/%s", > + backingStore = virStorageSourceGetBackingStore(&vol->target, 0); I see you fixed up the references here, but we still have a problem if backingStore == NULL (now *technically* I know that cannot happen yet, but at some point in the future it could. So what should be done if backingStore == NULL here? Something like: backingStore = virStorageSourceGetBackingStore(&vol->target, 0); if (backingStore) { if (virAsprintf(&backingStore->path, "%s/%s", pool->def->target.path, groups[1]) < 0) goto cleanup; backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2; } > + if (virAsprintf(&backingStore->path, "%s/%s", > pool->def->target.path, groups[1]) < 0) > goto cleanup; > > - vol->target.backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2; > + backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2; > } > > if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0) > @@ -732,6 +734,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn, > virErrorPtr err; > struct stat sb; > bool created = false; > + virStorageSourcePtr backingStore; > > if (vol->target.encryption != NULL) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > @@ -764,8 +767,9 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn, > } > virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(vol->target.capacity, > 1024)); > - if (vol->target.backingStore) > - virCommandAddArgList(cmd, "-s", vol->target.backingStore->path, NULL); > + backingStore = virStorageSourceGetBackingStore(&vol->target, 0); > + if (backingStore) > + virCommandAddArgList(cmd, "-s", backingStore->path, NULL); > else > virCommandAddArg(cmd, pool->def->source.name); > > diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c > index 016beaa..af17d82 100644 > --- a/src/util/virstoragefile.c > +++ b/src/util/virstoragefile.c > @@ -1076,10 +1076,10 @@ virStorageFileChainGetBroken(virStorageSourcePtr chain, > if (!chain) > return 0; > > - for (tmp = chain; tmp; tmp = tmp->backingStore) { > + for (tmp = chain; tmp; tmp = virStorageSourceGetBackingStore(tmp, 0)) { > /* Break when we hit end of chain; report error if we detected > * a missing backing file, infinite loop, or other error */ > - if (!tmp->backingStore && tmp->backingStoreRaw) { > + if (!virStorageSourceGetBackingStore(tmp, 0) && tmp->backingStoreRaw) { > if (VIR_STRDUP(*brokenFile, tmp->backingStoreRaw) < 0) > return -1; > > @@ -1334,8 +1334,8 @@ virStorageFileChainLookup(virStorageSourcePtr chain, > *parent = NULL; > > if (startFrom) { > - while (chain && chain != startFrom->backingStore) { > - chain = chain->backingStore; > + while (chain && chain != virStorageSourceGetBackingStore(startFrom, 0)) { > + chain = virStorageSourceGetBackingStore(chain, 0); > i++; > } > > @@ -1352,7 +1352,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain, > > while (chain) { > if (!name && !idx) { > - if (!chain->backingStore) > + if (!virStorageSourceGetBackingStore(chain, 0)) > break; > } else if (idx) { > VIR_DEBUG("%zu: %s", i, chain->path); > @@ -1387,7 +1387,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain, > } > } > *parent = chain; > - chain = chain->backingStore; > + chain = virStorageSourceGetBackingStore(chain, 0); > i++; > } > > @@ -1893,8 +1893,8 @@ virStorageSourceCopy(const virStorageSource *src, > !(ret->auth = virStorageAuthDefCopy(src->auth))) > goto error; > > - if (backingChain && src->backingStore) { > - if (!(ret->backingStore = virStorageSourceCopy(src->backingStore, > + if (backingChain && virStorageSourceGetBackingStore(src, 0)) { > + if (!(ret->backingStore = virStorageSourceCopy(virStorageSourceGetBackingStore(src, 0), > true))) long line > goto error; > } > @@ -2035,7 +2035,7 @@ virStorageSourceBackingStoreClear(virStorageSourcePtr def) > VIR_FREE(def->backingStoreRaw); > > /* recursively free backing chain */ > - virStorageSourceFree(def->backingStore); > + virStorageSourceFree(virStorageSourceGetBackingStore(def, 0)); > def->backingStore = NULL; > } > > @@ -2898,7 +2898,7 @@ virStorageFileGetRelativeBackingPath(virStorageSourcePtr top, > > *relpath = NULL; > > - for (next = top; next; next = next->backingStore) { > + for (next = top; next; next = virStorageSourceGetBackingStore(next, 0)) { > if (!next->relPath) { > ret = 1; > goto cleanup; > diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c > index 38ce09e..5bd4637 100644 > --- a/tests/virstoragetest.c > +++ b/tests/virstoragetest.c > @@ -403,7 +403,7 @@ testStorageChain(const void *args) > } > VIR_FREE(expect); > VIR_FREE(actual); > - elt = elt->backingStore; > + elt = virStorageSourceGetBackingStore(elt, 0); > i++; > } > if (i != data->nfiles) { > @@ -1044,8 +1044,8 @@ mymain(void) > ret = -1; > goto cleanup; > } > - chain2 = chain->backingStore; > - chain3 = chain2->backingStore; > + chain2 = virStorageSourceGetBackingStore(chain, 0); > + chain3 = virStorageSourceGetBackingStore(chain2, 0); > > #define TEST_LOOKUP_TARGET(id, target, from, name, index, result, \ > meta, parent) \ > @@ -1110,8 +1110,8 @@ mymain(void) > ret = -1; > goto cleanup; > } > - chain2 = chain->backingStore; > - chain3 = chain2->backingStore; > + chain2 = virStorageSourceGetBackingStore(chain, 0); > + chain3 = virStorageSourceGetBackingStore(chain2, 0); > > TEST_LOOKUP(28, NULL, "bogus", NULL, NULL, NULL); > TEST_LOOKUP(29, chain, "bogus", NULL, NULL, NULL); > @@ -1157,8 +1157,8 @@ mymain(void) > ret = -1; > goto cleanup; > } > - chain2 = chain->backingStore; > - chain3 = chain2->backingStore; > + chain2 = virStorageSourceGetBackingStore(chain, 0); > + chain3 = virStorageSourceGetBackingStore(chain2, 0); > > TEST_LOOKUP(56, NULL, "bogus", NULL, NULL, NULL); > TEST_LOOKUP(57, NULL, "sub/link2", chain->path, chain, NULL); >
>From 408c85dfd2aee9da7917d9a1b137e51827846a9f Mon Sep 17 00:00:00 2001 From: John Ferlan <jferlan@xxxxxxxxxx> Date: Mon, 14 Dec 2015 18:26:18 -0500 Subject: [PATCH 4/8] merge Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- src/conf/domain_conf.c | 20 ++++++++++++-------- src/conf/storage_conf.c | 15 +++++++++------ src/qemu/qemu_cgroup.c | 6 ++++-- src/qemu/qemu_driver.c | 6 ++++-- src/security/security_dac.c | 3 ++- src/security/security_selinux.c | 3 ++- src/storage/storage_backend.c | 17 ++++++++++------- src/storage/storage_backend_fs.c | 1 + src/storage/storage_backend_logical.c | 10 ++++++---- src/util/virstoragefile.c | 9 +++++---- 10 files changed, 55 insertions(+), 35 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 18f9628..88804d4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18730,6 +18730,7 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf, { const char *type; const char *format; + virStorageSourcePtr bsp; if (!backingStore) { if (!backingStoreRaw) @@ -18759,9 +18760,11 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf, virBufferAsprintf(buf, "<format type='%s'/>\n", format); /* We currently don't output seclabels for backing chain element */ - if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, 0, true) < 0 || - virDomainDiskBackingStoreFormat(buf, - virStorageSourceGetBackingStore(backingStore, 0), + if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, 0, true) < 0) + return -1; + + bsp = virStorageSourceGetBackingStore(backingStore, 0); + if (virDomainDiskBackingStoreFormat(buf, bsp, backingStore->backingStoreRaw, idx + 1) < 0) return -1; @@ -18881,11 +18884,12 @@ virDomainDiskDefFormat(virBufferPtr buf, /* Don't format backingStore to inactive XMLs until the code for * persistent storage of backing chains is ready. */ - if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) && - virDomainDiskBackingStoreFormat(buf, - virStorageSourceGetBackingStore(def->src, 0), - def->src->backingStoreRaw, 1) < 0) - return -1; + if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE)) { + virStorageSourcePtr bsp = virStorageSourceGetBackingStore(def->src, 0); + if (virDomainDiskBackingStoreFormat(buf, bsp, + def->src->backingStoreRaw, 1) < 0) + return -1; + } virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name); diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index d048e39..d02db8f 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1330,7 +1330,8 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, if (virStorageSize(unit, capacity, &ret->target.capacity) < 0) goto error; } else if (!(flags & VIR_VOL_XML_PARSE_NO_CAPACITY) && - !((flags & VIR_VOL_XML_PARSE_OPT_CAPACITY) && virStorageSourceGetBackingStore(&ret->target, 0))) { + !((flags & VIR_VOL_XML_PARSE_OPT_CAPACITY) && + virStorageSourceGetBackingStore(&ret->target, 0))) { virReportError(VIR_ERR_XML_ERROR, "%s", _("missing capacity element")); goto error; } @@ -1644,11 +1645,13 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool, &def->target, "target") < 0) goto cleanup; - if (virStorageSourceGetBackingStore(&def->target, 0) && - virStorageVolTargetDefFormat(options, &buf, - virStorageSourceGetBackingStore(&def->target, 0), - "backingStore") < 0) - goto cleanup; + if (virStorageSourceGetBackingStore(&def->target, 0)) { + virStorageSourcePtr bsp = + virStorageSourceGetBackingStore(&def->target, 0); + if (virStorageVolTargetDefFormat(options, &buf, bsp, + "backingStore") < 0) + goto cleanup; + } virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "</volume>\n"); diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 90bd4ee..bcf4448 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -121,7 +121,8 @@ qemuSetupDiskCgroup(virDomainObjPtr vm, virStorageSourcePtr next; bool forceReadonly = false; - for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { + for (next = disk->src; next; + next = virStorageSourceGetBackingStore(next, 0)) { if (qemuSetImageCgroupInternal(vm, next, false, forceReadonly) < 0) return -1; @@ -139,7 +140,8 @@ qemuTeardownDiskCgroup(virDomainObjPtr vm, { virStorageSourcePtr next; - for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { + for (next = disk->src; next; + next = virStorageSourceGetBackingStore(next, 0)) { if (qemuSetImageCgroup(vm, next, true) < 0) return -1; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6773c6e..4a05ceb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16324,6 +16324,8 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver, if (baseSource) { if (flags & VIR_DOMAIN_BLOCK_REBASE_RELATIVE) { + virStorageSourcePtr bsp; + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHANGE_BACKING_FILE)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("this QEMU binary doesn't support relative " @@ -16331,8 +16333,8 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver, goto endjob; } - if (virStorageFileGetRelativeBackingPath(virStorageSourceGetBackingStore(disk->src, 0), - baseSource, + bsp = virStorageSourceGetBackingStore(disk->src, 0); + if (virStorageFileGetRelativeBackingPath(bsp, baseSource, &backingPath) < 0) goto endjob; diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 95144b5..aa2ba42 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -454,7 +454,8 @@ virSecurityDACSetSecurityDiskLabel(virSecurityManagerPtr mgr, { virStorageSourcePtr next; - for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { + for (next = disk->src; next; + next = virStorageSourceGetBackingStore(next, 0)) { if (virSecurityDACSetSecurityImageLabel(mgr, def, next) < 0) return -1; } diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 0a6b2f7..770122c 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1350,7 +1350,8 @@ virSecuritySELinuxSetSecurityDiskLabel(virSecurityManagerPtr mgr, bool first = true; virStorageSourcePtr next; - for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) { + for (next = disk->src; next; + next = virStorageSourceGetBackingStore(next, 0)) { if (virSecuritySELinuxSetSecurityImageLabelInternal(mgr, def, next, first) < 0) return -1; diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 016d6ef..9ed3290 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1008,13 +1008,16 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn, * backing store, not really sure what use it serves though, and it * may cause issues with lvm. Untested essentially. */ - if (inputvol && - virStorageSourceGetBackingStore(&inputvol->target, 0) && - STRNEQ_NULLABLE(virStorageSourceGetBackingStore(&inputvol->target, 0)->path, - info.backingPath)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("a different backing store cannot be specified.")); - return NULL; + if (inputvol) { + virStorageSourcePtr bsp = + virStorageSourceGetBackingStore(&inputvol->target, 0); + + if (bsp && STRNEQ_NULLABLE(bsp->path, info.backingPath)) { + + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("a different backing store cannot be specified.")); + return NULL; + } } if (!(backingType = virStorageFileFormatTypeToString(info.backingFormat))) { diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 725d712..fcd52ed 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -108,6 +108,7 @@ virStorageBackendProbeTarget(virStorageSourcePtr target, * and put the string from the metadata as the path of the target. */ if (!virStorageSourceIsLocalStorage(backingStore)) { virStorageSourceFree(backingStore); + target->backingStore = NULL; if (VIR_ALLOC(backingStore) < 0) goto cleanup; diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c index 830076a..0bd4a65 100644 --- a/src/storage/storage_backend_logical.c +++ b/src/storage/storage_backend_logical.c @@ -153,11 +153,13 @@ virStorageBackendLogicalMakeVol(char **const groups, goto cleanup; backingStore = virStorageSourceGetBackingStore(&vol->target, 0); - if (virAsprintf(&backingStore->path, "%s/%s", - pool->def->target.path, groups[1]) < 0) - goto cleanup; + if (backingStore) { + if (virAsprintf(&backingStore->path, "%s/%s", + pool->def->target.path, groups[1]) < 0) + goto cleanup; - backingStore->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/util/virstoragefile.c b/src/util/virstoragefile.c index 091b945..a4384e7 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -1334,7 +1334,8 @@ virStorageFileChainLookup(virStorageSourcePtr chain, *parent = NULL; if (startFrom) { - while (chain && chain != virStorageSourceGetBackingStore(startFrom, 0)) { + while (chain && + chain != virStorageSourceGetBackingStore(startFrom, 0)) { chain = virStorageSourceGetBackingStore(chain, 0); i++; } @@ -1893,9 +1894,9 @@ virStorageSourceCopy(const virStorageSource *src, !(ret->auth = virStorageAuthDefCopy(src->auth))) goto error; - if (backingChain && virStorageSourceGetBackingStore(src, 0)) { - if (!(ret->backingStore = virStorageSourceCopy(virStorageSourceGetBackingStore(src, 0), - true))) + if (backingChain) { + virStorageSourcePtr bsp = virStorageSourceGetBackingStore(src, 0); + if (!(ret->backingStore = virStorageSourceCopy(bsp, true))) goto error; } -- 2.5.0
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list