On Thu, Oct 29, 2015 at 14:43:16 +0100, Matthias Gatto wrote:
Allow libvirt to build the quorum string used by quemu.
Add 2 static functions: qemuBuildRAIDStr and
qemuBuildRAIDFileSourceStr.
qemuBuildRAIDStr is made because a quorum can have another quorum
as a child, so we may need to call qemuBuildRAIDStr recursively.
qemuBuildRAIDFileSourceStr was basically made to share
the code use to build the source between qemuBuildRAIDStr and
qemuBuildDriveStr, but there is some difference betwin the syntax
use by libvirt to declare a disk and the one qemu need to build a quorum:
a quorum need a syntaxe like:
"domaine_name.children.X.file.filename=filename"
where libvirt don't use "file.filename=" but directly "file=".
Therfore I use this function only for quorum.
Signed-off-by: Matthias Gatto <matthias.gatto(a)outscale.com>
---
src/qemu/qemu_command.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 93 insertions(+)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 50cf8cc..4ca0011 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3612,6 +3612,93 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk)
return -1;
}
+static bool
The same comment regarding return value as in previous cases.
+qemuBuildRAIDFileSourceStr(virConnectPtr conn,
+ virStorageSourcePtr src,
+ virBuffer *opt,
+ const char *toAppend)
Since 'toAppend' is always pre-pended I'd rather call it prefix.
+{
+ char *source = NULL;
+ int actualType = virStorageSourceGetActualType(src);
+
+ if (qemuGetDriveSourceString(src, conn, &source) < 0)
Are you sure that it will work with remote storage too?
+ return false;
+
+ if (source) {
+ virBufferStrcat(opt, ",", toAppend, "filename=", NULL);
Since you already have 'source' here you can append it right away ...
+
+ if (actualType == VIR_STORAGE_TYPE_DIR) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unsupported disk driver type for
'%s'"),
+ virStorageFileFormatTypeToString(src->format));
This should probably be extracted somewhere else so that there's a
single point where we can check it.
+ return false;
+ }
+ virBufferAdd(opt, source, -1);
... rather than here.
+ }
+
+ return true;
+}
+
+
+static bool
+qemuBuildRAIDStr(virConnectPtr conn,
+ virDomainDiskDefPtr disk,
+ virStorageSourcePtr src,
+ virBuffer *opt,
+ const char *toAppend)
+{
+ char *tmp = NULL;
+ int ret;
+ virStorageSourcePtr backingStore;
+ size_t i;
+
+ if (virStorageSourceGetActualType(src) == VIR_STORAGE_TYPE_QUORUM) {
+ if (!src->threshold) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("threshold missing in the quorum
configuration"));
+ return false;
+ }
+ if (src->nBackingStores < 2) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("a quorum must have at last 2 children"));
+ return false;
+ }
+ if (src->threshold > src->nBackingStores) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("threshold must not exceed the number of
children"));
+ return false;
+ }
+ virBufferAsprintf(opt, ",%svote-threshold=%lu",
+ toAppend, src->threshold);
+ }
+
+ for (i = 0; i < src->nBackingStores; ++i) {
+ backingStore = virStorageSourceGetBackingStore(src, i);
+ ret = virAsprintf(&tmp, "%schildren.%lu.file.", toAppend, i);
So here you create 'tmp' ...
+ if (ret < 0)
+ return false;
+
+ virBufferAsprintf(opt, ",%schildren.%lu.driver=%s",
+ toAppend, i,
+ virStorageFileFormatTypeToString(backingStore->format));
+
+ if (qemuBuildRAIDFileSourceStr(conn, backingStore, opt, tmp) == false)
.. this function reads it ...
+ goto error;
+
+ /* This operation avoid us to made another copy */
+ tmp[ret - sizeof("file")] = '\0';
... so why is this necessary? Also I think it has a off-by-one which is
transparet since the string is containing a trailing dot, and sizeof
returns the size including the 0-byte at the end of the string.
+ if (virStorageSourceIsRAID(backingStore)) {
+ if (!qemuBuildRAIDStr(conn, disk, backingStore, opt, tmp))
+ goto error;
+ }
+ VIR_FREE(tmp);
+ }
+ return true;
+ error:
+ VIR_FREE(tmp);
+ return false;
+}
+
/* Check whether the device address is using either 'ccw' or default s390
* address format and whether that's "legal" for the current qemu and/or
Peter