On 21.01.2015 16:29, Matthias Gatto wrote:
Uniformize backing store usage by calling
virStorageSourceGetBackingStore
instead of setting backing store manually.
Signed-off-by: Matthias Gatto <matthias.gatto(a)outscale.com>
---
src/conf/domain_conf.c | 7 ++++---
src/conf/storage_conf.c | 18 ++++++++++--------
src/qemu/qemu_cgroup.c | 4 ++--
src/qemu/qemu_domain.c | 2 +-
src/qemu/qemu_driver.c | 12 ++++++------
src/security/security_dac.c | 2 +-
src/security/security_selinux.c | 4 ++--
src/security/virt-aa-helper.c | 2 +-
src/storage/storage_backend.c | 30 ++++++++++++++++--------------
src/storage/storage_backend_fs.c | 31 +++++++++++++++++--------------
src/storage/storage_backend_gluster.c | 8 +++++---
src/storage/storage_backend_logical.c | 6 +++---
src/util/virstoragefile.c | 20 ++++++++++----------
tests/virstoragetest.c | 14 +++++++-------
14 files changed, 85 insertions(+), 75 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 8792f5e..0668a5b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16704,7 +16704,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),
backingStore->backingStoreRaw,
idx + 1) < 0)
return -1;
@@ -16826,7 +16826,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),
def->src->backingStoreRaw, 1) < 0)
return -1;
@@ -20868,7 +20869,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 e9aaa8a..f4f7e24 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1339,20 +1339,22 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
}
if ((backingStore = virXPathString("string(./backingStore/path)", ctxt)))
{
+ virStorageSourcePtr backingStorePtr;
if (VIR_ALLOC(ret->target.backingStore) < 0)
goto error;
- ret->target.backingStore->path = backingStore;
+ backingStorePtr = virStorageSourceGetBackingStore(&ret->target, 0);
+ 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);
@@ -1361,9 +1363,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;
@@ -1641,9 +1643,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),
"backingStore") < 0)
goto cleanup;
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index d71ffbc..82b5f2f 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)) {
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)) {
if (qemuSetImageCgroup(vm, next, true) < 0)
return -1;
}
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 99c46d4..68a2a95 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2725,7 +2725,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 5994558..547d2b5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13499,13 +13499,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);
}
@@ -15624,7 +15624,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
goto endjob;
}
- if (virStorageFileGetRelativeBackingPath(disk->src->backingStore,
+ if
(virStorageFileGetRelativeBackingPath(virStorageSourceGetBackingStore(disk->src, 0),
baseSource,
&backingPath) < 0)
goto endjob;
@@ -16336,7 +16336,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);
@@ -16344,14 +16344,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'"),
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index deb6980..0c2a226 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -379,7 +379,7 @@ virSecurityDACSetSecurityDiskLabel(virSecurityManagerPtr mgr,
{
virStorageSourcePtr next;
- for (next = disk->src; next; next = next->backingStore) {
+ 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 6e67a86..a1cab9f 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1146,7 +1146,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
@@ -1276,7 +1276,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)) {
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 e53779e..7a67071 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -942,7 +942,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 b990a82..4a94d3f 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -822,6 +822,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
char *opts = NULL;
bool convert = false;
bool backing = false;
+ virStorageSourcePtr backingStore;
virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
@@ -873,11 +874,12 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
}
- if (vol->target.backingStore) {
+ backingStore = virStorageSourceGetBackingStore(&vol->target, 0);
+ if (backingStore) {
int accessRetCode = -1;
char *absolutePath = NULL;
- backingType =
virStorageFileFormatTypeToString(vol->target.backingStore->format);
+ backingType = virStorageFileFormatTypeToString(backingStore->format);
if (preallocate) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -890,9 +892,9 @@ virStorageBackendCreateQemuImgCmd(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,
- vol->target.backingStore->path)) {
+ if (inputvol &&
virStorageSourceGetBackingStore(&(inputvol->target), 0) &&
+ STRNEQ_NULLABLE(virStorageSourceGetBackingStore(&(inputvol->target),
0)->path,
+ backingStore->path)) {
While this works I'd prefer to use a temporary variable instead of func()->path.
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("a different backing store cannot be
specified."));
return NULL;
@@ -901,24 +903,24 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
if (backingType == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown storage vol backing store type %d"),
- vol->target.backingStore->format);
+ backingStore->format);
return NULL;
}
/* Convert relative backing store paths to absolute paths for access
* validation.
*/
- if ('/' != *(vol->target.backingStore->path) &&
+ if ('/' != *(backingStore->path) &&
virAsprintf(&absolutePath, "%s/%s",
pool->def->target.path,
- vol->target.backingStore->path) < 0)
+ backingStore->path) < 0)
return NULL;
accessRetCode = access(absolutePath ? absolutePath
- : vol->target.backingStore->path, R_OK);
+ : backingStore->path, R_OK);
VIR_FREE(absolutePath);
if (accessRetCode != 0) {
virReportSystemError(errno,
_("inaccessible backing store volume %s"),
- vol->target.backingStore->path);
+ backingStore->path);
return NULL;
}
}
@@ -959,7 +961,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
cmd = virCommandNew(create_tool);
convert = !!inputvol;
- backing = !inputvol && vol->target.backingStore;
+ backing = !inputvol &&
virStorageSourceGetBackingStore(&(vol->target), 0);
if (convert)
virCommandAddArgList(cmd, "convert", "-f", inputType,
"-O", type, NULL);
@@ -1086,7 +1088,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"));
@@ -1491,8 +1493,8 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
openflags)) < 0)
return ret;
- if (vol->target.backingStore &&
- (ret = virStorageBackendUpdateVolTargetInfo(vol->target.backingStore,
+ if (virStorageSourceGetBackingStore(&(vol->target), 0) &&
+ (ret =
virStorageBackendUpdateVolTargetInfo(virStorageSourceGetBackingStore(&(vol->target),
0),
updateCapacity,
withBlockVolFormat,
VIR_STORAGE_VOL_OPEN_DEFAULT |
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 34f2153..56cfc56 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)
@@ -96,27 +97,29 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
goto cleanup;
if (meta->backingStoreRaw) {
- if (!(target->backingStore = virStorageSourceNewFromBacking(meta)))
+ backingStore = virStorageSourceGetBackingStore(target, 0);
+ if (!(backingStore = virStorageSourceNewFromBacking(meta)))
This won't work. In the preexisting code target->backingStore is modified, while
with your change it's left untouched and a local variable is modified instead. I see
three possibilities:
1) make virStorageSourceGetBackingStore() return address of src->backingStore. That way
the backing store can be modified via: *backingStore = newValue. However, this would
require complete rework of your patch.
2) Introduce virStorageSourceGetBackingStoreAddr() which would return the address of
src->backingStore and the function would be used just here.
3) access target->backingStore directly.
goto cleanup;
- target->backingStore->format = backingStoreFormat;
+ backingStore->format = backingStoreFormat;
This is okay, as the target->backingStore and backingStore points at the same memory
address.
/* 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);
- 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;
Aha! So you're going with number 3. Okay. But in that case The first line in the block
I've pointed out is useless.
+ 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 (backingStore->format == VIR_STORAGE_FILE_AUTO) {
if ((rc = virStorageFileProbeFormat(target->backingStore->path,
This ^^ should use bare @backingStore, so s/target->// as the target->backingStore
can be still NULL here (in case the @backingStore doesn't point to a local storage).
-1, -1)) < 0) {
/* If the backing file is currently unavailable or is
@@ -124,12 +127,12 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
* 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;
}
}
}
So after reading the whole function, I suggest this diff to be squashed in:
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 0857de3..b3bb5f1 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -97,10 +97,10 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
goto cleanup;
if (meta->backingStoreRaw) {
- backingStore = virStorageSourceGetBackingStore(target, 0);
- if (!(backingStore = virStorageSourceNewFromBacking(meta)))
+ if (!(target->backingStore = virStorageSourceNewFromBacking(meta)))
goto cleanup;
+ backingStore = virStorageSourceGetBackingStore(target, 0);
backingStore->format = backingStoreFormat;
@@ -900,8 +903,8 @@ 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,
+ if (virStorageSourceGetBackingStore(&(vol->target), 0)) {
+
ignore_value(virStorageBackendUpdateVolTargetInfo(virStorageSourceGetBackingStore(&(vol->target),
0),
true, false,
VIR_STORAGE_VOL_OPEN_DEFAULT));
/* If this failed, the backing file is currently unavailable,
diff --git a/src/storage/storage_backend_gluster.c
b/src/storage/storage_backend_gluster.c
index 53e4632..fc48f0f 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 8aa68a6..fcec31f 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -151,11 +151,11 @@ virStorageBackendLogicalMakeVol(char **const groups,
if (VIR_ALLOC(vol->target.backingStore) < 0)
goto cleanup;
- if (virAsprintf(&vol->target.backingStore->path, "%s/%s",
+ if (virAsprintf(&virStorageSourceGetBackingStore(&vol->target,
0)->path, "%s/%s",
pool->def->target.path, groups[1]) < 0)
goto cleanup;
- vol->target.backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
+ virStorageSourceGetBackingStore(&vol->target, 0)->format =
VIR_STORAGE_POOL_LOGICAL_LVM2;
}
if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0)
@@ -764,7 +764,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
}
virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(vol->target.capacity,
1024));
- if (vol->target.backingStore)
+ if (virStorageSourceGetBackingStore(&(vol->target), 0))
virCommandAddArgList(cmd, "-s", vol->target.backingStore->path,
NULL);
else
virCommandAddArg(cmd, pool->def->source.name);
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index dc6cf8f..052debf 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++;
}
*parent = startFrom;
@@ -1343,7 +1343,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);
@@ -1378,7 +1378,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
}
}
*parent = chain;
- chain = chain->backingStore;
+ chain = virStorageSourceGetBackingStore(chain, 0);
i++;
}
@@ -1880,8 +1880,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)))
goto error;
}
@@ -2018,7 +2018,7 @@ virStorageSourceBackingStoreClear(virStorageSourcePtr def)
VIR_FREE(def->backingStoreRaw);
/* recursively free backing chain */
- virStorageSourceFree(def->backingStore);
+ virStorageSourceFree(virStorageSourceGetBackingStore(def, 0));
def->backingStore = NULL;
}
@@ -2832,7 +2832,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 2601edc..12670da 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) {
@@ -1029,8 +1029,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) \
@@ -1095,8 +1095,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);
@@ -1142,8 +1142,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);
There are some other issues I've found, so ACK with this squashed in:
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index a768290..7fcff09 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -931,9 +931,13 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
if (backingStore) {
int accessRetCode = -1;
char *absolutePath = NULL;
+ virStorageSourcePtr targetBackingStore = NULL;
backingType = virStorageFileFormatTypeToString(backingStore->format);
+ if (inputvol)
+ targetBackingStore =
virStorageSourceGetBackingStore(&inputvol->target, 0);
+
if (preallocate) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("metadata preallocation conflicts with backing"
@@ -945,9 +949,8 @@ virStorageBackendCreateQemuImgCmd(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,
- backingStore->path)) {
+ if (inputvol && targetBackingStore &&
+ STRNEQ_NULLABLE(targetBackingStore->path, backingStore->path)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("a different backing store cannot be
specified."));
return NULL;
@@ -1014,7 +1017,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
cmd = virCommandNew(create_tool);
convert = !!inputvol;
- backing = !inputvol && virStorageSourceGetBackingStore(&(vol->target),
0);
+ backing = !inputvol && backingStore;
if (convert)
virCommandAddArgList(cmd, "convert", "-f", inputType,
"-O", type, NULL);
@@ -1022,7 +1025,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
virCommandAddArgList(cmd, "create", "-f", type, NULL);
if (backing)
- virCommandAddArgList(cmd, "-b", vol->target.backingStore->path,
NULL);
+ virCommandAddArgList(cmd, "-b", backingStore->path, NULL);
if (imgformat >= QEMU_IMG_BACKING_FORMAT_OPTIONS) {
if (vol->target.format == VIR_STORAGE_FILE_QCOW2 && !compat
&&
@@ -1539,6 +1542,7 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
unsigned int openflags)
{
int ret;
+ virStorageSourcePtr backingStore =
virStorageSourceGetBackingStore(&vol->target, 0);
if ((ret = virStorageBackendUpdateVolTargetInfo(&vol->target,
updateCapacity,
@@ -1546,12 +1550,12 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
openflags)) < 0)
return ret;
- if (virStorageSourceGetBackingStore(&(vol->target), 0) &&
- (ret =
virStorageBackendUpdateVolTargetInfo(virStorageSourceGetBackingStore(&(vol->target),
0),
+ if (backingStore &&
+ (ret = virStorageBackendUpdateVolTargetInfo(backingStore,
updateCapacity,
withBlockVolFormat,
VIR_STORAGE_VOL_OPEN_DEFAULT |
- VIR_STORAGE_VOL_OPEN_NOERROR) <
0))
+ VIR_STORAGE_VOL_OPEN_NOERROR)) <
0)
return ret;
return 0;
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 0857de3..6c922e4 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -97,10 +97,10 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
goto cleanup;
if (meta->backingStoreRaw) {
- backingStore = virStorageSourceGetBackingStore(target, 0);
- if (!(backingStore = virStorageSourceNewFromBacking(meta)))
+ if (!(target->backingStore = virStorageSourceNewFromBacking(meta)))
goto cleanup;
+ backingStore = virStorageSourceGetBackingStore(target, 0);
backingStore->format = backingStoreFormat;
/* XXX: Remote storage doesn't play nicely with volumes backed by
@@ -863,6 +863,7 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn
ATTRIBUTE_UNUSED,
while ((direrr = virDirRead(dir, &ent, pool->def->target.path)) > 0) {
int ret;
+ virStorageSourcePtr backingStore;
if (VIR_ALLOC(vol) < 0)
goto error;
@@ -903,8 +904,9 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn
ATTRIBUTE_UNUSED,
if (vol->target.format == VIR_STORAGE_FILE_DIR)
vol->type = VIR_STORAGE_VOL_DIR;
- if (virStorageSourceGetBackingStore(&(vol->target), 0)) {
-
ignore_value(virStorageBackendUpdateVolTargetInfo(virStorageSourceGetBackingStore(&(vol->target),
0),
+ backingStore = virStorageSourceGetBackingStore(&vol->target, 0);
+ if (backingStore) {
+ ignore_value(virStorageBackendUpdateVolTargetInfo(backingStore,
true, false,
VIR_STORAGE_VOL_OPEN_DEFAULT));
/* If this failed, the backing file is currently unavailable,
diff --git a/src/storage/storage_backend_logical.c
b/src/storage/storage_backend_logical.c
index fcec31f..a383454 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -148,14 +148,17 @@ virStorageBackendLogicalMakeVol(char **const groups,
* lv is created with "--virtualsize").
*/
if (groups[1] && !STREQ(groups[1], "") && (groups[1][0] !=
'[')) {
+ virStorageSourcePtr backingStore;
+
if (VIR_ALLOC(vol->target.backingStore) < 0)
goto cleanup;
- if (virAsprintf(&virStorageSourceGetBackingStore(&vol->target,
0)->path, "%s/%s",
+ backingStore = virStorageSourceGetBackingStore(&vol->target, 0);
+ 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)
Michal