Re: [libvirt] [PATCH v7 05/13] virstoragefile: change backingStore to backingStores.
On 12/03/2015 09:35 AM, Matthias Gatto wrote: > The backingStore field was a virStorageSourcePtr. > Because a quorum can contain more that one backingStore at the same level, > it's now an array of 'virStorageSourcePtr'. > > This patch rename src->backingStore to src->backingStores, > Made the necessary changes to virStorageSourceSetBackingStore > and virStorageSourceGetBackingStore. > virStorageSourceSetBackingStore can now expand the size of src->backingStores. > > Signed-off-by: Matthias Gatto> --- > src/storage/storage_backend.c| 2 +- > src/storage/storage_backend_fs.c | 2 +- > src/util/virstoragefile.c| 66 > +++- > src/util/virstoragefile.h| 3 +- > 4 files changed, 56 insertions(+), 17 deletions(-) > > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c > index 08ed1dd..d71bb1a 100644 > --- a/src/storage/storage_backend.c > +++ b/src/storage/storage_backend.c > @@ -498,7 +498,7 @@ virStorageBackendCreateRaw(virConnectPtr conn > ATTRIBUTE_UNUSED, > goto cleanup; > } > > -if (vol->target.backingStore) { > +if (vol->target.backingStores) { > virReportError(VIR_ERR_NO_SUPPORT, "%s", > _("backing storage not supported for raw volumes")); > goto cleanup; > diff --git a/src/storage/storage_backend_fs.c > b/src/storage/storage_backend_fs.c > index b216e91..68419e3 100644 > --- a/src/storage/storage_backend_fs.c > +++ b/src/storage/storage_backend_fs.c > @@ -1100,7 +1100,7 @@ static int createFileDir(virConnectPtr conn > ATTRIBUTE_UNUSED, > return -1; > } > > -if (vol->target.backingStore) { > +if (vol->target.backingStores) { > virReportError(VIR_ERR_NO_SUPPORT, "%s", > _("backing storage not supported for directories > volumes")); > return -1; I would think these two accesses would need a read access rather than changing from backingStore to backingStores. First clue would be that now that everything is supposed to be contained within virstoragefile.c so any change outside that has been something changed since you first started this adventure. > diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c > index 1299f98..8c05786 100644 > --- a/src/util/virstoragefile.c > +++ b/src/util/virstoragefile.c > @@ -1809,22 +1809,50 @@ virStorageSourcePoolDefCopy(const > virStorageSourcePoolDef *src) > } > > > +/** > + * virStorageSourceGetBackingStore: > + * @src: virStorageSourcePtr containing the backing stores > + * @pos: position of the backing store to get > + * > + * return the backingStore at the position of @pos > + */ > virStorageSourcePtr > -virStorageSourceGetBackingStore(const virStorageSource *src, > -size_t pos ATTRIBUTE_UNUSED) > +virStorageSourceGetBackingStore(const virStorageSource *src, size_t pos) > { > -if (!src) > +if (!src || !src->backingStores || pos >= src->nBackingStores) > return NULL; > -return src->backingStore; > +return src->backingStores[pos]; > } > > > +/** > + * virStorageSourceSetBackingStore: > + * @src: virStorageSourcePtr to hold @backingStore > + * @backingStore: backingStore to store > + * @pos: position of the backing store to store > + * > + * Set @backingStore at @pos in src->backingStores. > + * If src->backingStores don't have the space to contain > + * @backingStore, we expand src->backingStores. > + * If src->backingStores[pos] is alerady set, free it. > + */ > int > virStorageSourceSetBackingStore(virStorageSourcePtr src, > virStorageSourcePtr backingStore, > -size_t pos ATTRIBUTE_UNUSED) > +size_t pos) > { > -src->backingStore = backingStore; > +if (!src) > +return -1; > + > +if (pos >= src->nBackingStores) { > +int nbr = pos - src->nBackingStores + 1; > +if (VIR_EXPAND_N(src->backingStores, src->nBackingStores, nbr) < 0) > +return -1; > +} > + > +if (src->backingStores[pos]) > +virStorageSourceFree(src->backingStores[pos]); > +src->backingStores[pos] = backingStore; > return 0; > } > > @@ -1843,6 +1871,7 @@ virStorageSourceCopy(const virStorageSource *src, > bool backingChain) > { > virStorageSourcePtr ret = NULL; > +size_t i; > > if (VIR_ALLOC(ret) < 0) > return NULL; > @@ -1855,6 +1884,8 @@ virStorageSourceCopy(const virStorageSource *src, > ret->physical = src->physical; > ret->readonly = src->readonly; > ret->shared = src->shared; > +ret->nBackingStores = src->nBackingStores; > +ret->threshold = src->threshold; This appears to be a rogue change... It causes my build to fail. Looks like it's defined in patch 7 and further used in patch 8 - so those will need an update once this is
[libvirt] [PATCH v7 05/13] virstoragefile: change backingStore to backingStores.
The backingStore field was a virStorageSourcePtr. Because a quorum can contain more that one backingStore at the same level, it's now an array of 'virStorageSourcePtr'. This patch rename src->backingStore to src->backingStores, Made the necessary changes to virStorageSourceSetBackingStore and virStorageSourceGetBackingStore. virStorageSourceSetBackingStore can now expand the size of src->backingStores. Signed-off-by: Matthias Gatto--- src/storage/storage_backend.c| 2 +- src/storage/storage_backend_fs.c | 2 +- src/util/virstoragefile.c| 66 +++- src/util/virstoragefile.h| 3 +- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 08ed1dd..d71bb1a 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -498,7 +498,7 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED, goto cleanup; } -if (vol->target.backingStore) { +if (vol->target.backingStores) { virReportError(VIR_ERR_NO_SUPPORT, "%s", _("backing storage not supported for raw volumes")); goto cleanup; diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index b216e91..68419e3 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -1100,7 +1100,7 @@ static int createFileDir(virConnectPtr conn ATTRIBUTE_UNUSED, return -1; } -if (vol->target.backingStore) { +if (vol->target.backingStores) { virReportError(VIR_ERR_NO_SUPPORT, "%s", _("backing storage not supported for directories volumes")); return -1; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 1299f98..8c05786 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -1809,22 +1809,50 @@ virStorageSourcePoolDefCopy(const virStorageSourcePoolDef *src) } +/** + * virStorageSourceGetBackingStore: + * @src: virStorageSourcePtr containing the backing stores + * @pos: position of the backing store to get + * + * return the backingStore at the position of @pos + */ virStorageSourcePtr -virStorageSourceGetBackingStore(const virStorageSource *src, -size_t pos ATTRIBUTE_UNUSED) +virStorageSourceGetBackingStore(const virStorageSource *src, size_t pos) { -if (!src) +if (!src || !src->backingStores || pos >= src->nBackingStores) return NULL; -return src->backingStore; +return src->backingStores[pos]; } +/** + * virStorageSourceSetBackingStore: + * @src: virStorageSourcePtr to hold @backingStore + * @backingStore: backingStore to store + * @pos: position of the backing store to store + * + * Set @backingStore at @pos in src->backingStores. + * If src->backingStores don't have the space to contain + * @backingStore, we expand src->backingStores. + * If src->backingStores[pos] is alerady set, free it. + */ int virStorageSourceSetBackingStore(virStorageSourcePtr src, virStorageSourcePtr backingStore, -size_t pos ATTRIBUTE_UNUSED) +size_t pos) { -src->backingStore = backingStore; +if (!src) +return -1; + +if (pos >= src->nBackingStores) { +int nbr = pos - src->nBackingStores + 1; +if (VIR_EXPAND_N(src->backingStores, src->nBackingStores, nbr) < 0) +return -1; +} + +if (src->backingStores[pos]) +virStorageSourceFree(src->backingStores[pos]); +src->backingStores[pos] = backingStore; return 0; } @@ -1843,6 +1871,7 @@ virStorageSourceCopy(const virStorageSource *src, bool backingChain) { virStorageSourcePtr ret = NULL; +size_t i; if (VIR_ALLOC(ret) < 0) return NULL; @@ -1855,6 +1884,8 @@ virStorageSourceCopy(const virStorageSource *src, ret->physical = src->physical; ret->readonly = src->readonly; ret->shared = src->shared; +ret->nBackingStores = src->nBackingStores; +ret->threshold = src->threshold; /* storage driver metadata are not copied */ ret->drv = NULL; @@ -1903,12 +1934,14 @@ virStorageSourceCopy(const virStorageSource *src, !(ret->auth = virStorageAuthDefCopy(src->auth))) goto error; -if (backingChain && virStorageSourceGetBackingStore(src, 0)) { -if (virStorageSourceSetBackingStore(ret, - virStorageSourceCopy(virStorageSourceGetBackingStore(src, 0), - true), - 0) < 0) -goto error; +for (i = 0; i < src->nBackingStores; ++i) { +if (backingChain && virStorageSourceGetBackingStore(src, i)) { +if (virStorageSourceSetBackingStore(ret,