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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08.12.2014 19:31, 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.gatto@xxxxxxxxxxxx>
---
  src/conf/storage_conf.c               |  3 +-
  src/libvirt_private.syms              |  1 +
  src/storage/storage_backend_fs.c      |  2 +-
  src/storage/storage_backend_logical.c |  2 +-
  src/util/virstoragefile.c             | 87 ++++++++++++++++++++++++++++++++---
  src/util/virstoragefile.h             |  2 +
  6 files changed, 87 insertions(+), 10 deletions(-)


diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index 300c990..edec124 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c

+/**
+ * virStorageSourcePushBackingStore:
+ * @src: virStorageSourcePtr to allocate the new backing store
+ *
+ * Allocate size for a new backing store 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
+virStorageSourcePushBackingStore(virStorageSourcePtr src)
+{
+    virStorageSourcePtr     tmp;
+    virStorageSourcePtr     *tmp2;
+
+    if (src->nBackingStores == 1) {
+/* If we need more than one backing store we need an array
+ * Because we don't want to lose our data from the old Backing Store
+ * we copy the pointer from src->backingStore to src->backingStore[0] */

I'd expect the comments to be indented with the code.

+        tmp = src->backingStore;
+        if (VIR_ALLOC_N(tmp2, 1) < 0)
+            return false;
+        src->backingStore = (virStorageSourcePtr)tmp2;
+        src->nBackingStores += 1;
+        virStorageSourceSetBackingStore(src, tmp, 0);
+    } else if (src->nBackingStores > 1) {
+        tmp2 = ((virStorageSourcePtr *)src->backingStore);
+        if (VIR_EXPAND_N(tmp2, src->nBackingStores, 1) < 0)
+            return false;
+        src->backingStore = (virStorageSourcePtr)tmp2;
+    } else {
+/* Most of the time we use only one backingStore
+ * So we don't need to allocate an array */
+        src->nBackingStores += 1;
+    }
+    return true;
+}
+

Michal

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]