Re: [libvirt] [PATCH v2 5/9] virstoragefile: Treat backingStore as a pointer or an array

2015-01-28 Thread Michal Privoznik
On 21.01.2015 16:29, Matthias Gatto wrote:
 As explain in the former patchs, backingStore can be treat an array or
 a pointer.
 If we have only one backingStore we have to use it as a normal ptr
 but if there is more backing store, we use it as a pointer's array.
 
 Because it would be complicated to expend backingStore manually, and do
 the convertion from a pointer to an array, I've created the
 virStorageSourcePushBackingStore function to help.
 
 This function allocate an array of pointer only if there is more than 1 bs.
 
 Because we can not remove a child from a quorum, i didn't create the function
 virStorageSourcePopBackingStore.
 
 I've changed virStorageSourceBackingStoreClear, 
 virStorageSourceSetBackingStore
 and virStorageSourceGetBackingStore to handle the case where backingStore
 is an array.
 
 Signed-off-by: Matthias Gatto matthias.ga...@outscale.com
 ---
  src/conf/storage_conf.c   |  7 ++-
  src/libvirt_private.syms  |  1 +
  src/storage/storage_backend_fs.c  |  2 +
  src/storage/storage_backend_logical.c |  2 +-
  src/util/virstoragefile.c | 89 
 ---
  src/util/virstoragefile.h |  2 +
  6 files changed, 94 insertions(+), 9 deletions(-)
 
 diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
 index fac85fa..41887eb 100644
 --- a/src/conf/storage_conf.c
 +++ b/src/conf/storage_conf.c
 @@ -1343,7 +1343,12 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
  if (VIR_ALLOC(backingStorePtr)  0)
  goto error;
  
 -backingStorePtr = virStorageSourceSetBackingStore(ret-target, 
 backingStorePtr, 0);
 +if (!virStorageSourcePushBackingStore(ret-target))
 +goto error;
 +
 +backingStorePtr = virStorageSourceSetBackingStore(ret-target,
 +  backingStorePtr,
 +  
 ret-target.nBackingStores - 1);
  backingStorePtr-path = backingStore;
  backingStore = NULL;
  
 diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
 index 980235b..5752907 100644
 --- a/src/libvirt_private.syms
 +++ b/src/libvirt_private.syms
 @@ -2033,6 +2033,7 @@ virStorageSourceParseRBDColonString;
  virStorageSourcePoolDefFree;
  virStorageSourcePoolModeTypeFromString;
  virStorageSourcePoolModeTypeToString;
 +virStorageSourcePushBackingStore;
  virStorageSourceSetBackingStore;
  virStorageTypeFromString;
  virStorageTypeToString;
 diff --git a/src/storage/storage_backend_fs.c 
 b/src/storage/storage_backend_fs.c
 index a3b6688..0d8c5ad 100644
 --- a/src/storage/storage_backend_fs.c
 +++ b/src/storage/storage_backend_fs.c
 @@ -112,6 +112,8 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
  
  if (VIR_ALLOC(backingStore)  0)
  goto cleanup;
 +if (virStorageSourcePushBackingStore(target) == false)
 +goto cleanup;
  virStorageSourceSetBackingStore(target, backingStore, 0);
  backingStore-type = VIR_STORAGE_TYPE_NETWORK;
  backingStore-path = meta-backingStoreRaw;
 diff --git a/src/storage/storage_backend_logical.c 
 b/src/storage/storage_backend_logical.c
 index fcec31f..cd8de85 100644
 --- a/src/storage/storage_backend_logical.c
 +++ b/src/storage/storage_backend_logical.c
 @@ -148,7 +148,7 @@ 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 (virStorageSourcePushBackingStore(vol-target) == false)
  goto cleanup;
  
  if (virAsprintf(virStorageSourceGetBackingStore(vol-target, 
 0)-path, %s/%s,
 diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
 index ba38827..554aa8b 100644
 --- a/src/util/virstoragefile.c
 +++ b/src/util/virstoragefile.c
 @@ -1798,21 +1798,88 @@ 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-backingStore || (pos  1  pos = src-nBackingStores))
 +return NULL;
 +if (src-nBackingStores  2)
 +return src-backingStore;
 +return ((virStorageSourcePtr *)src-backingStore)[pos];
 +}
 +
 +
 +/**
 + * virStorageSourcePushBackingStore:
 + * @src: virStorageSourcePtr to allocate the new backing store
 + *
 + * Allocate size for a new backingStorePtr in src-backingStore
 + * and update src-nBackingStores
 + * If we 

Re: [libvirt] [PATCH v2 5/9] virstoragefile: Treat backingStore as a pointer or an array

2015-01-28 Thread Matthias Gatto
On Wed, Jan 28, 2015 at 11:10 AM, Michal Privoznik mpriv...@redhat.com wrote:
 On 21.01.2015 16:29, Matthias Gatto wrote:
 As explain in the former patchs, backingStore can be treat an array or
 a pointer.
 If we have only one backingStore we have to use it as a normal ptr
 but if there is more backing store, we use it as a pointer's array.

 Because it would be complicated to expend backingStore manually, and do
 the convertion from a pointer to an array, I've created the
 virStorageSourcePushBackingStore function to help.

 This function allocate an array of pointer only if there is more than 1 bs.

 Because we can not remove a child from a quorum, i didn't create the function
 virStorageSourcePopBackingStore.

 I've changed virStorageSourceBackingStoreClear, 
 virStorageSourceSetBackingStore
 and virStorageSourceGetBackingStore to handle the case where backingStore
 is an array.

 Signed-off-by: Matthias Gatto matthias.ga...@outscale.com
 ---
  src/conf/storage_conf.c   |  7 ++-
  src/libvirt_private.syms  |  1 +
  src/storage/storage_backend_fs.c  |  2 +
  src/storage/storage_backend_logical.c |  2 +-
  src/util/virstoragefile.c | 89 
 ---
  src/util/virstoragefile.h |  2 +
  6 files changed, 94 insertions(+), 9 deletions(-)

 diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
 index fac85fa..41887eb 100644
 --- a/src/conf/storage_conf.c
 +++ b/src/conf/storage_conf.c
 @@ -1343,7 +1343,12 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
  if (VIR_ALLOC(backingStorePtr)  0)
  goto error;

 -backingStorePtr = virStorageSourceSetBackingStore(ret-target, 
 backingStorePtr, 0);
 +if (!virStorageSourcePushBackingStore(ret-target))
 +goto error;
 +
 +backingStorePtr = virStorageSourceSetBackingStore(ret-target,
 +  backingStorePtr,
 +  
 ret-target.nBackingStores - 1);
  backingStorePtr-path = backingStore;
  backingStore = NULL;

 diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
 index 980235b..5752907 100644
 --- a/src/libvirt_private.syms
 +++ b/src/libvirt_private.syms
 @@ -2033,6 +2033,7 @@ virStorageSourceParseRBDColonString;
  virStorageSourcePoolDefFree;
  virStorageSourcePoolModeTypeFromString;
  virStorageSourcePoolModeTypeToString;
 +virStorageSourcePushBackingStore;
  virStorageSourceSetBackingStore;
  virStorageTypeFromString;
  virStorageTypeToString;
 diff --git a/src/storage/storage_backend_fs.c 
 b/src/storage/storage_backend_fs.c
 index a3b6688..0d8c5ad 100644
 --- a/src/storage/storage_backend_fs.c
 +++ b/src/storage/storage_backend_fs.c
 @@ -112,6 +112,8 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,

  if (VIR_ALLOC(backingStore)  0)
  goto cleanup;
 +if (virStorageSourcePushBackingStore(target) == false)
 +goto cleanup;
  virStorageSourceSetBackingStore(target, backingStore, 0);
  backingStore-type = VIR_STORAGE_TYPE_NETWORK;
  backingStore-path = meta-backingStoreRaw;
 diff --git a/src/storage/storage_backend_logical.c 
 b/src/storage/storage_backend_logical.c
 index fcec31f..cd8de85 100644
 --- a/src/storage/storage_backend_logical.c
 +++ b/src/storage/storage_backend_logical.c
 @@ -148,7 +148,7 @@ 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 (virStorageSourcePushBackingStore(vol-target) == false)
  goto cleanup;

  if (virAsprintf(virStorageSourceGetBackingStore(vol-target, 
 0)-path, %s/%s,
 diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
 index ba38827..554aa8b 100644
 --- a/src/util/virstoragefile.c
 +++ b/src/util/virstoragefile.c
 @@ -1798,21 +1798,88 @@ 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-backingStore || (pos  1  pos = src-nBackingStores))
 +return NULL;
 +if (src-nBackingStores  2)
 +return src-backingStore;
 +return ((virStorageSourcePtr *)src-backingStore)[pos];
 +}
 +
 +
 +/**
 + * virStorageSourcePushBackingStore:
 + * @src: virStorageSourcePtr to allocate the new backing store
 + *
 + * Allocate size for a new backingStorePtr in 

[libvirt] [PATCH v2 5/9] virstoragefile: Treat backingStore as a pointer or an array

2015-01-21 Thread Matthias Gatto
As explain in the former patchs, backingStore can be treat an array or
a pointer.
If we have only one backingStore we have to use it as a normal ptr
but if there is more backing store, we use it as a pointer's array.

Because it would be complicated to expend backingStore manually, and do
the convertion from a pointer to an array, I've created the
virStorageSourcePushBackingStore function to help.

This function allocate an array of pointer only if there is more than 1 bs.

Because we can not remove a child from a quorum, i didn't create the function
virStorageSourcePopBackingStore.

I've changed virStorageSourceBackingStoreClear, virStorageSourceSetBackingStore
and virStorageSourceGetBackingStore to handle the case where backingStore
is an array.

Signed-off-by: Matthias Gatto matthias.ga...@outscale.com
---
 src/conf/storage_conf.c   |  7 ++-
 src/libvirt_private.syms  |  1 +
 src/storage/storage_backend_fs.c  |  2 +
 src/storage/storage_backend_logical.c |  2 +-
 src/util/virstoragefile.c | 89 ---
 src/util/virstoragefile.h |  2 +
 6 files changed, 94 insertions(+), 9 deletions(-)

diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index fac85fa..41887eb 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1343,7 +1343,12 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
 if (VIR_ALLOC(backingStorePtr)  0)
 goto error;
 
-backingStorePtr = virStorageSourceSetBackingStore(ret-target, 
backingStorePtr, 0);
+if (!virStorageSourcePushBackingStore(ret-target))
+goto error;
+
+backingStorePtr = virStorageSourceSetBackingStore(ret-target,
+  backingStorePtr,
+  
ret-target.nBackingStores - 1);
 backingStorePtr-path = backingStore;
 backingStore = NULL;
 
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 980235b..5752907 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2033,6 +2033,7 @@ virStorageSourceParseRBDColonString;
 virStorageSourcePoolDefFree;
 virStorageSourcePoolModeTypeFromString;
 virStorageSourcePoolModeTypeToString;
+virStorageSourcePushBackingStore;
 virStorageSourceSetBackingStore;
 virStorageTypeFromString;
 virStorageTypeToString;
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index a3b6688..0d8c5ad 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -112,6 +112,8 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
 
 if (VIR_ALLOC(backingStore)  0)
 goto cleanup;
+if (virStorageSourcePushBackingStore(target) == false)
+goto cleanup;
 virStorageSourceSetBackingStore(target, backingStore, 0);
 backingStore-type = VIR_STORAGE_TYPE_NETWORK;
 backingStore-path = meta-backingStoreRaw;
diff --git a/src/storage/storage_backend_logical.c 
b/src/storage/storage_backend_logical.c
index fcec31f..cd8de85 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -148,7 +148,7 @@ 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 (virStorageSourcePushBackingStore(vol-target) == false)
 goto cleanup;
 
 if (virAsprintf(virStorageSourceGetBackingStore(vol-target, 
0)-path, %s/%s,
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index ba38827..554aa8b 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -1798,21 +1798,88 @@ 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-backingStore || (pos  1  pos = src-nBackingStores))
+return NULL;
+if (src-nBackingStores  2)
+return src-backingStore;
+return ((virStorageSourcePtr *)src-backingStore)[pos];
+}
+
+
+/**
+ * virStorageSourcePushBackingStore:
+ * @src: virStorageSourcePtr to allocate the new backing store
+ *
+ * Allocate size for a new backingStorePtr in src-backingStore
+ * and update src-nBackingStores
+ * If we have less than 2 backing stores, we treat src-backingStore
+ * as a pointer otherwise we treat it as an array of virStorageSourcePtr
+ */
+bool