As we have a nested pointer for storing the backing store of a volume there's no need to store it in a separate struct. --- src/conf/storage_conf.c | 53 ++++++++++++++++++++--------------- src/conf/storage_conf.h | 1 - src/storage/storage_backend.c | 27 +++++++++--------- src/storage/storage_backend_fs.c | 9 ++++-- src/storage/storage_backend_gluster.c | 20 +++++++++---- src/storage/storage_backend_logical.c | 11 +++++--- 6 files changed, 72 insertions(+), 49 deletions(-) diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index aa29658..c79aebd 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -331,7 +331,6 @@ virStorageVolDefFree(virStorageVolDefPtr def) VIR_FREE(def->source.extents); virStorageSourceClear(&def->target); - virStorageSourceClear(&def->backingStore); VIR_FREE(def); } @@ -1168,6 +1167,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, char *allocation = NULL; char *capacity = NULL; char *unit = NULL; + char *backingStore = NULL; xmlNodePtr node; xmlNodePtr *nodes = NULL; size_t i; @@ -1252,21 +1252,35 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, goto error; } - ret->backingStore.path = virXPathString("string(./backingStore/path)", ctxt); - if (options->formatFromString) { - char *format = virXPathString("string(./backingStore/format/@type)", ctxt); - if (format == NULL) - ret->backingStore.format = options->defaultFormat; - else - ret->backingStore.format = (options->formatFromString)(format); + if ((backingStore = virXPathString("string(./backingStore/path)", ctxt))) { + if (VIR_ALLOC(ret->target.backingStore) < 0) + goto error; - if (ret->backingStore.format < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown volume format type %s"), format); + ret->target.backingStore->path = backingStore; + backingStore = NULL; + + if (options->formatFromString) { + char *format = virXPathString("string(./backingStore/format/@type)", ctxt); + if (format == NULL) + ret->target.backingStore->format = options->defaultFormat; + else + ret->target.backingStore->format = (options->formatFromString)(format); + + if (ret->target.backingStore->format < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown volume format type %s"), format); + VIR_FREE(format); + goto error; + } VIR_FREE(format); - goto error; } - VIR_FREE(format); + + if (VIR_ALLOC(ret->target.backingStore->perms) < 0) + goto error; + if (virStorageDefParsePerms(ctxt, ret->target.backingStore->perms, + "./backingStore/permissions", + DEFAULT_VOL_PERM_MODE) < 0) + goto error; } ret->target.compat = virXPathString("string(./target/compat)", ctxt); @@ -1308,19 +1322,13 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, VIR_FREE(nodes); } - if (VIR_ALLOC(ret->backingStore.perms) < 0) - goto error; - if (virStorageDefParsePerms(ctxt, ret->backingStore.perms, - "./backingStore/permissions", - DEFAULT_VOL_PERM_MODE) < 0) - goto error; - cleanup: VIR_FREE(nodes); VIR_FREE(allocation); VIR_FREE(capacity); VIR_FREE(unit); VIR_FREE(type); + VIR_FREE(backingStore); return ret; error: @@ -1544,9 +1552,10 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool, &def->target, "target") < 0) goto cleanup; - if (def->backingStore.path && + if (def->target.backingStore && virStorageVolTargetDefFormat(options, &buf, - &def->backingStore, "backingStore") < 0) + def->target.backingStore, + "backingStore") < 0) goto cleanup; virBufferAdjustIndent(&buf, -2); diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 47f769b..badf7a3 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -68,7 +68,6 @@ struct _virStorageVolDef { virStorageVolSource source; virStorageSource target; - virStorageSource backingStore; }; typedef struct _virStorageVolDefList virStorageVolDefList; diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index a36996f..f5bfdee 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -844,11 +844,11 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn, } - if (vol->backingStore.path) { + if (vol->target.backingStore) { int accessRetCode = -1; char *absolutePath = NULL; - backingType = virStorageFileFormatTypeToString(vol->backingStore.format); + backingType = virStorageFileFormatTypeToString(vol->target.backingStore->format); if (preallocate) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -862,7 +862,8 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn, * may cause issues with lvm. Untested essentially. */ if (inputvol && - STRNEQ_NULLABLE(inputvol->backingStore.path, vol->backingStore.path)) { + STRNEQ_NULLABLE(inputvol->target.backingStore->path, + vol->target.backingStore->path)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("a different backing store cannot be specified.")); return NULL; @@ -871,24 +872,24 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn, if (backingType == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unknown storage vol backing store type %d"), - vol->backingStore.format); + vol->target.backingStore->format); return NULL; } /* Convert relative backing store paths to absolute paths for access * validation. */ - if ('/' != *(vol->backingStore.path) && + if ('/' != *(vol->target.backingStore->path) && virAsprintf(&absolutePath, "%s/%s", pool->def->target.path, - vol->backingStore.path) < 0) + vol->target.backingStore->path) < 0) return NULL; accessRetCode = access(absolutePath ? absolutePath - : vol->backingStore.path, R_OK); + : vol->target.backingStore->path, R_OK); VIR_FREE(absolutePath); if (accessRetCode != 0) { virReportSystemError(errno, _("inaccessible backing store volume %s"), - vol->backingStore.path); + vol->target.backingStore->path); return NULL; } } @@ -929,7 +930,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn, cmd = virCommandNew(create_tool); convert = !!inputvol; - backing = !inputvol && vol->backingStore.path; + backing = !inputvol && vol->target.backingStore; if (convert) virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type, NULL); @@ -937,7 +938,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn, virCommandAddArgList(cmd, "create", "-f", type, NULL); if (backing) - virCommandAddArgList(cmd, "-b", vol->backingStore.path, NULL); + virCommandAddArgList(cmd, "-b", vol->target.backingStore->path, NULL); if (imgformat >= QEMU_IMG_BACKING_FORMAT_OPTIONS) { if (vol->target.format == VIR_STORAGE_FILE_QCOW2 && !compat && @@ -1055,7 +1056,7 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED, vol->target.format); return -1; } - if (vol->backingStore.path != NULL) { + if (vol->target.backingStore != NULL) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("copy-on-write image not supported with " "qcow-create")); @@ -1460,8 +1461,8 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol, openflags)) < 0) return ret; - if (vol->backingStore.path && - (ret = virStorageBackendUpdateVolTargetInfo(&vol->backingStore, + if (vol->target.backingStore && + (ret = virStorageBackendUpdateVolTargetInfo(vol->target.backingStore, updateCapacity, withBlockVolFormat, VIR_STORAGE_VOL_OPEN_DEFAULT)) < 0) diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 5e65f53..8b0beea 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -890,10 +890,13 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED, vol->type = VIR_STORAGE_VOL_DIR; if (backingStore != NULL) { - vol->backingStore.path = backingStore; - vol->backingStore.format = backingStoreFormat; + if (VIR_ALLOC(vol->target.backingStore) < 0) + goto cleanup; + + vol->target.backingStore->path = backingStore; + vol->target.backingStore->format = backingStoreFormat; - ignore_value(virStorageBackendUpdateVolTargetInfo(&vol->backingStore, + ignore_value(virStorageBackendUpdateVolTargetInfo(vol->target.backingStore, 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 76d2461..0f8f0f3 100644 --- a/src/storage/storage_backend_gluster.c +++ b/src/storage/storage_backend_gluster.c @@ -246,6 +246,7 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state, virStorageSourcePtr meta = NULL; char *header = NULL; ssize_t len = VIR_STORAGE_MAX_HEADER; + int backingFormat; *volptr = NULL; @@ -295,16 +296,23 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state, if (!(meta = virStorageFileGetMetadataFromBuf(name, header, len, VIR_STORAGE_FILE_AUTO, - &vol->backingStore.format))) + &backingFormat))) goto cleanup; - vol->backingStore.path = meta->backingStoreRaw; - meta->backingStoreRaw = NULL; + if (meta->backingStoreRaw) { + if (VIR_ALLOC(vol->target.backingStore) < 0) + goto cleanup; + + vol->target.backingStore->path = meta->backingStoreRaw; + + if (backingFormat < 0) + vol->target.backingStore->format = VIR_STORAGE_FILE_RAW; + else + vol->target.backingStore->format = backingFormat; + meta->backingStoreRaw = NULL; + } vol->target.format = meta->format; - if (vol->backingStore.path && - vol->backingStore.format < 0) - vol->backingStore.format = VIR_STORAGE_FILE_RAW; if (meta->capacity) vol->target.capacity = meta->capacity; if (meta->encryption) { diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c index faa9a4b..60ad5f2 100644 --- a/src/storage/storage_backend_logical.c +++ b/src/storage/storage_backend_logical.c @@ -139,11 +139,14 @@ virStorageBackendLogicalMakeVol(char **const groups, * lv is created with "--virtualsize"). */ if (groups[1] && !STREQ(groups[1], "") && (groups[1][0] != '[')) { - if (virAsprintf(&vol->backingStore.path, "%s/%s", + if (VIR_ALLOC(vol->target.backingStore) < 0) + goto cleanup; + + if (virAsprintf(&vol->target.backingStore->path, "%s/%s", pool->def->target.path, groups[1]) < 0) goto cleanup; - vol->backingStore.format = VIR_STORAGE_POOL_LOGICAL_LVM2; + vol->target.backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2; } if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0) @@ -752,8 +755,8 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn, } virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(vol->target.capacity, 1024)); - if (vol->backingStore.path) - virCommandAddArgList(cmd, "-s", vol->backingStore.path, NULL); + if (vol->target.backingStore) + virCommandAddArgList(cmd, "-s", vol->target.backingStore->path, NULL); else virCommandAddArg(cmd, pool->def->source.name); -- 2.0.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list