[PATCH] libxl: fix crash when initializing driver

2020-04-03 Thread Jim Fehlig
Commit 54a401af478 split out DriverConfigInit from DriverConfigNew, but
then called it a bit late from libxlStateInitialize. The cfg is used in
libxlDriverConfigLoadFile and when uninitialized results in a crash.
Calling DriverConfigInit immediately after DriverConfigNew fixes the
crash.

Signed-off-by: Jim Fehlig 
---
 src/libxl/libxl_driver.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 7ec4fcc3d1..980984b199 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -702,14 +702,14 @@ libxlStateInitialize(bool privileged,
 if (!(cfg = libxlDriverConfigNew()))
 goto error;
 
+if (libxlDriverConfigInit(cfg) < 0)
+goto error;
+
 driverConf = g_strdup_printf("%s/libxl.conf", cfg->configBaseDir);
 
 if (libxlDriverConfigLoadFile(cfg, driverConf) < 0)
 goto error;
 
-if (libxlDriverConfigInit(cfg) < 0)
-goto error;
-
 /* Register the callbacks providing access to libvirt's event loop */
 libxl_osevent_register_hooks(cfg->ctx, _osevent_callbacks, cfg->ctx);
 
-- 
2.26.0




[PATCH v5 1/7] sheepdog: Add trivial backing_fmt support

2020-04-03 Thread Eric Blake
Sheepdog already requires that if backing_file is present, that it be
another sheepdog image (see sd_co_create).  Meanwhile, we want to move
towards always being explicit about the backing format for other
drivers where it matters.  So for convenience, make qemu-img create -F
sheepdog work, while rejecting all other explicit formats (note that
this is only for QemuOpts usage; there is no change to the QAPI to
allow a format through -blockdev).

Signed-off-by: Eric Blake 
---
 block/sheepdog.c | 18 --
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/block/sheepdog.c b/block/sheepdog.c
index 59f7ebb1710f..8f558367d2d5 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -2163,13 +2163,21 @@ static int coroutine_fn sd_co_create_opts(BlockDriver 
*drv,
   Error **errp)
 {
 BlockdevCreateOptions *create_options = NULL;
-QDict *qdict, *location_qdict;
+QDict *qdict = NULL, *location_qdict;
 Visitor *v;
-char *redundancy;
+char *redundancy = NULL;
 Error *local_err = NULL;
 int ret;
+char *backing_fmt = NULL;

 redundancy = qemu_opt_get_del(opts, BLOCK_OPT_REDUNDANCY);
+backing_fmt = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FMT);
+
+if (backing_fmt && strcmp(backing_fmt, "sheepdog") != 0) {
+error_setg(errp, "backing_file must be a sheepdog image");
+ret = -EINVAL;
+goto fail;
+}

 qdict = qemu_opts_to_qdict(opts, NULL);
 qdict_put_str(qdict, "driver", "sheepdog");
@@ -2234,6 +2242,7 @@ fail:
 qapi_free_BlockdevCreateOptions(create_options);
 qobject_unref(qdict);
 g_free(redundancy);
+g_free(backing_fmt);
 return ret;
 }

@@ -3191,6 +3200,11 @@ static QemuOptsList sd_create_opts = {
 .type = QEMU_OPT_STRING,
 .help = "File name of a base image"
 },
+{
+.name = BLOCK_OPT_BACKING_FMT,
+.type = QEMU_OPT_STRING,
+.help = "Must be 'sheepdog' if present",
+},
 {
 .name = BLOCK_OPT_PREALLOC,
 .type = QEMU_OPT_STRING,
-- 
2.26.0.rc2



[PATCH v5 6/7] block: Add support to warn on backing file change without format

2020-04-03 Thread Eric Blake
For now, this is a mechanical addition; all callers pass false. But
the next patch will use it to improve 'qemu-img rebase -u' when
selecting a backing file with no format.

Signed-off-by: Eric Blake 
Reviewed-by: Peter Krempa 
Reviewed-by: Ján Tomko 
---
 include/block/block.h |  4 ++--
 block.c   | 13 ++---
 block/qcow2.c |  2 +-
 block/stream.c|  2 +-
 blockdev.c|  3 ++-
 qemu-img.c|  4 ++--
 6 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/include/block/block.h b/include/block/block.h
index b05995fe9c5b..098fc635e865 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -351,8 +351,8 @@ BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts 
*opts,
 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
 void bdrv_refresh_limits(BlockDriverState *bs, Error **errp);
 int bdrv_commit(BlockDriverState *bs);
-int bdrv_change_backing_file(BlockDriverState *bs,
-const char *backing_file, const char *backing_fmt);
+int bdrv_change_backing_file(BlockDriverState *bs, const char *backing_file,
+ const char *backing_fmt, bool warn);
 void bdrv_register(BlockDriver *bdrv);
 int bdrv_drop_intermediate(BlockDriverState *top, BlockDriverState *base,
const char *backing_file_str);
diff --git a/block.c b/block.c
index 2e3905c99e8c..70cc6123dd91 100644
--- a/block.c
+++ b/block.c
@@ -1322,7 +1322,8 @@ static int bdrv_backing_update_filename(BdrvChild *c, 
BlockDriverState *base,
 }

 ret = bdrv_change_backing_file(parent, filename,
-   base->drv ? base->drv->format_name : "");
+   base->drv ? base->drv->format_name : "",
+   false);
 if (ret < 0) {
 error_setg_errno(errp, -ret, "Could not update backing file link");
 }
@@ -4566,8 +4567,8 @@ int bdrv_check(BlockDriverState *bs,
  *image file header
  * -ENOTSUP - format driver doesn't support changing the backing file
  */
-int bdrv_change_backing_file(BlockDriverState *bs,
-const char *backing_file, const char *backing_fmt)
+int bdrv_change_backing_file(BlockDriverState *bs, const char *backing_file,
+ const char *backing_fmt, bool warn)
 {
 BlockDriver *drv = bs->drv;
 int ret;
@@ -4581,6 +4582,12 @@ int bdrv_change_backing_file(BlockDriverState *bs,
 return -EINVAL;
 }

+if (warn && backing_file && !backing_fmt) {
+warn_report("Deprecated use of backing file without explicit "
+"backing format, use of this image requires "
+"potentially unsafe format probing");
+}
+
 if (drv->bdrv_change_backing_file != NULL) {
 ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
 } else {
diff --git a/block/qcow2.c b/block/qcow2.c
index e4b772726010..0a7e70bdf879 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -3526,7 +3526,7 @@ qcow2_co_create(BlockdevCreateOptions *create_options, 
Error **errp)
 }

 ret = bdrv_change_backing_file(blk_bs(blk), qcow2_opts->backing_file,
-   backing_format);
+   backing_format, false);
 if (ret < 0) {
 error_setg_errno(errp, -ret, "Could not assign backing file '%s' "
  "with format '%s'", qcow2_opts->backing_file,
diff --git a/block/stream.c b/block/stream.c
index aa2e7af98e37..310ccbaa4cfd 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -78,7 +78,7 @@ static int stream_prepare(Job *job)
 }
 }
 bdrv_set_backing_hd(bs, base, _err);
-ret = bdrv_change_backing_file(bs, base_id, base_fmt);
+ret = bdrv_change_backing_file(bs, base_id, base_fmt, false);
 if (local_err) {
 error_report_err(local_err);
 return -EPERM;
diff --git a/blockdev.c b/blockdev.c
index fa8630cb412d..5bc9d78563ab 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3692,7 +3692,8 @@ void qmp_change_backing_file(const char *device,
 }

 ret = bdrv_change_backing_file(image_bs, backing_file,
-   image_bs->drv ? image_bs->drv->format_name : 
"");
+   image_bs->drv ? image_bs->drv->format_name 
: "",
+   false);

 if (ret < 0) {
 error_setg_errno(errp, -ret, "Could not change backing file to '%s'",
diff --git a/qemu-img.c b/qemu-img.c
index b167376bd72e..cb8fa5a0ee8b 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3644,9 +3644,9 @@ static int img_rebase(int argc, char **argv)
  * doesn't change when we switch the backing file.
  */
 if (out_baseimg && *out_baseimg) {
-ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);
+ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt, false);
 } else {
-   

[PATCH v5 7/7] qemu-img: Deprecate use of -b without -F

2020-04-03 Thread Eric Blake
Creating an image that requires format probing of the backing image is
inherently unsafe (we've had several CVEs over the years based on
probes leaking information to the guest on a subsequent boot, although
these days tools like libvirt are aware of the issue enough to prevent
the worst effects).  However, if our probing algorithm ever changes,
or if other tools like libvirt determine a different probe result than
we do, then subsequent use of that backing file under a different
format will present corrupted data to the guest.  Start a deprecation
clock so that future qemu-img can refuse to create unsafe backing
chains that would rely on probing.  Most warnings are intentionally
emitted from bdrv_img_create() in the block layer, but qemu-img
convert uses bdrv_create() which cannot emit its own warning without
causing spurious warnings on other code paths.  In the end, all
command-line image creation or backing file rewriting now performs a
check.

However, there is one time where probing is safe: if we probe raw,
then it is safe to record that implicitly in the image (but we still
warn, as it's better to teach the user to supply -F always than to
make them guess when it is safe).

iotest 114 specifically wants to create an unsafe image for later
amendment rather than defaulting to our new default of recording a
probed format, so it needs an update.  While touching it, expand it to
cover all of the various warnings enabled by this patch.  iotest 290
also shows a change to qcow messages; note that the fact that we now
make a probed format of 'raw' explicit now results in a double
warning, but no one should be creating new qcow images so it is not
worth cleaning up.

Signed-off-by: Eric Blake 
---
 docs/system/deprecated.rst | 20 
 block.c| 21 -
 qemu-img.c |  9 -
 tests/qemu-iotests/114 | 12 
 tests/qemu-iotests/114.out |  9 +
 tests/qemu-iotests/290.out |  5 -
 6 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
index aac6be58917a..8abfd436820a 100644
--- a/docs/system/deprecated.rst
+++ b/docs/system/deprecated.rst
@@ -429,6 +429,26 @@ image).  Rather, any changes to the backing chain should 
be performed
 with ``qemu-img rebase -u`` either before or after the remaining
 changes being performed by amend, as appropriate.

+qemu-img backing file without format (since 5.0.0)
+''
+
+The use of ``qemu-img create``, ``qemu-img rebase``, or ``qemu-img
+convert`` to create or modify an image that depends on a backing file
+now recommends that an explicit backing format be provided.  This is
+for safety: if QEMU probes a different format than what you thought,
+the data presented to the guest will be corrupt; similarly, presenting
+a raw image to a guest allows a potential security exploit if a future
+probe sees a non-raw image based on guest writes.
+
+To avoid the warning message, or even future refusal to create an
+unsafe image, you must pass ``-o backing_fmt=`` (or the shorthand
+``-F`` during create) to specify the intended backing format.  You may
+use ``qemu-img rebase -u`` to retroactively add a backing format to an
+existing image.  However, be aware that there are already potential
+security risks to blindly using ``qemu-img info`` to probe the format
+of an untrusted backing image, when deciding what format to add into
+an existing image.
+
 ``qemu-img convert -n -o`` (since 4.2.0)
 

diff --git a/block.c b/block.c
index 70cc6123dd91..61871965eee4 100644
--- a/block.c
+++ b/block.c
@@ -6072,6 +6072,20 @@ void bdrv_img_create(const char *filename, const char 
*fmt,
   "Could not open backing image to determine 
size.\n");
 goto out;
 } else {
+if (!backing_fmt) {
+warn_report("Deprecated use of backing file without explicit "
+"backing format (detected format of %s)",
+bs->drv->format_name);
+if (bs->drv == _raw) {
+/*
+ * A probe of raw is always correct, so in this one
+ * case, we can write that into the image.
+ */
+backing_fmt = bs->drv->format_name;
+qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, backing_fmt,
+ NULL);
+}
+}
 if (size == -1) {
 /* Opened BS, have no size */
 size = bdrv_getlength(bs);
@@ -6085,7 +6099,12 @@ void bdrv_img_create(const char *filename, const char 
*fmt,
 }
 bdrv_unref(bs);
 }
-} /* (backing_file && !(flags & BDRV_O_NO_BACKING)) */
+/* (backing_file && !(flags & BDRV_O_NO_BACKING)) */
+} else if 

[PATCH v5 2/7] vmdk: Add trivial backing_fmt support

2020-04-03 Thread Eric Blake
vmdk already requires that if backing_file is present, that it be
another vmdk image (see vmdk_co_do_create).  Meanwhile, we want to
move towards always being explicit about the backing format for other
drivers where it matters.  So for convenience, make qemu-img create -F
vmdk work, while rejecting all other explicit formats (note that this
is only for QemuOpts usage; there is no change to the QAPI to allow a
format through -blockdev).

Signed-off-by: Eric Blake 
---
 block/vmdk.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/block/vmdk.c b/block/vmdk.c
index 218d9c980059..7ecaf0ee9be3 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -2613,6 +2613,14 @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver 
*drv,
 bool zeroed_grain;
 bool compat6;
 VMDKCreateOptsData data;
+char *backing_fmt = NULL;
+
+backing_fmt = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FMT);
+if (backing_fmt && strcmp(backing_fmt, "vmdk") != 0) {
+error_setg(errp, "backing_file must be a vmdk image");
+ret = -EINVAL;
+goto exit;
+}

 if (filename_decompose(filename, path, prefix, postfix, PATH_MAX, errp)) {
 ret = -EINVAL;
@@ -2671,6 +2679,7 @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver 
*drv,
 vmdk_co_create_opts_cb, , errp);

 exit:
+g_free(backing_fmt);
 g_free(adapter_type);
 g_free(backing_file);
 g_free(hw_version);
@@ -3007,6 +3016,11 @@ static QemuOptsList vmdk_create_opts = {
 .type = QEMU_OPT_STRING,
 .help = "File name of a base image"
 },
+{
+.name = BLOCK_OPT_BACKING_FMT,
+.type = QEMU_OPT_STRING,
+.help = "Must be 'vmdk' if present",
+},
 {
 .name = BLOCK_OPT_COMPAT6,
 .type = QEMU_OPT_BOOL,
-- 
2.26.0.rc2



[PATCH v5 4/7] qcow2: Deprecate use of qemu-img amend to change backing file

2020-04-03 Thread Eric Blake
The use of 'qemu-img amend' to change qcow2 backing files is not
tested very well.  In particular, our implementation has a bug where
if a new backing file is provided without a format, then the prior
format is blindly reused, even if this results in data corruption, but
this is not caught by iotests.

There are also situations where amending other options needs access to
the original backing file (for example, on a downgrade to a v2 image,
knowing whether a v3 zero cluster must be allocated or may be left
unallocated depends on knowing whether the backing file already reads
as zero), but the command line does not have a nice way to tell us
both the backing file to use for opening the image as well as the
backing file to install after the operation is complete.

Even if we do allow changing the backing file, it is redundant with
the existing ability to change backing files via 'qemu-img rebase -u'.
It is time to deprecate this support (leaving the existing behavior
intact, even if it is buggy), and at a point in the future, require
the use of only 'qemu-img rebase' for adjusting backing chain
relations, saving 'qemu-img amend' for changes unrelated to the
backing chain.

Signed-off-by: Eric Blake 
---
 docs/system/deprecated.rst | 12 
 docs/tools/qemu-img.rst|  4 
 block/qcow2.c  |  5 +
 tests/qemu-iotests/061.out |  1 +
 tests/qemu-iotests/082.out |  2 ++
 5 files changed, 24 insertions(+)

diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
index c633fe2beffd..aac6be58917a 100644
--- a/docs/system/deprecated.rst
+++ b/docs/system/deprecated.rst
@@ -417,6 +417,18 @@ The above, converted to the current supported format::
 Related binaries
 

+qemu-img amend to adjust backing file (since 5.0.0)
+'''
+
+The use of ``qemu-img amend`` to modify the name or format of a qcow2
+backing image is deprecated; this functionality was never fully
+documented or tested, and interferes with other amend operations that
+need access to the original backing image (such as deciding whether a
+v3 zero cluster may be left unallocated when converting to a v2
+image).  Rather, any changes to the backing chain should be performed
+with ``qemu-img rebase -u`` either before or after the remaining
+changes being performed by amend, as appropriate.
+
 ``qemu-img convert -n -o`` (since 4.2.0)
 

diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
index 0080f83a76c9..83d57586be96 100644
--- a/docs/tools/qemu-img.rst
+++ b/docs/tools/qemu-img.rst
@@ -254,6 +254,10 @@ Command description:
   Amends the image format specific *OPTIONS* for the image file
   *FILENAME*. Not all file formats support this operation.

+  The set of options that can be amended are dependent on the image
+  format, but note that amending the backing chain relationship should
+  instead be performed with ``qemu-img rebase``.
+
 .. option:: bench [-c COUNT] [-d DEPTH] [-f FMT] 
[--flush-interval=FLUSH_INTERVAL] [-i AIO] [-n] [--no-drain] [-o OFFSET] 
[--pattern=PATTERN] [-q] [-s BUFFER_SIZE] [-S STEP_SIZE] [-t CACHE] [-w] [-U] 
FILENAME

   Run a simple sequential I/O benchmark on the specified image. If ``-w`` is
diff --git a/block/qcow2.c b/block/qcow2.c
index 2bb536b01494..e4b772726010 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -5303,6 +5303,11 @@ static int qcow2_amend_options(BlockDriverState *bs, 
QemuOpts *opts,
 }

 if (backing_file || backing_format) {
+if (g_strcmp0(backing_file, s->image_backing_file) ||
+g_strcmp0(backing_format, s->image_backing_format)) {
+warn_report("Deprecated use of amend to alter the backing file; "
+"use qemu-img rebase instead");
+}
 ret = qcow2_change_backing_file(bs,
 backing_file ?: s->image_backing_file,
 backing_format ?: s->image_backing_format);
diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
index 413cc4e0f4ab..048248c121cb 100644
--- a/tests/qemu-iotests/061.out
+++ b/tests/qemu-iotests/061.out
@@ -342,6 +342,7 @@ wrote 131072/131072 bytes at offset 0
 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 read 131072/131072 bytes at offset 0
 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+qemu-img: warning: Deprecated use of amend to alter the backing file; use 
qemu-img rebase instead
 read 131072/131072 bytes at offset 0
 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 No errors were found on the image.
diff --git a/tests/qemu-iotests/082.out b/tests/qemu-iotests/082.out
index 9d4ed4dc9d61..94ea990a2754 100644
--- a/tests/qemu-iotests/082.out
+++ b/tests/qemu-iotests/082.out
@@ -806,10 +806,12 @@ Creation options for 'qcow2':
 Note that not all of these options may be amendable.

 Testing: amend -f qcow2 -o backing_file=TEST_DIR/t.qcow2,,help TEST_DIR/t.qcow2
+qemu-img: warning: 

[PATCH v5 3/7] qcow: Tolerate backing_fmt=, but warn on backing_fmt=raw

2020-04-03 Thread Eric Blake
qcow has no space in the metadata to store a backing format, and there
are existing qcow images backed both by raw or by other formats
(usually qcow) images, reliant on probing to tell the difference.
While we don't recommend the creation of new qcow images (as qcow2 is
hands-down better), we can at least insist that if the user does
request a specific format without using -u, then it must be non-raw
(as a raw backing file that gets inadvertently edited into some other
format can form a security hole); if the user does not request a
specific format or lies when using -u, then the status quo of probing
for the backing format remains intact (although an upcoming patch will
warn when omitting a format request).  Thus, when this series is
complete, the only way to use a backing file for qcow without
triggering a warning is when using -F if the backing file is non-raw
to begin with.  Note that this is only for QemuOpts usage; there is no
change to the QAPI to allow a format through -blockdev.

Add a new iotest 290 just for qcow, to demonstrate the new warning.

Signed-off-by: Eric Blake 
---
 block/qcow.c   | 16 -
 tests/qemu-iotests/290 | 72 ++
 tests/qemu-iotests/290.out | 42 ++
 tests/qemu-iotests/group   |  1 +
 4 files changed, 130 insertions(+), 1 deletion(-)
 create mode 100755 tests/qemu-iotests/290
 create mode 100644 tests/qemu-iotests/290.out

diff --git a/block/qcow.c b/block/qcow.c
index 8973e4e565a1..bbe48b7db4d7 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -940,11 +940,12 @@ static int coroutine_fn qcow_co_create_opts(BlockDriver 
*drv,
 {
 BlockdevCreateOptions *create_options = NULL;
 BlockDriverState *bs = NULL;
-QDict *qdict;
+QDict *qdict = NULL;
 Visitor *v;
 const char *val;
 Error *local_err = NULL;
 int ret;
+char *backing_fmt;

 static const QDictRenames opt_renames[] = {
 { BLOCK_OPT_BACKING_FILE,   "backing-file" },
@@ -953,6 +954,13 @@ static int coroutine_fn qcow_co_create_opts(BlockDriver 
*drv,
 };

 /* Parse options and convert legacy syntax */
+backing_fmt = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FMT);
+if (backing_fmt && !strcmp(backing_fmt, "raw")) {
+error_setg(errp, "qcow cannot store backing format; an explicit "
+   "backing format of raw is unsafe");
+ret = -EINVAL;
+goto fail;
+}
 qdict = qemu_opts_to_qdict_filtered(opts, NULL, _create_opts, true);

 val = qdict_get_try_str(qdict, BLOCK_OPT_ENCRYPT);
@@ -1018,6 +1026,7 @@ static int coroutine_fn qcow_co_create_opts(BlockDriver 
*drv,

 ret = 0;
 fail:
+g_free(backing_fmt);
 qobject_unref(qdict);
 bdrv_unref(bs);
 qapi_free_BlockdevCreateOptions(create_options);
@@ -1152,6 +1161,11 @@ static QemuOptsList qcow_create_opts = {
 .type = QEMU_OPT_STRING,
 .help = "File name of a base image"
 },
+{
+.name = BLOCK_OPT_BACKING_FMT,
+.type = QEMU_OPT_STRING,
+.help = "Format of the backing image (caution: raw backing is 
unsafe)",
+},
 {
 .name = BLOCK_OPT_ENCRYPT,
 .type = QEMU_OPT_BOOL,
diff --git a/tests/qemu-iotests/290 b/tests/qemu-iotests/290
new file mode 100755
index ..8482de58cb4b
--- /dev/null
+++ b/tests/qemu-iotests/290
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+#
+# Test qcow backing file warnings
+#
+# Copyright (C) 2020 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see .
+#
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+status=1   # failure is the default!
+
+_cleanup()
+{
+   _cleanup_test_img
+}
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+_supported_fmt qcow
+_supported_proto file
+_supported_os Linux
+
+size=128M
+
+echo
+echo "== qcow backed by qcow =="
+
+TEST_IMG="$TEST_IMG.base" _make_test_img $size
+_make_test_img -b "$TEST_IMG.base"
+_img_info
+_make_test_img -b "$TEST_IMG.base" -F $IMGFMT
+_img_info
+
+echo
+echo "== mismatched command line detection =="
+
+_make_test_img -b "$TEST_IMG.base" -F vmdk
+# Use of -u bypasses the backing format sanity check
+_make_test_img -u -b "$TEST_IMG.base" -F vmdk $size
+_img_info
+
+echo
+echo "== qcow backed by raw =="
+

[PATCH v5 for-5.0? 0/7] Tighten qemu-img rules on missing backing format

2020-04-03 Thread Eric Blake
v4 was here:
https://lists.gnu.org/archive/html/qemu-devel/2020-03/msg03775.html
In v5:
- fix 'qemu-img convert -B' to actually warn [Kashyap]
- squash in followups
- a couple more iotest improvements

If we decide this is not 5.0 material, then patches 4 and 7 need a
tweak to s/5.0/5.1/ as the start of the deprecation clock.

Eric Blake (7):
  sheepdog: Add trivial backing_fmt support
  vmdk: Add trivial backing_fmt support
  qcow: Tolerate backing_fmt=, but warn on backing_fmt=raw
  qcow2: Deprecate use of qemu-img amend to change backing file
  iotests: Specify explicit backing format where sensible
  block: Add support to warn on backing file change without format
  qemu-img: Deprecate use of -b without -F

 docs/system/deprecated.rst| 32 
 docs/tools/qemu-img.rst   |  4 ++
 include/block/block.h |  4 +-
 block.c   | 34 +++--
 block/qcow.c  | 16 +++-
 block/qcow2.c |  7 +++-
 block/sheepdog.c  | 18 -
 block/stream.c|  2 +-
 block/vmdk.c  | 14 +++
 blockdev.c|  3 +-
 qemu-img.c| 11 +-
 tests/qemu-iotests/017|  2 +-
 tests/qemu-iotests/017.out|  2 +-
 tests/qemu-iotests/018|  2 +-
 tests/qemu-iotests/018.out|  2 +-
 tests/qemu-iotests/019|  5 ++-
 tests/qemu-iotests/019.out|  2 +-
 tests/qemu-iotests/020|  4 +-
 tests/qemu-iotests/020.out|  4 +-
 tests/qemu-iotests/024|  8 ++--
 tests/qemu-iotests/024.out|  5 ++-
 tests/qemu-iotests/028|  4 +-
 tests/qemu-iotests/028.out|  2 +-
 tests/qemu-iotests/030| 26 +
 tests/qemu-iotests/034|  2 +-
 tests/qemu-iotests/034.out|  2 +-
 tests/qemu-iotests/037|  2 +-
 tests/qemu-iotests/037.out|  2 +-
 tests/qemu-iotests/038|  2 +-
 tests/qemu-iotests/038.out|  2 +-
 tests/qemu-iotests/039|  3 +-
 tests/qemu-iotests/039.out|  2 +-
 tests/qemu-iotests/040| 47 ---
 tests/qemu-iotests/041| 37 --
 tests/qemu-iotests/042|  4 +-
 tests/qemu-iotests/043| 18 -
 tests/qemu-iotests/043.out| 16 +---
 tests/qemu-iotests/046|  2 +-
 tests/qemu-iotests/046.out|  2 +-
 tests/qemu-iotests/050|  4 +-
 tests/qemu-iotests/050.out|  2 +-
 tests/qemu-iotests/051|  2 +-
 tests/qemu-iotests/051.out|  2 +-
 tests/qemu-iotests/051.pc.out |  2 +-
 tests/qemu-iotests/056|  3 +-
 tests/qemu-iotests/060|  2 +-
 tests/qemu-iotests/060.out|  2 +-
 tests/qemu-iotests/061| 10 ++---
 tests/qemu-iotests/061.out| 11 +++---
 tests/qemu-iotests/069|  2 +-
 tests/qemu-iotests/069.out|  2 +-
 tests/qemu-iotests/073|  2 +-
 tests/qemu-iotests/073.out|  2 +-
 tests/qemu-iotests/082| 10 +++--
 tests/qemu-iotests/082.out| 14 ---
 tests/qemu-iotests/085|  4 +-
 tests/qemu-iotests/085.out|  6 +--
 tests/qemu-iotests/089|  2 +-
 tests/qemu-iotests/089.out|  2 +-
 tests/qemu-iotests/095|  4 +-
 tests/qemu-iotests/095.out|  4 +-
 tests/qemu-iotests/097|  4 +-
 tests/qemu-iotests/097.out| 16 
 tests/qemu-iotests/098|  2 +-
 tests/qemu-iotests/098.out|  8 ++--
 tests/qemu-iotests/110|  4 +-
 tests/qemu-iotests/110.out|  4 +-
 tests/qemu-iotests/114| 12 ++
 tests/qemu-iotests/114.out|  9 +
 tests/qemu-iotests/122| 27 +++--
 tests/qemu-iotests/122.out|  8 ++--
 tests/qemu-iotests/126|  4 +-
 tests/qemu-iotests/126.out|  4 +-
 tests/qemu-iotests/127|  4 +-
 tests/qemu-iotests/127.out|  4 +-
 tests/qemu-iotests/129|  3 +-
 tests/qemu-iotests/133|  2 +-
 tests/qemu-iotests/133.out|  2 +-
 tests/qemu-iotests/139|  2 +-
 tests/qemu-iotests/141|  4 +-
 tests/qemu-iotests/141.out|  4 +-
 tests/qemu-iotests/142|  2 +-
 tests/qemu-iotests/142.out|  2 +-
 tests/qemu-iotests/153| 14 +++
 tests/qemu-iotests/153.out| 35 +
 tests/qemu-iotests/154| 42 ++--
 tests/qemu-iotests/154.out| 42 ++--
 tests/qemu-iotests/155| 12 --
 tests/qemu-iotests/156|  9 +++--
 tests/qemu-iotests/156.out|  6 +--
 tests/qemu-iotests/158|  2 +-
 tests/qemu-iotests/158.out|  2 +-
 tests/qemu-iotests/161|  8 ++--
 tests/qemu-iotests/161.out|  8 ++--
 tests/qemu-iotests/176|  4 +-
 tests/qemu-iotests/176.out| 32 
 tests/qemu-iotests/177|  2 +-
 tests/qemu-iotests/177.out|  2 +-
 tests/qemu-iotests/179|  2 +-
 tests/qemu-iotests/179.out|  2 +-
 tests/qemu-iotests/189|  2 +-
 tests/qemu-iotests/189.out|  2 +-
 tests/qemu-iotests/191| 12 +++---
 

Re: [libvirt PATCH] github: enable lockdown of issues and merge requests

2020-04-03 Thread Ján Tomko

On a Friday in 2020, Andrea Bolognani wrote:

On Fri, 2020-04-03 at 11:38 +0100, Daniel P. Berrangé wrote:

+++ b/.github/lockdown.yml
@@ -0,0 +1,36 @@
+pulls:
+  comment: |
+Thank you for your interest in the libvirt project.
+
+Since this repository is a read-only mirror of the project's
 master repostory hosted on GitLab, merge requests opened here
 are not processed.


Maybe s/merge/pull/ here? Since we're adding a comment on GitHub and
targeting GitHub users when doing so, it might be more appropriate to
use the GitHub term.

Everything else looks good, but there's the obvious caveat that we
can't merge the commit as-is until we have actually moved to GitLab.

Since that could take a while, and locking down the GitHub
repositories is already a good idea, maybe point people to

 https://libvirt.org/hacking.html

in the meantime?



As danpb mentions in the cover letter, CONTRIBUTING.md should be easily
discoverable on GitLab. We [0] should somehow put the brief instructions
there (like README-hacking) and not scare drive-by contributors with
the giant hacking.html.

OTOH, I'm not sure how well 'I fixed these coding styles issues and
pushed the patch' translates to the merge request review.

Jano

[0] it's on my TODO list (TM)


--
Andrea Bolognani / Red Hat / Virtualization



signature.asc
Description: PGP signature


Re: [libvirt PATCH] github: enable lockdown of issues and merge requests

2020-04-03 Thread Andrea Bolognani
On Fri, 2020-04-03 at 11:38 +0100, Daniel P. Berrangé wrote:
> +++ b/.github/lockdown.yml
> @@ -0,0 +1,36 @@
> +pulls:
> +  comment: |
> +Thank you for your interest in the libvirt project.
> +
> +Since this repository is a read-only mirror of the project's
>  master repostory hosted on GitLab, merge requests opened here
>  are not processed.

Maybe s/merge/pull/ here? Since we're adding a comment on GitHub and
targeting GitHub users when doing so, it might be more appropriate to
use the GitHub term.

Everything else looks good, but there's the obvious caveat that we
can't merge the commit as-is until we have actually moved to GitLab.

Since that could take a while, and locking down the GitHub
repositories is already a good idea, maybe point people to

  https://libvirt.org/hacking.html

in the meantime?

-- 
Andrea Bolognani / Red Hat / Virtualization



Re: [PATCH 01/36] util: virresctrl: convert classes to GObject

2020-04-03 Thread Daniel P . Berrangé
On Fri, Apr 03, 2020 at 07:02:17PM +0200, Rafael Fonseca wrote:
> On Fri, Apr 3, 2020 at 5:51 PM Rafael Fonseca  wrote:
> >
> > Anyway I'll replace them by g_clear_object. Tks.
> 
> Is it ok if I wait to collect more feedback before sending a v2 with
> 's/if (...) g_object_unref/g_clear_object/'?

Yes, that's fine.

Regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|



Re: [PATCH 01/36] util: virresctrl: convert classes to GObject

2020-04-03 Thread Rafael Fonseca
On Fri, Apr 3, 2020 at 5:51 PM Rafael Fonseca  wrote:
>
> Anyway I'll replace them by g_clear_object. Tks.

Is it ok if I wait to collect more feedback before sending a v2 with
's/if (...) g_object_unref/g_clear_object/'?


Att.
-- 
Rafael Fonseca




Re: [PATCH v3 0/3] add support for QEMU 9pfs 'multidevs' option

2020-04-03 Thread Christian Schoenebeck
On Freitag, 3. April 2020 18:27:28 CEST you wrote:
> On a Friday in 2020, Christian Schoenebeck wrote:
> >On Montag, 30. März 2020 20:27:00 CEST Christian Schoenebeck wrote:
> >> v2->v3:
> >>   * Rebased to master (SHA-1 e4bf03b8ff).
> >>   
> >>   * Auto sense QEMU capability for command line option fsdev.multidevs
> >>   
> >> instead of checking for QEMU version 4.2. [patch 1]
> >>   
> >>   * Auto regenerated capabilities data for all archs (fixes capability
> >>   
> >> test). [patch 1]
> >>   
> >>   * Added XML test. [patch 2]
> >>   
> >>   * Added argv test. [patch 3]
> >> 
> >> Message-ID of v2: cover.1584723662.git.qemu_...@crudebyte.com
> >> 
> >> Christian Schoenebeck (3):
> >>   qemu: capabilities: add QEMU_CAPS_VIRTFS_MULTIDEVS
> >>   conf: add 'multidevs' option
> >>   qemu: add support for 'multidevs' option
> >>  
> >>  docs/formatdomain.html.in | 40 -
> >>  docs/schemas/domaincommon.rng | 10 
> >>  src/conf/domain_conf.c| 29 ++
> >>  src/conf/domain_conf.h| 13 +
> >>  src/qemu/qemu_capabilities.c  |  2 +
> >>  src/qemu/qemu_capabilities.h  |  1 +
> >>  src/qemu/qemu_command.c   |  7 +++
> >>  src/qemu/qemu_domain.c| 12 
> >>  .../caps_4.2.0.aarch64.xml|  1 +
> >>  .../qemucapabilitiesdata/caps_4.2.0.s390x.xml |  1 +
> >>  .../caps_4.2.0.x86_64.xml |  1 +
> >>  .../caps_5.0.0.aarch64.xml|  1 +
> >>  .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml |  1 +
> >>  .../caps_5.0.0.x86_64.xml |  1 +
> >>  .../virtio-9p-multidevs.x86_64-latest.args| 45 +++
> >>  .../qemuxml2argvdata/virtio-9p-multidevs.xml  | 53 ++
> >>  tests/qemuxml2argvtest.c  |  2 +
> >>  .../virtio-9p-multidevs.x86_64-latest.xml | 56 +++
> >>  tests/qemuxml2xmltest.c   |  2 +
> >>  19 files changed, 277 insertions(+), 1 deletion(-)
> >>  create mode 100644
> >> 
> >> tests/qemuxml2argvdata/virtio-9p-multidevs.x86_64-latest.args create mode
> >> 100644 tests/qemuxml2argvdata/virtio-9p-multidevs.xml create mode 100644
> >> tests/qemuxml2xmloutdata/virtio-9p-multidevs.x86_64-latest.xml
> >
> >Never mind about this version; it would no longer merge against master. :/
> >
> >I'll post a v4 with merge conflicts being resolved.
> 
> No need to do that, I already have it applied and rebased

Yeeehaaa! Thanks Ján, I appreciate it! :)

Best regards,
Christian Schoenebeck





Re: [PATCH v3 0/3] add support for QEMU 9pfs 'multidevs' option

2020-04-03 Thread Christian Schoenebeck
On Montag, 30. März 2020 20:27:00 CEST Christian Schoenebeck wrote:
> v2->v3:
> 
>   * Rebased to master (SHA-1 e4bf03b8ff).
> 
>   * Auto sense QEMU capability for command line option fsdev.multidevs
> instead of checking for QEMU version 4.2. [patch 1]
> 
>   * Auto regenerated capabilities data for all archs (fixes capability
> test). [patch 1]
> 
>   * Added XML test. [patch 2]
> 
>   * Added argv test. [patch 3]
> 
> Message-ID of v2: cover.1584723662.git.qemu_...@crudebyte.com
> 
> Christian Schoenebeck (3):
>   qemu: capabilities: add QEMU_CAPS_VIRTFS_MULTIDEVS
>   conf: add 'multidevs' option
>   qemu: add support for 'multidevs' option
> 
>  docs/formatdomain.html.in | 40 -
>  docs/schemas/domaincommon.rng | 10 
>  src/conf/domain_conf.c| 29 ++
>  src/conf/domain_conf.h| 13 +
>  src/qemu/qemu_capabilities.c  |  2 +
>  src/qemu/qemu_capabilities.h  |  1 +
>  src/qemu/qemu_command.c   |  7 +++
>  src/qemu/qemu_domain.c| 12 
>  .../caps_4.2.0.aarch64.xml|  1 +
>  .../qemucapabilitiesdata/caps_4.2.0.s390x.xml |  1 +
>  .../caps_4.2.0.x86_64.xml |  1 +
>  .../caps_5.0.0.aarch64.xml|  1 +
>  .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml |  1 +
>  .../caps_5.0.0.x86_64.xml |  1 +
>  .../virtio-9p-multidevs.x86_64-latest.args| 45 +++
>  .../qemuxml2argvdata/virtio-9p-multidevs.xml  | 53 ++
>  tests/qemuxml2argvtest.c  |  2 +
>  .../virtio-9p-multidevs.x86_64-latest.xml | 56 +++
>  tests/qemuxml2xmltest.c   |  2 +
>  19 files changed, 277 insertions(+), 1 deletion(-)
>  create mode 100644
> tests/qemuxml2argvdata/virtio-9p-multidevs.x86_64-latest.args create mode
> 100644 tests/qemuxml2argvdata/virtio-9p-multidevs.xml create mode 100644
> tests/qemuxml2xmloutdata/virtio-9p-multidevs.x86_64-latest.xml

Never mind about this version; it would no longer merge against master. :/

I'll post a v4 with merge conflicts being resolved.

Best regards,
Christian Schoenebeck





Re: [PATCH v3 0/3] add support for QEMU 9pfs 'multidevs' option

2020-04-03 Thread Ján Tomko

On a Friday in 2020, Christian Schoenebeck wrote:

On Montag, 30. März 2020 20:27:00 CEST Christian Schoenebeck wrote:

v2->v3:

  * Rebased to master (SHA-1 e4bf03b8ff).

  * Auto sense QEMU capability for command line option fsdev.multidevs
instead of checking for QEMU version 4.2. [patch 1]

  * Auto regenerated capabilities data for all archs (fixes capability
test). [patch 1]

  * Added XML test. [patch 2]

  * Added argv test. [patch 3]

Message-ID of v2: cover.1584723662.git.qemu_...@crudebyte.com

Christian Schoenebeck (3):
  qemu: capabilities: add QEMU_CAPS_VIRTFS_MULTIDEVS
  conf: add 'multidevs' option
  qemu: add support for 'multidevs' option

 docs/formatdomain.html.in | 40 -
 docs/schemas/domaincommon.rng | 10 
 src/conf/domain_conf.c| 29 ++
 src/conf/domain_conf.h| 13 +
 src/qemu/qemu_capabilities.c  |  2 +
 src/qemu/qemu_capabilities.h  |  1 +
 src/qemu/qemu_command.c   |  7 +++
 src/qemu/qemu_domain.c| 12 
 .../caps_4.2.0.aarch64.xml|  1 +
 .../qemucapabilitiesdata/caps_4.2.0.s390x.xml |  1 +
 .../caps_4.2.0.x86_64.xml |  1 +
 .../caps_5.0.0.aarch64.xml|  1 +
 .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml |  1 +
 .../caps_5.0.0.x86_64.xml |  1 +
 .../virtio-9p-multidevs.x86_64-latest.args| 45 +++
 .../qemuxml2argvdata/virtio-9p-multidevs.xml  | 53 ++
 tests/qemuxml2argvtest.c  |  2 +
 .../virtio-9p-multidevs.x86_64-latest.xml | 56 +++
 tests/qemuxml2xmltest.c   |  2 +
 19 files changed, 277 insertions(+), 1 deletion(-)
 create mode 100644
tests/qemuxml2argvdata/virtio-9p-multidevs.x86_64-latest.args create mode
100644 tests/qemuxml2argvdata/virtio-9p-multidevs.xml create mode 100644
tests/qemuxml2xmloutdata/virtio-9p-multidevs.x86_64-latest.xml


Never mind about this version; it would no longer merge against master. :/

I'll post a v4 with merge conflicts being resolved.



No need to do that, I already have it applied and rebased

Jano


Best regards,
Christian Schoenebeck





signature.asc
Description: PGP signature


Re: [libvirt-jenkins-ci PATCH 2/5] guests: templates: Introduce a gitlab-runner RC init service template

2020-04-03 Thread Andrea Bolognani
Looks like I somehow sent an empty reply by mistake the first time
around. Let's try again...

On Fri, 2020-04-03 at 16:04 +0200, Erik Skultety wrote:
> On Fri, Apr 03, 2020 at 03:50:21PM +0200, Andrea Bolognani wrote:
> > I have tested this, though not extensively, on Linux and adding
> > User=gitlab to the service file seems to be basically all that's
> 
> Did ^this actually work? I recall having some issues on Linux when I used the
> User= directive and I could not get the agent pull a job from the server,

It would seem that way:

  https://gitlab.com/abologna/libvirt/pipelines/132661098

Pay no attention to the failures in the second round of jobs, the
Docker daemon seems to be having some trouble getting in touch with
quay.io right now. It managed to pull the two images necessary for
the prebuild jobs before that, however.

Of course for that to work I had to add the gitlab user to the
docker group, which is another potential attack venue... The
alternative is running everything as root, however, so it would still
seem preferable to that. Hopefully at some point gitlab-runner will
grow a Podman executor :)

-- 
Andrea Bolognani / Red Hat / Virtualization



Re: [PATCH] cpu.c: Use g_autoptr and g_autofree in virCPUDataParse

2020-04-03 Thread Ján Tomko

cpu: Use g_autoptr and g_autofree in virCPUDataParse

The first part says which driver/area the patch touches,
no need to put an extension there.

On a Friday in 2020, Seeteena Thoufeek wrote:

Signed-off-by: Seeteena Thoufeek 
---
src/cpu/cpu.c | 18 +++---
1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index 631c755..e556ffe 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -772,40 +772,36 @@ virCPUDataPtr
virCPUDataParse(const char *xmlStr)
{
struct cpuArchDriver *driver;
-xmlDocPtr xml = NULL;
-xmlXPathContextPtr ctxt = NULL;
+g_autoptr(xmlDoc) xml = NULL;
+g_autoptr(xmlXPathContext) ctxt = NULL;
virCPUDataPtr data = NULL;
-char *arch = NULL;
+g_autofree char *arch = NULL;

VIR_DEBUG("xmlStr=%s", xmlStr);

if (!(xml = virXMLParseStringCtxt(xmlStr, _("CPU data"), ))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
   _("cannot parse CPU data"));
-goto cleanup;
+return data;


The point of these refactors is to make the flow of the function easier to
read, so this (and all the other cases except the successful one at the
end) should return NULL;

Jano



}

if (!(arch = virXPathString("string(/cpudata/@arch)", ctxt))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
   _("missing CPU data architecture"));
-goto cleanup;
+return data;
}

if (!(driver = cpuGetSubDriverByName(arch)))
-goto cleanup;
+return data;

if (!driver->dataParse) {
virReportError(VIR_ERR_NO_SUPPORT,
   _("cannot parse %s CPU data"), arch);
-goto cleanup;
+return data;
}

data = driver->dataParse(ctxt);

- cleanup:
-xmlXPathFreeContext(ctxt);
-xmlFreeDoc(xml);
-VIR_FREE(arch);
return data;
}

--
1.8.3.1




signature.asc
Description: PGP signature


Re: [PATCH 00/36] convert virObjects to GObject

2020-04-03 Thread Daniel P . Berrangé
On Fri, Apr 03, 2020 at 05:15:28PM +0200, Rafael Fonseca wrote:
> This patch series convert various simple instances of virObject to a
> GObject equivalent.
> 
> virDomain is still WIP because it causes some linking problem I am still
> investigating.
> 
> virObjects that work as parent class to other objects will be covered in
> a next patchset.

virConnectPtr is the one I don't know how we'll solve.

virConnectClose requires us to return 0 if the last reference
was released, 1 otherwise.  g_object_unref  returns void  :-(

I've tried to think about ways to detect the removal of the
last reference, but can't figure out a nice solution thus far...



Regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|



Re: [libvirt-jenkins-ci PATCH 2/5] guests: templates: Introduce a gitlab-runner RC init service template

2020-04-03 Thread Andrea Bolognani
On Fri, 2020-04-03 at 16:04 +0200, Erik Skultety wrote:
> On Fri, Apr 03, 2020 at 03:50:21PM +0200, Andrea Bolognani wrote:
> > On Fri, 2020-04-03 at 09:21 +0200, Erik Skultety wrote:
> > > On Tue, Mar 31, 2020 at 04:42:10PM +0200, Andrea Bolognani wrote:
> > > > On Thu, 2020-03-26 at 14:33 +0100, Erik Skultety wrote:
> > > > > +gitlab_runner_start()
> > > > > +{
> > > > > +export USER=${user}
> > > > > +export HOME=${user_home}
> > > > > +export PATH=${PATH}:/usr/local/bin/:/usr/local/sbin/
> > > > > +if checkyesno ${rcvar}; then
> > > > > +cd ${user_home}
> > > > > +/usr/sbin/daemon -p ${pidfile} ${command} ${command_args} > 
> > > > > /var/log/gitlab-runner.log 2>&1
> > > > 
> > > > The version in the official documentation does this a little
> > > > differently... I guess the difference is that in their case the
> > > > gitlab-runner application is running as the gitlab user, wereas in
> > > > ours the daemon is running as root but is instructed to execute
> > > > workloads as the gitlab user. The latter seems fine, as that's what
> > > > happens on Linux as well, but have you fully considered the security
> > > > implications?
> > > 
> > > It is different because I wanted a unified behaviour on Linux and FreeBSD.
> > > What security implications are you talking about, can you be more 
> > > specific? The
> > > machines are going to run behind a NAT, the daemon executing the service 
> > > should
> > > be trusted by default (otherwise, engage the tin foil hat mode), the 
> > > gitlab
> > > user doesn't have sudo permissions (and we should not trust this user), 
> > > and in
> > > later patches I setup a random root password, so that only access via an 
> > > SSH
> > > pub key to the root account is allowed. Alternatively, we could set up 
> > > another
> > > service user which will have sudo (not passwordless) access and will not 
> > > run
> > > any services, so that root isn't accessible over the network, would 
> > > consider
> > > that as suitable precaution measures?
> > 
> > I trust gitlab-runner in the sense that I don't expect it to contain
> > intentional backdoor, but not necessarily in the sense that I expect
> > it to be entirely bug-free and impossible for an attacker to abuse as
> > a compromise vector. With that in mind, running it as an unprivileged
> > user right off the bat is obviously strictly safer than running it as
> > root and delegating the privilege dropping part to it.
> > 
> > Having the same behavior for both Linux and FreeBSD is certainly
> > something that we should strive for, but can we make that behavior
> > the safest one of the two?
> > 
> > I have tested this, though not extensively, on Linux and adding
> > User=gitlab to the service file seems to be basically all that's
> 
> Did ^this actually work? I recall having some issues on Linux when I used the
> User= directive and I could not get the agent pull a job from the server,
> however I used it in combination with WorkingDir (or what the proper name is)
> so it may have also been that one, but I definitely tried what you describe 
> and
> didn't work for me, hence the patch looks like the way it does, but now I have
> to go verify your claim and if indeed it works then we can go with what you
> suggest for sure. I admit that I was playing with a handful of different 
> runner
> setups, both containerized and direct executions, so a tiny mistake may have
> slipped in despite the fact I was restoring the VM state from a snapshot.
> 
> > needed to make it work; for FreeBSD this setup is the one described
> > in the official documentation, so I'm going to assume it's not going
> > to cause any issues either.
> > 
> > If we find that running gitlab-runner as an unprivileged user gets
> > in the way we can certainly go back on this decision, but I would
> > like to try and see if we can get the safest option to work first.
> 
> Let me try again and I'll get back to you.
> 
> --
> Erik Skultety
-- 
Andrea Bolognani / Red Hat / Virtualization



[PATCH 1/3] selinux: Don't remember label for restore path

2020-04-03 Thread Michal Privoznik
The seclabel for @stdin_path in virSecuritySELinuxSetAllLabel()
is not restored, because at virSecuritySELinuxRestoreAllLabel()
phase it's too late and the caller (QEMU driver) simply doesn't
care. Well, don't remember the label and let the perms leak.

Signed-off-by: Michal Privoznik 
---
 src/security/security_selinux.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 8aeb6e45a5..f47bfbdba9 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -3233,7 +3233,7 @@ virSecuritySELinuxSetAllLabel(virSecurityManagerPtr mgr,
 
 if (stdin_path &&
 virSecuritySELinuxSetFilecon(mgr, stdin_path,
- data->content_context, true) < 0)
+ data->content_context, false) < 0)
 return -1;
 
 return 0;
-- 
2.24.1



[PATCH 0/3] qemu: Fix restoring a domain from a block device

2020-04-03 Thread Michal Privoznik
*** BLURB HERE ***

Michal Prívozník (3):
  selinux: Don't remember label for restore path
  security: Introduce virSecurityManagerDomainSetIncomingPathLabel
  qemu: Label restore path outside of secdriver transactions

 src/libvirt_private.syms|  1 +
 src/qemu/qemu_security.c|  7 +++
 src/security/security_driver.h  |  4 
 src/security/security_manager.c | 29 +
 src/security/security_manager.h |  4 
 src/security/security_selinux.c | 23 +--
 src/security/security_stack.c   | 21 +
 7 files changed, 83 insertions(+), 6 deletions(-)

-- 
2.24.1



[PATCH 3/3] qemu: Label restore path outside of secdriver transactions

2020-04-03 Thread Michal Privoznik
As explained in the previous commit, we need to relabel the file
we are restoring the domain from. That is the FD that is passed
to QEMU. If the file is not under /dev then the file inside the
namespace is the very same as the one in the host. And regardless
of using transactions, the file will be relabeled. But, if the
file is under /dev then when using transactions only the copy
inside the namespace is relabeled and the one in the host is not.
But QEMU is reading from the one in the host, actually.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1772838

Signed-off-by: Michal Privoznik 
---
 src/qemu/qemu_security.c|  7 +++
 src/security/security_selinux.c | 23 +--
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_security.c b/src/qemu/qemu_security.c
index 484fc34552..594a700ea3 100644
--- a/src/qemu/qemu_security.c
+++ b/src/qemu/qemu_security.c
@@ -39,6 +39,13 @@ qemuSecuritySetAllLabel(virQEMUDriverPtr driver,
 qemuDomainObjPrivatePtr priv = vm->privateData;
 pid_t pid = -1;
 
+/* Explicitly run this outside of transaction. We really want to relabel
+ * the file in the host and not in the domain's namespace. */
+if (virSecurityManagerDomainSetIncomingPathLabel(driver->securityManager,
+ vm->def,
+ stdin_path) < 0)
+goto cleanup;
+
 if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
 pid = vm->pid;
 
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index f47bfbdba9..4d8f755c10 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -3135,7 +3135,7 @@ 
virSecuritySELinuxSetSecuritySmartcardCallback(virDomainDefPtr def,
 static int
 virSecuritySELinuxSetAllLabel(virSecurityManagerPtr mgr,
   virDomainDefPtr def,
-  const char *stdin_path,
+  const char *stdin_path G_GNUC_UNUSED,
   bool chardevStdioLogd,
   bool migrated G_GNUC_UNUSED)
 {
@@ -3231,11 +3231,6 @@ virSecuritySELinuxSetAllLabel(virSecurityManagerPtr mgr,
  data->content_context, true) < 0)
 return -1;
 
-if (stdin_path &&
-virSecuritySELinuxSetFilecon(mgr, stdin_path,
- data->content_context, false) < 0)
-return -1;
-
 return 0;
 }
 
@@ -3393,6 +3388,21 @@ 
virSecuritySELinuxDomainSetPathLabel(virSecurityManagerPtr mgr,
 return virSecuritySELinuxSetFilecon(mgr, path, seclabel->imagelabel, true);
 }
 
+static int
+virSecuritySELinuxDomainSetIncomingPathLabel(virSecurityManagerPtr mgr,
+ virDomainDefPtr def,
+ const char *path)
+{
+virSecuritySELinuxDataPtr data = virSecurityManagerGetPrivateData(mgr);
+virSecurityLabelDefPtr secdef;
+
+secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
+
+if (!path || !secdef || !secdef->relabel || data->skipAllLabel)
+return 0;
+
+return virSecuritySELinuxSetFilecon(mgr, path, data->content_context, 
false);
+}
 
 /*
  * virSecuritySELinuxSetFileLabels:
@@ -3596,6 +3606,7 @@ virSecurityDriver virSecurityDriverSELinux = {
 .getBaseLabel   = virSecuritySELinuxGetBaseLabel,
 
 .domainSetPathLabel = virSecuritySELinuxDomainSetPathLabel,
+.domainSetIncomingPathLabel = 
virSecuritySELinuxDomainSetIncomingPathLabel,
 
 .domainSetSecurityChardevLabel  = virSecuritySELinuxSetChardevLabel,
 .domainRestoreSecurityChardevLabel  = 
virSecuritySELinuxRestoreChardevLabel,
-- 
2.24.1



[PATCH 2/3] security: Introduce virSecurityManagerDomainSetIncomingPathLabel

2020-04-03 Thread Michal Privoznik
This API allows drivers to separate out handling of @stdin_path
of virSecurityManagerSetAllLabel(). The thing is, the QEMU driver
uses transactions for virSecurityManagerSetAllLabel() which
relabels devices from inside of domain's namespace. This is what
we usually want. Except when resuming domain from a file. The
file is opened before any namespace is set up and the FD is
passed to QEMU to read the migration stream from. Because of
this, the file lives outside of the namespace and if it so
happens that the file is a block device (i.e. it lives under
/dev) its copy will be created in the namespace. But the FD that
is passed to QEMU points to the original living in the host and
not in the namespace. So relabeling the file inside the namespace
helps nothing.

But if we have a separate API for relabeling the restore file
then the QEMU driver can continue calling
virSecurityManagerSetAllLabel() with transactions enabled and
call this new API without transactions.

We already have an API for relabeling a single file
(virSecurityManagerDomainSetPathLabel()) but in case of SELinux
it uses @imagelabel (which allows RW access) and we want to use
@content_context (which allows RO access).

Signed-off-by: Michal Privoznik 
---
 src/libvirt_private.syms|  1 +
 src/security/security_driver.h  |  4 
 src/security/security_manager.c | 29 +
 src/security/security_manager.h |  4 
 src/security/security_stack.c   | 21 +
 5 files changed, 59 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index e276f55bb1..2c63f37fc2 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1523,6 +1523,7 @@ virSecurityDriverLookup;
 # security/security_manager.h
 virSecurityManagerCheckAllLabel;
 virSecurityManagerClearSocketLabel;
+virSecurityManagerDomainSetIncomingPathLabel;
 virSecurityManagerDomainSetPathLabel;
 virSecurityManagerGenLabel;
 virSecurityManagerGetBaseLabel;
diff --git a/src/security/security_driver.h b/src/security/security_driver.h
index 3353955813..6cbe8613c9 100644
--- a/src/security/security_driver.h
+++ b/src/security/security_driver.h
@@ -140,6 +140,9 @@ typedef int (*virSecurityDomainSetPathLabel) 
(virSecurityManagerPtr mgr,
   virDomainDefPtr def,
   const char *path,
   bool allowSubtree);
+typedef int (*virSecurityDomainSetIncomingPathLabel) (virSecurityManagerPtr 
mgr,
+  virDomainDefPtr def,
+  const char *path);
 typedef int (*virSecurityDomainSetChardevLabel) (virSecurityManagerPtr mgr,
  virDomainDefPtr def,
  virDomainChrSourceDefPtr 
dev_source,
@@ -211,6 +214,7 @@ struct _virSecurityDriver {
 virSecurityDriverGetBaseLabel getBaseLabel;
 
 virSecurityDomainSetPathLabel domainSetPathLabel;
+virSecurityDomainSetIncomingPathLabel domainSetIncomingPathLabel;
 
 virSecurityDomainSetChardevLabel domainSetSecurityChardevLabel;
 virSecurityDomainRestoreChardevLabel domainRestoreSecurityChardevLabel;
diff --git a/src/security/security_manager.c b/src/security/security_manager.c
index fe032746ff..a76b953ee4 100644
--- a/src/security/security_manager.c
+++ b/src/security/security_manager.c
@@ -1077,6 +1077,35 @@ 
virSecurityManagerDomainSetPathLabel(virSecurityManagerPtr mgr,
 }
 
 
+/**
+ * virSecurityManagerDomainSetIncomingPathLabel:
+ * @mgr: security manager object
+ * @vm: domain definition object
+ * @path: path to label
+ *
+ * This function relabels given @path so that @vm can restore for
+ * it.  This allows the driver backend to use different label than
+ * virSecurityManagerDomainSetPathLabel().
+ *
+ * Returns: 0 on success, -1 on error.
+ */
+int
+virSecurityManagerDomainSetIncomingPathLabel(virSecurityManagerPtr mgr,
+ virDomainDefPtr vm,
+ const char *path)
+{
+if (mgr->drv->domainSetIncomingPathLabel) {
+int ret;
+virObjectLock(mgr);
+ret = mgr->drv->domainSetIncomingPathLabel(mgr, vm, path);
+virObjectUnlock(mgr);
+return ret;
+}
+
+return 0;
+}
+
+
 /**
  * virSecurityManagerSetMemoryLabel:
  * @mgr: security manager object
diff --git a/src/security/security_manager.h b/src/security/security_manager.h
index 7699bcbc6f..465d71558f 100644
--- a/src/security/security_manager.h
+++ b/src/security/security_manager.h
@@ -189,6 +189,10 @@ int 
virSecurityManagerDomainSetPathLabel(virSecurityManagerPtr mgr,
  const char *path,
  bool allowSubtree);
 
+int virSecurityManagerDomainSetIncomingPathLabel(virSecurityManagerPtr mgr,
+ 

Re: [libvirt PATCH 3/3] qemu: block: external snapshot-delete implementation for straightforward cases

2020-04-03 Thread Pavel Mores
On Tue, Mar 31, 2020 at 12:06:15PM +0200, Peter Krempa wrote:
> On Tue, Mar 31, 2020 at 11:18:29 +0200, Pavel Mores wrote:
> > +}
> > +
> > +if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN)
> > +topPath = disk->src->path;
> > +else
> > +topPath = snapdisk->src->path;
> 
> You must not use paths for doing this lookup. Paths at best work for
> local files only and this would make the code not future proof.
> 
> Also you want to verify that:
> - images you want to merge are actually in the backing chain
> - the backing chain looks as snapshots describe it (e.g you unplug vda
>   and plug a different chain back)

Let me check with you how exactly to perform this verification.

To retrieve the names of the disks included in a snapshot, I can use its
virDomainSnapshotDef which contains an array of disks
(virDomainSnapshotDiskDef's) whose 'name' member can be used to identify disks.

To get the state of the chain at moment the snapshot was created, I can use the
'src' member and walk its 'backingStore' list to examine the whole chain.

To get the currently running configuration, I assume I can use the names of the
relevant disks (obtained from the snapshot as mentioned above) to get a
virDomainDiskDefPtr for each of them, whose 'src' member points to a
virStorageSource that represents the topmost image in the disk's chain.  From
there, I can walk the 'backingStore' list to get the other images in the chain
all the way to the base image.

The verification succeeds if the disk names and their chains in the snapshot
and the running config correspond.  Is the above correct?

If so, I'm still not certain how to compare two virStorageSource's.  How is
identity of two different virStorageSource instances is established?

Thanks!

pvl



Re: [PATCH 01/36] util: virresctrl: convert classes to GObject

2020-04-03 Thread Rafael Fonseca
On Fri, Apr 3, 2020 at 5:37 PM Peter Krempa  wrote:
>
> On Fri, Apr 03, 2020 at 17:15:29 +0200, Rafael Fonseca wrote:
> > Signed-off-by: Rafael Fonseca 
> > ---
> >  src/conf/capabilities.c |   3 +-
> >  src/conf/domain_conf.c  |  21 +++---
> >  src/util/virresctrl.c   | 137 ++--
> >  src/util/virresctrl.h   |  15 +++--
> >  tests/virresctrltest.c  |   3 +-
> >  5 files changed, 97 insertions(+), 82 deletions(-)
> >
> > diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
> > index 99b69aebb5..2c91461a54 100644
> > --- a/src/conf/capabilities.c
> > +++ b/src/conf/capabilities.c
> > @@ -266,7 +266,8 @@ virCapsDispose(void *object)
> >  VIR_FREE(caps->host.netprefix);
> >  VIR_FREE(caps->host.pagesSize);
> >  virCPUDefFree(caps->host.cpu);
> > -virObjectUnref(caps->host.resctrl);
> > +if (caps->host.resctrl)
> > +g_object_unref(caps->host.resctrl);
>
> Please use g_clear_object without the condition instead of this pattern
> everywhere. It was recently discussed on the list that this is the
> better option.

Oh, I missed the discussion. I was following this patch example:
https://libvirt.org/git/?p=libvirt.git;a=commitdiff;h=16121a88a7ef933220bcf9eff6575367278a06f7;hp=b74a95d6a2950a7b9168d772b49e07a5d20a3f63

Anyway I'll replace them by g_clear_object. Tks.


Att
-- 
Rafael Fonseca




Re: [PATCH 2/4] conf: domain: support for virtio packed option

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Bjoern Walk wrote:

Expose the virtio parameter for packed virtqueues as a optional libvirt XML


s/a optional/an optional/


attribute to virtio-backed devices, e.g.:

   
 
 
 
   

If the attribute is omitted, the default value for this attribute is 'off' and
regular split virtqueues are used.

Reviewed-by: Boris Fiuczynski 
Signed-off-by: Bjoern Walk 
---
docs/schemas/domaincommon.rng |  5 +
src/conf/domain_conf.c| 28 
src/conf/domain_conf.h|  1 +
3 files changed, 34 insertions(+)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 3/4] qemu: command: support for virtio packed option

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Bjoern Walk wrote:

Pass the packed option on the QEMU command line of the capability for
packed virtqueues is detected and the parameter is set explicitly.

Signed-off-by: Bjoern Walk 
---
src/qemu/qemu_command.c| 10 +++
tests/qemuxml2argvdata/virtio-options.args | 32 --
tests/qemuxml2argvdata/virtio-options.xml  | 26 +-
tests/qemuxml2argvtest.c   |  3 +-
tests/qemuxml2xmltest.c|  3 +-
5 files changed, 44 insertions(+), 30 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 1/4] qemu: capabilities: add 'packed' capability

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Bjoern Walk wrote:

Add the capability for QEMU's packed virtqueues for virtio that supposedly have
better cache utilization and performance compared to the default split queues.

Signed-off-by: Bjoern Walk 
---
src/qemu/qemu_capabilities.c  | 6 ++
src/qemu/qemu_capabilities.h  | 1 +
tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml  | 1 +
tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml   | 1 +
tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml  | 1 +
7 files changed, 12 insertions(+)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 01/36] util: virresctrl: convert classes to GObject

2020-04-03 Thread Peter Krempa
On Fri, Apr 03, 2020 at 17:15:29 +0200, Rafael Fonseca wrote:
> Signed-off-by: Rafael Fonseca 
> ---
>  src/conf/capabilities.c |   3 +-
>  src/conf/domain_conf.c  |  21 +++---
>  src/util/virresctrl.c   | 137 ++--
>  src/util/virresctrl.h   |  15 +++--
>  tests/virresctrltest.c  |   3 +-
>  5 files changed, 97 insertions(+), 82 deletions(-)
> 
> diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
> index 99b69aebb5..2c91461a54 100644
> --- a/src/conf/capabilities.c
> +++ b/src/conf/capabilities.c
> @@ -266,7 +266,8 @@ virCapsDispose(void *object)
>  VIR_FREE(caps->host.netprefix);
>  VIR_FREE(caps->host.pagesSize);
>  virCPUDefFree(caps->host.cpu);
> -virObjectUnref(caps->host.resctrl);
> +if (caps->host.resctrl)
> +g_object_unref(caps->host.resctrl);

Please use g_clear_object without the condition instead of this pattern
everywhere. It was recently discussed on the list that this is the
better option.



Re: [libvirt-jenkins-ci PATCH 4/5] playbooks: gitlab: Force a random password for the root account

2020-04-03 Thread Andrea Bolognani
On Fri, 2020-04-03 at 09:43 +0200, Erik Skultety wrote:
> On Tue, Mar 31, 2020 at 05:39:45PM +0200, Andrea Bolognani wrote:
> > On Thu, 2020-03-26 at 14:33 +0100, Erik Skultety wrote:
> > > Unlike with the 'test' flavour, where the 'test' user has sudo
> > > permissions on the system, with machines set up with the 'gitlab'
> > > flavour which are intended to contact the outside world which, we don't
> > > want that. More importantly though, we must not use the default root
> > > password which is set by the install script on such machines.
> > > Therefore, set the root password to a random one as part of the gitlab
> > > flavour task, thus only allowing SSH pubkey authentication for the root
> > > account.
> > 
> > I'm confused by this.
> > 
> > If we want the root account to only be accessible via SSH with a
> > pubkey, then we can configure sshd accordingly: setting a random
> > password which is not stored anywhere prevents access not only via
> > SSH, but also via local access (eg. serial console), which I don't
> > think is desirable.

Turns out we already do this:

  # guests/playbooks/update/tasks/users.yml

  - name: 'root: Disable ssh password authentication'
lineinfile:
  path: /etc/ssh/sshd_config
  regexp: '^#*\s*PermitRootLogin\s*.*$'
  line: 'PermitRootLogin without-password'
  state: present

So it's already the case that the only way you can ssh into the
builders as root is by using pubkey authentication.

> > Moreover, the root password that is set in the first place is taken
> > from a mandatory user-provided configuration file, and I'm not sure
> > we should be condescending towards users by basically saying "we know
> > you didn't choose a secure password, so we're going to generate a new
> > one ourselves".
> 
> Like I said, with these machines, we need to design them in a way where they
> can come and go easily. Once you accept that, you don't care about the root
> password as long as you have SSH access via a secure manner (at least I never
> cared with the machines I created with virt-builder, or provisioned in 
> beaker).
> For personal machines, yes, this is inconvenient, but the sole purpose of 
> these
> executors is to live somewhere in the cloud and do 1 job and 1 job only. I'm
> planning on proceeding with creating a cloud config for OpenStack for these
> machines which is another explanation for the password - for cloud machines,
> the root password will always be set by the cloud init script and that one can
> either be static, or random (and I have a hunch that the latter is actually
> true in production environments where other mechanism are put in use to be 
> able
> to get root access, like SSH or a service account with sudo perms).

Sorry, I still don't get it. If the password doesn't matter because
you're going to set a new one using cloud-init, why bother replacing
the one that was set earlier?

I think we are conflating different scenarios:

  * if you want to build your runner locally using 'lcitool install'
and then connect it to whatever GitLab instance, then the root
password that was configured by the user should be preserved,
because it's an explicit setting from the user;

  * if you want to build qcow2 images for distribution, such that
other users can later spin them up on their cloud of choice, then
the root password must be set at instantiation time using
cloud-init or other similar mechanisms.

In neither scenario generating a random password at install time is
necessary, or helpful.

For the latter one, in particular, you'd need to ensure cloud-init
is present and enabled in the image, which is currently not the case,
so it will simply not work. You'll also want to strip out the ssh key
of the user who generated the image from authorized_keys, but I
assume something like virt-sysprep is going to be one of the steps
of the image generation pipeline and will take care of that.

-- 
Andrea Bolognani / Red Hat / Virtualization



[PATCH 36/36] util: convert virStorageSource to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/qemu/qemu_blockjob.c  | 71 ++-
 src/qemu/qemu_domain.c| 13 +++
 src/util/virstoragefile.c | 41 +++---
 src/util/virstoragefile.h |  6 ++--
 4 files changed, 65 insertions(+), 66 deletions(-)

diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 7d6aabe554..767ac54170 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -91,10 +91,10 @@ static void
 qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
 {
 if (job->type == QEMU_BLOCKJOB_TYPE_CREATE)
-virObjectUnref(job->data.create.src);
+g_object_unref(job->data.create.src);
 
 if (job->type == QEMU_BLOCKJOB_TYPE_BACKUP) {
-virObjectUnref(job->data.backup.store);
+g_object_unref(job->data.backup.store);
 g_free(job->data.backup.bitmap);
 }
 }
@@ -105,8 +105,10 @@ qemuBlockJobDataFinalize(GObject *obj)
 {
 qemuBlockJobDataPtr job = QEMU_BLOCK_JOB_DATA(obj);
 
-virObjectUnref(job->chain);
-virObjectUnref(job->mirrorChain);
+if (job->chain)
+g_object_unref(job->chain);
+if (job->mirrorChain)
+g_object_unref(job->mirrorChain);
 
 qemuBlockJobDataDisposeJobdata(job);
 
@@ -185,7 +187,7 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
 
 if (disk) {
 job->disk = disk;
-job->chain = virObjectRef(disk->src);
+job->chain = g_object_ref(disk->src);
 QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = g_object_ref(job);
 }
 
@@ -337,9 +339,9 @@ qemuBlockJobNewCreate(virDomainObjPtr vm,
 return NULL;
 
 if (virStorageSourceIsBacking(chain))
-job->chain = virObjectRef(chain);
+job->chain = g_object_ref(chain);
 
- job->data.create.src = virObjectRef(src);
+ job->data.create.src = g_object_ref(src);
 
 if (qemuBlockJobRegister(job, vm, NULL, true) < 0)
 return NULL;
@@ -370,7 +372,7 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm,
 if (!(job = qemuBlockJobDataNew(QEMU_BLOCKJOB_TYPE_COPY, jobname)))
 return NULL;
 
-job->mirrorChain = virObjectRef(mirror);
+job->mirrorChain = g_object_ref(mirror);
 
 if (shallow && !reuse)
 job->data.copy.shallownew = true;
@@ -399,7 +401,7 @@ qemuBlockJobDiskNewBackup(virDomainObjPtr vm,
 return NULL;
 
 job->data.backup.bitmap = g_strdup(bitmap);
-job->data.backup.store = virObjectRef(store);
+job->data.backup.store = g_object_ref(store);
 
 /* backup jobs are usually started in bulk by transaction so the caller
  * shall save the status XML */
@@ -688,14 +690,12 @@ qemuBlockJobRewriteConfigDiskSource(virDomainObjPtr vm,
 /* discard any detected backing store */
 if (virStorageSourceIsBacking(n->backingStore) &&
 n->backingStore->detected) {
-virObjectUnref(n->backingStore);
-n->backingStore = NULL;
+g_clear_object(>backingStore);
 break;
 }
 }
 
-virObjectUnref(persistDisk->src);
-persistDisk->src = g_steal_pointer();
+g_set_object(>src, copy);
 }
 
 
@@ -729,8 +729,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr 
driver,
  disk->dst);
 }
 
-virObjectUnref(disk->src);
-disk->src = disk->mirror;
+g_set_object(>src, disk->mirror);
 } else {
 if (disk->mirror) {
 virDomainLockImageDetach(driver->lockManager, vm, disk->mirror);
@@ -740,7 +739,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr 
driver,
  * Remove security driver metadata so that they are not leaked. */
 qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror);
 
-virObjectUnref(disk->mirror);
+g_object_unref(disk->mirror);
 }
 
 qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->src);
@@ -817,8 +816,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver,
  * Remove security driver metadata so that they are not leaked. */
 qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror);
 
-virObjectUnref(disk->mirror);
-disk->mirror = NULL;
+g_clear_object(>mirror);
 }
 disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
 disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
@@ -930,8 +928,8 @@ qemuBlockJobClearConfigChain(virDomainObjPtr vm,
 if (!virStorageSourceIsSameLocation(disk->src, cfgdisk->src))
 return;
 
-virObjectUnref(cfgdisk->src->backingStore);
-cfgdisk->src->backingStore = NULL;
+if (cfgdisk->src->backingStore)
+g_clear_object(>src->backingStore);
 }
 
 
@@ -997,14 +995,16 @@ qemuBlockJobProcessEventCompletedPull(virQEMUDriverPtr 
driver,
 if (baseparent)
 baseparent->backingStore = NULL;
 qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, tmp);
-

[PATCH 24/36] datatypes: convert virNodeDevice to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/node_device_event.c |  9 +++-
 src/conf/node_device_util.c  |  4 ++--
 src/conf/virnodedeviceobj.c  | 10 ++--
 src/datatypes.c  | 44 ++--
 src/datatypes.h  | 14 +++-
 src/libvirt-nodedev.c|  6 ++---
 src/libvirt_private.syms |  1 -
 src/libxl/libxl_driver.c |  9 +++-
 src/qemu/qemu_driver.c   |  9 +++-
 src/remote/remote_driver.c   |  4 ++--
 src/rpc/gendispatch.pl   |  2 +-
 src/test/test_driver.c   |  2 +-
 12 files changed, 61 insertions(+), 53 deletions(-)

diff --git a/src/conf/node_device_event.c b/src/conf/node_device_event.c
index c6915be593..cc2cdd9352 100644
--- a/src/conf/node_device_event.c
+++ b/src/conf/node_device_event.c
@@ -110,7 +110,7 @@ virNodeDeviceEventDispatchDefaultFunc(virConnectPtr conn,
   virConnectObjectEventGenericCallback cb,
   void *cbopaque)
 {
-virNodeDevicePtr dev = virGetNodeDevice(conn,
+g_autoptr(virNodeDevice) dev = virGetNodeDevice(conn,
 event->meta.name);
 
 if (!dev)
@@ -126,23 +126,20 @@ virNodeDeviceEventDispatchDefaultFunc(virConnectPtr conn,
  
nodeDeviceLifecycleEvent->type,
  
nodeDeviceLifecycleEvent->detail,
  cbopaque);
-goto cleanup;
+return;
 }
 
 case VIR_NODE_DEVICE_EVENT_ID_UPDATE:
 {
 ((virConnectNodeDeviceEventGenericCallback)cb)(conn, dev,
cbopaque);
-goto cleanup;
+return;
 }
 
 case VIR_NODE_DEVICE_EVENT_ID_LAST:
 break;
 }
 VIR_WARN("Unexpected event ID %d", event->eventID);
-
- cleanup:
-virObjectUnref(dev);
 }
 
 
diff --git a/src/conf/node_device_util.c b/src/conf/node_device_util.c
index 5e80422d7f..0b9292ffd3 100644
--- a/src/conf/node_device_util.c
+++ b/src/conf/node_device_util.c
@@ -20,6 +20,7 @@
 
 #include "internal.h"
 
+#include "datatypes.h"
 #include "node_device_util.h"
 #include "virlog.h"
 #include "virscsihost.h"
@@ -45,7 +46,7 @@ char *
 virNodeDeviceGetParentName(virConnectPtr conn,
const char *nodedev_name)
 {
-virNodeDevicePtr device = NULL;
+g_autoptr(virNodeDevice) device = NULL;
 char *parent;
 
 if (!(device = virNodeDeviceLookupByName(conn, nodedev_name))) {
@@ -56,7 +57,6 @@ virNodeDeviceGetParentName(virConnectPtr conn,
 }
 
 parent = g_strdup(virNodeDeviceGetParent(device));
-virObjectUnref(device);
 
 return parent;
 }
diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
index 3a34a324ca..5ee2db8b01 100644
--- a/src/conf/virnodedeviceobj.c
+++ b/src/conf/virnodedeviceobj.c
@@ -866,7 +866,6 @@ virNodeDeviceObjListExportCallback(void *payload,
 virNodeDeviceObjMatch(obj, data->flags)) {
 if (data->devices) {
 if (!(device = virGetNodeDevice(data->conn, def->name))) {
-virObjectUnref(device);
 data->error = true;
 goto cleanup;
 }
@@ -914,7 +913,14 @@ virNodeDeviceObjListExport(virConnectPtr conn,
 return data.ndevices;
 
  cleanup:
-virObjectListFree(data.devices);
+if (data.devices) {
+while (data.ndevices--) {
+if (data.devices[data.ndevices])
+g_object_unref(data.devices[data.ndevices]);
+}
+}
+VIR_FREE(data.devices);
+
 return -1;
 }
 
diff --git a/src/datatypes.c b/src/datatypes.c
index 1f811e5f5e..43767b9fb5 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -36,14 +36,12 @@ VIR_LOG_INIT("datatypes");
 virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
-virClassPtr virNodeDeviceClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
 
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
-static void virNodeDeviceDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
 
@@ -127,6 +125,22 @@ vir_network_port_class_init(virNetworkPortClass *klass)
 obj->finalize = virNetworkPortFinalize;
 }
 
+G_DEFINE_TYPE(virNodeDevice, vir_node_device, G_TYPE_OBJECT);
+static void virNodeDeviceFinalize(GObject *obj);
+
+static void
+vir_node_device_init(virNodeDevice *dev G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_node_device_class_init(virNodeDeviceClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virNodeDeviceFinalize;
+}
+
 G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT);
 static void virNWFilterFinalize(GObject *obj);
 

[PATCH 32/36] qemu: convert qemuBlockJobData to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/qemu/qemu_blockjob.c | 55 +++-
 src/qemu/qemu_blockjob.h | 15 +++
 src/qemu/qemu_domain.c   |  7 +++--
 3 files changed, 41 insertions(+), 36 deletions(-)

diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 2032c0c1c5..7d6aabe554 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -71,8 +71,21 @@ VIR_ENUM_IMPL(qemuBlockjob,
   "create",
   "broken");
 
-static virClassPtr qemuBlockJobDataClass;
+G_DEFINE_TYPE(qemuBlockJobData, qemu_block_job_data, G_TYPE_OBJECT);
+static void qemuBlockJobDataFinalize(GObject *obj);
 
+static void
+qemu_block_job_data_init(qemuBlockJobData *job G_GNUC_UNUSED)
+{
+}
+
+static void
+qemu_block_job_data_class_init(qemuBlockJobDataClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = qemuBlockJobDataFinalize;
+}
 
 static void
 qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
@@ -88,9 +101,9 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job)
 
 
 static void
-qemuBlockJobDataDispose(void *obj)
+qemuBlockJobDataFinalize(GObject *obj)
 {
-qemuBlockJobDataPtr job = obj;
+qemuBlockJobDataPtr job = QEMU_BLOCK_JOB_DATA(obj);
 
 virObjectUnref(job->chain);
 virObjectUnref(job->mirrorChain);
@@ -99,32 +112,17 @@ qemuBlockJobDataDispose(void *obj)
 
 g_free(job->name);
 g_free(job->errmsg);
-}
 
-
-static int
-qemuBlockJobDataOnceInit(void)
-{
-if (!VIR_CLASS_NEW(qemuBlockJobData, virClassForObject()))
-return -1;
-
-return 0;
+G_OBJECT_CLASS(qemu_block_job_data_parent_class)->finalize(obj);
 }
 
 
-VIR_ONCE_GLOBAL_INIT(qemuBlockJobData);
-
 qemuBlockJobDataPtr
 qemuBlockJobDataNew(qemuBlockJobType type,
 const char *name)
 {
-g_autoptr(qemuBlockJobData) job = NULL;
-
-if (qemuBlockJobDataInitialize() < 0)
-return NULL;
-
-if (!(job = virObjectNew(qemuBlockJobDataClass)))
-return NULL;
+g_autoptr(qemuBlockJobData) job =
+QEMU_BLOCK_JOB_DATA(g_object_new(QEMU_TYPE_BLOCK_JOB_DATA, NULL));
 
 job->name = g_strdup(name);
 
@@ -180,15 +178,15 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
 return -1;
 }
 
-if (virHashAddEntry(priv->blockjobs, job->name, virObjectRef(job)) < 0) {
-virObjectUnref(job);
+if (virHashAddEntry(priv->blockjobs, job->name, g_object_ref(job)) < 0) {
+g_object_unref(job);
 return -1;
 }
 
 if (disk) {
 job->disk = disk;
 job->chain = virObjectRef(disk->src);
-QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
+QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = g_object_ref(job);
 }
 
 if (savestatus)
@@ -209,8 +207,7 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job,
 diskPriv = QEMU_DOMAIN_DISK_PRIVATE(job->disk);
 
 if (job == diskPriv->blockjob) {
-virObjectUnref(diskPriv->blockjob);
-diskPriv->blockjob = NULL;
+g_clear_object(>blockjob);
 }
 
 job->disk = NULL;
@@ -427,7 +424,7 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
 if (!job)
 return NULL;
 
-return virObjectRef(job);
+return g_object_ref(job);
 }
 
 
@@ -466,7 +463,7 @@ qemuBlockJobStartupFinalize(virDomainObjPtr vm,
 if (job->state == QEMU_BLOCKJOB_STATE_NEW)
 qemuBlockJobUnregister(job, vm);
 
-virObjectUnref(job);
+g_object_unref(job);
 }
 
 
@@ -1738,7 +1735,7 @@ qemuBlockJobGetByDisk(virDomainDiskDefPtr disk)
 if (!job)
 return NULL;
 
-return virObjectRef(job);
+return g_object_ref(job);
 }
 
 
diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h
index 19498b5bd8..fc36131c67 100644
--- a/src/qemu/qemu_blockjob.h
+++ b/src/qemu/qemu_blockjob.h
@@ -23,6 +23,7 @@
 
 #include "internal.h"
 #include "qemu_conf.h"
+#include 
 
 /**
  * This enum has to map all known block job states from enum 
virDomainBlockJobType
@@ -119,11 +120,8 @@ struct _qemuBlockJobBackupData {
 };
 
 
-typedef struct _qemuBlockJobData qemuBlockJobData;
-typedef qemuBlockJobData *qemuBlockJobDataPtr;
-
 struct _qemuBlockJobData {
-virObject parent;
+GObject parent;
 
 char *name;
 
@@ -154,7 +152,14 @@ struct _qemuBlockJobData {
 bool invalidData; /* the job data (except name) is not valid */
 bool reconnected; /* internal field for tracking whether job is live after 
reconnect to qemu */
 };
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockJobData, virObjectUnref);
+
+#define QEMU_TYPE_BLOCK_JOB_DATA qemu_block_job_data_get_type()
+G_DECLARE_FINAL_TYPE(qemuBlockJobData,
+ qemu_block_job_data,
+ QEMU,
+ BLOCK_JOB_DATA,
+ GObject);
+typedef qemuBlockJobData *qemuBlockJobDataPtr;
 
 int
 qemuBlockJobRegister(qemuBlockJobDataPtr job,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 

[PATCH 31/36] libxl: convert libxlMigrationDstArgs to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/libxl/libxl_migration.c | 57 +++--
 1 file changed, 36 insertions(+), 21 deletions(-)

diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c
index a105a03b47..15724bb262 100644
--- a/src/libxl/libxl_migration.c
+++ b/src/libxl/libxl_migration.c
@@ -60,7 +60,7 @@ struct _libxlMigrationCookie {
 };
 
 typedef struct _libxlMigrationDstArgs {
-virObject parent;
+GObject parent;
 
 int recvfd;
 virConnectPtr conn;
@@ -73,7 +73,28 @@ typedef struct _libxlMigrationDstArgs {
 size_t nsocks;
 } libxlMigrationDstArgs;
 
-static virClassPtr libxlMigrationDstArgsClass;
+G_DEFINE_TYPE(libxlMigrationDstArgs, libxl_migration_dst_args, G_TYPE_OBJECT);
+#define LIBXL_TYPE_MIGRATION_DST_ARGS libxl_migration_dst_args_get_type()
+G_DECLARE_FINAL_TYPE(libxlMigrationDstArgs,
+ libxl_migration_dst_args,
+ LIBXL,
+ MIGRATION_DST_ARGS,
+ GObject);
+
+static void libxlMigrationDstArgsFinalize(GObject *obj);
+
+static void
+libxl_migration_dst_args_init(lixlMigrationDstArgs *args G_GNUC_UNUSED)
+{
+}
+
+static void
+libxl_migration_dst_args_class_init(lixlMigrationDstArgsClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = libxlMigrationDstArgsFinalize;
+}
 
 
 static void
@@ -226,26 +247,18 @@ libxlMigrationEatCookie(const char *cookiein,
 }
 
 static void
-libxlMigrationDstArgsDispose(void *obj)
+libxlMigrationDstArgsFinalize(GObject *obj)
 {
-libxlMigrationDstArgs *args = obj;
+libxlMigrationDstArgs *args = LIBXL_MIGRATION_DST_ARGS(obj);
 
 libxlMigrationCookieFree(args->migcookie);
 VIR_FREE(args->socks);
 virObjectUnref(args->conn);
 virObjectUnref(args->vm);
-}
 
-static int
-libxlMigrationDstArgsOnceInit(void)
-{
-if (!VIR_CLASS_NEW(libxlMigrationDstArgs, virClassForObject()))
-return -1;
-
-return 0;
+G_OBJECT_CLASS(libxl_migration_dst_args_parent_class)->finalize(obj);
 }
 
-VIR_ONCE_GLOBAL_INIT(libxlMigrationDstArgs);
 
 static void
 libxlDoMigrateDstReceive(void *opaque)
@@ -277,7 +290,7 @@ libxlDoMigrateDstReceive(void *opaque)
 }
 args->nsocks = 0;
 VIR_FORCE_CLOSE(recvfd);
-virObjectUnref(args);
+g_object_unref(args);
 virDomainObjEndAPI();
 }
 
@@ -339,7 +352,7 @@ libxlMigrateDstReceive(virNetSocketPtr sock,
 }
 args->nsocks = 0;
 VIR_FORCE_CLOSE(recvfd);
-virObjectUnref(args);
+g_object_unref(args);
 }
 
 static int
@@ -600,8 +613,8 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn,
 if (libxlMigrationDstArgsInitialize() < 0)
 goto endjob;
 
-if (!(args = virObjectNew(libxlMigrationDstArgsClass)))
-goto endjob;
+args = LIBXL_MIGRATION_DST_ARGS(
+g_object_new(LIBXL_TYPE_MIGRATION_DST_ARGS, NULL));
 
 args->conn = virObjectRef(dconn);
 args->vm = virObjectRef(vm);
@@ -634,7 +647,8 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn,
 libxlMigrationCookieFree(mig);
 VIR_FORCE_CLOSE(dataFD[1]);
 VIR_FORCE_CLOSE(dataFD[0]);
-virObjectUnref(args);
+if (args)
+g_object_unref(args);
 /* Remove virDomainObj from domain list */
 if (vm)
 virDomainObjListRemove(driver->domains, vm);
@@ -765,8 +779,8 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn,
 if (libxlMigrationDstArgsInitialize() < 0)
 goto endjob;
 
-if (!(args = virObjectNew(libxlMigrationDstArgsClass)))
-goto endjob;
+args = LIBXL_MIGRATION_DST_ARGS(
+g_object_new(LIBXL_TYPE_MIGRATION_DST_ARGS, NULL));
 
 args->conn = virObjectRef(dconn);
 args->vm = virObjectRef(vm);
@@ -823,7 +837,8 @@ libxlDomainMigrationDstPrepare(virConnectPtr dconn,
 VIR_FREE(hostname);
 else
 virURIFree(uri);
-virObjectUnref(args);
+if (args)
+g_object_unref(args);
 virDomainObjEndAPI();
 return ret;
 }
-- 
2.25.1




[PATCH 26/36] datatypes: convert virStream to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virchrdev.c|  5 +++--
 src/datatypes.c | 32 +
 src/datatypes.h | 15 +++---
 src/libvirt-stream.c|  7 +++
 src/libvirt_private.syms|  1 -
 src/libxl/libxl_migration.c |  2 +-
 src/qemu/qemu_migration.c   |  6 ++
 src/remote/remote_daemon_dispatch.c |  2 +-
 src/remote/remote_daemon_stream.c   |  3 ++-
 src/remote/remote_driver.c  |  3 ++-
 src/rpc/gendispatch.pl  |  2 +-
 src/util/virfdstream.c  |  5 +++--
 12 files changed, 49 insertions(+), 34 deletions(-)

diff --git a/src/conf/virchrdev.c b/src/conf/virchrdev.c
index 800e82869e..2338d40c39 100644
--- a/src/conf/virchrdev.c
+++ b/src/conf/virchrdev.c
@@ -205,7 +205,8 @@ static void virChrdevHashEntryFree(void *data)
 return;
 
 /* free stream reference */
-virObjectUnref(ent->st);
+if (ent->st)
+g_object_unref(ent->st);
 
 /* delete lock file */
 virChrdevLockFileRemove(ent->dev);
@@ -435,7 +436,7 @@ int virChrdevOpen(virChrdevsPtr devs,
 if (added)
 virHashRemoveEntry(devs->hash, path);
 else
-virObjectUnref(st);
+g_object_unref(st);
 
 if (cbdata)
 VIR_FREE(cbdata->path);
diff --git a/src/datatypes.c b/src/datatypes.c
index 4f2bca6e6d..8cf9e0c51b 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -36,12 +36,10 @@ VIR_LOG_INIT("datatypes");
 virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
-virClassPtr virStreamClass;
 
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
-static void virStreamDispose(void *obj);
 
 G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT);
 static void virDomainCheckpointFinalize(GObject *obj);
@@ -219,6 +217,22 @@ vir_storage_vol_class_init(virStorageVolClass *klass)
 obj->finalize = virStorageVolFinalize;
 }
 
+G_DEFINE_TYPE(virStream, vir_stream, G_TYPE_OBJECT);
+static void virStreamFinalize(GObject *obj);
+
+static void
+vir_stream_init(virStream *strm G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_stream_class_init(virStreamClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virStreamFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -271,7 +285,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnect);
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
-DECLARE_CLASS(virStream);
 
 DECLARE_CLASS_LOCKABLE(virAdmConnect);
 DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
@@ -933,7 +946,7 @@ virSecretFinalize(GObject *obj)
  * @conn: the hypervisor connection
  *
  * Allocates a new stream object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the stream object, or NULL on error.
  */
@@ -945,8 +958,7 @@ virGetStream(virConnectPtr conn)
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-if (!(ret = virObjectNew(virStreamClass)))
-return NULL;
+ret = VIR_STREAM(g_object_new(VIR_TYPE_STREAM, NULL));
 
 ret->conn = virObjectRef(conn);
 
@@ -954,7 +966,7 @@ virGetStream(virConnectPtr conn)
 }
 
 /**
- * virStreamDispose:
+ * virStreamFinalize:
  * @obj: the stream to release
  *
  * Unconditionally release all memory associated with a stream.
@@ -964,14 +976,16 @@ virGetStream(virConnectPtr conn)
  * which may also be released if its ref count hits zero.
  */
 static void
-virStreamDispose(void *obj)
+virStreamFinalize(GObject *obj)
 {
-virStreamPtr st = obj;
+virStreamPtr st = VIR_STREAM(obj);
 VIR_DEBUG("release dev %p", st);
 
 if (st->ff)
 st->ff(st->privateData);
 virObjectUnref(st->conn);
+
+G_OBJECT_CLASS(vir_stream_parent_class)->finalize(obj);
 }
 
 
diff --git a/src/datatypes.h b/src/datatypes.h
index 4b0747f728..759e5487c3 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -32,8 +32,6 @@
 
 extern virClassPtr virConnectClass;
 extern virClassPtr virDomainClass;
-extern virClassPtr virStreamClass;
-
 
 #define VIR_TYPE_DOMAIN_CHECKPOINT vir_domain_checkpoint_get_type()
 G_DECLARE_FINAL_TYPE(virDomainCheckpoint,
@@ -80,6 +78,9 @@ G_DECLARE_FINAL_TYPE(virStoragePool, vir_storage_pool, VIR, 
STORAGE_POOL, GObjec
 #define VIR_TYPE_STORAGE_VOL vir_storage_vol_get_type()
 G_DECLARE_FINAL_TYPE(virStorageVol, vir_storage_vol, VIR, STORAGE_VOL, 
GObject);
 
+#define VIR_TYPE_STREAM vir_stream_get_type()
+G_DECLARE_FINAL_TYPE(virStream, vir_stream, VIR, STREAM, GObject);
+
 extern virClassPtr virAdmConnectClass;
 
 #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type()
@@ -308,8 +309,8 @@ 

[PATCH 25/36] datatypes: convert virSecret to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/secret_event.c |  9 ++
 src/conf/virsecretobj.c |  8 +-
 src/datatypes.c | 44 ++---
 src/datatypes.h | 14 +
 src/libvirt-secret.c|  7 ++---
 src/libvirt_private.syms|  1 -
 src/remote/remote_daemon_dispatch.c |  4 +--
 src/remote/remote_driver.c  |  4 +--
 src/storage/storage_util.c  |  4 +--
 src/util/virsecret.c|  3 +-
 10 files changed, 54 insertions(+), 44 deletions(-)

diff --git a/src/conf/secret_event.c b/src/conf/secret_event.c
index 1c34dcfbc9..229f90c6c4 100644
--- a/src/conf/secret_event.c
+++ b/src/conf/secret_event.c
@@ -109,7 +109,7 @@ virSecretEventDispatchDefaultFunc(virConnectPtr conn,
   virConnectObjectEventGenericCallback cb,
   void *cbopaque)
 {
-virSecretPtr secret = virGetSecret(conn,
+g_autoptr(virSecret) secret = virGetSecret(conn,
event->meta.uuid,
event->meta.id,
event->meta.name);
@@ -127,23 +127,20 @@ virSecretEventDispatchDefaultFunc(virConnectPtr conn,
  
secretLifecycleEvent->type,
  
secretLifecycleEvent->detail,
  cbopaque);
-goto cleanup;
+return;
 }
 
 case VIR_SECRET_EVENT_ID_VALUE_CHANGED:
 {
 ((virConnectSecretEventGenericCallback)cb)(conn, secret,
cbopaque);
-goto cleanup;
+return;
 }
 
 case VIR_SECRET_EVENT_ID_LAST:
 break;
 }
 VIR_WARN("Unexpected event ID %d", event->eventID);
-
- cleanup:
-virObjectUnref(secret);
 }
 
 
diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c
index 81c9f2c346..861c66bd03 100644
--- a/src/conf/virsecretobj.c
+++ b/src/conf/virsecretobj.c
@@ -611,7 +611,13 @@ virSecretObjListExport(virConnectPtr conn,
 return data.nsecrets;
 
  error:
-virObjectListFree(data.secrets);
+if (data.secrets) {
+while (data.nsecrets--) {
+if (data.secrets[data.nsecrets])
+g_object_unref(data.secrets[data.nsecrets]);
+}
+VIR_FREE(data.secrets);
+}
 return -1;
 }
 
diff --git a/src/datatypes.c b/src/datatypes.c
index 43767b9fb5..4f2bca6e6d 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -36,13 +36,11 @@ VIR_LOG_INIT("datatypes");
 virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
-virClassPtr virSecretClass;
 virClassPtr virStreamClass;
 
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
-static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
 
 G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT);
@@ -173,6 +171,22 @@ vir_nw_filter_binding_class_init(virNWFilterBindingClass 
*klass)
 obj->finalize = virNWFilterBindingFinalize;
 }
 
+G_DEFINE_TYPE(virSecret, vir_secret, G_TYPE_OBJECT);
+static void virSecretFinalize(GObject *obj);
+
+static void
+vir_secret_init(virSecret *sec G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_secret_class_init(virSecretClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virSecretFinalize;
+}
+
 G_DEFINE_TYPE(virStoragePool, vir_storage_pool, G_TYPE_OBJECT);
 static void virStoragePoolFinalize(GObject *obj);
 
@@ -257,7 +271,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnect);
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
-DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
 
 DECLARE_CLASS_LOCKABLE(virAdmConnect);
@@ -862,7 +875,7 @@ virNodeDeviceFinalize(GObject *obj)
  * @uuid: secret UUID
  *
  * Allocates a new secret object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the secret object, or NULL on error.
  */
@@ -870,16 +883,15 @@ virSecretPtr
 virGetSecret(virConnectPtr conn, const unsigned char *uuid,
  int usageType, const char *usageID)
 {
-virSecretPtr ret = NULL;
+g_autoptr(virSecret) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckConnectGoto(conn, error);
-virCheckNonNullArgGoto(uuid, error);
+virCheckConnectReturn(conn, NULL);
+virCheckNonNullArgReturn(uuid, NULL);
 
-if (!(ret = virObjectNew(virSecretClass)))
-return NULL;
+ret = 

[PATCH 35/36] conf: convert virSaveCookie to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/snapshot_conf.c |  3 ++-
 src/conf/snapshot_conf.h |  2 +-
 src/conf/virsavecookie.c | 10 
 src/conf/virsavecookie.h | 14 +--
 src/qemu/qemu_domain.c   | 53 +++-
 src/qemu/qemu_domain.h   | 12 ++---
 src/qemu/qemu_driver.c   |  8 +++---
 7 files changed, 52 insertions(+), 50 deletions(-)

diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index 37b5c2fdf7..b58c00e86e 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -129,7 +129,8 @@ virDomainSnapshotDefDispose(void *obj)
 for (i = 0; i < def->ndisks; i++)
 virDomainSnapshotDiskDefClear(>disks[i]);
 VIR_FREE(def->disks);
-virObjectUnref(def->cookie);
+if (def->cookie)
+g_object_unref(def->cookie);
 }
 
 int
diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
index b5b1ef2718..97a7b3b4e5 100644
--- a/src/conf/snapshot_conf.h
+++ b/src/conf/snapshot_conf.h
@@ -84,7 +84,7 @@ struct _virDomainSnapshotDef {
 size_t ndisks; /* should not exceed dom->ndisks */
 virDomainSnapshotDiskDef *disks;
 
-virObjectPtr cookie;
+GObject *cookie;
 };
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainSnapshotDef, virObjectUnref);
diff --git a/src/conf/virsavecookie.c b/src/conf/virsavecookie.c
index bdc22bb324..6cdfa4fc5a 100644
--- a/src/conf/virsavecookie.c
+++ b/src/conf/virsavecookie.c
@@ -34,7 +34,7 @@ VIR_LOG_INIT("conf.savecookie");
 
 static int
 virSaveCookieParseNode(xmlXPathContextPtr ctxt,
-   virObjectPtr *obj,
+   GObject **obj,
virSaveCookieCallbacksPtr saveCookie)
 {
 *obj = NULL;
@@ -54,7 +54,7 @@ virSaveCookieParseNode(xmlXPathContextPtr ctxt,
 
 int
 virSaveCookieParse(xmlXPathContextPtr ctxt,
-   virObjectPtr *obj,
+   GObject **obj,
virSaveCookieCallbacksPtr saveCookie)
 {
 xmlNodePtr node = ctxt->node;
@@ -77,7 +77,7 @@ virSaveCookieParse(xmlXPathContextPtr ctxt,
 
 int
 virSaveCookieParseString(const char *xml,
- virObjectPtr *obj,
+ GObject **obj,
  virSaveCookieCallbacksPtr saveCookie)
 {
 xmlDocPtr doc = NULL;
@@ -105,7 +105,7 @@ virSaveCookieParseString(const char *xml,
 
 int
 virSaveCookieFormatBuf(virBufferPtr buf,
-   virObjectPtr obj,
+   GObject *obj,
virSaveCookieCallbacksPtr saveCookie)
 {
 if (!obj || !saveCookie || !saveCookie->format)
@@ -125,7 +125,7 @@ virSaveCookieFormatBuf(virBufferPtr buf,
 
 
 char *
-virSaveCookieFormat(virObjectPtr obj,
+virSaveCookieFormat(GObject *obj,
 virSaveCookieCallbacksPtr saveCookie)
 {
 virBuffer buf = VIR_BUFFER_INITIALIZER;
diff --git a/src/conf/virsavecookie.h b/src/conf/virsavecookie.h
index eafffbed66..b17701c727 100644
--- a/src/conf/virsavecookie.h
+++ b/src/conf/virsavecookie.h
@@ -23,14 +23,14 @@
 #include 
 
 #include "internal.h"
-#include "virobject.h"
 #include "virbuffer.h"
+#include 
 
 
 typedef int (*virSaveCookieParseFunc)(xmlXPathContextPtr ctxt,
-  virObjectPtr *obj);
+  GObject **obj);
 typedef int (*virSaveCookieFormatFunc)(virBufferPtr buf,
-   virObjectPtr obj);
+   GObject *obj);
 
 typedef struct _virSaveCookieCallbacks virSaveCookieCallbacks;
 typedef virSaveCookieCallbacks *virSaveCookieCallbacksPtr;
@@ -42,19 +42,19 @@ struct _virSaveCookieCallbacks {
 
 int
 virSaveCookieParse(xmlXPathContextPtr ctxt,
-   virObjectPtr *obj,
+   GObject **obj,
virSaveCookieCallbacksPtr saveCookie);
 
 int
 virSaveCookieParseString(const char *xml,
- virObjectPtr *obj,
+ GObject **obj,
  virSaveCookieCallbacksPtr saveCookie);
 
 int
 virSaveCookieFormatBuf(virBufferPtr buf,
-   virObjectPtr obj,
+   GObject *obj,
virSaveCookieCallbacksPtr saveCookie);
 
 char *
-virSaveCookieFormat(virObjectPtr obj,
+virSaveCookieFormat(GObject *obj,
 virSaveCookieCallbacksPtr saveCookie);
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index eb0403031d..a12ecc0e25 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -162,21 +162,12 @@ struct _qemuDomainLogContext {
 };
 
 G_DEFINE_TYPE(qemuDomainLogContext, qemu_domain_log_context, G_TYPE_OBJECT);
-static virClassPtr qemuDomainSaveCookieClass;
+G_DEFINE_TYPE(qemuDomainSaveCookie, qemu_domain_save_cookie, G_TYPE_OBJECT);
 
 static void qemuDomainLogContextFinalize(GObject *obj);
-static void qemuDomainSaveCookieDispose(void *obj);
+static void qemuDomainSaveCookieFinalize(GObject *obj);
 
 
-static int

[PATCH 29/36] libxl: convert libxlDriverConfig to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/libxl/libxl_conf.c  |  51 ++-
 src/libxl/libxl_conf.h  |  12 ++-
 src/libxl/libxl_driver.c| 163 +---
 src/libxl/libxl_migration.c |  21 ++---
 tests/testutilsxen.c|   3 +-
 5 files changed, 98 insertions(+), 152 deletions(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index d9377438d9..547868c6e8 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -52,23 +52,27 @@
 VIR_LOG_INIT("libxl.libxl_conf");
 
 
-static virClassPtr libxlDriverConfigClass;
-static void libxlDriverConfigDispose(void *obj);
+G_DEFINE_TYPE(libxlDriverConfig, libxl_driver_config, G_TYPE_OBJECT);
 
-static int libxlConfigOnceInit(void)
-{
-if (!VIR_CLASS_NEW(libxlDriverConfig, virClassForObject()))
-return -1;
+static void libxlDriverConfigFinalize(GObject *obj);
 
-return 0;
+static void
+libxl_driver_config_init(libxlDriverConfig *cfg G_GNUC_UNUSED)
+{
 }
 
-VIR_ONCE_GLOBAL_INIT(libxlConfig);
+static void
+libxl_driver_config_class_init(libxlDriverConfigClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = libxlDriverConfigFinalize;
+}
 
 static void
-libxlDriverConfigDispose(void *obj)
+libxlDriverConfigFinalize(GObject *obj)
 {
-libxlDriverConfigPtr cfg = obj;
+libxlDriverConfigPtr cfg = LIBXL_DRIVER_CONFIG(obj);
 
 if (cfg->caps)
 g_object_unref(cfg->caps);
@@ -87,6 +91,8 @@ libxlDriverConfigDispose(void *obj)
 VIR_FREE(cfg->lockManagerName);
 VIR_FREE(cfg->channelDir);
 virFirmwareFreeList(cfg->firmwares, cfg->nfirmwares);
+
+G_OBJECT_CLASS(libxl_driver_config_parent_class)->finalize(obj);
 }
 
 
@@ -1685,13 +1691,8 @@ libxlGetAutoballoonConf(libxlDriverConfigPtr cfg,
 libxlDriverConfigPtr
 libxlDriverConfigNew(void)
 {
-libxlDriverConfigPtr cfg;
-
-if (libxlConfigInitialize() < 0)
-return NULL;
-
-if (!(cfg = virObjectNew(libxlDriverConfigClass)))
-return NULL;
+g_autoptr(libxlDriverConfig) cfg =
+LIBXL_DRIVER_CONFIG(g_object_new(LIBXL_TYPE_DRIVER_CONFIG, NULL));
 
 cfg->configBaseDir = g_strdup(LIBXL_CONFIG_BASE_DIR);
 cfg->configDir = g_strdup(LIBXL_CONFIG_DIR);
@@ -1707,34 +1708,30 @@ libxlDriverConfigNew(void)
 if (virFirmwareParseList(DEFAULT_LOADER_NVRAM,
  >firmwares,
  >nfirmwares) < 0)
-goto error;
+return NULL;
 
 #else
 if (VIR_ALLOC_N(cfg->firmwares, 1) < 0)
-goto error;
+return NULL;
 cfg->nfirmwares = 1;
 if (VIR_ALLOC(cfg->firmwares[0]) < 0)
-goto error;
+return NULL;
 cfg->firmwares[0]->name = g_strdup(LIBXL_FIRMWARE_DIR "/ovmf.bin");
 #endif
 
 /* Always add hvmloader to firmwares */
 if (VIR_REALLOC_N(cfg->firmwares, cfg->nfirmwares + 1) < 0)
-goto error;
+return NULL;
 cfg->nfirmwares++;
 if (VIR_ALLOC(cfg->firmwares[cfg->nfirmwares - 1]) < 0)
-goto error;
+return NULL;
 cfg->firmwares[cfg->nfirmwares - 1]->name = g_strdup(LIBXL_FIRMWARE_DIR 
"/hvmloader");
 
 /* defaults for keepalive messages */
 cfg->keepAliveInterval = 5;
 cfg->keepAliveCount = 5;
 
-return cfg;
-
- error:
-virObjectUnref(cfg);
-return NULL;
+return g_steal_pointer();
 }
 
 int
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index 07b3373170..94386cc8cc 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -37,6 +37,7 @@
 #include "virfirmware.h"
 #include "libxl_capabilities.h"
 #include "libxl_logger.h"
+#include 
 
 #define LIBXL_DRIVER_NAME "xenlight"
 #define LIBXL_VNC_PORT_MIN  5900
@@ -60,11 +61,17 @@
 typedef struct _libxlDriverPrivate libxlDriverPrivate;
 typedef libxlDriverPrivate *libxlDriverPrivatePtr;
 
-typedef struct _libxlDriverConfig libxlDriverConfig;
+#define LIBXL_TYPE_DRIVER_CONFIG libxl_driver_config_get_type()
+G_DECLARE_FINAL_TYPE(libxlDriverConfig,
+ libxl_driver_config,
+ LIBXL,
+ DRIVER_CONFIG,
+ GObject);
+
 typedef libxlDriverConfig *libxlDriverConfigPtr;
 
 struct _libxlDriverConfig {
-virObject parent;
+GObject parent;
 
 const libxl_version_info *verInfo;
 unsigned int version;
@@ -102,7 +109,6 @@ struct _libxlDriverConfig {
 size_t nfirmwares;
 };
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(libxlDriverConfig, virObjectUnref);
 
 
 struct _libxlDriverPrivate {
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index bd43f3310e..eab8945e48 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -390,7 +390,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
 {
 libxlDriverPrivatePtr driver = opaque;
 libxlDomainObjPrivatePtr priv = vm->privateData;
-libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
+g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
 int rc;
 

[PATCH 23/36] datatypes: convert virStorageVol to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virstorageobj.c |  8 +-
 src/datatypes.c  | 48 ++--
 src/datatypes.h  | 15 +--
 src/libvirt-storage.c|  6 ++---
 src/libvirt_private.syms |  1 -
 src/qemu/qemu_migration.c|  3 +--
 src/storage/storage_driver.c |  7 +++---
 src/vz/vz_sdk.c  | 19 ++
 8 files changed, 58 insertions(+), 49 deletions(-)

diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
index bff6eb6ae1..698fc25c5f 100644
--- a/src/conf/virstorageobj.c
+++ b/src/conf/virstorageobj.c
@@ -1052,7 +1052,13 @@ virStoragePoolObjVolumeListExport(virConnectPtr conn,
 return data.nvols;
 
  error:
-virObjectListFree(data.vols);
+if (data.vols) {
+while (data.nvols--) {
+if (data.vols[data.nvols])
+g_object_unref(data.vols[data.nvols]);
+}
+VIR_FREE(data.vols);
+}
 return -1;
 }
 
diff --git a/src/datatypes.c b/src/datatypes.c
index e434c31785..1f811e5f5e 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -39,7 +39,6 @@ virClassPtr virDomainClass;
 virClassPtr virNodeDeviceClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
-virClassPtr virStorageVolClass;
 
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
@@ -47,7 +46,6 @@ static void virDomainDispose(void *obj);
 static void virNodeDeviceDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
-static void virStorageVolDispose(void *obj);
 
 G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT);
 static void virDomainCheckpointFinalize(GObject *obj);
@@ -177,6 +175,22 @@ vir_storage_pool_class_init(virStoragePoolClass *klass)
 obj->finalize = virStoragePoolFinalize;
 }
 
+G_DEFINE_TYPE(virStorageVol, vir_storage_vol, G_TYPE_OBJECT);
+static void virStorageVolFinalize(GObject *obj);
+
+static void
+vir_storage_vol_init(virStorageVol *vol G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_storage_vol_class_init(virStorageVolClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virStorageVolFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -232,7 +246,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS(virNodeDevice);
 DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
-DECLARE_CLASS(virStorageVol);
 
 DECLARE_CLASS_LOCKABLE(virAdmConnect);
 DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
@@ -713,7 +726,7 @@ virStoragePoolFinalize(GObject *obj)
  * @freeFunc: private data cleanup function pointer specific to driver
  *
  * Allocates a new storage volume object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the storage volume object, or NULL on error.
  */
@@ -721,18 +734,17 @@ virStorageVolPtr
 virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
  const char *key, void *privateData, virFreeCallback freeFunc)
 {
-virStorageVolPtr ret = NULL;
+g_autoptr(virStorageVol) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckConnectGoto(conn, error);
-virCheckNonNullArgGoto(pool, error);
-virCheckNonNullArgGoto(name, error);
-virCheckNonNullArgGoto(key, error);
+virCheckConnectReturn(conn, NULL);
+virCheckNonNullArgReturn(pool, NULL);
+virCheckNonNullArgReturn(name, NULL);
+virCheckNonNullArgReturn(key, NULL);
 
-if (!(ret = virObjectNew(virStorageVolClass)))
-goto error;
+ret = VIR_STORAGE_VOL(g_object_new(VIR_TYPE_STORAGE_VOL, NULL));
 
 ret->pool = g_strdup(pool);
 ret->name = g_strdup(name);
@@ -744,16 +756,12 @@ virGetStorageVol(virConnectPtr conn, const char *pool, 
const char *name,
 ret->privateData = privateData;
 ret->privateDataFreeFunc = freeFunc;
 
-return ret;
-
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 
 /**
- * virStorageVolDispose:
+ * virStorageVolFinalize:
  * @obj: the storage volume to release
  *
  * Unconditionally release all memory associated with a volume.
@@ -763,9 +771,9 @@ virGetStorageVol(virConnectPtr conn, const char *pool, 
const char *name,
  * which may also be released if its ref count hits zero.
  */
 static void
-virStorageVolDispose(void *obj)
+virStorageVolFinalize(GObject *obj)
 {
-virStorageVolPtr vol = obj;
+virStorageVolPtr vol = VIR_STORAGE_VOL(obj);
 VIR_DEBUG("release vol %p %s", vol, vol->name);
 
 if (vol->privateDataFreeFunc)
@@ -775,6 +783,8 @@ virStorageVolDispose(void *obj)
 VIR_FREE(vol->name);
 VIR_FREE(vol->pool);
 virObjectUnref(vol->conn);
+
+G_OBJECT_CLASS(vir_storage_vol_parent_class)->finalize(obj);
 }
 
 

[PATCH 18/36] datatypes: convert virNWFilterBinding to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virnwfilterbindingobjlist.c |  6 +++-
 src/datatypes.c  | 44 +---
 src/datatypes.h  | 14 ++---
 src/libvirt-nwfilter.c   |  7 ++---
 src/nwfilter/nwfilter_driver.c   |  3 +-
 5 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/src/conf/virnwfilterbindingobjlist.c 
b/src/conf/virnwfilterbindingobjlist.c
index 97e4d3c49b..110403bfcc 100644
--- a/src/conf/virnwfilterbindingobjlist.c
+++ b/src/conf/virnwfilterbindingobjlist.c
@@ -489,7 +489,11 @@ 
virNWFilterBindingObjListExport(virNWFilterBindingObjListPtr bindings,
  cleanup:
 virObjectListFreeCount(bindingobjs, nbindings);
 if (ret < 0) {
-virObjectListFreeCount(*bindinglist, nbindings);
+for (i = 0; i < nbindings; i++) {
+if ((*bindinglist)[i])
+g_object_unref((*bindinglist)[i]);
+}
+VIR_FREE(*bindinglist);
 *bindinglist = NULL;
 }
 return ret;
diff --git a/src/datatypes.c b/src/datatypes.c
index d4f60db2be..b9879cfb9e 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -40,7 +40,6 @@ virClassPtr virInterfaceClass;
 virClassPtr virNetworkClass;
 virClassPtr virNetworkPortClass;
 virClassPtr virNodeDeviceClass;
-virClassPtr virNWFilterBindingClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
 virClassPtr virStorageVolClass;
@@ -53,7 +52,6 @@ static void virInterfaceDispose(void *obj);
 static void virNetworkDispose(void *obj);
 static void virNetworkPortDispose(void *obj);
 static void virNodeDeviceDispose(void *obj);
-static void virNWFilterBindingDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
 static void virStorageVolDispose(void *obj);
@@ -107,6 +105,22 @@ vir_nw_filter_class_init(virNWFilterClass *klass)
 obj->finalize = virNWFilterFinalize;
 }
 
+G_DEFINE_TYPE(virNWFilterBinding, vir_nw_filter_binding, G_TYPE_OBJECT);
+static void virNWFilterBindingFinalize(GObject *obj);
+
+static void
+vir_nw_filter_binding_init(virNWFilterBinding *bdg G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_nw_filter_binding_class_init(virNWFilterBindingClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virNWFilterBindingFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -163,7 +177,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS(virNetwork);
 DECLARE_CLASS(virNetworkPort);
 DECLARE_CLASS(virNodeDevice);
-DECLARE_CLASS(virNWFilterBinding);
 DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
 DECLARE_CLASS(virStorageVol);
@@ -958,7 +971,7 @@ virNWFilterFinalize(GObject *obj)
  * @filtername: name of the network filter
  *
  * Allocates a new network filter binding object. When the object is no longer
- * needed, virObjectUnref() must be called in order to not leak data.
+ * needed, g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the network filter binding object, or NULL on error.
  */
@@ -966,16 +979,15 @@ virNWFilterBindingPtr
 virGetNWFilterBinding(virConnectPtr conn, const char *portdev,
   const char *filtername)
 {
-virNWFilterBindingPtr ret = NULL;
+g_autoptr(virNWFilterBinding) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckConnectGoto(conn, error);
-virCheckNonNullArgGoto(portdev, error);
+virCheckConnectReturn(conn, NULL);
+virCheckNonNullArgReturn(portdev, NULL);
 
-if (!(ret = virObjectNew(virNWFilterBindingClass)))
-goto error;
+ret = VIR_NW_FILTER_BINDING(g_object_new(VIR_TYPE_NW_FILTER_BINDING, 
NULL));
 
 ret->portdev = g_strdup(portdev);
 
@@ -983,16 +995,12 @@ virGetNWFilterBinding(virConnectPtr conn, const char 
*portdev,
 
 ret->conn = virObjectRef(conn);
 
-return ret;
-
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 
 /**
- * virNWFilterBindingDispose:
+ * virNWFilterBindingFinalize:
  * @obj: the network filter binding to release
  *
  * Unconditionally release all memory associated with a nwfilter binding.
@@ -1002,15 +1010,17 @@ virGetNWFilterBinding(virConnectPtr conn, const char 
*portdev,
  * which may also be released if its ref count hits zero.
  */
 static void
-virNWFilterBindingDispose(void *obj)
+virNWFilterBindingFinalize(GObject *obj)
 {
-virNWFilterBindingPtr binding = obj;
+virNWFilterBindingPtr binding = VIR_NW_FILTER_BINDING(obj);
 
 VIR_DEBUG("release binding %p %s", binding, binding->portdev);
 
 VIR_FREE(binding->portdev);
 VIR_FREE(binding->filtername);
 virObjectUnref(binding->conn);
+
+G_OBJECT_CLASS(vir_nw_filter_binding_parent_class)->finalize(obj);
 }
 
 
diff --git a/src/datatypes.h b/src/datatypes.h
index e8bd9bf1e5..87c6a1366e 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -36,7 +36,6 @@ 

[PATCH 28/36] lxc: convert virLXCDriverConfig to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/lxc/lxc_conf.c| 31 +-
 src/lxc/lxc_conf.h| 10 +++--
 src/lxc/lxc_driver.c  | 51 +++
 src/lxc/lxc_process.c | 33 +---
 4 files changed, 51 insertions(+), 74 deletions(-)

diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index cfb80eaf22..243020f9f1 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -42,19 +42,20 @@
 
 VIR_LOG_INIT("lxc.lxc_conf");
 
-static virClassPtr virLXCDriverConfigClass;
-static void virLXCDriverConfigDispose(void *obj);
+G_DEFINE_TYPE(virLXCDriverConfig, vir_lxc_driver_config, G_TYPE_OBJECT);
 
-static int virLXCConfigOnceInit(void)
-{
-if (!VIR_CLASS_NEW(virLXCDriverConfig, virClassForObject()))
-return -1;
+static void virLXCDriverConfigFinalize(GObject *obj);
 
-return 0;
+static void vir_lxc_driver_config_init(virLXCDriverConfig *cfg G_GNUC_UNUSED)
+{
 }
 
-VIR_ONCE_GLOBAL_INIT(virLXCConfig);
+static void vir_lxc_driver_config_class_init(virLXCDriverConfigClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
 
+obj->finalize = virLXCDriverConfigFinalize;
+}
 
 /* Functions */
 virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver)
@@ -227,11 +228,7 @@ virLXCDriverConfigNew(void)
 {
 virLXCDriverConfigPtr cfg;
 
-if (virLXCConfigInitialize() < 0)
-return NULL;
-
-if (!(cfg = virObjectNew(virLXCDriverConfigClass)))
-return NULL;
+cfg = VIR_LXC_DRIVER_CONFIG(g_object_new(VIR_TYPE_LXC_DRIVER_CONFIG, 
NULL));
 
 cfg->securityDefaultConfined = false;
 cfg->securityRequireConfined = false;
@@ -278,19 +275,21 @@ virLXCDriverConfigPtr 
virLXCDriverGetConfig(virLXCDriverPtr driver)
 {
 virLXCDriverConfigPtr cfg;
 lxcDriverLock(driver);
-cfg = virObjectRef(driver->config);
+cfg = g_object_ref(driver->config);
 lxcDriverUnlock(driver);
 return cfg;
 }
 
 static void
-virLXCDriverConfigDispose(void *obj)
+virLXCDriverConfigFinalize(GObject *obj)
 {
-virLXCDriverConfigPtr cfg = obj;
+virLXCDriverConfigPtr cfg = VIR_LXC_DRIVER_CONFIG(obj);
 
 VIR_FREE(cfg->configDir);
 VIR_FREE(cfg->autostartDir);
 VIR_FREE(cfg->stateDir);
 VIR_FREE(cfg->logDir);
 VIR_FREE(cfg->securityDriverName);
+
+G_OBJECT_CLASS(vir_lxc_driver_config_parent_class)->finalize(obj);
 }
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h
index f2f0e0a570..5ed84f79c7 100644
--- a/src/lxc/lxc_conf.h
+++ b/src/lxc/lxc_conf.h
@@ -34,6 +34,7 @@
 #include "virusb.h"
 #include "virclosecallbacks.h"
 #include "virhostdev.h"
+#include 
 
 #define LXC_DRIVER_NAME "LXC"
 
@@ -45,11 +46,16 @@
 typedef struct _virLXCDriver virLXCDriver;
 typedef virLXCDriver *virLXCDriverPtr;
 
-typedef struct _virLXCDriverConfig virLXCDriverConfig;
+#define VIR_TYPE_LXC_DRIVER_CONFIG vir_lxc_driver_config_get_type()
+G_DECLARE_FINAL_TYPE(virLXCDriverConfig,
+ vir_lxc_driver_config,
+ VIR,
+ LXC_DRIVER_CONFIG,
+ GObject);
 typedef virLXCDriverConfig *virLXCDriverConfigPtr;
 
 struct _virLXCDriverConfig {
-virObject parent;
+GObject parent;
 
 char *configDir;
 char *autostartDir;
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 5da9ec7c58..07bc7219f1 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -400,7 +400,7 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
 virDomainPtr dom = NULL;
 virObjectEventPtr event = NULL;
 virDomainDefPtr oldDef = NULL;
-virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
+g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver);
 g_autoptr(virCaps) caps = NULL;
 unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
 
@@ -458,7 +458,6 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flags)
 virDomainDefFree(oldDef);
 virDomainObjEndAPI();
 virObjectEventStateQueue(driver->domainEventState, event);
-virObjectUnref(cfg);
 return dom;
 }
 
@@ -475,7 +474,7 @@ static int lxcDomainUndefineFlags(virDomainPtr dom,
 virDomainObjPtr vm;
 virObjectEventPtr event = NULL;
 int ret = -1;
-virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
+g_autoptr(virLXCDriverConfig) cfg = virLXCDriverGetConfig(driver);
 
 virCheckFlags(0, -1);
 
@@ -510,7 +509,6 @@ static int lxcDomainUndefineFlags(virDomainPtr dom,
  cleanup:
 virDomainObjEndAPI();
 virObjectEventStateQueue(driver->domainEventState, event);
-virObjectUnref(cfg);
 return ret;
 }
 
@@ -638,7 +636,7 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, 
unsigned long newmem,
 int ret = -1;
 virLXCDomainObjPrivatePtr priv;
 virLXCDriverPtr driver = dom->conn->privateData;
-virLXCDriverConfigPtr cfg = NULL;
+g_autoptr(virLXCDriverConfig) cfg = NULL;
 
 virCheckFlags(VIR_DOMAIN_AFFECT_LIVE 

[PATCH 30/36] hypervisor: convert virHostdevManager to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/hypervisor/virhostdev.c | 31 +--
 src/hypervisor/virhostdev.h | 13 +
 src/libxl/libxl_driver.c|  3 ++-
 src/lxc/lxc_driver.c|  3 ++-
 src/qemu/qemu_driver.c  |  3 ++-
 5 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
index 9017cc3be8..83298e7674 100644
--- a/src/hypervisor/virhostdev.c
+++ b/src/hypervisor/virhostdev.c
@@ -44,8 +44,21 @@ VIR_LOG_INIT("util.hostdev");
 
 static virHostdevManagerPtr manager; /* global hostdev manager, never freed */
 
-static virClassPtr virHostdevManagerClass;
-static void virHostdevManagerDispose(void *obj);
+G_DEFINE_TYPE(virHostdevManager, vir_hostdev_manager, G_TYPE_OBJECT);
+
+static void virHostdevManagerFinalize(GObject *obj);
+
+static void vir_hostdev_manager_init(virHostdevManager *mgr G_GNUC_UNUSED)
+{
+}
+
+static void vir_hostdev_manager_class_init(virHostdevManagerClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virHostdevManagerFinalize;
+}
+
 static virHostdevManagerPtr virHostdevManagerNew(void);
 
 struct virHostdevIsPCINodeDeviceUsedData {
@@ -112,9 +125,6 @@ static int 
virHostdevIsPCINodeDeviceUsed(virPCIDeviceAddressPtr devAddr, void *o
 
 static int virHostdevManagerOnceInit(void)
 {
-if (!VIR_CLASS_NEW(virHostdevManager, virClassForObject()))
-return -1;
-
 if (!(manager = virHostdevManagerNew()))
 return -1;
 
@@ -124,9 +134,9 @@ static int virHostdevManagerOnceInit(void)
 VIR_ONCE_GLOBAL_INIT(virHostdevManager);
 
 static void
-virHostdevManagerDispose(void *obj)
+virHostdevManagerFinalize(GObject *obj)
 {
-virHostdevManagerPtr hostdevMgr = obj;
+virHostdevManagerPtr hostdevMgr = VIR_HOSTDEV_MANAGER(obj);
 
 virObjectUnref(hostdevMgr->activePCIHostdevs);
 virObjectUnref(hostdevMgr->inactivePCIHostdevs);
@@ -136,6 +146,8 @@ virHostdevManagerDispose(void *obj)
 virObjectUnref(hostdevMgr->activeMediatedHostdevs);
 virObjectUnref(hostdevMgr->activeNVMeHostdevs);
 VIR_FREE(hostdevMgr->stateDir);
+
+G_OBJECT_CLASS(vir_hostdev_manager_parent_class)->finalize(obj);
 }
 
 static virHostdevManagerPtr
@@ -144,8 +156,7 @@ virHostdevManagerNew(void)
 g_autoptr(virHostdevManager) hostdevMgr = NULL;
 bool privileged = geteuid() == 0;
 
-if (!(hostdevMgr = virObjectNew(virHostdevManagerClass)))
-return NULL;
+hostdevMgr = VIR_HOSTDEV_MANAGER(g_object_new(VIR_TYPE_HOSTDEV_MANAGER, 
NULL));
 
 if (!(hostdevMgr->activePCIHostdevs = virPCIDeviceListNew()))
 return NULL;
@@ -206,7 +217,7 @@ virHostdevManagerGetDefault(void)
 if (virHostdevManagerInitialize() < 0)
 return NULL;
 
-return virObjectRef(manager);
+return g_object_ref(manager);
 }
 
 /**
diff --git a/src/hypervisor/virhostdev.h b/src/hypervisor/virhostdev.h
index 811bda40ed..be5345992c 100644
--- a/src/hypervisor/virhostdev.h
+++ b/src/hypervisor/virhostdev.h
@@ -30,6 +30,7 @@
 #include "conf/domain_conf.h"
 #include "virmdev.h"
 #include "virnvme.h"
+#include 
 
 typedef enum {
 VIR_HOSTDEV_STRICT_ACS_CHECK = (1 << 0), /* strict acs check */
@@ -41,10 +42,8 @@ typedef enum {
 } virHostdevFlag;
 
 
-typedef struct _virHostdevManager virHostdevManager;
-typedef virHostdevManager *virHostdevManagerPtr;
 struct _virHostdevManager {
-virObject parent;
+GObject parent;
 
 char *stateDir;
 
@@ -59,7 +58,13 @@ struct _virHostdevManager {
 virNVMeDeviceListPtr activeNVMeHostdevs;
 };
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(virHostdevManager, virObjectUnref);
+#define VIR_TYPE_HOSTDEV_MANAGER vir_hostdev_manager_get_type()
+G_DECLARE_FINAL_TYPE(virHostdevManager,
+ vir_hostdev_manager,
+ VIR,
+ HOSTDEV_MANAGER,
+ GObject);
+typedef virHostdevManager *virHostdevManagerPtr;
 
 
 virHostdevManagerPtr virHostdevManagerGetDefault(void);
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index eab8945e48..313918acde 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -505,7 +505,8 @@ libxlStateCleanup(void)
 if (!libxl_driver)
 return -1;
 
-virObjectUnref(libxl_driver->hostdevMgr);
+if (libxl_driver->hostdevMgr)
+g_object_unref(libxl_driver->hostdevMgr);
 if (libxl_driver->xmlopt)
 g_object_unref(libxl_driver->xmlopt);
 virObjectUnref(libxl_driver->domains);
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 07bc7219f1..86f84fd152 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -1603,7 +1603,8 @@ static int lxcStateCleanup(void)
 
 virSysinfoDefFree(lxc_driver->hostsysinfo);
 
-virObjectUnref(lxc_driver->hostdevMgr);
+if (lxc_driver->hostdevMgr)
+g_object_unref(lxc_driver->hostdevMgr);
 if (lxc_driver->caps)
 g_object_unref(lxc_driver->caps);
 

[PATCH 34/36] conf: convert virDomain*Private to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/domain_conf.c|  29 ++--
 src/conf/domain_conf.h|  18 +-
 src/qemu/qemu_domain.c| 347 --
 src/qemu/qemu_domain.h| 145 +++-
 src/util/virstoragefile.h |   3 +-
 5 files changed, 281 insertions(+), 261 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f3a8a36eb2..eb5155f612 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1768,7 +1768,8 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
 virDomainGraphicsListenDefClear(>listens[i]);
 VIR_FREE(def->listens);
 
-virObjectUnref(def->privateData);
+if (def->privateData)
+g_object_unref(def->privateData);
 VIR_FREE(def);
 }
 
@@ -1816,7 +1817,7 @@ static virDomainVcpuDefPtr
 virDomainVcpuDefNew(virDomainXMLOptionPtr xmlopt)
 {
 virDomainVcpuDefPtr ret = NULL;
-g_autoptr(virObject) priv = NULL;
+g_autoptr(GObject) priv = NULL;
 
 if (xmlopt && xmlopt->privateData.vcpuNew &&
 !(priv = xmlopt->privateData.vcpuNew()))
@@ -1839,7 +1840,8 @@ virDomainVcpuDefFree(virDomainVcpuDefPtr info)
 
 virBitmapFree(info->cpumask);
 info->cpumask = NULL;
-virObjectUnref(info->privateData);
+if (info->privateData)
+g_object_unref(info->privateData);
 VIR_FREE(info);
 }
 
@@ -2141,7 +2143,8 @@ virDomainDiskDefFree(virDomainDiskDefPtr def)
 VIR_FREE(def->blkdeviotune.group_name);
 VIR_FREE(def->virtio);
 virDomainDeviceInfoClear(>info);
-virObjectUnref(def->privateData);
+if (def->privateData)
+g_object_unref(def->privateData);
 
 VIR_FREE(def);
 }
@@ -2343,7 +2346,8 @@ void virDomainFSDefFree(virDomainFSDefPtr def)
 VIR_FREE(def->dst);
 virDomainDeviceInfoClear(>info);
 VIR_FREE(def->virtio);
-virObjectUnref(def->privateData);
+if (def->privateData)
+g_object_unref(def->privateData);
 VIR_FREE(def->binary);
 
 VIR_FREE(def);
@@ -2404,7 +2408,8 @@ virDomainVsockDefFree(virDomainVsockDefPtr vsock)
 if (!vsock)
 return;
 
-virObjectUnref(vsock->privateData);
+if (vsock->privateData)
+g_object_unref(vsock->privateData);
 virDomainDeviceInfoClear(>info);
 VIR_FREE(vsock);
 }
@@ -2492,7 +2497,8 @@ virDomainNetDefFree(virDomainNetDefPtr def)
 if (!def)
 return;
 virDomainNetDefClear(def);
-virObjectUnref(def->privateData);
+if (def->privateData)
+g_object_unref(def->privateData);
 VIR_FREE(def);
 }
 
@@ -2635,7 +2641,8 @@ virDomainChrSourceDefFinalize(GObject *obj)
 size_t i;
 
 virDomainChrSourceDefClear(def);
-virObjectUnref(def->privateData);
+if (def->privateData)
+g_object_unref(def->privateData);
 
 if (def->seclabels) {
 for (i = 0; i < def->nseclabels; i++)
@@ -2881,7 +2888,8 @@ virDomainVideoDefClear(virDomainVideoDefPtr def)
 if (def->driver)
 VIR_FREE(def->driver->vhost_user_binary);
 VIR_FREE(def->driver);
-virObjectUnref(def->privateData);
+if (def->privateData)
+g_object_unref(def->privateData);
 
 memset(def, 0, sizeof(*def));
 }
@@ -26996,7 +27004,8 @@ virDomainRNGDefFree(virDomainRNGDefPtr def)
 VIR_FREE(def->source.file);
 break;
 case VIR_DOMAIN_RNG_BACKEND_EGD:
-virObjectUnref(def->source.chardev);
+if (def->source.chardev)
+g_object_unref(def->source.chardev);
 break;
 case VIR_DOMAIN_RNG_BACKEND_BUILTIN:
 case VIR_DOMAIN_RNG_BACKEND_LAST:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index b6b2a72dd4..ab1e763ab1 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -528,7 +528,7 @@ typedef enum {
 struct _virDomainDiskDef {
 virStorageSourcePtr src; /* non-NULL.  XXX Allow NULL for empty cdrom? */
 
-virObjectPtr privateData;
+GObject *privateData;
 
 int device; /* enum virDomainDiskDevice */
 int bus; /* enum virDomainDiskBus */
@@ -837,7 +837,7 @@ struct _virDomainFSDef {
 virTristateSwitch posix_lock;
 virTristateSwitch flock;
 virDomainVirtioOptionsPtr virtio;
-virObjectPtr privateData;
+GObject *privateData;
 };
 
 
@@ -1056,7 +1056,7 @@ struct _virDomainNetDef {
 unsigned int mtu;
 virNetDevCoalescePtr coalesce;
 virDomainVirtioOptionsPtr virtio;
-virObjectPtr privateData;
+GObject *privateData;
 };
 
 typedef enum {
@@ -1175,7 +1175,7 @@ struct _virDomainChrSourceReconnectDef {
 struct _virDomainChrSourceDef {
 GObject parent;
 int type; /* virDomainChrType */
-virObjectPtr privateData;
+GObject *privateData;
 union {
 /* no  for null, vc, stdio */
 struct {
@@ -1478,7 +1478,7 @@ struct _virDomainVideoDriverDef {
 };
 
 struct _virDomainVideoDef {
-virObjectPtr privateData;
+GObject *privateData;
 
 int type;   /* enum virDomainVideoType */
 unsigned int ram;  /* kibibytes (multiples of 1024) */
@@ 

[PATCH 21/36] datatypes: convert virInterface to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virinterfaceobj.c  |  7 ++--
 src/datatypes.c | 44 +++--
 src/datatypes.h | 10 +++---
 src/interface/interface_backend_netcf.c |  2 +-
 src/interface/interface_backend_udev.c  |  2 +-
 src/libvirt-interface.c |  6 ++--
 src/libvirt_private.syms|  1 -
 7 files changed, 42 insertions(+), 30 deletions(-)

diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c
index 43ba395d2b..da6c56862b 100644
--- a/src/conf/virinterfaceobj.c
+++ b/src/conf/virinterfaceobj.c
@@ -338,9 +338,10 @@ virInterfaceObjListExport(virConnectPtr conn,
 ret = data.nifaces;
  cleanup:
 virObjectRWUnlock(ifaceobjs);
-while (data.ifaces && data.nifaces)
-virObjectUnref(data.ifaces[--data.nifaces]);
-
+while (data.ifaces && data.nifaces) {
+if (data.ifaces[--data.nifaces])
+g_object_unref(data.ifaces[data.nifaces]);
+}
 VIR_FREE(data.ifaces);
 return ret;
 }
diff --git a/src/datatypes.c b/src/datatypes.c
index e715c37306..f1bcca44f1 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -36,7 +36,6 @@ VIR_LOG_INIT("datatypes");
 virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
-virClassPtr virInterfaceClass;
 virClassPtr virNodeDeviceClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
@@ -46,7 +45,6 @@ virClassPtr virStoragePoolClass;
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
-static void virInterfaceDispose(void *obj);
 static void virNodeDeviceDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
@@ -85,6 +83,22 @@ vir_domain_snapshot_class_init(virDomainSnapshotClass *klass)
 obj->finalize = virDomainSnapshotFinalize;
 }
 
+G_DEFINE_TYPE(virInterface, vir_interface, G_TYPE_OBJECT);
+static void virInterfaceFinalize(GObject *obj);
+
+static void
+vir_interface_init(virInterface *iface G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_interface_class_init(virInterfaceClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virInterfaceFinalize;
+}
+
 G_DEFINE_TYPE(virNetwork, vir_network, G_TYPE_OBJECT);
 static void virNetworkFinalize(GObject *obj);
 
@@ -201,7 +215,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnect);
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
-DECLARE_CLASS(virInterface);
 DECLARE_CLASS(virNodeDevice);
 DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
@@ -553,42 +566,37 @@ virNetworkPortFinalize(GObject *obj)
  * @mac: pointer to the mac
  *
  * Allocates a new interface object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the interface object, or NULL on error.
  */
 virInterfacePtr
 virGetInterface(virConnectPtr conn, const char *name, const char *mac)
 {
-virInterfacePtr ret = NULL;
+g_autoptr(virInterface) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckConnectGoto(conn, error);
-virCheckNonNullArgGoto(name, error);
+virCheckConnectReturn(conn, NULL);
+virCheckNonNullArgReturn(name, NULL);
 
 /* a NULL mac from caller is okay. Treat it as blank */
 if (mac == NULL)
mac = "";
 
-if (!(ret = virObjectNew(virInterfaceClass)))
-goto error;
+ret = VIR_INTERFACE(g_object_new(VIR_TYPE_INTERFACE, NULL));
 
 ret->name = g_strdup(name);
 ret->mac = g_strdup(mac);
 
 ret->conn = virObjectRef(conn);
 
-return ret;
-
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 /**
- * virInterfaceDispose:
+ * virInterfaceFinalize:
  * @obj: the interface to release
  *
  * Unconditionally release all memory associated with an interface.
@@ -598,14 +606,16 @@ virGetInterface(virConnectPtr conn, const char *name, 
const char *mac)
  * which may also be released if its ref count hits zero.
  */
 static void
-virInterfaceDispose(void *obj)
+virInterfaceFinalize(GObject *obj)
 {
-virInterfacePtr iface = obj;
+virInterfacePtr iface = VIR_INTERFACE(obj);
 VIR_DEBUG("release interface %p %s", iface, iface->name);
 
 VIR_FREE(iface->name);
 VIR_FREE(iface->mac);
 virObjectUnref(iface->conn);
+
+G_OBJECT_CLASS(vir_interface_parent_class)->finalize(obj);
 }
 
 
diff --git a/src/datatypes.h b/src/datatypes.h
index a544a7a347..c68a0e9265 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -32,7 +32,6 @@
 
 extern virClassPtr virConnectClass;
 extern virClassPtr virDomainClass;
-extern virClassPtr virInterfaceClass;
 extern virClassPtr virNodeDeviceClass;
 extern virClassPtr 

[PATCH 33/36] qemu: convert virQEMUDriverConfig to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/qemu/qemu_conf.c   | 36 ++--
 src/qemu/qemu_conf.h   | 19 ---
 src/qemu/qemu_driver.c |  3 ++-
 tests/domaincapstest.c |  3 ++-
 tests/testutilsqemu.c  |  3 ++-
 5 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 68df8a419a..b0e4ac8ef4 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -68,18 +68,21 @@ VIR_LOG_INIT("qemu.qemu_conf");
 #define QEMU_MIGRATION_PORT_MIN 49152
 #define QEMU_MIGRATION_PORT_MAX 49215
 
-static virClassPtr virQEMUDriverConfigClass;
-static void virQEMUDriverConfigDispose(void *obj);
+G_DEFINE_TYPE(virQEMUDriverConfig, vir_qemu_driver_config, G_TYPE_OBJECT);
+static void virQEMUDriverConfigFinalize(GObject *obj);
 
-static int virQEMUConfigOnceInit(void)
+static void
+vir_qemu_driver_config_init(virQEMUDriverConfig *cfg G_GNUC_UNUSED)
 {
-if (!VIR_CLASS_NEW(virQEMUDriverConfig, virClassForObject()))
-return -1;
-
-return 0;
 }
 
-VIR_ONCE_GLOBAL_INIT(virQEMUConfig);
+static void
+vir_qemu_driver_config_class_init(virQEMUDriverConfigClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virQEMUDriverConfigFinalize;
+}
 
 
 static void
@@ -105,13 +108,8 @@ qemuDriverUnlock(virQEMUDriverPtr driver)
 virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged,
   const char *root)
 {
-g_autoptr(virQEMUDriverConfig) cfg = NULL;
-
-if (virQEMUConfigInitialize() < 0)
-return NULL;
-
-if (!(cfg = virObjectNew(virQEMUDriverConfigClass)))
-return NULL;
+g_autoptr(virQEMUDriverConfig) cfg =
+VIR_QEMU_DRIVER_CONFIG(g_object_new(VIR_TYPE_QEMU_DRIVER_CONFIG, 
NULL));
 
 if (root) {
 cfg->uri = g_strdup_printf("qemu:///embed?root=%s", root);
@@ -294,9 +292,9 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool 
privileged,
 }
 
 
-static void virQEMUDriverConfigDispose(void *obj)
+static void virQEMUDriverConfigFinalize(GObject *obj)
 {
-virQEMUDriverConfigPtr cfg = obj;
+virQEMUDriverConfigPtr cfg = VIR_QEMU_DRIVER_CONFIG(obj);
 
 virBitmapFree(cfg->namespaces);
 
@@ -370,6 +368,8 @@ static void virQEMUDriverConfigDispose(void *obj)
 VIR_FREE(cfg->swtpmStorageDir);
 
 virStringListFree(cfg->capabilityfilters);
+
+G_OBJECT_CLASS(vir_qemu_driver_config_parent_class)->finalize(obj);
 }
 
 
@@ -1219,7 +1219,7 @@ virQEMUDriverConfigPtr 
virQEMUDriverGetConfig(virQEMUDriverPtr driver)
 {
 virQEMUDriverConfigPtr conf;
 qemuDriverLock(driver);
-conf = virObjectRef(driver->config);
+conf = g_object_ref(driver->config);
 qemuDriverUnlock(driver);
 return conf;
 }
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 14f9b9e81e..e9a60d5628 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -48,15 +48,13 @@
 #include "virfile.h"
 #include "virfilecache.h"
 #include "virfirmware.h"
+#include 
 
 #define QEMU_DRIVER_NAME "QEMU"
 
 typedef struct _virQEMUDriver virQEMUDriver;
 typedef virQEMUDriver *virQEMUDriverPtr;
 
-typedef struct _virQEMUDriverConfig virQEMUDriverConfig;
-typedef virQEMUDriverConfig *virQEMUDriverConfigPtr;
-
 /* Main driver config. The data in these object
  * instances is immutable, so can be accessed
  * without locking. Threads must, however, hold
@@ -65,15 +63,15 @@ typedef virQEMUDriverConfig *virQEMUDriverConfigPtr;
  *
  * eg
  *  qemuDriverLock(driver);
- *  virQEMUDriverConfigPtr cfg = virObjectRef(driver->config);
+ *  virQEMUDriverConfigPtr cfg = g_object_ref(driver->config);
  *  qemuDriverUnlock(driver);
  *
  *  ...do stuff with 'cfg'..
  *
- *  virObjectUnref(cfg);
+ *  g_object_unref(cfg);
  */
 struct _virQEMUDriverConfig {
-virObject parent;
+GObject parent;
 
 char *uri;
 char *root; /* The root directory for embed driver,
@@ -222,7 +220,14 @@ struct _virQEMUDriverConfig {
 char **capabilityfilters;
 };
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUDriverConfig, virObjectUnref);
+#define VIR_TYPE_QEMU_DRIVER_CONFIG vir_qemu_driver_config_get_type()
+G_DECLARE_FINAL_TYPE(virQEMUDriverConfig,
+ vir_qemu_driver_config,
+ VIR,
+ QEMU_DRIVER_CONFIG,
+ GObject);
+typedef virQEMUDriverConfig *virQEMUDriverConfigPtr;
+
 
 
 /* Main driver state */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 630ece6cc6..3e92629d19 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1146,7 +1146,8 @@ qemuStateCleanup(void)
 if (qemu_driver->lockFD != -1)
 virPidFileRelease(qemu_driver->config->stateDir, "driver", 
qemu_driver->lockFD);
 
-virObjectUnref(qemu_driver->config);
+if (qemu_driver->config)
+g_object_unref(qemu_driver->config);
 virMutexDestroy(_driver->lock);
 VIR_FREE(qemu_driver);
 
diff --git a/tests/domaincapstest.c 

[PATCH 27/36] conf: convert virNetworkXMLOption to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/network_conf.c | 31 ++-
 src/conf/network_conf.h | 12 +---
 src/network/bridge_driver.c |  2 +-
 tests/networkxml2xmltest.c  |  3 +--
 4 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 819b645df7..c56dc95688 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -70,35 +70,32 @@ VIR_ENUM_IMPL(virNetworkTaint,
   "hook-script",
 );
 
-static virClassPtr virNetworkXMLOptionClass;
+G_DEFINE_TYPE(virNetworkXMLOption, vir_network_xml_option, G_TYPE_OBJECT);
 
 static void
-virNetworkXMLOptionDispose(void *obj G_GNUC_UNUSED)
+virNetworkXMLOptionFinalize(GObject *obj)
 {
-return;
+G_OBJECT_CLASS(vir_network_xml_option_parent_class)->finalize(obj);
 }
 
-static int
-virNetworkXMLOnceInit(void)
+static void
+vir_network_xml_option_init(virNetworkXMLOption *xmlopt G_GNUC_UNUSED)
 {
-if (!VIR_CLASS_NEW(virNetworkXMLOption, virClassForObject()))
-return -1;
-
-return 0;
 }
 
-VIR_ONCE_GLOBAL_INIT(virNetworkXML);
+static void
+vir_network_xml_option_class_init(virNetworkXMLOptionClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virNetworkXMLOptionFinalize;
+}
 
 virNetworkXMLOptionPtr
 virNetworkXMLOptionNew(virXMLNamespacePtr xmlns)
 {
-virNetworkXMLOptionPtr xmlopt;
-
-if (virNetworkXMLInitialize() < 0)
-return NULL;
-
-if (!(xmlopt = virObjectNew(virNetworkXMLOptionClass)))
-return NULL;
+virNetworkXMLOptionPtr xmlopt =
+VIR_NETWORK_XML_OPTION(g_object_new(VIR_TYPE_NETWORK_XML_OPTION, 
NULL));
 
 if (xmlns)
 xmlopt->ns = *xmlns;
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index db7243eef5..e492ca9c6f 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -33,17 +33,23 @@
 #include "device_conf.h"
 #include "virbitmap.h"
 #include "networkcommon_conf.h"
-#include "virobject.h"
 #include "virmacmap.h"
 #include "virenum.h"
 #include "virxml.h"
+#include 
 
 struct _virNetworkXMLOption {
-virObject parent;
+GObject parent;
 
 virXMLNamespace ns;
 };
-typedef struct _virNetworkXMLOption virNetworkXMLOption;
+
+#define VIR_TYPE_NETWORK_XML_OPTION vir_network_xml_option_get_type()
+G_DECLARE_FINAL_TYPE(virNetworkXMLOption,
+ vir_network_xml_option,
+ VIR,
+ NETWORK_XML_OPTION,
+ GObject);
 typedef virNetworkXMLOption *virNetworkXMLOptionPtr;
 
 
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 6148bf6a7e..77b5aafb60 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -889,7 +889,7 @@ networkStateCleanup(void)
 return -1;
 
 virObjectUnref(network_driver->networkEventState);
-virObjectUnref(network_driver->xmlopt);
+g_object_unref(network_driver->xmlopt);
 
 /* free inactive networks */
 virObjectUnref(network_driver->networks);
diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c
index ec679e72ee..b881e03c3b 100644
--- a/tests/networkxml2xmltest.c
+++ b/tests/networkxml2xmltest.c
@@ -30,7 +30,7 @@ testCompareXMLToXMLFiles(const char *inxml, const char 
*outxml,
 int ret;
 testCompareNetXML2XMLResult result = 
TEST_COMPARE_NET_XML2XML_RESULT_SUCCESS;
 virNetworkDefPtr dev = NULL;
-virNetworkXMLOptionPtr xmlopt = NULL;
+g_autoptr(virNetworkXMLOption) xmlopt = NULL;
 
 if (!(xmlopt = networkDnsmasqCreateXMLConf()))
 goto cleanup;
@@ -72,7 +72,6 @@ testCompareXMLToXMLFiles(const char *inxml, const char 
*outxml,
 
 VIR_FREE(actual);
 virNetworkDefFree(dev);
-virObjectUnref(xmlopt);
 return ret;
 }
 
-- 
2.25.1




[PATCH 20/36] datatypes: convert virNetworkPort to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/domain_conf.c  |  6 ++---
 src/conf/virnetworkobj.c|  7 +++---
 src/datatypes.c | 37 +++--
 src/datatypes.h | 15 ++--
 src/libvirt-network.c   |  7 +++---
 src/libvirt_private.syms|  1 -
 src/remote/remote_daemon_dispatch.c |  2 +-
 7 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 772d9ae0a8..f3a8a36eb2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -31541,7 +31541,7 @@ virDomainNetReleaseActualDevice(virConnectPtr conn,
 virDomainNetDefPtr iface)
 {
 g_autoptr(virNetwork) net = NULL;
-virNetworkPortPtr port = NULL;
+g_autoptr(virNetworkPort) port = NULL;
 int ret = -1;
 
 /* Port might not exist if a failure occurred during VM startup */
@@ -31560,7 +31560,6 @@ virDomainNetReleaseActualDevice(virConnectPtr conn,
 goto cleanup;
 
  cleanup:
-virObjectUnref(port);
 return ret;
 }
 
@@ -31614,7 +31613,7 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
 virNetDevBandwidthPtr newBandwidth)
 {
 g_autoptr(virNetwork) net = NULL;
-virNetworkPortPtr port = NULL;
+g_autoptr(virNetworkPort) port = NULL;
 virTypedParameterPtr params = NULL;
 int nparams = 0;
 virConnectPtr conn = NULL;
@@ -31639,7 +31638,6 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
  cleanup:
 virObjectUnref(conn);
 virTypedParamsFree(params, nparams);
-virObjectUnref(port);
 return ret;
 }
 
diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
index 762c9d9159..fba2587fd8 100644
--- a/src/conf/virnetworkobj.c
+++ b/src/conf/virnetworkobj.c
@@ -1825,9 +1825,10 @@ virNetworkObjPortListExport(virNetworkPtr net,
 
 ret = data.nports;
  cleanup:
-while (data.ports && data.nports)
-virObjectUnref(data.ports[--data.nports]);
-
+while (data.ports && data.nports) {
+if (data.ports[--data.nports])
+g_object_unref(data.ports[data.nports]);
+}
 VIR_FREE(data.ports);
 return ret;
 }
diff --git a/src/datatypes.c b/src/datatypes.c
index 15130ca0fa..e715c37306 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -37,7 +37,6 @@ virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
 virClassPtr virInterfaceClass;
-virClassPtr virNetworkPortClass;
 virClassPtr virNodeDeviceClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
@@ -48,7 +47,6 @@ static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
 static void virInterfaceDispose(void *obj);
-static void virNetworkPortDispose(void *obj);
 static void virNodeDeviceDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
@@ -103,6 +101,22 @@ vir_network_class_init(virNetworkClass *klass)
 obj->finalize = virNetworkFinalize;
 }
 
+G_DEFINE_TYPE(virNetworkPort, vir_network_port, G_TYPE_OBJECT);
+static void virNetworkPortFinalize(GObject *obj);
+
+static void
+vir_network_port_init(virNetworkPort *np G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_network_port_class_init(virNetworkPortClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virNetworkPortFinalize;
+}
+
 G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT);
 static void virNWFilterFinalize(GObject *obj);
 
@@ -188,7 +202,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
 DECLARE_CLASS(virInterface);
-DECLARE_CLASS(virNetworkPort);
 DECLARE_CLASS(virNodeDevice);
 DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
@@ -482,14 +495,14 @@ virNetworkFinalize(GObject *obj)
  * @uuid: pointer to the uuid
  *
  * Allocates a new network port object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the network port object, or NULL on error.
  */
 virNetworkPortPtr
 virGetNetworkPort(virNetworkPtr net, const unsigned char *uuid)
 {
-virNetworkPortPtr ret = NULL;
+g_autoptr(virNetworkPort) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
@@ -497,21 +510,19 @@ virGetNetworkPort(virNetworkPtr net, const unsigned char 
*uuid)
 virCheckNetworkGoto(net, error);
 virCheckNonNullArgGoto(uuid, error);
 
-if (!(ret = virObjectNew(virNetworkPortClass)))
-goto error;
+ret = VIR_NETWORK_PORT(g_object_new(VIR_TYPE_NETWORK_PORT, NULL));
 
 ret->net = g_object_ref(net);
 memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
 
-return ret;
+return g_steal_pointer();
 
  error:
-

[PATCH 22/36] datatypes: convert virStoragePool to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/storage_event.c| 15 --
 src/conf/virstorageobj.c|  8 -
 src/datatypes.c | 46 ++---
 src/datatypes.h | 15 +-
 src/libvirt-storage.c   |  6 ++--
 src/libvirt_private.syms|  1 -
 src/qemu/qemu_migration.c   |  3 +-
 src/remote/remote_daemon_dispatch.c |  2 +-
 src/remote/remote_driver.c  |  4 +--
 src/vz/vz_sdk.c |  3 +-
 10 files changed, 57 insertions(+), 46 deletions(-)

diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c
index de36ec3af9..e18069f718 100644
--- a/src/conf/storage_event.c
+++ b/src/conf/storage_event.c
@@ -110,10 +110,10 @@ virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn,
virConnectObjectEventGenericCallback cb,
void *cbopaque)
 {
-virStoragePoolPtr pool = virGetStoragePool(conn,
-   event->meta.name,
-   event->meta.uuid,
-   NULL, NULL);
+g_autoptr(virStoragePool) pool = virGetStoragePool(conn,
+   event->meta.name,
+   event->meta.uuid,
+   NULL, NULL);
 if (!pool)
 return;
 
@@ -127,23 +127,20 @@ virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn,
   
storagePoolLifecycleEvent->type,
   
storagePoolLifecycleEvent->detail,
   cbopaque);
-goto cleanup;
+return;
 }
 
 case VIR_STORAGE_POOL_EVENT_ID_REFRESH:
 {
 ((virConnectStoragePoolEventGenericCallback)cb)(conn, pool,
 cbopaque);
-goto cleanup;
+return;
 }
 
 case VIR_STORAGE_POOL_EVENT_ID_LAST:
 break;
 }
 VIR_WARN("Unexpected event ID %d", event->eventID);
-
- cleanup:
-virObjectUnref(pool);
 }
 
 
diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
index 5cbd30f93c..bff6eb6ae1 100644
--- a/src/conf/virstorageobj.c
+++ b/src/conf/virstorageobj.c
@@ -2095,6 +2095,12 @@ virStoragePoolObjListExport(virConnectPtr conn,
 return data.nPools;
 
  error:
-virObjectListFree(data.pools);
+if (data.pools) {
+while (data.nPools--) {
+if (data.pools[data.nPools])
+g_object_unref(data.pools[data.nPools]);
+}
+}
+VIR_FREE(data.pools);
 return -1;
 }
diff --git a/src/datatypes.c b/src/datatypes.c
index f1bcca44f1..e434c31785 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -40,7 +40,6 @@ virClassPtr virNodeDeviceClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
 virClassPtr virStorageVolClass;
-virClassPtr virStoragePoolClass;
 
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
@@ -49,7 +48,6 @@ static void virNodeDeviceDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
 static void virStorageVolDispose(void *obj);
-static void virStoragePoolDispose(void *obj);
 
 G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT);
 static void virDomainCheckpointFinalize(GObject *obj);
@@ -163,6 +161,22 @@ vir_nw_filter_binding_class_init(virNWFilterBindingClass 
*klass)
 obj->finalize = virNWFilterBindingFinalize;
 }
 
+G_DEFINE_TYPE(virStoragePool, vir_storage_pool, G_TYPE_OBJECT);
+static void virStoragePoolFinalize(GObject *obj);
+
+static void
+vir_storage_pool_init(virStoragePool *pool G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_storage_pool_class_init(virStoragePoolClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virStoragePoolFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -219,7 +233,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
 DECLARE_CLASS(virStorageVol);
-DECLARE_CLASS(virStoragePool);
 
 DECLARE_CLASS_LOCKABLE(virAdmConnect);
 DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
@@ -628,7 +641,7 @@ virInterfaceFinalize(GObject *obj)
  * @freeFunc: private data cleanup function pointer specific to driver
  *
  * Allocates a new storage pool object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the storage pool object, or NULL on error.
  */
@@ -637,17 +650,16 @@ 

[PATCH 17/36] datatypes: convert virNWFilter to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virnwfilterobj.c |  6 +++--
 src/datatypes.c   | 46 ---
 src/datatypes.h   | 10 +
 src/libvirt-nwfilter.c|  7 +++---
 src/libvirt_private.syms  |  1 -
 5 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c
index c9e224061d..6d89701199 100644
--- a/src/conf/virnwfilterobj.c
+++ b/src/conf/virnwfilterobj.c
@@ -473,8 +473,10 @@ virNWFilterObjListExport(virConnectPtr conn,
 
  cleanup:
 if (tmp_filters) {
-for (i = 0; i < nfilters; i ++)
-virObjectUnref(tmp_filters[i]);
+for (i = 0; i < nfilters; i ++) {
+if (tmp_filters[i])
+g_object_unref(tmp_filters[i]);
+}
 }
 VIR_FREE(tmp_filters);
 
diff --git a/src/datatypes.c b/src/datatypes.c
index fd39c96b31..d4f60db2be 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -40,7 +40,6 @@ virClassPtr virInterfaceClass;
 virClassPtr virNetworkClass;
 virClassPtr virNetworkPortClass;
 virClassPtr virNodeDeviceClass;
-virClassPtr virNWFilterClass;
 virClassPtr virNWFilterBindingClass;
 virClassPtr virSecretClass;
 virClassPtr virStreamClass;
@@ -54,7 +53,6 @@ static void virInterfaceDispose(void *obj);
 static void virNetworkDispose(void *obj);
 static void virNetworkPortDispose(void *obj);
 static void virNodeDeviceDispose(void *obj);
-static void virNWFilterDispose(void *obj);
 static void virNWFilterBindingDispose(void *obj);
 static void virSecretDispose(void *obj);
 static void virStreamDispose(void *obj);
@@ -93,6 +91,22 @@ vir_domain_snapshot_class_init(virDomainSnapshotClass *klass)
 obj->finalize = virDomainSnapshotFinalize;
 }
 
+G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT);
+static void virNWFilterFinalize(GObject *obj);
+
+static void
+vir_nw_filter_init(virNWFilter *filter G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_nw_filter_class_init(virNWFilterClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virNWFilterFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -149,7 +163,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS(virNetwork);
 DECLARE_CLASS(virNetworkPort);
 DECLARE_CLASS(virNodeDevice);
-DECLARE_CLASS(virNWFilter);
 DECLARE_CLASS(virNWFilterBinding);
 DECLARE_CLASS(virSecret);
 DECLARE_CLASS(virStream);
@@ -883,7 +896,7 @@ virStreamDispose(void *obj)
  * @uuid: pointer to the uuid
  *
  * Allocates a new network filter object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the network filter object, or NULL on error.
  */
@@ -891,17 +904,16 @@ virNWFilterPtr
 virGetNWFilter(virConnectPtr conn, const char *name,
const unsigned char *uuid)
 {
-virNWFilterPtr ret = NULL;
+g_autoptr(virNWFilter) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckConnectGoto(conn, error);
-virCheckNonNullArgGoto(name, error);
-virCheckNonNullArgGoto(uuid, error);
+virCheckConnectReturn(conn, NULL);
+virCheckNonNullArgReturn(name, NULL);
+virCheckNonNullArgReturn(uuid, NULL);
 
-if (!(ret = virObjectNew(virNWFilterClass)))
-goto error;
+ret = VIR_NW_FILTER(g_object_new(VIR_TYPE_NW_FILTER, NULL));
 
 ret->name = g_strdup(name);
 
@@ -909,16 +921,12 @@ virGetNWFilter(virConnectPtr conn, const char *name,
 
 ret->conn = virObjectRef(conn);
 
-return ret;
-
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 
 /**
- * virNWFilterDispose:
+ * virNWFilterFinalize:
  * @obj: the network filter to release
  *
  * Unconditionally release all memory associated with a nwfilter.
@@ -928,9 +936,9 @@ virGetNWFilter(virConnectPtr conn, const char *name,
  * which may also be released if its ref count hits zero.
  */
 static void
-virNWFilterDispose(void *obj)
+virNWFilterFinalize(GObject *obj)
 {
-virNWFilterPtr nwfilter = obj;
+virNWFilterPtr nwfilter = VIR_NW_FILTER(obj);
 char uuidstr[VIR_UUID_STRING_BUFLEN];
 
 virUUIDFormat(nwfilter->uuid, uuidstr);
@@ -938,6 +946,8 @@ virNWFilterDispose(void *obj)
 
 VIR_FREE(nwfilter->name);
 virObjectUnref(nwfilter->conn);
+
+G_OBJECT_CLASS(vir_nw_filter_parent_class)->finalize(obj);
 }
 
 
diff --git a/src/datatypes.h b/src/datatypes.h
index 296196523b..e8bd9bf1e5 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -36,7 +36,6 @@ extern virClassPtr virInterfaceClass;
 extern virClassPtr virNetworkClass;
 extern virClassPtr virNetworkPortClass;
 extern virClassPtr virNodeDeviceClass;
-extern virClassPtr virNWFilterClass;
 extern virClassPtr virNWFilterBindingClass;
 extern virClassPtr virSecretClass;
 extern virClassPtr virStreamClass;
@@ -58,6 +57,9 @@ 

[PATCH 06/36] conf: convert virDomainXMLOption to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/bhyve/bhyve_driver.c  |  3 ++-
 src/conf/domain_conf.c| 29 +++--
 src/conf/domain_conf.h|  9 +
 src/esx/esx_driver.c  |  3 ++-
 src/libxl/libxl_driver.c  |  3 ++-
 src/lxc/lxc_controller.c  |  3 ++-
 src/lxc/lxc_driver.c  |  3 ++-
 src/openvz/openvz_conf.c  |  3 ++-
 src/qemu/qemu_driver.c|  3 ++-
 src/qemu/qemu_process.c   | 15 +--
 src/security/virt-aa-helper.c |  3 ++-
 src/test/test_driver.c|  3 ++-
 src/vbox/vbox_common.c|  3 ++-
 src/vmware/vmware_conf.c  |  3 ++-
 src/vz/vz_driver.c|  3 ++-
 tests/bhyveargv2xmltest.c |  2 +-
 tests/bhyvexml2argvtest.c |  2 +-
 tests/bhyvexml2xmltest.c  |  2 +-
 tests/domainconftest.c|  3 ++-
 tests/genericxml2xmltest.c|  3 ++-
 tests/openvzutilstest.c   |  2 +-
 tests/testutilslxc.c  |  3 ++-
 tests/testutilsqemu.c |  3 ++-
 tests/testutilsxen.c  |  3 ++-
 tests/vmx2xmltest.c   |  3 ++-
 tests/xml2vmxtest.c   |  6 --
 26 files changed, 77 insertions(+), 44 deletions(-)

diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index 4ca3666700..2224395128 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -1183,7 +1183,8 @@ bhyveStateCleanup(void)
 virObjectUnref(bhyve_driver->domains);
 if (bhyve_driver->caps)
 g_object_unref(bhyve_driver->caps);
-virObjectUnref(bhyve_driver->xmlopt);
+if (bhyve_driver->xmlopt)
+g_object_unref(bhyve_driver->xmlopt);
 virSysinfoDefFree(bhyve_driver->hostsysinfo);
 virObjectUnref(bhyve_driver->closeCallbacks);
 virObjectUnref(bhyve_driver->domainEventState);
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 425a6bccb6..38a0c04c1f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -71,7 +71,7 @@ VIR_LOG_INIT("conf.domain_conf");
 /* This structure holds various callbacks and data needed
  * while parsing and creating domain XMLs */
 struct _virDomainXMLOption {
-virObject parent;
+GObject parent;
 
 /* XML parser callbacks and defaults */
 virDomainDefParserConfig config;
@@ -1273,18 +1273,26 @@ VIR_ENUM_IMPL(virDomainLaunchSecurity,
 );
 
 static virClassPtr virDomainObjClass;
-static virClassPtr virDomainXMLOptionClass;
 static void virDomainObjDispose(void *obj);
-static void virDomainXMLOptionDispose(void *obj);
+G_DEFINE_TYPE(virDomainXMLOption, vir_domain_xml_option, G_TYPE_OBJECT);
+static void virDomainXMLOptionFinalize(GObject *obj);
+
+static void vir_domain_xml_option_init(virDomainXMLOption *option 
G_GNUC_UNUSED)
+{
+}
+
+static void vir_domain_xml_option_class_init(virDomainXMLOptionClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virDomainXMLOptionFinalize;
+}
 
 static int virDomainObjOnceInit(void)
 {
 if (!VIR_CLASS_NEW(virDomainObj, virClassForObjectLockable()))
 return -1;
 
-if (!VIR_CLASS_NEW(virDomainXMLOption, virClassForObject()))
-return -1;
-
 return 0;
 }
 
@@ -1292,12 +1300,14 @@ VIR_ONCE_GLOBAL_INIT(virDomainObj);
 
 
 static void
-virDomainXMLOptionDispose(void *obj)
+virDomainXMLOptionFinalize(GObject *obj)
 {
-virDomainXMLOptionPtr xmlopt = obj;
+virDomainXMLOptionPtr xmlopt = VIR_DOMAIN_XML_OPTION(obj);
 
 if (xmlopt->config.privFree)
 (xmlopt->config.privFree)(xmlopt->config.priv);
+
+G_OBJECT_CLASS(vir_domain_xml_option_parent_class)->finalize(obj);
 }
 
 /**
@@ -1424,8 +1434,7 @@ virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
 if (virDomainObjInitialize() < 0)
 return NULL;
 
-if (!(xmlopt = virObjectNew(virDomainXMLOptionClass)))
-return NULL;
+xmlopt = VIR_DOMAIN_XML_OPTION(g_object_new(VIR_TYPE_DOMAIN_XML_OPTION, 
NULL));
 
 if (priv)
 xmlopt->privateData = *priv;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 33875d942f..7e2792ae62 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -58,6 +58,8 @@
 #include "virresctrl.h"
 #include "virenum.h"
 
+#include 
+
 /* Flags for the 'type' field in virDomainDeviceDef */
 typedef enum {
 VIR_DOMAIN_DEVICE_NONE = 0,
@@ -2800,6 +2802,13 @@ struct _virDomainABIStability {
 virDomainABIStabilityDomain domain;
 };
 
+#define VIR_TYPE_DOMAIN_XML_OPTION vir_domain_xml_option_get_type()
+G_DECLARE_FINAL_TYPE(virDomainXMLOption,
+ vir_domain_xml_option,
+ VIR,
+ DOMAIN_XML_OPTION,
+ GObject);
+
 virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
 
virDomainXMLPrivateDataCallbacksPtr priv,
 virXMLNamespacePtr xmlns,
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index f893d112d0..354f5cbe69 100644
--- 

[PATCH 03/36] qemu: convert virQEMUCaps to GObject

2020-04-03 Thread Rafael Fonseca
virFileCache had to also be changed to properly unref the QEMUCaps
objects; in turn, virfilecachetest was also converted to GObject so it
plays nicely with virFileCache.

Signed-off-by: Rafael Fonseca 
---
 src/qemu/qemu_capabilities.c | 119 +++
 src/qemu/qemu_capabilities.h |   9 ++-
 src/qemu/qemu_domain.c   |   8 +--
 src/qemu/qemu_process.c  |   3 +-
 src/util/virfilecache.c  |  13 ++--
 tests/cputest.c  |  14 ++---
 tests/domaincapstest.c   |   3 +-
 tests/qemublocktest.c|   3 +-
 tests/qemucapabilitiestest.c |   9 +--
 tests/qemucaps2xmltest.c |  16 ++---
 tests/qemucapsprobe.c|   4 +-
 tests/qemumemlocktest.c  |   3 +-
 tests/testutilsqemu.c|  18 +++---
 tests/virfilecachetest.c |  53 +++-
 14 files changed, 118 insertions(+), 157 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 4bbd14f7ad..36a8467f2c 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -639,7 +639,7 @@ static void virQEMUDomainCapsCacheDispose(void *obj)
  * And don't forget to update virQEMUCapsNewCopy.
  */
 struct _virQEMUCaps {
-virObject parent;
+GObject parent;
 
 bool kvmSupportsNesting;
 
@@ -677,14 +677,23 @@ struct virQEMUCapsSearchData {
 };
 
 
-static virClassPtr virQEMUCapsClass;
-static void virQEMUCapsDispose(void *obj);
+G_DEFINE_TYPE(virQEMUCaps, vir_qemu_caps, G_TYPE_OBJECT);
 
-static int virQEMUCapsOnceInit(void)
+static void virQEMUCapsFinalize(GObject *obj);
+
+static void vir_qemu_caps_init(virQEMUCaps *caps G_GNUC_UNUSED)
 {
-if (!VIR_CLASS_NEW(virQEMUCaps, virClassForObject()))
-return -1;
+}
 
+static void vir_qemu_caps_class_init(virQEMUCapsClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virQEMUCapsFinalize;
+}
+
+static int virQEMUCapsOnceInit(void)
+{
 if (!(VIR_CLASS_NEW(virQEMUDomainCapsCache, virClassForObjectLockable(
 return -1;
 
@@ -864,7 +873,7 @@ virQEMUCapsInitGuest(virCapsPtr caps,
  virArch guestarch)
 {
 char *binary = NULL;
-virQEMUCapsPtr qemuCaps = NULL;
+g_autoptr(virQEMUCaps) qemuCaps = NULL;
 int ret = -1;
 
 binary = virQEMUCapsGetDefaultEmulator(hostarch, guestarch);
@@ -882,7 +891,6 @@ virQEMUCapsInitGuest(virCapsPtr caps,
  guestarch);
 
 VIR_FREE(binary);
-virObjectUnref(qemuCaps);
 
 return ret;
 }
@@ -1633,7 +1641,7 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr caps,
  virFileCachePtr capsCache,
  unsigned int *version)
 {
-virQEMUCapsPtr qemucaps;
+g_autoptr(virQEMUCaps) qemucaps = NULL;
 virArch hostarch;
 virCapsDomainDataPtr capsdata;
 
@@ -1656,7 +1664,6 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr caps,
 return -1;
 
 *version = virQEMUCapsGetVersion(qemucaps);
-virObjectUnref(qemucaps);
 return 0;
 }
 
@@ -1682,26 +1689,17 @@ virQEMUDomainCapsCacheNew(void)
 virQEMUCapsPtr
 virQEMUCapsNew(void)
 {
-virQEMUCapsPtr qemuCaps;
-
-if (virQEMUCapsInitialize() < 0)
-return NULL;
-
-if (!(qemuCaps = virObjectNew(virQEMUCapsClass)))
-return NULL;
+g_autoptr(virQEMUCaps) qemuCaps =
+VIR_QEMU_CAPS(g_object_new(VIR_TYPE_QEMU_CAPS, NULL));
 
 qemuCaps->invalidation = true;
 if (!(qemuCaps->flags = virBitmapNew(QEMU_CAPS_LAST)))
-goto error;
+return NULL;
 
 if (!(qemuCaps->domCapsCache = virQEMUDomainCapsCacheNew()))
-goto error;
-
-return qemuCaps;
+return NULL;
 
- error:
-virObjectUnref(qemuCaps);
-return NULL;
+return g_steal_pointer();
 }
 
 
@@ -1709,6 +1707,8 @@ virQEMUCapsPtr
 virQEMUCapsNewBinary(const char *binary)
 {
 virQEMUCapsPtr qemuCaps = virQEMUCapsNew();
+if (!qemuCaps)
+return NULL;
 
 if (qemuCaps)
 qemuCaps->binary = g_strdup(binary);
@@ -1818,7 +1818,7 @@ virQEMUCapsAccelCopy(virQEMUCapsAccelPtr dst,
 
 virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
 {
-virQEMUCapsPtr ret = virQEMUCapsNewBinary(qemuCaps->binary);
+g_autoptr(virQEMUCaps) ret = virQEMUCapsNewBinary(qemuCaps->binary);
 size_t i;
 
 if (!ret)
@@ -1842,10 +1842,10 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr 
qemuCaps)
 
 if (virQEMUCapsAccelCopy(>kvm, >kvm) < 0 ||
 virQEMUCapsAccelCopy(>tcg, >tcg) < 0)
-goto error;
+return NULL;
 
 if (VIR_ALLOC_N(ret->gicCapabilities, qemuCaps->ngicCapabilities) < 0)
-goto error;
+return NULL;
 ret->ngicCapabilities = qemuCaps->ngicCapabilities;
 for (i = 0; i < qemuCaps->ngicCapabilities; i++)
 ret->gicCapabilities[i] = qemuCaps->gicCapabilities[i];
@@ -1853,13 +1853,9 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr 
qemuCaps)
 if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST) &&
   

[PATCH 09/36] rpc: convert virNetServerService to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/lxc/lxc_controller.c  |  6 +--
 src/rpc/virnetserver.c|  4 +-
 src/rpc/virnetserverprogram.h |  7 ++-
 src/rpc/virnetserverservice.c | 87 +++
 tests/virnetdaemontest.c  |  4 +-
 5 files changed, 48 insertions(+), 60 deletions(-)

diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 4c038c6228..ea03f5a452 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -992,8 +992,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr 
ctrl)
 
 if (virNetServerAddService(srv, svc) < 0)
 goto error;
-virObjectUnref(svc);
-svc = NULL;
+g_clear_object();
 
 ctrl->prog = virNetServerProgramNew(VIR_LXC_MONITOR_PROGRAM,
 VIR_LXC_MONITOR_PROGRAM_VERSION,
@@ -1015,7 +1014,8 @@ static int 
virLXCControllerSetupServer(virLXCControllerPtr ctrl)
 virObjectUnref(srv);
 virObjectUnref(ctrl->daemon);
 ctrl->daemon = NULL;
-virObjectUnref(svc);
+if (svc)
+g_object_unref(svc);
 return -1;
 }
 
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index 5e9124c7ee..f5a59b11af 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -660,7 +660,7 @@ int virNetServerAddService(virNetServerPtr srv,
 if (VIR_EXPAND_N(srv->services, srv->nservices, 1) < 0)
 goto error;
 
-srv->services[srv->nservices-1] = virObjectRef(svc);
+srv->services[srv->nservices-1] = g_object_ref(svc);
 
 virNetServerServiceSetDispatcher(svc,
  virNetServerDispatchNewClient,
@@ -916,7 +916,7 @@ void virNetServerDispose(void *obj)
 virThreadPoolFree(srv->workers);
 
 for (i = 0; i < srv->nservices; i++)
-virObjectUnref(srv->services[i]);
+g_object_unref(srv->services[i]);
 VIR_FREE(srv->services);
 
 for (i = 0; i < srv->nprograms; i++)
diff --git a/src/rpc/virnetserverprogram.h b/src/rpc/virnetserverprogram.h
index bcc10809d4..72dff3b9cb 100644
--- a/src/rpc/virnetserverprogram.h
+++ b/src/rpc/virnetserverprogram.h
@@ -29,7 +29,12 @@
 typedef struct _virNetDaemon virNetDaemon;
 typedef virNetDaemon *virNetDaemonPtr;
 
-typedef struct _virNetServerService virNetServerService;
+#define VIR_TYPE_NET_SERVER_SERVICE vir_net_server_service_get_type()
+G_DECLARE_FINAL_TYPE(virNetServerService,
+ vir_net_server_service,
+ VIR,
+ NET_SERVER_SERVICE,
+ GObject);
 typedef virNetServerService *virNetServerServicePtr;
 
 #define VIR_TYPE_NET_SERVER_PROGRAM vir_net_server_program_get_type()
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
index 9d5df456a8..781e414461 100644
--- a/src/rpc/virnetserverservice.c
+++ b/src/rpc/virnetserverservice.c
@@ -35,7 +35,7 @@
 VIR_LOG_INIT("rpc.netserverservice");
 
 struct _virNetServerService {
-virObject parent;
+GObject parent;
 
 size_t nsocks;
 virNetSocketPtr *socks;
@@ -51,19 +51,19 @@ struct _virNetServerService {
 };
 
 
-static virClassPtr virNetServerServiceClass;
-static void virNetServerServiceDispose(void *obj);
+G_DEFINE_TYPE(virNetServerService, vir_net_server_service, G_TYPE_OBJECT);
+static void virNetServerServiceFinalize(GObject *obj);
 
-static int virNetServerServiceOnceInit(void)
+static void vir_net_server_service_init(virNetServerService *svc G_GNUC_UNUSED)
 {
-if (!VIR_CLASS_NEW(virNetServerService, virClassForObject()))
-return -1;
-
-return 0;
 }
 
-VIR_ONCE_GLOBAL_INIT(virNetServerService);
+static void vir_net_server_service_class_init(virNetServerServiceClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
 
+obj->finalize = virNetServerServiceFinalize;
+}
 
 static void virNetServerServiceAccept(virNetSocketPtr sock,
   int events G_GNUC_UNUSED,
@@ -97,17 +97,13 @@ virNetServerServiceNewSocket(virNetSocketPtr *socks,
  size_t max_queued_clients,
  size_t nrequests_client_max)
 {
-virNetServerServicePtr svc;
+g_autoptr(virNetServerService) svc = NULL;
 size_t i;
 
-if (virNetServerServiceInitialize() < 0)
-return NULL;
-
-if (!(svc = virObjectNew(virNetServerServiceClass)))
-return NULL;
+svc = VIR_NET_SERVER_SERVICE(g_object_new(VIR_TYPE_NET_SERVER_SERVICE, 
NULL));
 
 if (VIR_ALLOC_N(svc->socks, nsocks) < 0)
-goto error;
+return NULL;
 svc->nsocks = nsocks;
 for (i = 0; i < svc->nsocks; i++) {
 svc->socks[i] = socks[i];
@@ -120,27 +116,22 @@ virNetServerServiceNewSocket(virNetSocketPtr *socks,
 
 for (i = 0; i < svc->nsocks; i++) {
 if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0)
-goto error;
+return NULL;
 
 /* IO callback is initially disabled, until we're ready
  * to deal with incoming 

[PATCH 14/36] admin: convert virAdmClient to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/admin/libvirt-admin.c|  2 +-
 src/admin/libvirt_admin_private.syms |  1 -
 src/datatypes.c  | 36 ++--
 src/datatypes.h  | 13 +-
 4 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/src/admin/libvirt-admin.c b/src/admin/libvirt-admin.c
index ed7a57cbbb..6f86de4360 100644
--- a/src/admin/libvirt-admin.c
+++ b/src/admin/libvirt-admin.c
@@ -676,7 +676,7 @@ int virAdmClientFree(virAdmClientPtr client)
 
 virCheckAdmClientReturn(client, -1);
 
-virObjectUnref(client);
+g_object_unref(client);
 return 0;
 }
 
diff --git a/src/admin/libvirt_admin_private.syms 
b/src/admin/libvirt_admin_private.syms
index 270fa43995..9ba4b68932 100644
--- a/src/admin/libvirt_admin_private.syms
+++ b/src/admin/libvirt_admin_private.syms
@@ -34,7 +34,6 @@ xdr_admin_server_set_threadpool_parameters_args;
 xdr_admin_server_update_tls_files_args;
 
 # datatypes.h
-virAdmClientClass;
 virAdmConnectClass;
 virAdmConnectCloseCallbackDataRegister;
 virAdmConnectCloseCallbackDataReset;
diff --git a/src/datatypes.c b/src/datatypes.c
index d6afaf89ad..68fc216ffa 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -71,8 +71,21 @@ virClassPtr virAdmConnectCloseCallbackDataClass;
 static void virAdmConnectDispose(void *obj);
 static void virAdmConnectCloseCallbackDataDispose(void *obj);
 
-virClassPtr virAdmClientClass;
-static void virAdmClientDispose(void *obj);
+G_DEFINE_TYPE(virAdmClient, vir_adm_client, G_TYPE_OBJECT);
+static void virAdmClientFinalize(GObject *obj);
+
+static void
+vir_adm_client_init(virAdmClient *clt G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_adm_client_class_init(virAdmClientClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virAdmClientFinalize;
+}
 
 G_DEFINE_TYPE(virAdmServer, vir_adm_server, G_TYPE_OBJECT);
 static void virAdmServerFinalize(GObject *obj);
@@ -119,7 +132,6 @@ virDataTypesOnceInit(void)
 
 DECLARE_CLASS_LOCKABLE(virAdmConnect);
 DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
-DECLARE_CLASS(virAdmClient);
 
 #undef DECLARE_CLASS_COMMON
 #undef DECLARE_CLASS_LOCKABLE
@@ -1216,30 +1228,28 @@ virAdmClientPtr
 virAdmGetClient(virAdmServerPtr srv, const unsigned long long id,
 unsigned long long timestamp, unsigned int transport)
 {
-virAdmClientPtr ret = NULL;
+g_autoptr(virAdmClient) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
-goto error;
+return NULL;
 
-if (!(ret = virObjectNew(virAdmClientClass)))
-goto error;
+ret = VIR_ADM_CLIENT(g_object_new(VIR_TYPE_ADM_CLIENT, NULL));
 
 ret->id = id;
 ret->timestamp = timestamp;
 ret->transport = transport;
 ret->srv = g_object_ref(srv);
 
-return ret;
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 static void
-virAdmClientDispose(void *obj)
+virAdmClientFinalize(GObject *obj)
 {
-virAdmClientPtr clt = obj;
+virAdmClientPtr clt = VIR_ADM_CLIENT(obj);
 VIR_DEBUG("release client clt=%p, id=%llu", clt, clt->id);
 
 g_object_unref(clt->srv);
+
+G_OBJECT_CLASS(vir_adm_client_parent_class)->finalize(obj);
 }
diff --git a/src/datatypes.h b/src/datatypes.h
index 20b64ca788..4e9f338f8b 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -46,10 +46,11 @@ extern virClassPtr virStorageVolClass;
 extern virClassPtr virStoragePoolClass;
 
 extern virClassPtr virAdmConnectClass;
-extern virClassPtr virAdmClientClass;
 
 #define VIR_TYPE_ADM_SERVER vir_adm_server_get_type()
 G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject);
+#define VIR_TYPE_ADM_CLIENT vir_adm_client_get_type()
+G_DECLARE_FINAL_TYPE(virAdmClient, vir_adm_client, VIR, ADM_CLIENT, GObject);
 
 #define virCheckConnectReturn(obj, retval) \
 do { \
@@ -447,8 +448,8 @@ G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, 
ADM_SERVER, GObject);
 
 #define virCheckAdmClientReturn(obj, retval) \
 do { \
-virAdmClientPtr _clt = (obj); \
-if (!virObjectIsClass(_clt, virAdmClientClass) || \
+virAdmClientPtr _clt = VIR_ADM_CLIENT(obj); \
+if (!G_IS_OBJECT(_clt) || !(G_OBJECT_TYPE(_clt) == 
VIR_TYPE_ADM_CLIENT) || \
 !G_IS_OBJECT(_clt->srv) || !(G_OBJECT_TYPE(_clt->srv) == 
VIR_TYPE_ADM_SERVER) || \
 !virObjectIsClass(_clt->srv->conn, virAdmConnectClass)) { \
 virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \
@@ -460,8 +461,8 @@ G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, 
ADM_SERVER, GObject);
 } while (0)
 #define virCheckAdmClientGoto(obj, label) \
 do { \
-virAdmClientPtr _clt = (obj); \
-if (!virObjectIsClass(_clt, virAdmClientClass) || \
+virAdmClientPtr _clt = VIR_ADM_CLIENT(obj); \
+if (!G_IS_OBJECT(_clt) || !(G_OBJECT_TYPE(_clt) == 
VIR_TYPE_ADM_CLIENT) || \
 !G_IS_OBJECT(_clt->srv) 

[PATCH 10/36] conf: convert virDomainCapsCPUModels to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/domain_capabilities.c | 48 ++
 src/conf/domain_capabilities.h | 10 ---
 tests/cputest.c| 35 -
 3 files changed, 43 insertions(+), 50 deletions(-)

diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
index 921d795630..bc0a505cb9 100644
--- a/src/conf/domain_capabilities.c
+++ b/src/conf/domain_capabilities.c
@@ -45,19 +45,27 @@ VIR_ENUM_IMPL(virDomainCapsFeature,
 );
 
 static virClassPtr virDomainCapsClass;
-static virClassPtr virDomainCapsCPUModelsClass;
+G_DEFINE_TYPE(virDomainCapsCPUModels, vir_domain_caps_cpu_models, 
G_TYPE_OBJECT);
 
 static void virDomainCapsDispose(void *obj);
-static void virDomainCapsCPUModelsDispose(void *obj);
+static void virDomainCapsCPUModelsFinalize(GObject *obj);
+
+static void vir_domain_caps_cpu_models_init(virDomainCapsCPUModels *mod 
G_GNUC_UNUSED)
+{
+}
+
+static void vir_domain_caps_cpu_models_class_init(virDomainCapsCPUModelsClass 
*klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virDomainCapsCPUModelsFinalize;
+}
 
 static int virDomainCapsOnceInit(void)
 {
 if (!VIR_CLASS_NEW(virDomainCaps, virClassForObjectLockable()))
 return -1;
 
-if (!VIR_CLASS_NEW(virDomainCapsCPUModels, virClassForObject()))
-return -1;
-
 return 0;
 }
 
@@ -107,9 +115,9 @@ virDomainCapsDispose(void *obj)
 
 
 static void
-virDomainCapsCPUModelsDispose(void *obj)
+virDomainCapsCPUModelsFinalize(GObject *obj)
 {
-virDomainCapsCPUModelsPtr cpuModels = obj;
+virDomainCapsCPUModelsPtr cpuModels = VIR_DOMAIN_CAPS_CPU_MODELS(obj);
 size_t i;
 
 for (i = 0; i < cpuModels->nmodels; i++) {
@@ -118,6 +126,8 @@ virDomainCapsCPUModelsDispose(void *obj)
 }
 
 VIR_FREE(cpuModels->models);
+
+G_OBJECT_CLASS(vir_domain_caps_cpu_models_parent_class)->finalize(obj);
 }
 
 
@@ -147,30 +157,26 @@ virDomainCapsNew(const char *path,
 virDomainCapsCPUModelsPtr
 virDomainCapsCPUModelsNew(size_t nmodels)
 {
-virDomainCapsCPUModelsPtr cpuModels = NULL;
+g_autoptr(virDomainCapsCPUModels) cpuModels = NULL;
 
 if (virDomainCapsInitialize() < 0)
 return NULL;
 
-if (!(cpuModels = virObjectNew(virDomainCapsCPUModelsClass)))
-return NULL;
+cpuModels = VIR_DOMAIN_CAPS_CPU_MODELS(
+g_object_new(VIR_TYPE_DOMAIN_CAPS_CPU_MODELS, NULL));
 
 if (VIR_ALLOC_N(cpuModels->models, nmodels) < 0)
-goto error;
+return NULL;
 cpuModels->nmodels_max = nmodels;
 
-return cpuModels;
-
- error:
-virObjectUnref(cpuModels);
-return NULL;
+return g_steal_pointer();
 }
 
 
 virDomainCapsCPUModelsPtr
 virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old)
 {
-virDomainCapsCPUModelsPtr cpuModels;
+g_autoptr(virDomainCapsCPUModels) cpuModels = NULL;
 size_t i;
 
 if (!(cpuModels = virDomainCapsCPUModelsNew(old->nmodels)))
@@ -181,14 +187,10 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old)
   old->models[i].name,
   old->models[i].usable,
   old->models[i].blockers) < 0)
-goto error;
+return NULL;
 }
 
-return cpuModels;
-
- error:
-virObjectUnref(cpuModels);
-return NULL;
+return g_steal_pointer();
 }
 
 
diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
index 9f4a23d015..88673ffe35 100644
--- a/src/conf/domain_capabilities.h
+++ b/src/conf/domain_capabilities.h
@@ -129,17 +129,21 @@ struct _virDomainCapsCPUModel {
 char **blockers; /* NULL-terminated list of usability blockers */
 };
 
-typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels;
+#define VIR_TYPE_DOMAIN_CAPS_CPU_MODELS vir_domain_caps_cpu_models_get_type()
+G_DECLARE_FINAL_TYPE(virDomainCapsCPUModels,
+ vir_domain_caps_cpu_models,
+ VIR,
+ DOMAIN_CAPS_CPU_MODELS,
+ GObject);
 typedef virDomainCapsCPUModels *virDomainCapsCPUModelsPtr;
 struct _virDomainCapsCPUModels {
-virObject parent;
+GObject parent;
 
 size_t nmodels_max;
 size_t nmodels;
 virDomainCapsCPUModelPtr models;
 };
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCapsCPUModels, virObjectUnref);
 
 typedef struct _virDomainCapsCPU virDomainCapsCPU;
 typedef virDomainCapsCPU *virDomainCapsCPUPtr;
diff --git a/tests/cputest.c b/tests/cputest.c
index 4590bfacee..6ae35227b9 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -572,7 +572,7 @@ cpuTestCPUID(bool guest, const void *arg)
 char *host = NULL;
 virCPUDefPtr cpu = NULL;
 char *result = NULL;
-virDomainCapsCPUModelsPtr models = NULL;
+g_autoptr(virDomainCapsCPUModels) models = NULL;
 
 hostFile = g_strdup_printf("%s/cputestdata/%s-cpuid-%s.xml", abs_srcdir,
virArchToString(data->arch), 

[PATCH 04/36] rpc: convert virNetClientProgram to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/admin/admin_remote.c| 10 +++
 src/locking/lock_driver_lockd.c | 23 ---
 src/logging/log_manager.c   | 17 ++-
 src/lxc/lxc_monitor.c   |  3 +-
 src/remote/remote_driver.c  | 52 +
 src/rpc/virnetclient.c  |  4 +--
 src/rpc/virnetclientprogram.c   | 29 +-
 src/rpc/virnetclientprogram.h   | 10 +--
 src/rpc/virnetclientstream.c|  5 ++--
 9 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c
index ca5e0c9fe4..da90939e49 100644
--- a/src/admin/admin_remote.c
+++ b/src/admin/admin_remote.c
@@ -41,7 +41,8 @@ remoteAdminPrivDispose(void *opaque)
 {
 remoteAdminPrivPtr priv = opaque;
 
-virObjectUnref(priv->program);
+if (priv->program)
+g_object_unref(priv->program);
 virObjectUnref(priv->client);
 }
 
@@ -227,10 +228,9 @@ remoteAdminPrivNew(const char *sock_path)
 if (!(priv->client = virNetClientNewUNIX(sock_path, false, NULL)))
 goto error;
 
-if (!(priv->program = virNetClientProgramNew(ADMIN_PROGRAM,
- ADMIN_PROTOCOL_VERSION,
- NULL, 0, NULL)))
-goto error;
+priv->program = virNetClientProgramNew(ADMIN_PROGRAM,
+   ADMIN_PROTOCOL_VERSION,
+   NULL, 0, NULL);
 
 if (virNetClientAddProgram(priv->client, priv->program) < 0)
 goto error;
diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
index bec98dd05f..7520545dc0 100644
--- a/src/locking/lock_driver_lockd.c
+++ b/src/locking/lock_driver_lockd.c
@@ -213,12 +213,11 @@ static virNetClientPtr 
virLockManagerLockDaemonConnectionNew(bool privileged,
daemonPath)))
 goto error;
 
-if (!(*prog = virNetClientProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM,
- 
VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION,
- NULL,
- 0,
- NULL)))
-goto error;
+*prog = virNetClientProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM,
+   VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION,
+   NULL,
+   0,
+   NULL);
 
 if (virNetClientAddProgram(client, *prog) < 0)
 goto error;
@@ -233,7 +232,8 @@ static virNetClientPtr 
virLockManagerLockDaemonConnectionNew(bool privileged,
 VIR_FREE(lockdpath);
 virNetClientClose(client);
 virObjectUnref(client);
-virObjectUnref(*prog);
+if (*prog)
+g_object_unref(*prog);
 return NULL;
 }
 
@@ -296,7 +296,8 @@ static int virLockManagerLockDaemonSetupLockspace(const 
char *path)
 rv = 0;
 
  cleanup:
-virObjectUnref(program);
+if (program)
+g_object_unref(program);
 virNetClientClose(client);
 virObjectUnref(client);
 return rv;
@@ -660,7 +661,8 @@ static int 
virLockManagerLockDaemonAcquire(virLockManagerPtr lock,
 VIR_FORCE_CLOSE(*fd);
 virNetClientClose(client);
 virObjectUnref(client);
-virObjectUnref(program);
+if (program)
+g_object_unref(program);
 
 return rv;
 }
@@ -713,7 +715,8 @@ static int 
virLockManagerLockDaemonRelease(virLockManagerPtr lock,
  cleanup:
 virNetClientClose(client);
 virObjectUnref(client);
-virObjectUnref(program);
+if (program)
+g_object_unref(program);
 
 return rv;
 }
diff --git a/src/logging/log_manager.c b/src/logging/log_manager.c
index fd7c2922b3..dee5307e56 100644
--- a/src/logging/log_manager.c
+++ b/src/logging/log_manager.c
@@ -83,12 +83,11 @@ virLogManagerConnect(bool privileged,
daemonPath)))
 goto error;
 
-if (!(*prog = virNetClientProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM,
- 
VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION,
- NULL,
- 0,
- NULL)))
-goto error;
+*prog = virNetClientProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM,
+   VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION,
+   NULL,
+   0,
+   NULL);
 
 if (virNetClientAddProgram(client, *prog) < 0)
 goto error;
@@ -103,7 +102,8 @@ virLogManagerConnect(bool privileged,
 VIR_FREE(logdpath);
 virNetClientClose(client);
 virObjectUnref(client);
-virObjectUnref(*prog);
+if (*prog)
+g_object_unref(*prog);
 return NULL;
 }
 
@@ -135,7 +135,8 @@ 

[PATCH 02/36] conf: capabilities: convert virCaps to GOBject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/bhyve/bhyve_capabilities.c  | 16 
 src/bhyve/bhyve_driver.c| 30 --
 src/conf/capabilities.c | 39 ++--
 src/conf/capabilities.h |  6 ++---
 src/conf/storage_capabilities.c |  5 ++--
 src/conf/virconftypes.h |  3 +--
 src/esx/esx_driver.c| 25 +++---
 src/libxl/libxl_capabilities.c  | 19 +-
 src/libxl/libxl_conf.c  |  3 ++-
 src/lxc/lxc_conf.c  | 16 +---
 src/lxc/lxc_controller.c|  3 ++-
 src/lxc/lxc_driver.c| 45 -
 src/lxc/lxc_process.c   |  3 ++-
 src/openvz/openvz_conf.c|  7 +++--
 src/qemu/qemu_capabilities.c| 14 +++---
 src/qemu/qemu_conf.c|  8 +++---
 src/qemu/qemu_driver.c  |  3 ++-
 src/security/virt-aa-helper.c   |  8 +++---
 src/storage/storage_backend.c   |  3 +--
 src/test/test_driver.c  | 28 +---
 src/vbox/vbox_common.c  |  7 +++--
 src/vmware/vmware_conf.c| 12 -
 src/vz/vz_driver.c  | 27 
 tests/bhyveargv2xmltest.c   |  2 +-
 tests/bhyvexml2argvtest.c   |  2 +-
 tests/bhyvexml2xmltest.c|  2 +-
 tests/domainconftest.c  |  3 ++-
 tests/genericxml2xmltest.c  |  3 ++-
 tests/openvzutilstest.c |  2 +-
 tests/qemucaps2xmltest.c| 13 +++---
 tests/qemuhotplugtest.c |  6 ++---
 tests/testutils.c   |  4 +--
 tests/testutilslxc.c| 21 +++
 tests/testutilsqemu.c   | 11 
 tests/testutilsxen.c|  3 +--
 tests/vircaps2xmltest.c |  6 +
 tests/vircapstest.c | 14 +++---
 tests/virresctrltest.c  |  3 +--
 tests/vmx2xmltest.c |  8 ++
 tests/xml2vmxtest.c |  9 +++
 40 files changed, 177 insertions(+), 265 deletions(-)

diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
index fb8829d571..66442e50ba 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -43,31 +43,25 @@ VIR_LOG_INIT("bhyve.bhyve_capabilities");
 virCapsPtr
 virBhyveCapsBuild(void)
 {
-virCapsPtr caps;
+g_autoptr(virCaps) caps = NULL;
 virCapsGuestPtr guest;
 
-if ((caps = virCapabilitiesNew(virArchFromHost(),
-   false, false)) == NULL)
-return NULL;
+caps = virCapabilitiesNew(virArchFromHost(), false, false);
 
 if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM,
  VIR_ARCH_X86_64,
  "bhyve",
  NULL, 0, NULL)) == NULL)
-goto error;
+return NULL;
 
 if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_BHYVE,
   NULL, NULL, 0, NULL) == NULL)
-goto error;
+return NULL;
 
 if (!(caps->host.cpu = virCPUProbeHost(caps->host.arch)))
 VIR_WARN("Failed to get host CPU");
 
-return caps;
-
- error:
-virObjectUnref(caps);
-return NULL;
+return g_steal_pointer();
 }
 
 int
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index b6204c7fb9..4ca3666700 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -126,22 +126,21 @@ bhyveAutostartDomains(bhyveConnPtr driver)
  * Get a reference to the virCapsPtr instance for the
  * driver.
  *
- * The caller must release the reference with virObjetUnref
+ * The caller must release the reference with g_object_unref
  *
  * Returns: a reference to a virCapsPtr instance or NULL
  */
 virCapsPtr ATTRIBUTE_NONNULL(1)
 bhyveDriverGetCapabilities(bhyveConnPtr driver)
 {
-return virObjectRef(driver->caps);
+return g_object_ref(driver->caps);
 }
 
 static char *
 bhyveConnectGetCapabilities(virConnectPtr conn)
 {
 bhyveConnPtr privconn = conn->privateData;
-virCapsPtr caps;
-char *xml = NULL;
+g_autoptr(virCaps) caps;
 
 if (virConnectGetCapabilitiesEnsureACL(conn) < 0)
 return NULL;
@@ -149,15 +148,10 @@ bhyveConnectGetCapabilities(virConnectPtr conn)
 if (!(caps = bhyveDriverGetCapabilities(privconn))) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unable to get Capabilities"));
-goto cleanup;
+return NULL;
 }
 
-if (!(xml = virCapabilitiesFormatXML(caps)))
-goto cleanup;
-
- cleanup:
-virObjectUnref(caps);
-return xml;
+return virCapabilitiesFormatXML(caps);
 }
 
 static virDomainObjPtr
@@ -508,7 +502,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flag
 virDomainDefPtr oldDef = NULL;
 virDomainObjPtr vm = NULL;
 virObjectEventPtr event = NULL;
-virCapsPtr caps = NULL;
+g_autoptr(virCaps) caps = NULL;
 unsigned int parse_flags 

[PATCH 13/36] admin: convert virAdmServer to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/admin/libvirt-admin.c|  2 +-
 src/admin/libvirt_admin_private.syms |  1 -
 src/datatypes.c  | 42 ++--
 src/datatypes.h  | 20 +++--
 4 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/src/admin/libvirt-admin.c b/src/admin/libvirt-admin.c
index 835b5560d2..ed7a57cbbb 100644
--- a/src/admin/libvirt-admin.c
+++ b/src/admin/libvirt-admin.c
@@ -586,7 +586,7 @@ int virAdmServerFree(virAdmServerPtr srv)
 
 virCheckAdmServerReturn(srv, -1);
 
-virObjectUnref(srv);
+g_object_unref(srv);
 return 0;
 }
 
diff --git a/src/admin/libvirt_admin_private.syms 
b/src/admin/libvirt_admin_private.syms
index 157a45341e..270fa43995 100644
--- a/src/admin/libvirt_admin_private.syms
+++ b/src/admin/libvirt_admin_private.syms
@@ -40,7 +40,6 @@ virAdmConnectCloseCallbackDataRegister;
 virAdmConnectCloseCallbackDataReset;
 virAdmConnectCloseCallbackDataUnregister;
 virAdmGetServer;
-virAdmServerClass;
 
 # Let emacs know we want case-insensitive sorting
 # Local Variables:
diff --git a/src/datatypes.c b/src/datatypes.c
index 552115c7a3..d6afaf89ad 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -71,11 +71,25 @@ virClassPtr virAdmConnectCloseCallbackDataClass;
 static void virAdmConnectDispose(void *obj);
 static void virAdmConnectCloseCallbackDataDispose(void *obj);
 
-virClassPtr virAdmServerClass;
 virClassPtr virAdmClientClass;
-static void virAdmServerDispose(void *obj);
 static void virAdmClientDispose(void *obj);
 
+G_DEFINE_TYPE(virAdmServer, vir_adm_server, G_TYPE_OBJECT);
+static void virAdmServerFinalize(GObject *obj);
+
+static void
+vir_adm_server_init(virAdmServer *srv G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_adm_server_class_init(virAdmServerClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virAdmServerFinalize;
+}
+
 static int
 virDataTypesOnceInit(void)
 {
@@ -105,7 +119,6 @@ virDataTypesOnceInit(void)
 
 DECLARE_CLASS_LOCKABLE(virAdmConnect);
 DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
-DECLARE_CLASS(virAdmServer);
 DECLARE_CLASS(virAdmClient);
 
 #undef DECLARE_CLASS_COMMON
@@ -1173,31 +1186,30 @@ 
virAdmConnectCloseCallbackDataRegister(virAdmConnectCloseCallbackDataPtr cbdata,
 virAdmServerPtr
 virAdmGetServer(virAdmConnectPtr conn, const char *name)
 {
-virAdmServerPtr ret = NULL;
+g_autoptr(virAdmServer) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
-goto error;
+return NULL;
+
+ret = VIR_ADM_SERVER(g_object_new(VIR_TYPE_ADM_SERVER, NULL));
 
-if (!(ret = virObjectNew(virAdmServerClass)))
-goto error;
 ret->name = g_strdup(name);
 
 ret->conn = virObjectRef(conn);
 
-return ret;
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 static void
-virAdmServerDispose(void *obj)
+virAdmServerFinalize(GObject *obj)
 {
-virAdmServerPtr srv = obj;
+virAdmServerPtr srv = VIR_ADM_SERVER(obj);
 VIR_DEBUG("release server srv=%p name=%s", srv, srv->name);
 
 VIR_FREE(srv->name);
 virObjectUnref(srv->conn);
+
+G_OBJECT_CLASS(vir_adm_server_parent_class)->finalize(obj);
 }
 
 virAdmClientPtr
@@ -1215,7 +1227,7 @@ virAdmGetClient(virAdmServerPtr srv, const unsigned long 
long id,
 ret->id = id;
 ret->timestamp = timestamp;
 ret->transport = transport;
-ret->srv = virObjectRef(srv);
+ret->srv = g_object_ref(srv);
 
 return ret;
  error:
@@ -1229,5 +1241,5 @@ virAdmClientDispose(void *obj)
 virAdmClientPtr clt = obj;
 VIR_DEBUG("release client clt=%p, id=%llu", clt, clt->id);
 
-virObjectUnref(clt->srv);
+g_object_unref(clt->srv);
 }
diff --git a/src/datatypes.h b/src/datatypes.h
index 2d0407f7ec..20b64ca788 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -28,6 +28,8 @@
 #include "virobject.h"
 #include "viruuid.h"
 
+#include 
+
 extern virClassPtr virConnectClass;
 extern virClassPtr virDomainClass;
 extern virClassPtr virDomainCheckpointClass;
@@ -44,9 +46,11 @@ extern virClassPtr virStorageVolClass;
 extern virClassPtr virStoragePoolClass;
 
 extern virClassPtr virAdmConnectClass;
-extern virClassPtr virAdmServerClass;
 extern virClassPtr virAdmClientClass;
 
+#define VIR_TYPE_ADM_SERVER vir_adm_server_get_type()
+G_DECLARE_FINAL_TYPE(virAdmServer, vir_adm_server, VIR, ADM_SERVER, GObject);
+
 #define virCheckConnectReturn(obj, retval) \
 do { \
 if (!virObjectIsClass(obj, virConnectClass)) { \
@@ -419,8 +423,8 @@ extern virClassPtr virAdmClientClass;
 
 #define virCheckAdmServerReturn(obj, retval) \
 do { \
-virAdmServerPtr _srv = (obj); \
-if (!virObjectIsClass(_srv, virAdmServerClass) || \
+virAdmServerPtr _srv = VIR_ADM_SERVER(obj); \
+if (!G_IS_OBJECT(_srv) || !(G_OBJECT_TYPE(_srv) == 
VIR_TYPE_ADM_SERVER) || \
 !virObjectIsClass(_srv->conn, virAdmConnectClass)) { \
  

[PATCH 11/36] util: convert dnsmasqCaps to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/network/bridge_driver.c | 21 ++
 src/util/virdnsmasq.c   | 56 +
 src/util/virdnsmasq.h   |  6 ++--
 tests/networkxml2conftest.c | 10 ++-
 4 files changed, 41 insertions(+), 52 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index f06099297a..6148bf6a7e 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -117,7 +117,7 @@ networkGetDnsmasqCaps(virNetworkDriverStatePtr driver)
 {
 dnsmasqCapsPtr ret;
 networkDriverLock(driver);
-ret = virObjectRef(driver->dnsmasqCaps);
+ret = g_object_ref(driver->dnsmasqCaps);
 networkDriverUnlock(driver);
 return ret;
 }
@@ -132,7 +132,8 @@ networkDnsmasqCapsRefresh(virNetworkDriverStatePtr driver)
 return -1;
 
 networkDriverLock(driver);
-virObjectUnref(driver->dnsmasqCaps);
+if (driver->dnsmasqCaps)
+g_object_unref(driver->dnsmasqCaps);
 driver->dnsmasqCaps = caps;
 networkDriverUnlock(driver);
 return 0;
@@ -543,7 +544,7 @@ networkUpdateState(virNetworkObjPtr obj,
 {
 virNetworkDefPtr def;
 virNetworkDriverStatePtr driver = opaque;
-dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
+g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver);
 virMacMapPtr macmap;
 char *macMapFile = NULL;
 int ret = -1;
@@ -629,7 +630,6 @@ networkUpdateState(virNetworkObjPtr obj,
 ret = 0;
  cleanup:
 virObjectUnlock(obj);
-virObjectUnref(dnsmasq_caps);
 VIR_FREE(macMapFile);
 return ret;
 }
@@ -905,7 +905,8 @@ networkStateCleanup(void)
 VIR_FREE(network_driver->dnsmasqStateDir);
 VIR_FREE(network_driver->radvdStateDir);
 
-virObjectUnref(network_driver->dnsmasqCaps);
+if (network_driver->dnsmasqCaps)
+g_object_unref(network_driver->dnsmasqCaps);
 
 virMutexDestroy(_driver->lock);
 
@@ -1544,7 +1545,7 @@ 
networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver,
   dnsmasqContext *dctx)
 {
 virNetworkDefPtr def = virNetworkObjGetDef(obj);
-dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
+g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver);
 virCommandPtr cmd = NULL;
 int ret = -1;
 char *configfile = NULL;
@@ -1587,7 +1588,6 @@ 
networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver,
 *cmdout = cmd;
 ret = 0;
  cleanup:
-virObjectUnref(dnsmasq_caps);
 VIR_FREE(configfile);
 VIR_FREE(configstr);
 VIR_FREE(leaseshelper_path);
@@ -1911,7 +1911,7 @@ networkStartRadvd(virNetworkDriverStatePtr driver,
   virNetworkObjPtr obj)
 {
 virNetworkDefPtr def = virNetworkObjGetDef(obj);
-dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
+g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver);
 pid_t radvdPid;
 char *pidfile = NULL;
 char *radvdpidbase = NULL;
@@ -1989,7 +1989,6 @@ networkStartRadvd(virNetworkDriverStatePtr driver,
 
 ret = 0;
  cleanup:
-virObjectUnref(dnsmasq_caps);
 virCommandFree(cmd);
 VIR_FREE(configfile);
 VIR_FREE(radvdpidbase);
@@ -2003,14 +2002,13 @@ networkRefreshRadvd(virNetworkDriverStatePtr driver,
 virNetworkObjPtr obj)
 {
 virNetworkDefPtr def = virNetworkObjGetDef(obj);
-dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
+g_autoptr(dnsmasqCaps) dnsmasq_caps = networkGetDnsmasqCaps(driver);
 g_autofree char *radvdpidbase = NULL;
 g_autofree char *pidfile = NULL;
 pid_t radvdPid;
 
 /* Is dnsmasq handling RA? */
 if (DNSMASQ_RA_SUPPORT(dnsmasq_caps)) {
-virObjectUnref(dnsmasq_caps);
 if ((radvdpidbase = networkRadvdPidfileBasename(def->name)) &&
 (pidfile = virPidFileBuildPath(driver->pidDir, radvdpidbase))) {
 /* radvd should not be running but in case it is */
@@ -2019,7 +2017,6 @@ networkRefreshRadvd(virNetworkDriverStatePtr driver,
 }
 return 0;
 }
-virObjectUnref(dnsmasq_caps);
 
 /* if there's no running radvd, just start it */
 radvdPid = virNetworkObjGetRadvdPid(obj);
diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c
index adc6f96bb6..a8fb22a368 100644
--- a/src/util/virdnsmasq.c
+++ b/src/util/virdnsmasq.c
@@ -598,7 +598,7 @@ dnsmasqReload(pid_t pid G_GNUC_UNUSED)
  *
  */
 struct _dnsmasqCaps {
-virObject parent;
+GObject parent;
 char *binaryPath;
 bool noRefresh;
 time_t mtime;
@@ -606,26 +606,31 @@ struct _dnsmasqCaps {
 unsigned long version;
 };
 
-static virClassPtr dnsmasqCapsClass;
+G_DEFINE_TYPE(dnsmasqCaps, dnsmasq_caps, G_TYPE_OBJECT);
 
 static void
-dnsmasqCapsDispose(void *obj)
+dnsmasqCapsFinalize(GObject *obj)
 {
-dnsmasqCapsPtr caps = obj;
+dnsmasqCapsPtr caps = DNSMASQ_CAPS(obj);
 
 virBitmapFree(caps->flags);
 VIR_FREE(caps->binaryPath);

[PATCH 19/36] datatypes: convert virNetwork to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/domain_conf.c  |  6 ++--
 src/conf/network_event.c|  2 +-
 src/conf/virnetworkobj.c|  7 ++--
 src/datatypes.c | 50 +
 src/datatypes.h | 33 ++-
 src/libvirt-network.c   |  7 ++--
 src/libvirt_private.syms|  1 -
 src/libxl/libxl_conf.c  |  3 +-
 src/libxl/xen_common.c  |  2 +-
 src/remote/remote_daemon_dispatch.c |  6 ++--
 src/remote/remote_driver.c  |  4 +--
 11 files changed, 64 insertions(+), 57 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a29e6681a5..772d9ae0a8 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -31540,7 +31540,7 @@ virDomainNetReleaseActualDevice(virConnectPtr conn,
 virDomainDefPtr dom G_GNUC_UNUSED,
 virDomainNetDefPtr iface)
 {
-virNetworkPtr net = NULL;
+g_autoptr(virNetwork) net = NULL;
 virNetworkPortPtr port = NULL;
 int ret = -1;
 
@@ -31561,7 +31561,6 @@ virDomainNetReleaseActualDevice(virConnectPtr conn,
 
  cleanup:
 virObjectUnref(port);
-virObjectUnref(net);
 return ret;
 }
 
@@ -31614,7 +31613,7 @@ int
 virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
 virNetDevBandwidthPtr newBandwidth)
 {
-virNetworkPtr net = NULL;
+g_autoptr(virNetwork) net = NULL;
 virNetworkPortPtr port = NULL;
 virTypedParameterPtr params = NULL;
 int nparams = 0;
@@ -31641,7 +31640,6 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
 virObjectUnref(conn);
 virTypedParamsFree(params, nparams);
 virObjectUnref(port);
-virObjectUnref(net);
 return ret;
 }
 
diff --git a/src/conf/network_event.c b/src/conf/network_event.c
index 41cabe340a..5a8f138dfd 100644
--- a/src/conf/network_event.c
+++ b/src/conf/network_event.c
@@ -111,7 +111,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
 VIR_WARN("Unexpected event ID %d", event->eventID);
 
  cleanup:
-virObjectUnref(net);
+g_object_unref(net);
 }
 
 
diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
index b2affaacd3..762c9d9159 100644
--- a/src/conf/virnetworkobj.c
+++ b/src/conf/virnetworkobj.c
@@ -1429,9 +1429,10 @@ virNetworkObjListExport(virConnectPtr conn,
 ret = data.nnets;
  cleanup:
 virObjectRWUnlock(netobjs);
-while (data.nets && data.nnets)
-virObjectUnref(data.nets[--data.nnets]);
-
+while (data.nets && data.nnets) {
+if (data.nets[--data.nnets])
+g_object_unref(data.nets[data.nnets]);
+}
 VIR_FREE(data.nets);
 return ret;
 }
diff --git a/src/datatypes.c b/src/datatypes.c
index b9879cfb9e..15130ca0fa 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -37,7 +37,6 @@ virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
 virClassPtr virInterfaceClass;
-virClassPtr virNetworkClass;
 virClassPtr virNetworkPortClass;
 virClassPtr virNodeDeviceClass;
 virClassPtr virSecretClass;
@@ -49,7 +48,6 @@ static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
 static void virInterfaceDispose(void *obj);
-static void virNetworkDispose(void *obj);
 static void virNetworkPortDispose(void *obj);
 static void virNodeDeviceDispose(void *obj);
 static void virSecretDispose(void *obj);
@@ -89,6 +87,22 @@ vir_domain_snapshot_class_init(virDomainSnapshotClass *klass)
 obj->finalize = virDomainSnapshotFinalize;
 }
 
+G_DEFINE_TYPE(virNetwork, vir_network, G_TYPE_OBJECT);
+static void virNetworkFinalize(GObject *obj);
+
+static void
+vir_network_init(virNetwork *net G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_network_class_init(virNetworkClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virNetworkFinalize;
+}
+
 G_DEFINE_TYPE(virNWFilter, vir_nw_filter, G_TYPE_OBJECT);
 static void virNWFilterFinalize(GObject *obj);
 
@@ -174,7 +188,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
 DECLARE_CLASS(virInterface);
-DECLARE_CLASS(virNetwork);
 DECLARE_CLASS(virNetworkPort);
 DECLARE_CLASS(virNodeDevice);
 DECLARE_CLASS(virSecret);
@@ -411,39 +424,34 @@ virDomainDispose(void *obj)
  * @uuid: pointer to the uuid
  *
  * Allocates a new network object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the network object, or NULL on error.
  */
 virNetworkPtr
 virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid)
 {
-virNetworkPtr ret = NULL;
+g_autoptr(virNetwork) ret = NULL;
 
 if 

[PATCH 07/36] bhyve: convert bhyveMonitor to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/bhyve/bhyve_monitor.c | 35 +++
 src/bhyve/bhyve_monitor.h |  3 ++-
 2 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/src/bhyve/bhyve_monitor.c b/src/bhyve/bhyve_monitor.c
index e5cd39a086..4609e3c53a 100644
--- a/src/bhyve/bhyve_monitor.c
+++ b/src/bhyve/bhyve_monitor.c
@@ -39,7 +39,7 @@
 VIR_LOG_INIT("bhyve.bhyve_monitor");
 
 struct _bhyveMonitor {
-virObject parent;
+GObject parent;
 
 bhyveConnPtr driver;
 virDomainObjPtr vm;
@@ -48,34 +48,38 @@ struct _bhyveMonitor {
 bool reboot;
 };
 
-static virClassPtr bhyveMonitorClass;
+G_DEFINE_TYPE(bhyveMonitor, bhyve_monitor, G_TYPE_OBJECT);
 
 static void
-bhyveMonitorDispose(void *obj)
+bhyveMonitorFinalize(GObject *obj)
 {
-bhyveMonitorPtr mon = obj;
+bhyveMonitorPtr mon = BHYVE_MONITOR(obj);
 
 VIR_FORCE_CLOSE(mon->kq);
 virObjectUnref(mon->vm);
+
+G_OBJECT_CLASS(bhyve_monitor_parent_class)->finalize(obj);
 }
 
-static int
-bhyveMonitorOnceInit(void)
+static void
+bhyve_monitor_init(bhyveMonitor *mon G_GNUC_UNUSED)
 {
-if (!VIR_CLASS_NEW(bhyveMonitor, virClassForObject()))
-return -1;
-
-return 0;
 }
 
-VIR_ONCE_GLOBAL_INIT(bhyveMonitor);
+static void
+bhyve_monitor_class_init(bhyveMonitorClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = bhyveMonitorFinalize;
+}
 
 static void bhyveMonitorIO(int, int, int, void *);
 
 static bool
 bhyveMonitorRegister(bhyveMonitorPtr mon)
 {
-virObjectRef(mon);
+g_object_ref(mon);
 mon->watch = virEventAddHandle(mon->kq,
VIR_EVENT_HANDLE_READABLE |
VIR_EVENT_HANDLE_ERROR |
@@ -85,7 +89,7 @@ bhyveMonitorRegister(bhyveMonitorPtr mon)
virObjectFreeCallback);
 if (mon->watch < 0) {
 VIR_DEBUG("failed to add event handle for mon %p", mon);
-virObjectUnref(mon);
+g_object_unref(mon);
 return false;
 }
 return true;
@@ -181,8 +185,7 @@ bhyveMonitorOpenImpl(virDomainObjPtr vm, bhyveConnPtr 
driver)
 if (bhyveMonitorInitialize() < 0)
 return NULL;
 
-if (!(mon = virObjectNew(bhyveMonitorClass)))
-return NULL;
+mon = BHYVE_MONITOR(g_object_new(BHYVE_TYPE_MONITOR, NULL));
 
 mon->driver = driver;
 mon->reboot = false;
@@ -238,5 +241,5 @@ bhyveMonitorClose(bhyveMonitorPtr mon)
 VIR_DEBUG("cleaning up bhyveMonitor %p", mon);
 
 bhyveMonitorUnregister(mon);
-virObjectUnref(mon);
+g_object_unref(mon);
 }
diff --git a/src/bhyve/bhyve_monitor.h b/src/bhyve/bhyve_monitor.h
index 175cc87192..dcc6929696 100644
--- a/src/bhyve/bhyve_monitor.h
+++ b/src/bhyve/bhyve_monitor.h
@@ -24,7 +24,8 @@
 #include "domain_conf.h"
 #include "bhyve_utils.h"
 
-typedef struct _bhyveMonitor bhyveMonitor;
+#define BHYVE_TYPE_MONITOR bhyve_monitor_get_type()
+G_DECLARE_FINAL_TYPE(bhyveMonitor, bhyve_monitor, BHYVE, MONITOR, GObject);
 typedef bhyveMonitor *bhyveMonitorPtr;
 
 bhyveMonitorPtr bhyveMonitorOpen(virDomainObjPtr vm, bhyveConnPtr driver);
-- 
2.25.1




[PATCH 16/36] datatypes: convert virDomainSnapshot to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virdomainsnapshotobjlist.c |  6 ++--
 src/datatypes.c | 44 ++---
 src/datatypes.h | 13 +++--
 src/libvirt-domain-snapshot.c   |  7 ++---
 src/libvirt_private.syms|  1 -
 src/qemu/qemu_driver.c  |  3 +-
 6 files changed, 45 insertions(+), 29 deletions(-)

diff --git a/src/conf/virdomainsnapshotobjlist.c 
b/src/conf/virdomainsnapshotobjlist.c
index 910b0714c7..7641aa98ff 100644
--- a/src/conf/virdomainsnapshotobjlist.c
+++ b/src/conf/virdomainsnapshotobjlist.c
@@ -286,8 +286,10 @@ virDomainListSnapshots(virDomainSnapshotObjListPtr 
snapshots,
 VIR_FREE(names[i]);
 VIR_FREE(names);
 if (ret < 0 && list) {
-for (i = 0; i < count; i++)
-virObjectUnref(list[i]);
+for (i = 0; i < count; i++) {
+if (list[i])
+g_object_unref(list[i]);
+}
 VIR_FREE(list);
 }
 return ret;
diff --git a/src/datatypes.c b/src/datatypes.c
index 1e0861aa5f..fd39c96b31 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -36,7 +36,6 @@ VIR_LOG_INIT("datatypes");
 virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
-virClassPtr virDomainSnapshotClass;
 virClassPtr virInterfaceClass;
 virClassPtr virNetworkClass;
 virClassPtr virNetworkPortClass;
@@ -51,7 +50,6 @@ virClassPtr virStoragePoolClass;
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
-static void virDomainSnapshotDispose(void *obj);
 static void virInterfaceDispose(void *obj);
 static void virNetworkDispose(void *obj);
 static void virNetworkPortDispose(void *obj);
@@ -79,6 +77,22 @@ vir_domain_checkpoint_class_init(virDomainCheckpointClass 
*klass)
 obj->finalize = virDomainCheckpointFinalize;
 }
 
+G_DEFINE_TYPE(virDomainSnapshot, vir_domain_snapshot, G_TYPE_OBJECT);
+static void virDomainSnapshotFinalize(GObject *obj);
+
+static void
+vir_domain_snapshot_init(virDomainSnapshot *ds G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_domain_snapshot_class_init(virDomainSnapshotClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virDomainSnapshotFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -131,7 +145,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnect);
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
-DECLARE_CLASS(virDomainSnapshot);
 DECLARE_CLASS(virInterface);
 DECLARE_CLASS(virNetwork);
 DECLARE_CLASS(virNetworkPort);
@@ -1051,37 +1064,32 @@ virDomainCheckpointFinalize(GObject *obj)
  * @name: pointer to the domain snapshot name
  *
  * Allocates a new domain snapshot object. When the object is no longer needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the domain snapshot object, or NULL on error.
  */
 virDomainSnapshotPtr
 virGetDomainSnapshot(virDomainPtr domain, const char *name)
 {
-virDomainSnapshotPtr ret = NULL;
+g_autoptr(virDomainSnapshot) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckDomainGoto(domain, error);
-virCheckNonNullArgGoto(name, error);
+virCheckDomainReturn(domain, NULL);
+virCheckNonNullArgReturn(name, NULL);
 
-if (!(ret = virObjectNew(virDomainSnapshotClass)))
-goto error;
+ret = VIR_DOMAIN_SNAPSHOT(g_object_new(VIR_TYPE_DOMAIN_SNAPSHOT, NULL));
 ret->name = g_strdup(name);
 
 ret->domain = virObjectRef(domain);
 
-return ret;
-
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 
 /**
- * virDomainSnapshotDispose:
+ * virDomainSnapshotFinalize:
  * @obj: the domain snapshot to release
  *
  * Unconditionally release all memory associated with a snapshot.
@@ -1091,13 +1099,15 @@ virGetDomainSnapshot(virDomainPtr domain, const char 
*name)
  * which may also be released if its ref count hits zero.
  */
 static void
-virDomainSnapshotDispose(void *obj)
+virDomainSnapshotFinalize(GObject *obj)
 {
-virDomainSnapshotPtr snapshot = obj;
+virDomainSnapshotPtr snapshot = VIR_DOMAIN_SNAPSHOT(obj);
 VIR_DEBUG("release snapshot %p %s", snapshot, snapshot->name);
 
 VIR_FREE(snapshot->name);
 virObjectUnref(snapshot->domain);
+
+G_OBJECT_CLASS(vir_domain_snapshot_parent_class)->finalize(obj);
 }
 
 
diff --git a/src/datatypes.h b/src/datatypes.h
index 13ad044126..296196523b 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -32,7 +32,6 @@
 
 extern virClassPtr virConnectClass;
 extern virClassPtr virDomainClass;
-extern virClassPtr virDomainSnapshotClass;
 extern virClassPtr virInterfaceClass;
 extern virClassPtr virNetworkClass;
 extern virClassPtr 

[PATCH 00/36] convert virObjects to GObject

2020-04-03 Thread Rafael Fonseca
This patch series convert various simple instances of virObject to a
GObject equivalent.

virDomain is still WIP because it causes some linking problem I am still
investigating.

virObjects that work as parent class to other objects will be covered in
a next patchset.

Rafael Fonseca (36):
  util: virresctrl: convert classes to GObject
  conf: capabilities: convert virCaps to GOBject
  qemu: convert virQEMUCaps to GObject
  rpc: convert virNetClientProgram to GObject
  rpc: convert virNetServerProgram to GObject
  conf: convert virDomainXMLOption to GObject
  bhyve: convert bhyveMonitor to GObject
  bhyve: convert virBhyveDriverConfig to GObject
  rpc: convert virNetServerService to GObject
  conf: convert virDomainCapsCPUModels to GObject
  util: convert dnsmasqCaps to GObject
  conf: convert virDomainChrSourceDef to GObject
  admin: convert virAdmServer to GObject
  admin: convert virAdmClient to GObject
  datatypes: convert virDomainCheckpoint to GObject
  datatypes: convert virDomainSnapshot to GObject
  datatypes: convert virNWFilter to GObject
  datatypes: convert virNWFilterBinding to GObject
  datatypes: convert virNetwork to GObject
  datatypes: convert virNetworkPort to GObject
  datatypes: convert virInterface to GObject
  datatypes: convert virStoragePool to GObject
  datatypes: convert virStorageVol to GObject
  datatypes: convert virNodeDevice to GObject
  datatypes: convert virSecret to GObject
  datatypes: convert virStream to GObject
  conf: convert virNetworkXMLOption to GObject
  lxc: convert virLXCDriverConfig to GObject
  libxl: convert libxlDriverConfig to GObject
  hypervisor: convert virHostdevManager to GObject
  libxl: convert libxlMigrationDstArgs to GObject
  qemu: convert qemuBlockJobData to GObject
  qemu: convert virQEMUDriverConfig to GObject
  conf: convert virDomain*Private to GObject
  conf: convert virSaveCookie to GObject
  util: convert virStorageSource to GObject

 src/admin/admin_remote.c|  10 +-
 src/admin/libvirt-admin.c   |   4 +-
 src/admin/libvirt_admin_private.syms|   2 -
 src/bhyve/bhyve_capabilities.c  |  19 +-
 src/bhyve/bhyve_conf.c  |  34 +-
 src/bhyve/bhyve_driver.c|  36 +-
 src/bhyve/bhyve_monitor.c   |  35 +-
 src/bhyve/bhyve_monitor.h   |   3 +-
 src/bhyve/bhyve_utils.h |  11 +-
 src/conf/capabilities.c |  42 +-
 src/conf/capabilities.h |   6 +-
 src/conf/domain_capabilities.c  |  48 +-
 src/conf/domain_capabilities.h  |  10 +-
 src/conf/domain_conf.c  | 126 ++---
 src/conf/domain_conf.h  |  36 +-
 src/conf/network_conf.c |  31 +-
 src/conf/network_conf.h |  12 +-
 src/conf/network_event.c|   2 +-
 src/conf/node_device_event.c|   9 +-
 src/conf/node_device_util.c |   4 +-
 src/conf/secret_event.c |   9 +-
 src/conf/snapshot_conf.c|   3 +-
 src/conf/snapshot_conf.h|   2 +-
 src/conf/storage_capabilities.c |   5 +-
 src/conf/storage_event.c|  15 +-
 src/conf/virchrdev.c|   5 +-
 src/conf/virconftypes.h |   3 +-
 src/conf/virdomaincheckpointobjlist.c   |   6 +-
 src/conf/virdomainsnapshotobjlist.c |   6 +-
 src/conf/virinterfaceobj.c  |   7 +-
 src/conf/virnetworkobj.c|  14 +-
 src/conf/virnodedeviceobj.c |  10 +-
 src/conf/virnwfilterbindingobjlist.c|   6 +-
 src/conf/virnwfilterobj.c   |   6 +-
 src/conf/virsavecookie.c|  10 +-
 src/conf/virsavecookie.h|  14 +-
 src/conf/virsecretobj.c |   8 +-
 src/conf/virstorageobj.c|  16 +-
 src/datatypes.c | 601 +++-
 src/datatypes.h | 199 
 src/esx/esx_driver.c|  28 +-
 src/hypervisor/virhostdev.c |  31 +-
 src/hypervisor/virhostdev.h |  13 +-
 src/interface/interface_backend_netcf.c |   2 +-
 src/interface/interface_backend_udev.c  |   2 +-
 src/libvirt-domain-checkpoint.c |   7 +-
 src/libvirt-domain-snapshot.c   |   7 +-
 src/libvirt-interface.c |   6 +-
 src/libvirt-network.c   |  14 +-
 src/libvirt-nodedev.c   |   6 +-
 src/libvirt-nwfilter.c  |  14 +-
 src/libvirt-secret.c|   7 +-
 src/libvirt-storage.c   |  12 +-
 src/libvirt-stream.c|   7 +-
 src/libvirt_private.syms|  11 -
 src/libxl/libxl_capabilities.c  |  19 +-
 src/libxl/libxl_conf.c  |  57 ++-
 src/libxl/libxl_conf.h  |  12 +-
 src/libxl/libxl_driver.c| 178 +++
 src/libxl/libxl_migration.c |  80 ++--
 src/libxl/xen_common.c   

[PATCH 15/36] datatypes: convert virDomainCheckpoint to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/virdomaincheckpointobjlist.c |  6 ++--
 src/datatypes.c   | 44 ---
 src/datatypes.h   | 14 ++---
 src/libvirt-domain-checkpoint.c   |  7 ++---
 src/libvirt_private.syms  |  1 -
 5 files changed, 44 insertions(+), 28 deletions(-)

diff --git a/src/conf/virdomaincheckpointobjlist.c 
b/src/conf/virdomaincheckpointobjlist.c
index a4942ea706..5c457dc876 100644
--- a/src/conf/virdomaincheckpointobjlist.c
+++ b/src/conf/virdomaincheckpointobjlist.c
@@ -235,8 +235,10 @@ virDomainListCheckpoints(virDomainCheckpointObjListPtr 
checkpoints,
 VIR_FREE(names[i]);
 VIR_FREE(names);
 if (ret < 0 && list) {
-for (i = 0; i < count; i++)
-virObjectUnref(list[i]);
+for (i = 0; i < count; i++) {
+if (list[i])
+g_object_unref(list[i]);
+}
 VIR_FREE(list);
 }
 return ret;
diff --git a/src/datatypes.c b/src/datatypes.c
index 68fc216ffa..1e0861aa5f 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -36,7 +36,6 @@ VIR_LOG_INIT("datatypes");
 virClassPtr virConnectClass;
 virClassPtr virConnectCloseCallbackDataClass;
 virClassPtr virDomainClass;
-virClassPtr virDomainCheckpointClass;
 virClassPtr virDomainSnapshotClass;
 virClassPtr virInterfaceClass;
 virClassPtr virNetworkClass;
@@ -52,7 +51,6 @@ virClassPtr virStoragePoolClass;
 static void virConnectDispose(void *obj);
 static void virConnectCloseCallbackDataDispose(void *obj);
 static void virDomainDispose(void *obj);
-static void virDomainCheckpointDispose(void *obj);
 static void virDomainSnapshotDispose(void *obj);
 static void virInterfaceDispose(void *obj);
 static void virNetworkDispose(void *obj);
@@ -65,6 +63,22 @@ static void virStreamDispose(void *obj);
 static void virStorageVolDispose(void *obj);
 static void virStoragePoolDispose(void *obj);
 
+G_DEFINE_TYPE(virDomainCheckpoint, vir_domain_checkpoint, G_TYPE_OBJECT);
+static void virDomainCheckpointFinalize(GObject *obj);
+
+static void
+vir_domain_checkpoint_init(virDomainCheckpoint *dc G_GNUC_UNUSED)
+{
+}
+
+static void
+vir_domain_checkpoint_class_init(virDomainCheckpointClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virDomainCheckpointFinalize;
+}
+
 virClassPtr virAdmConnectClass;
 virClassPtr virAdmConnectCloseCallbackDataClass;
 
@@ -117,7 +131,6 @@ virDataTypesOnceInit(void)
 DECLARE_CLASS_LOCKABLE(virConnect);
 DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
 DECLARE_CLASS(virDomain);
-DECLARE_CLASS(virDomainCheckpoint);
 DECLARE_CLASS(virDomainSnapshot);
 DECLARE_CLASS(virInterface);
 DECLARE_CLASS(virNetwork);
@@ -984,7 +997,7 @@ virNWFilterBindingDispose(void *obj)
  * @name: pointer to the domain checkpoint name
  *
  * Allocates a new domain checkpoint object. When the object is no longer 
needed,
- * virObjectUnref() must be called in order to not leak data.
+ * g_object_unref() must be called in order to not leak data.
  *
  * Returns a pointer to the domain checkpoint object, or NULL on error.
  */
@@ -992,30 +1005,25 @@ virDomainCheckpointPtr
 virGetDomainCheckpoint(virDomainPtr domain,
const char *name)
 {
-virDomainCheckpointPtr ret = NULL;
+g_autoptr(virDomainCheckpoint) ret = NULL;
 
 if (virDataTypesInitialize() < 0)
 return NULL;
 
-virCheckDomainGoto(domain, error);
-virCheckNonNullArgGoto(name, error);
+virCheckDomainReturn(domain, NULL);
+virCheckNonNullArgReturn(name, NULL);
 
-if (!(ret = virObjectNew(virDomainCheckpointClass)))
-goto error;
+ret = VIR_DOMAIN_CHECKPOINT(g_object_new(VIR_TYPE_DOMAIN_CHECKPOINT, 
NULL));
 ret->name = g_strdup(name);
 
 ret->domain = virObjectRef(domain);
 
-return ret;
-
- error:
-virObjectUnref(ret);
-return NULL;
+return g_steal_pointer();
 }
 
 
 /**
- * virDomainCheckpointDispose:
+ * virDomainCheckpointFinalize:
  * @obj: the domain checkpoint to release
  *
  * Unconditionally release all memory associated with a checkpoint.
@@ -1025,13 +1033,15 @@ virGetDomainCheckpoint(virDomainPtr domain,
  * which may also be released if its ref count hits zero.
  */
 static void
-virDomainCheckpointDispose(void *obj)
+virDomainCheckpointFinalize(GObject *obj)
 {
-virDomainCheckpointPtr checkpoint = obj;
+virDomainCheckpointPtr checkpoint = VIR_DOMAIN_CHECKPOINT(obj);
 VIR_DEBUG("release checkpoint %p %s", checkpoint, checkpoint->name);
 
 VIR_FREE(checkpoint->name);
 virObjectUnref(checkpoint->domain);
+
+G_OBJECT_CLASS(vir_domain_checkpoint_parent_class)->finalize(obj);
 }
 
 
diff --git a/src/datatypes.h b/src/datatypes.h
index 4e9f338f8b..13ad044126 100644
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -32,7 +32,6 @@
 
 extern virClassPtr virConnectClass;
 extern virClassPtr virDomainClass;
-extern virClassPtr virDomainCheckpointClass;
 

[PATCH 05/36] rpc: convert virNetServerProgram to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/locking/lock_daemon.c   | 28 ++--
 src/logging/log_daemon.c| 28 ++--
 src/lxc/lxc_controller.c| 13 +---
 src/remote/remote_daemon.c  | 52 ++---
 src/remote/remote_daemon_dispatch.c | 19 ++-
 src/remote/remote_daemon_stream.c   |  5 +--
 src/rpc/virnetserver.c  | 14 
 src/rpc/virnetserverprogram.c   | 30 -
 src/rpc/virnetserverprogram.h   | 10 --
 9 files changed, 88 insertions(+), 111 deletions(-)

diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
index 4eff63014a..260a74a81a 100644
--- a/src/locking/lock_daemon.c
+++ b/src/locking/lock_daemon.c
@@ -860,8 +860,8 @@ virLockDaemonUsage(const char *argv0, bool privileged)
 int main(int argc, char **argv) {
 virNetServerPtr lockSrv = NULL;
 virNetServerPtr adminSrv = NULL;
-virNetServerProgramPtr lockProgram = NULL;
-virNetServerProgramPtr adminProgram = NULL;
+g_autoptr(virNetServerProgram) lockProgram = NULL;
+g_autoptr(virNetServerProgram) adminProgram = NULL;
 char *remote_config_file = NULL;
 int statuswrite = -1;
 int ret = 1;
@@ -1134,13 +1134,10 @@ int main(int argc, char **argv) {
 goto cleanup;
 }
 
-if (!(lockProgram = virNetServerProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM,
-   
VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION,
-   virLockSpaceProtocolProcs,
-   virLockSpaceProtocolNProcs))) {
-ret = VIR_DAEMON_ERR_INIT;
-goto cleanup;
-}
+lockProgram = virNetServerProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM,
+ 
VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION,
+ virLockSpaceProtocolProcs,
+ virLockSpaceProtocolNProcs);
 
 if (virNetServerAddProgram(lockSrv, lockProgram) < 0) {
 ret = VIR_DAEMON_ERR_INIT;
@@ -1148,13 +1145,10 @@ int main(int argc, char **argv) {
 }
 
 if (adminSrv != NULL) {
-if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM,
-ADMIN_PROTOCOL_VERSION,
-adminProcs,
-adminNProcs))) {
-ret = VIR_DAEMON_ERR_INIT;
-goto cleanup;
-}
+adminProgram = virNetServerProgramNew(ADMIN_PROGRAM,
+  ADMIN_PROTOCOL_VERSION,
+  adminProcs,
+  adminNProcs);
 if (virNetServerAddProgram(adminSrv, adminProgram) < 0) {
 ret = VIR_DAEMON_ERR_INIT;
 goto cleanup;
@@ -1191,8 +1185,6 @@ int main(int argc, char **argv) {
 ret = 0;
 
  cleanup:
-virObjectUnref(lockProgram);
-virObjectUnref(adminProgram);
 virObjectUnref(lockSrv);
 virObjectUnref(adminSrv);
 virLockDaemonFree(lockDaemon);
diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
index f37054706e..98f8b9c68b 100644
--- a/src/logging/log_daemon.c
+++ b/src/logging/log_daemon.c
@@ -641,8 +641,8 @@ virLogDaemonUsage(const char *argv0, bool privileged)
 int main(int argc, char **argv) {
 virNetServerPtr logSrv = NULL;
 virNetServerPtr adminSrv = NULL;
-virNetServerProgramPtr logProgram = NULL;
-virNetServerProgramPtr adminProgram = NULL;
+g_autoptr(virNetServerProgram) logProgram = NULL;
+g_autoptr(virNetServerProgram) adminProgram = NULL;
 char *remote_config_file = NULL;
 int statuswrite = -1;
 int ret = 1;
@@ -916,26 +916,20 @@ int main(int argc, char **argv) {
 goto cleanup;
 }
 
-if (!(logProgram = virNetServerProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM,
-  
VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION,
-  virLogManagerProtocolProcs,
-  virLogManagerProtocolNProcs))) {
-ret = VIR_DAEMON_ERR_INIT;
-goto cleanup;
-}
+logProgram = virNetServerProgramNew(VIR_LOG_MANAGER_PROTOCOL_PROGRAM,
+
VIR_LOG_MANAGER_PROTOCOL_PROGRAM_VERSION,
+virLogManagerProtocolProcs,
+virLogManagerProtocolNProcs);
 if (virNetServerAddProgram(logSrv, logProgram) < 0) {
 ret = VIR_DAEMON_ERR_INIT;
 goto cleanup;
 }
 
 if (adminSrv != NULL) {
-if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM,
-ADMIN_PROTOCOL_VERSION,
-adminProcs,
-   

[PATCH 08/36] bhyve: convert virBhyveDriverConfig to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/bhyve/bhyve_capabilities.c |  3 +--
 src/bhyve/bhyve_conf.c | 34 +-
 src/bhyve/bhyve_driver.c   |  3 ++-
 src/bhyve/bhyve_utils.h| 11 +--
 4 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
index 66442e50ba..00f7613594 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -131,7 +131,7 @@ virBhyveDomainCapsBuild(bhyveConnPtr conn,
 DIR *dir;
 struct dirent *entry;
 size_t firmwares_alloc = 0;
-virBhyveDriverConfigPtr cfg = virBhyveDriverGetConfig(conn);
+g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(conn);
 const char *firmware_dir = cfg->firmwareDir;
 virDomainCapsStringValuesPtr firmwares = NULL;
 
@@ -167,7 +167,6 @@ virBhyveDomainCapsBuild(bhyveConnPtr conn,
  cleanup:
 VIR_FREE(firmwares);
 VIR_DIR_CLOSE(dir);
-virObjectUnref(cfg);
 return caps;
 }
 
diff --git a/src/bhyve/bhyve_conf.c b/src/bhyve/bhyve_conf.c
index f3e2ebf7c7..19ea5c5a03 100644
--- a/src/bhyve/bhyve_conf.c
+++ b/src/bhyve/bhyve_conf.c
@@ -32,29 +32,27 @@
 
 VIR_LOG_INIT("bhyve.bhyve_conf");
 
-static virClassPtr virBhyveDriverConfigClass;
-static void virBhyveDriverConfigDispose(void *obj);
+G_DEFINE_TYPE(virBhyveDriverConfig, vir_bhyve_driver_config, G_TYPE_OBJECT);
+static void virBhyveDriverConfigFinalize(GObject *obj);
 
-static int virBhyveConfigOnceInit(void)
+static void
+vir_bhyve_driver_config_init(virBhyveDriverConfig *cfg G_GNUC_UNUSED)
 {
-if (!VIR_CLASS_NEW(virBhyveDriverConfig, virClassForObject()))
-return -1;
-
-return 0;
 }
 
-VIR_ONCE_GLOBAL_INIT(virBhyveConfig);
+static void
+vir_bhyve_driver_config_class_init(virBhyveDriverConfigClass *klass)
+{
+GObjectClass *obj = G_OBJECT_CLASS(klass);
+
+obj->finalize = virBhyveDriverConfigFinalize;
+}
 
 virBhyveDriverConfigPtr
 virBhyveDriverConfigNew(void)
 {
-virBhyveDriverConfigPtr cfg;
-
-if (virBhyveConfigInitialize() < 0)
-return NULL;
-
-if (!(cfg = virObjectNew(virBhyveDriverConfigClass)))
-return NULL;
+virBhyveDriverConfigPtr cfg =
+VIR_BHYVE_DRIVER_CONFIG(g_object_new(VIR_TYPE_BHYVE_DRIVER_CONFIG, 
NULL));
 
 cfg->firmwareDir = g_strdup(DATADIR "/uefi-firmware");
 
@@ -93,11 +91,13 @@ virBhyveDriverGetConfig(bhyveConnPtr driver)
 }
 
 static void
-virBhyveDriverConfigDispose(void *obj)
+virBhyveDriverConfigFinalize(GObject *obj)
 {
-virBhyveDriverConfigPtr cfg = obj;
+virBhyveDriverConfigPtr cfg = VIR_BHYVE_DRIVER_CONFIG(obj);
 
 VIR_FREE(cfg->firmwareDir);
+
+G_OBJECT_CLASS(vir_bhyve_driver_config_parent_class)->finalize(obj);
 }
 
 void
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index 2224395128..275c095b20 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -1188,7 +1188,8 @@ bhyveStateCleanup(void)
 virSysinfoDefFree(bhyve_driver->hostsysinfo);
 virObjectUnref(bhyve_driver->closeCallbacks);
 virObjectUnref(bhyve_driver->domainEventState);
-virObjectUnref(bhyve_driver->config);
+if (bhyve_driver->config)
+g_object_unref(bhyve_driver->config);
 virPortAllocatorRangeFree(bhyve_driver->remotePorts);
 
 if (bhyve_driver->lockFD != -1)
diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h
index f3e80b6121..675b859098 100644
--- a/src/bhyve/bhyve_utils.h
+++ b/src/bhyve/bhyve_utils.h
@@ -29,16 +29,23 @@
 #include "hypervisor/virclosecallbacks.h"
 #include "virportallocator.h"
 
+#include 
+
 #define BHYVE_AUTOSTART_DIRSYSCONFDIR "/libvirt/bhyve/autostart"
 #define BHYVE_CONFIG_DIR   SYSCONFDIR "/libvirt/bhyve"
 #define BHYVE_STATE_DIRRUNSTATEDIR "/libvirt/bhyve"
 #define BHYVE_LOG_DIR  LOCALSTATEDIR "/log/libvirt/bhyve"
 
-typedef struct _virBhyveDriverConfig virBhyveDriverConfig;
+#define VIR_TYPE_BHYVE_DRIVER_CONFIG vir_bhyve_driver_config_get_type()
+G_DECLARE_FINAL_TYPE(virBhyveDriverConfig,
+ vir_bhyve_driver_config,
+ VIR,
+ BHYVE_DRIVER_CONFIG,
+ GObject);
 typedef struct _virBhyveDriverConfig *virBhyveDriverConfigPtr;
 
 struct _virBhyveDriverConfig {
-virObject parent;
+GObject parent;
 
 char *firmwareDir;
 };
-- 
2.25.1




[PATCH 01/36] util: virresctrl: convert classes to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/capabilities.c |   3 +-
 src/conf/domain_conf.c  |  21 +++---
 src/util/virresctrl.c   | 137 ++--
 src/util/virresctrl.h   |  15 +++--
 tests/virresctrltest.c  |   3 +-
 5 files changed, 97 insertions(+), 82 deletions(-)

diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 99b69aebb5..2c91461a54 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -266,7 +266,8 @@ virCapsDispose(void *object)
 VIR_FREE(caps->host.netprefix);
 VIR_FREE(caps->host.pagesSize);
 virCPUDefFree(caps->host.cpu);
-virObjectUnref(caps->host.resctrl);
+if (caps->host.resctrl)
+g_object_unref(caps->host.resctrl);
 }
 
 /**
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 914e03c705..425a6bccb6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3286,7 +3286,8 @@ virDomainResctrlMonDefFree(virDomainResctrlMonDefPtr 
domresmon)
 return;
 
 virBitmapFree(domresmon->vcpus);
-virObjectUnref(domresmon->instance);
+if (domresmon->instance)
+g_object_unref(domresmon->instance);
 VIR_FREE(domresmon);
 }
 
@@ -3302,7 +3303,8 @@ virDomainResctrlDefFree(virDomainResctrlDefPtr resctrl)
 for (i = 0; i < resctrl->nmonitors; i++)
 virDomainResctrlMonDefFree(resctrl->monitors[i]);
 
-virObjectUnref(resctrl->alloc);
+if (resctrl->alloc)
+g_object_unref(resctrl->alloc);
 virBitmapFree(resctrl->vcpus);
 VIR_FREE(resctrl->monitors);
 VIR_FREE(resctrl);
@@ -19887,11 +19889,6 @@ virDomainResctrlMonDefParse(virDomainDefPtr def,
 domresmon->tag = tag;
 
 domresmon->instance = virResctrlMonitorNew();
-if (!domresmon->instance) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-   _("Could not create monitor"));
-goto cleanup;
-}
 
 if (tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) {
 tmp = virXMLPropString(nodes[i], "level");
@@ -20001,7 +19998,7 @@ virDomainResctrlNew(xmlNodePtr node,
 goto cleanup;
 }
 
-resctrl->alloc = virObjectRef(alloc);
+resctrl->alloc = g_object_ref(alloc);
 
 ret = g_steal_pointer();
  cleanup:
@@ -20048,8 +20045,7 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
 return -1;
 }
 
-if (!(alloc = virResctrlAllocNew()))
-return -1;
+alloc = virResctrlAllocNew();
 
 for (i = 0; i < n; i++) {
 if (virDomainCachetuneDefParseCache(ctxt, nodes[i], alloc) < 0)
@@ -20234,10 +20230,9 @@ virDomainMemorytuneDefParse(virDomainDefPtr def,
 return -1;
 
 if (resctrl) {
-alloc = virObjectRef(resctrl->alloc);
+alloc = g_object_ref(resctrl->alloc);
 } else {
-if (!(alloc = virResctrlAllocNew()))
-return -1;
+alloc = virResctrlAllocNew();
 }
 
 /* First, parse  element if any  element exists */
diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
index c537d606cc..d112cc02e4 100644
--- a/src/util/virresctrl.c
+++ b/src/util/virresctrl.c
@@ -112,12 +112,6 @@ typedef struct _virResctrlAllocMemBW virResctrlAllocMemBW;
 typedef virResctrlAllocMemBW *virResctrlAllocMemBWPtr;
 
 
-/* Class definitions and initializations */
-static virClassPtr virResctrlInfoClass;
-static virClassPtr virResctrlAllocClass;
-static virClassPtr virResctrlMonitorClass;
-
-
 /* virResctrlInfo */
 struct _virResctrlInfoPerType {
 /* Kernel-provided information */
@@ -182,7 +176,7 @@ struct _virResctrlInfoMongrp {
 };
 
 struct _virResctrlInfo {
-virObject parent;
+GObject parent;
 
 virResctrlInfoPerLevelPtr *levels;
 size_t nlevels;
@@ -192,14 +186,17 @@ struct _virResctrlInfo {
 virResctrlInfoMongrpPtr monitor_info;
 };
 
+/* Class definitions and initializations */
+G_DEFINE_TYPE(virResctrlInfo, vir_resctrl_info, G_TYPE_OBJECT);
+
 
 static void
-virResctrlInfoDispose(void *obj)
+virResctrlInfoFinalize(GObject *obj)
 {
 size_t i = 0;
 size_t j = 0;
 
-virResctrlInfoPtr resctrl = obj;
+virResctrlInfoPtr resctrl = VIR_RESCTRL_INFO(obj);
 
 for (i = 0; i < resctrl->nlevels; i++) {
 virResctrlInfoPerLevelPtr level = resctrl->levels[i];
@@ -221,6 +218,8 @@ virResctrlInfoDispose(void *obj)
 VIR_FREE(resctrl->membw_info);
 VIR_FREE(resctrl->levels);
 VIR_FREE(resctrl->monitor_info);
+
+G_OBJECT_CLASS(vir_resctrl_info_parent_class)->finalize(obj);
 }
 
 
@@ -334,7 +333,7 @@ struct _virResctrlAllocMemBW {
 };
 
 struct _virResctrlAlloc {
-virObject parent;
+GObject parent;
 
 virResctrlAllocPerLevelPtr *levels;
 size_t nlevels;
@@ -355,7 +354,7 @@ struct _virResctrlAlloc {
  * memory bandwidth.
  */
 struct _virResctrlMonitor {
-virObject parent;
+GObject parent;
 
 /* Each virResctrlMonitor is associated with one specific allocation,
  * either the root directory allocation under /sys/fs/resctrl or a
@@ -372,15 

[PATCH 12/36] conf: convert virDomainChrSourceDef to GObject

2020-04-03 Thread Rafael Fonseca
Signed-off-by: Rafael Fonseca 
---
 src/conf/domain_conf.c   | 35 ---
 src/conf/domain_conf.h   |  9 -
 src/qemu/qemu_domain.c   |  7 ---
 src/qemu/qemu_process.c  |  3 +--
 src/qemu/qemu_virtiofs.c | 12 +---
 5 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 38a0c04c1f..a29e6681a5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2421,8 +2421,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
 
 switch (def->type) {
 case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
-virObjectUnref(def->data.vhostuser);
-def->data.vhostuser = NULL;
+g_clear_object(>data.vhostuser);
 break;
 
 case VIR_DOMAIN_NET_TYPE_SERVER:
@@ -2497,6 +2496,7 @@ virDomainNetDefFree(virDomainNetDefPtr def)
 VIR_FREE(def);
 }
 
+G_DEFINE_TYPE(virDomainChrSourceDef, vir_domain_chr_source_def, G_TYPE_OBJECT);
 
 const char *
 virDomainChrSourceDefGetPath(virDomainChrSourceDefPtr chr)
@@ -2629,9 +2629,9 @@ virDomainChrSourceDefCopy(virDomainChrSourceDefPtr dest,
 }
 
 static void
-virDomainChrSourceDefDispose(void *obj)
+virDomainChrSourceDefFinalize(GObject *obj)
 {
-virDomainChrSourceDefPtr def = obj;
+virDomainChrSourceDefPtr def = VIR_DOMAIN_CHR_SOURCE_DEF(obj);
 size_t i;
 
 virDomainChrSourceDefClear(def);
@@ -2642,6 +2642,8 @@ virDomainChrSourceDefDispose(void *obj)
 virSecurityDeviceLabelDefFree(def->seclabels[i]);
 VIR_FREE(def->seclabels);
 }
+
+G_OBJECT_CLASS(vir_domain_chr_source_def_parent_class)->finalize(obj);
 }
 
 
@@ -13215,34 +13217,29 @@ 
virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def,
 }
 
 
-static virClassPtr virDomainChrSourceDefClass;
+static void
+vir_domain_chr_source_def_init(virDomainChrSourceDef *def G_GNUC_UNUSED)
+{
+}
 
-static int
-virDomainChrSourceDefOnceInit(void)
+static void
+vir_domain_chr_source_def_class_init(virDomainChrSourceDefClass *klass)
 {
-if (!VIR_CLASS_NEW(virDomainChrSourceDef, virClassForObject()))
-return -1;
+GObjectClass *obj = G_OBJECT_CLASS(klass);
 
-return 0;
+obj->finalize = virDomainChrSourceDefFinalize;
 }
 
-VIR_ONCE_GLOBAL_INIT(virDomainChrSourceDef);
-
 virDomainChrSourceDefPtr
 virDomainChrSourceDefNew(virDomainXMLOptionPtr xmlopt)
 {
 virDomainChrSourceDefPtr def = NULL;
 
-if (virDomainChrSourceDefInitialize() < 0)
-return NULL;
-
-if (!(def = virObjectNew(virDomainChrSourceDefClass)))
-return NULL;
+def = 
VIR_DOMAIN_CHR_SOURCE_DEF(g_object_new(VIR_TYPE_DOMAIN_CHR_SOURCE_DEF, NULL));
 
 if (xmlopt && xmlopt->privateData.chrSourceNew &&
 !(def->privateData = xmlopt->privateData.chrSourceNew())) {
-virObjectUnref(def);
-def = NULL;
+g_clear_object();
 }
 
 return def;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 7e2792ae62..b6b2a72dd4 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1173,7 +1173,7 @@ struct _virDomainChrSourceReconnectDef {
 
 /* The host side information for a character device.  */
 struct _virDomainChrSourceDef {
-virObject parent;
+GObject parent;
 int type; /* virDomainChrType */
 virObjectPtr privateData;
 union {
@@ -1219,6 +1219,13 @@ struct _virDomainChrSourceDef {
 virSecurityDeviceLabelDefPtr *seclabels;
 };
 
+#define VIR_TYPE_DOMAIN_CHR_SOURCE_DEF vir_domain_chr_source_def_get_type()
+G_DECLARE_FINAL_TYPE(virDomainChrSourceDef,
+ vir_domain_chr_source_def,
+ VIR,
+ DOMAIN_CHR_SOURCE_DEF,
+ GObject);
+
 /* A complete character device, both host and domain views.  */
 struct _virDomainChrDef {
 int deviceType; /* enum virDomainChrDeviceType */
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 32dd69892a..2506fa2eea 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2315,7 +2315,8 @@ qemuDomainObjPrivateFree(void *data)
 
 qemuDomainObjPrivateDataClear(priv);
 
-virObjectUnref(priv->monConfig);
+if (priv->monConfig)
+g_object_unref(priv->monConfig);
 qemuDomainObjFreeJob(priv);
 VIR_FREE(priv->lockState);
 VIR_FREE(priv->origname);
@@ -3934,8 +3935,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
  error:
 virBitmapFree(priv->namespaces);
 priv->namespaces = NULL;
-virObjectUnref(priv->monConfig);
-priv->monConfig = NULL;
+if (priv->monConfig)
+g_clear_object(>monConfig);
 virStringListFree(priv->qemuDevices);
 priv->qemuDevices = NULL;
 return -1;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index ef34dd8cfd..817e858ac2 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -7390,8 +7390,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
 if (priv->monConfig) {
 if (priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX)
   

Re: [libvirt-jenkins-ci PATCH 3/5] guests: Introduce the new 'gitlab' flavor

2020-04-03 Thread Andrea Bolognani
On Fri, 2020-04-03 at 09:38 +0200, Erik Skultety wrote:
> On Tue, Mar 31, 2020 at 05:23:32PM +0200, Andrea Bolognani wrote:
> > On Thu, 2020-03-26 at 14:33 +0100, Erik Skultety wrote:
> > > +++ b/guests/playbooks/update/tasks/gitlab.yml
> > > @@ -0,0 +1,64 @@
> > > +---
> > > +- name: Look up Gitlab runner secret
> > > +  set_fact:
> > > +gitlab_runner_secret: '{{ lookup("file", gitlab_runner_token_file) 
> > > }}'
> > 
> > The GitLab token should be extracted from the vault, not from a
> > regular file.
> 
> This was a deliberate decision and I didn't want to do it the jenkins way, let
> me expand on why. Ultimately, we want other community members to contribute
> their resources to our gitlab so that the test results are centralized, but
> what if they want to setup the same machine for their internal infrastructure
> as well to stay unified with the setup upstream libvirt "mandates". With the
> secret in the vault, we always create machines that can only be plugged into
> *our* gitlab, but why should be that restrictive? Give the consumers the 
> leeway
> to actually have a possibility to plug it into their own instance by supplying
> the token the same way as we supply the vault and root passwords, so I'd 
> rather
> not be tying this to a single use case just like we did with jenkins.

Thanks for spelling out your intentions, it really helps.

I agree that reusing the recipe to build runners that connect to a
local / private GitLab instance is a valid use case that we should
accomodate.

One point that immediately leads to, and which was unintentionally
already addressed above, is that in that case you need not only the
token to be configurable, but also the connection URL.

Other than that, storing the token in ~/.config/lcitool is fine I
guess. The number of files in that directory is getting fairly
ridiculous, though, so Someone™ should really look into throwing
away the current, extremely crude configuration system that's been
inherited from the original shell implementation and replace it
with something more sensible like a config.toml.

> > > +# To ensure idempotency, we must run the registration only when we first
> > > +# created the config dir, otherwise we'll register a new runner on every
> > > +# update
> > > +- name: Register the gitlab-runner agent
> > > +  shell: 'gitlab-runner register --non-interactive --config 
> > > /home/gitlab/.gitlab-runner/config.toml --registration-token {{ 
> > > gitlab_runner_secret }} --url https://gitlab.com --executor shell 
> > > --tag-list {{ inventory_hostname }}'
> > > +  when: rc_gitlab_runner_config_dir.changed
> > 
> > ... this check could be replaced with
> > 
> >   creates: '{{ gitlab_runner_config_path }}'
> 
> Like I said in the comment above, the reason why I created those 2 tasks to
> create the config file was to ensure idempotency, the registration runs every
> single time you execute the playbook and guess what, it registers a new runner
> which you can see in the gitlab runner pool - we don't want that. I'm not sure
> "creates" actually prevents that behaviour.

That's *exactly* what it does:

  creates A filename, when it already exists, this step
  (path)  will *not* be run.

https://docs.ansible.com/ansible/latest/modules/shell_module.html#parameter-creates

> >   * the 'shell' executor is I think our only option when it comes to
> > FreeBSD (and we should make sure we fully understand the security
> > implications of using it before exposing any of this on the
> > internet), but for Linux we should be able to use the 'docker'
> > executor instead, which should provide additional isolation;
> 
> I get the isolation part, but why exactly is the additional isolation by the
> container deemed so necessary compared to achieving consistency in terms of
> maintenance? I mentioned it earlier, these machines run in a secured
> environment not accessible from the outside. Moreover, these are test machines
> that are designed to come and go, so if the worst comes, they can be torn down
> and replaced with new copies, that's the whole point of CI environments, so
> aren't we trying to be a bit too paranoid?

Consistency is a worthy goal, but it's not the only one. Security is
another very important one.

Anyway, it's simpler than that: all of our Linux jobs currently
expect to run in container images, and we can only have that using
the Docker executor.

We could, I guess, change our configuration so that, instead of
having each job use a specific container image, they would be tagged
with a specific label that would ensure they are scheduled on the
expected target OS, eg. instead of

  dco:
script:
  - ...
image: quay.io/libvirt/buildenv-libvirt-fedora-31:latest

we could have

  dco:
script:
  - ...
tags:
  - fedora-31

However, due to the restrictions in how GitLab will schedule jobs for
forks, that configuration would only run for libvirt/libvirt branches
and would not run for forks and 

Re: [libvirt PATCH] github: enable lockdown of issues and merge requests

2020-04-03 Thread Daniel P . Berrangé
On Fri, Apr 03, 2020 at 08:55:11AM -0500, Eric Blake wrote:
> On 4/3/20 5:38 AM, Daniel P. Berrangé wrote:
> > Libvirt uses GitHub as an automated read-only mirror. The goals were to
> > have a disaster recovery backup for libvirt.org, a way to make it easy
> > for people to clone their own private copy of libvirt Git, and finally
> > as a way to interact with apps like Travis.
> > 
> > The project description was set to a message telling people that we
> > don't respond to pull requests. This was quite a negative message to
> > potential contributors, and also did not give them any guidance about
> > the right way to submit to libvirt. Many also missed the description and
> > submitted issues or pull requests regardless.
> > 
> > It is possible to disable the issue tracker in GitHub, but there is no
> > way to disable merge requests. Disabling the issue tracker would also
> > leave the problem of users not being given any positive information
> > about where they should be reporting instead.
> > 
> > There is a fairly new 3rd party application built for GitHub that
> > provides a bot which auto-responds to both issues and merge requests,
> > closing and locking them, with a arbitrary comment:
> > 
> > https://github.com/apps/repo-lockdown
> > 
> > This commit adds a suitable configuration file for libvirt, which
> > tries to give a positive response to user's issue/pullreq and guide
> > them to the desired contribution path on GitLab.
> > 
> > Signed-off-by: Daniel P. Berrangé 
> > ---
> > 
> > FYI, I have configured the test.git repo to demonstrate the operation.
> > 
> > See the comments / actions performed here:
> > 
> >https://github.com/libvirt/test/pull/3
> >https://github.com/libvirt/test/issues/2
> > 
> > This lockdown.yml file will need to be created in each libvirt git
> > repo, with just the URL changed. If this patch is approved, then I
> > propose to directly push the equivalent config file to every other
> > git repo, without spamming libvir-list for review of each.
> 
> Makes sense to me.
> 
> > +++ b/.github/lockdown.yml
> > @@ -0,0 +1,36 @@
> > +# Configuration for Repo Lockdown - 
> > https://github.com/dessant/repo-lockdown
> > +
> > +# Close issues and pull requests
> > +close: true
> > +
> > +# Lock issues and pull requests
> > +lock: true
> > +
> > +# Optionally, specify configuration settings just for `issues` or `pulls`
> > +issues:
> > +  comment: |
> > +Thank you for your interest in the libvirt project.
> > +
> > +Since this repository is a read-only mirror of the project's master 
> > repostory hosted on GitLab, issues opened here are not processed.
> 
> Is line-wrapping this worthwhile?

The content here is treated as literal markdown, with line breaks
preserved. If I line wrap it here, then it gets line wrapped when
displayed to the user which is not desirable - I want to let the
browser wrap according to the space it has to display the comment.

Using ">" instead of "|" for the multiple line string lets you
do wrapping, which is then ignored, but this has the annoying
side effect of also removing the blank lines between paragraphs.

So the long lines were the least worst option to give the desired
display in the browser that I came up with.

> Otherwise,
> Reviewed-by: Eric Blake 

Regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|



Re: [PATCH 00/15] move validations out of qemu_domain.c

2020-04-03 Thread Ján Tomko

On a Friday in 2020, Daniel Henrique Barboza wrote:

Ping

On 3/26/20 6:31 PM, Daniel Henrique Barboza wrote:

 po/POTFILES.in   |1 +
 src/qemu/Makefile.inc.am |2 +
 src/qemu/qemu_domain.c   | 3895 ++
 src/qemu/qemu_validate.c | 3592 +++
 src/qemu/qemu_validate.h |   34 +
 tests/qemublocktest.c|3 +-
 6 files changed, 3801 insertions(+), 3726 deletions(-)
 create mode 100644 src/qemu/qemu_validate.c
 create mode 100644 src/qemu/qemu_validate.h





Now pushed.

Jano


signature.asc
Description: PGP signature


[PATCH] cpu.c: Use g_autoptr and g_autofree in virCPUDataParse

2020-04-03 Thread Seeteena Thoufeek
Signed-off-by: Seeteena Thoufeek 
---
 src/cpu/cpu.c | 18 +++---
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index 631c755..e556ffe 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -772,40 +772,36 @@ virCPUDataPtr
 virCPUDataParse(const char *xmlStr)
 {
 struct cpuArchDriver *driver;
-xmlDocPtr xml = NULL;
-xmlXPathContextPtr ctxt = NULL;
+g_autoptr(xmlDoc) xml = NULL;
+g_autoptr(xmlXPathContext) ctxt = NULL;
 virCPUDataPtr data = NULL;
-char *arch = NULL;
+g_autofree char *arch = NULL;
 
 VIR_DEBUG("xmlStr=%s", xmlStr);
 
 if (!(xml = virXMLParseStringCtxt(xmlStr, _("CPU data"), ))) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot parse CPU data"));
-goto cleanup;
+return data;
 }
 
 if (!(arch = virXPathString("string(/cpudata/@arch)", ctxt))) {
 virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing CPU data architecture"));
-goto cleanup;
+return data;
 }
 
 if (!(driver = cpuGetSubDriverByName(arch)))
-goto cleanup;
+return data;
 
 if (!driver->dataParse) {
 virReportError(VIR_ERR_NO_SUPPORT,
_("cannot parse %s CPU data"), arch);
-goto cleanup;
+return data;
 }
 
 data = driver->dataParse(ctxt);
 
- cleanup:
-xmlXPathFreeContext(ctxt);
-xmlFreeDoc(xml);
-VIR_FREE(arch);
 return data;
 }
 
-- 
1.8.3.1




Re: [PATCH 08/15] qemu: move qemuDomainDeviceDefValidateVideo() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 98 +---
src/qemu/qemu_validate.c | 96 +++
src/qemu/qemu_validate.h |  2 +
3 files changed, 99 insertions(+), 97 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 09/15] qemu: move qemuDomainDeviceDefValidateDisk() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

This function will remain public due to its usage in qemublocktest.c
even after moving qemuDomainDeviceDefValidate(). The position of its
header in qemu_validate.h is no accident.

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 100 +--
src/qemu/qemu_validate.c |  99 ++
src/qemu/qemu_validate.h |   2 +
tests/qemublocktest.c|   3 +-
4 files changed, 104 insertions(+), 100 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 07/15] qemu: move qemuDomainDeviceDefValidateHostdev() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

This function alone requires other 3 static functions to be
moved as well, thus let's move it in its own patch.

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 190 +--
src/qemu/qemu_validate.c | 188 ++
src/qemu/qemu_validate.h |   3 +
3 files changed, 192 insertions(+), 189 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 06/15] qemu: move qemuDomainChrDefValidate() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

qemuDomainChrDefValidate() has a lot of static helpers functions
that needed to be moved as well.

Other functions from qemuDomainDeviceDefValidate() that were
also moved:
- qemuValidateDomainSmartcardDef
- qemuValidateDomainRNGDef
- qemuValidateDomainRedirdevDef
- qemuValidateDomainWatchdogDef

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 383 +--
src/qemu/qemu_validate.c | 373 ++
src/qemu/qemu_validate.h |  11 ++
3 files changed, 389 insertions(+), 378 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 05/15] qemu: move qemuDomainDeviceDefValidateAddress() to qemu_validate.c

2020-04-03 Thread Ján Tomko

qemuDomainDeviceDefValidateNetwork in the commit summary

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 146 +--
src/qemu/qemu_validate.c | 144 ++
src/qemu/qemu_validate.h |   2 +
3 files changed, 147 insertions(+), 145 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 04/15] qemu: move qemuDomainDeviceDefValidateAddress() to qemu_validation.c

2020-04-03 Thread Ján Tomko

s/validation/validate/ in the commit summary

On a Thursday in 2020, Daniel Henrique Barboza wrote:

The next big task is to move qemuDomainDeviceDefValidate() to
qemu_validation.c, which is a function that calls a lot of
other static helper functions. This patch starts it by moving
qemuDomainDeviceDefValidateAddress().

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 74 +---
src/qemu/qemu_validate.c | 72 ++
src/qemu/qemu_validate.h |  2 ++
3 files changed, 75 insertions(+), 73 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 14/15] qemu: move remaining qemuDomainDeviceDefValidate() helpers

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

This will allow to move qemuDomainDeviceDefValidate() itself in
the next patch in a cleaner way.

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 392 +--
src/qemu/qemu_validate.c | 376 +
src/qemu/qemu_validate.h |  21 +++
3 files changed, 405 insertions(+), 384 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 15/15] qemu: move qemuValidateDomainDeviceDef() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Now that all its helper functions are in qemu_validate.c, we can
move the function itself. The helpers can become static again since
they're all in the same file.

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 128 +
src/qemu/qemu_validate.c | 168 ++-
src/qemu/qemu_validate.h |  57 +
3 files changed, 151 insertions(+), 202 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 13/15] qemu: move qemuDomainDeviceDefValidateSound() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 76 +---
src/qemu/qemu_validate.c | 76 
src/qemu/qemu_validate.h |  2 ++
3 files changed, 79 insertions(+), 75 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 12/15] qemu: move qemuDomainDeviceDefValidateFS() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 119 +--
src/qemu/qemu_validate.c | 119 +++
src/qemu/qemu_validate.h |   4 ++
3 files changed, 124 insertions(+), 118 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 11/15] qemu: move qemuDomainDeviceDefValidateGraphics() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 177 +--
src/qemu/qemu_validate.c | 175 ++
src/qemu/qemu_validate.h |   5 ++
3 files changed, 181 insertions(+), 176 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [libvirt-jenkins-ci PATCH 2/5] guests: templates: Introduce a gitlab-runner RC init service template

2020-04-03 Thread Erik Skultety
On Fri, Apr 03, 2020 at 03:50:21PM +0200, Andrea Bolognani wrote:
> On Fri, 2020-04-03 at 09:21 +0200, Erik Skultety wrote:
> > On Tue, Mar 31, 2020 at 04:42:10PM +0200, Andrea Bolognani wrote:
> > > On Thu, 2020-03-26 at 14:33 +0100, Erik Skultety wrote:
> > > > +gitlab_runner_start()
> > > > +{
> > > > +export USER=${user}
> > > > +export HOME=${user_home}
> > > > +export PATH=${PATH}:/usr/local/bin/:/usr/local/sbin/
> > > > +if checkyesno ${rcvar}; then
> > > > +cd ${user_home}
> > > > +/usr/sbin/daemon -p ${pidfile} ${command} ${command_args} > 
> > > > /var/log/gitlab-runner.log 2>&1
> > >
> > > The version in the official documentation does this a little
> > > differently... I guess the difference is that in their case the
> > > gitlab-runner application is running as the gitlab user, wereas in
> > > ours the daemon is running as root but is instructed to execute
> > > workloads as the gitlab user. The latter seems fine, as that's what
> > > happens on Linux as well, but have you fully considered the security
> > > implications?
> >
> > It is different because I wanted a unified behaviour on Linux and FreeBSD.
> > What security implications are you talking about, can you be more specific? 
> > The
> > machines are going to run behind a NAT, the daemon executing the service 
> > should
> > be trusted by default (otherwise, engage the tin foil hat mode), the gitlab
> > user doesn't have sudo permissions (and we should not trust this user), and 
> > in
> > later patches I setup a random root password, so that only access via an SSH
> > pub key to the root account is allowed. Alternatively, we could set up 
> > another
> > service user which will have sudo (not passwordless) access and will not run
> > any services, so that root isn't accessible over the network, would consider
> > that as suitable precaution measures?
>
> I trust gitlab-runner in the sense that I don't expect it to contain
> intentional backdoor, but not necessarily in the sense that I expect
> it to be entirely bug-free and impossible for an attacker to abuse as
> a compromise vector. With that in mind, running it as an unprivileged
> user right off the bat is obviously strictly safer than running it as
> root and delegating the privilege dropping part to it.
>
> Having the same behavior for both Linux and FreeBSD is certainly
> something that we should strive for, but can we make that behavior
> the safest one of the two?
>
> I have tested this, though not extensively, on Linux and adding
> User=gitlab to the service file seems to be basically all that's

Did ^this actually work? I recall having some issues on Linux when I used the
User= directive and I could not get the agent pull a job from the server,
however I used it in combination with WorkingDir (or what the proper name is)
so it may have also been that one, but I definitely tried what you describe and
didn't work for me, hence the patch looks like the way it does, but now I have
to go verify your claim and if indeed it works then we can go with what you
suggest for sure. I admit that I was playing with a handful of different runner
setups, both containerized and direct executions, so a tiny mistake may have
slipped in despite the fact I was restoring the VM state from a snapshot.

> needed to make it work; for FreeBSD this setup is the one described
> in the official documentation, so I'm going to assume it's not going
> to cause any issues either.
>
> If we find that running gitlab-runner as an unprivileged user gets
> in the way we can certainly go back on this decision, but I would
> like to try and see if we can get the safest option to work first.

Let me try again and I'll get back to you.

--
Erik Skultety



Re: [PATCH 10/15] qemu: move qemuValidateDomainDeviceDefController() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

Move the function and all its static helper functions.

Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 804 +--
src/qemu/qemu_validate.c | 804 +++
src/qemu/qemu_validate.h |   3 +
3 files changed, 808 insertions(+), 803 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH] rng: Support encryption and slices element in snapshot XML

2020-04-03 Thread Erik Skultety
On Wed, Apr 01, 2020 at 10:10:12PM +0800, Han Han wrote:
> Signed-off-by: Han Han 

I added some minimalistic commit message, tweaked the subject according to
Daniel's note and pushed the patch.

Reviewed-by: Erik Skultety 



Re: [libvirt PATCH] github: enable lockdown of issues and merge requests

2020-04-03 Thread Eric Blake

On 4/3/20 5:38 AM, Daniel P. Berrangé wrote:

Libvirt uses GitHub as an automated read-only mirror. The goals were to
have a disaster recovery backup for libvirt.org, a way to make it easy
for people to clone their own private copy of libvirt Git, and finally
as a way to interact with apps like Travis.

The project description was set to a message telling people that we
don't respond to pull requests. This was quite a negative message to
potential contributors, and also did not give them any guidance about
the right way to submit to libvirt. Many also missed the description and
submitted issues or pull requests regardless.

It is possible to disable the issue tracker in GitHub, but there is no
way to disable merge requests. Disabling the issue tracker would also
leave the problem of users not being given any positive information
about where they should be reporting instead.

There is a fairly new 3rd party application built for GitHub that
provides a bot which auto-responds to both issues and merge requests,
closing and locking them, with a arbitrary comment:

https://github.com/apps/repo-lockdown

This commit adds a suitable configuration file for libvirt, which
tries to give a positive response to user's issue/pullreq and guide
them to the desired contribution path on GitLab.

Signed-off-by: Daniel P. Berrangé 
---

FYI, I have configured the test.git repo to demonstrate the operation.

See the comments / actions performed here:

   https://github.com/libvirt/test/pull/3
   https://github.com/libvirt/test/issues/2

This lockdown.yml file will need to be created in each libvirt git
repo, with just the URL changed. If this patch is approved, then I
propose to directly push the equivalent config file to every other
git repo, without spamming libvir-list for review of each.


Makes sense to me.


+++ b/.github/lockdown.yml
@@ -0,0 +1,36 @@
+# Configuration for Repo Lockdown - https://github.com/dessant/repo-lockdown
+
+# Close issues and pull requests
+close: true
+
+# Lock issues and pull requests
+lock: true
+
+# Optionally, specify configuration settings just for `issues` or `pulls`
+issues:
+  comment: |
+Thank you for your interest in the libvirt project.
+
+Since this repository is a read-only mirror of the project's master 
repostory hosted on GitLab, issues opened here are not processed.


Is line-wrapping this worthwhile?

Otherwise,
Reviewed-by: Eric Blake 

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3226
Virtualization:  qemu.org | libvirt.org



Re: [libvirt-jenkins-ci PATCH 2/5] guests: templates: Introduce a gitlab-runner RC init service template

2020-04-03 Thread Andrea Bolognani
On Fri, 2020-04-03 at 09:21 +0200, Erik Skultety wrote:
> On Tue, Mar 31, 2020 at 04:42:10PM +0200, Andrea Bolognani wrote:
> > On Thu, 2020-03-26 at 14:33 +0100, Erik Skultety wrote:
> > > +gitlab_runner_start()
> > > +{
> > > +export USER=${user}
> > > +export HOME=${user_home}
> > > +export PATH=${PATH}:/usr/local/bin/:/usr/local/sbin/
> > > +if checkyesno ${rcvar}; then
> > > +cd ${user_home}
> > > +/usr/sbin/daemon -p ${pidfile} ${command} ${command_args} > 
> > > /var/log/gitlab-runner.log 2>&1
> > 
> > The version in the official documentation does this a little
> > differently... I guess the difference is that in their case the
> > gitlab-runner application is running as the gitlab user, wereas in
> > ours the daemon is running as root but is instructed to execute
> > workloads as the gitlab user. The latter seems fine, as that's what
> > happens on Linux as well, but have you fully considered the security
> > implications?
> 
> It is different because I wanted a unified behaviour on Linux and FreeBSD.
> What security implications are you talking about, can you be more specific? 
> The
> machines are going to run behind a NAT, the daemon executing the service 
> should
> be trusted by default (otherwise, engage the tin foil hat mode), the gitlab
> user doesn't have sudo permissions (and we should not trust this user), and in
> later patches I setup a random root password, so that only access via an SSH
> pub key to the root account is allowed. Alternatively, we could set up another
> service user which will have sudo (not passwordless) access and will not run
> any services, so that root isn't accessible over the network, would consider
> that as suitable precaution measures?

I trust gitlab-runner in the sense that I don't expect it to contain
intentional backdoor, but not necessarily in the sense that I expect
it to be entirely bug-free and impossible for an attacker to abuse as
a compromise vector. With that in mind, running it as an unprivileged
user right off the bat is obviously strictly safer than running it as
root and delegating the privilege dropping part to it.

Having the same behavior for both Linux and FreeBSD is certainly
something that we should strive for, but can we make that behavior
the safest one of the two?

I have tested this, though not extensively, on Linux and adding
User=gitlab to the service file seems to be basically all that's
needed to make it work; for FreeBSD this setup is the one described
in the official documentation, so I'm going to assume it's not going
to cause any issues either.

If we find that running gitlab-runner as an unprivileged user gets
in the way we can certainly go back on this decision, but I would
like to try and see if we can get the safest option to work first.

-- 
Andrea Bolognani / Red Hat / Virtualization



Re: [libvirt PATCH 3/3] qemu: block: external snapshot-delete implementation for straightforward cases

2020-04-03 Thread Pavel Mores
On Fri, Apr 03, 2020 at 02:36:35PM +0200, Peter Krempa wrote:
> On Fri, Apr 03, 2020 at 14:34:29 +0200, Pavel Mores wrote:
> > On Tue, Mar 31, 2020 at 12:06:15PM +0200, Peter Krempa wrote:
> > > On Tue, Mar 31, 2020 at 11:18:29 +0200, Pavel Mores wrote:
> > > 
> > > > +}
> > > > +
> > > > +if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN)
> > > > +topPath = disk->src->path;
> > > > +else
> > > > +topPath = snapdisk->src->path;
> > > 
> > > You must not use paths for doing this lookup. Paths at best work for
> > > local files only and this would make the code not future proof.
> > > 
> > > Also you want to verify that:
> > > - images you want to merge are actually in the backing chain
> > > - the backing chain looks as snapshots describe it (e.g you unplug vda
> > >   and plug a different chain back)
> > > 
> > > Doing the validation above will necessarily give you a
> > > virStorageSourcePtr for the appropriate member of the backing chain and
> > > that one should be used as argument for the commit operation.
> > 
> > I'm afraid I'm not following this.  qemuDomainBlockCommitImpl(), just like
> > qemuDomainBlockCommit() take paths so that's what I'm passing them.  What do
> > you mean, I should use virStorageSourcePtr as argument for the commit
> > operation?
> 
> I'm saying you should not use paths at all. Use virStorageSource
> directly. If you look inside qemuDomainBlockCommitImpl there are calls
> which take path and look up the virStorageSource.
> 
> Specifically e.g. for NBD disks path may be NULL, thus must not be used
> if your code has to work for everything. It's okay only to use them when
> passed by user, but not internally.

Alright, so you mean a further refactor of qemuDomainBlockCommitImpl() is
needed.  Thanks, I'll look into it.

pvl



Re: [PATCH 03/15] qemu: move qemuDomainValidateDef() to qemu_validate.c

2020-04-03 Thread Ján Tomko

On a Thursday in 2020, Daniel Henrique Barboza wrote:

After moving most of static functions qemuDomainValidateDef() uses,
move the last remaining static and qemuDomainValidateDef() itself
to qemu_validation.c.


I'd rather squash this with the previous patch.



Signed-off-by: Daniel Henrique Barboza 
---
src/qemu/qemu_domain.c   | 254 +---
src/qemu/qemu_validate.c | 269 +--
src/qemu/qemu_validate.h |  19 +--
3 files changed, 263 insertions(+), 279 deletions(-)

diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index b2a8c3c0b5..27e0558770 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
+
+int
+qemuValidateDomainDef(const virDomainDef *def, void *opaque)


The parameters were originally on different lines.


+{
+virQEMUDriverPtr driver = opaque;
+g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+g_autoptr(virQEMUCaps) qemuCaps = NULL;
+size_t i;


To this and the previous patch:
Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 01/15] qemu: introducing qemu_validate.c/h

2020-04-03 Thread Daniel Henrique Barboza




On 4/3/20 10:21 AM, Ján Tomko wrote:

Moving the first functions seems more important than the fact that
we are introducing a new file.

qemu: move qemuDomainDefValidateFeatures to qemu_validate

On a Thursday in 2020, Daniel Henrique Barboza wrote:

While moving validations from qemu_command to qemu_domain,
it was suggested that we should instead move them to a new
file [1] because qemu_domain is already too crowded.



This will become a part of the git history, but the cover letter will
not, so the above [1] will become a dead reference.

I'd just drop the above paragraph.


This patch introduces a new file to host such validations from


s/such/domain/


the QEMU driver. And to get things started, let's move
qemuDomainDefValidateFeatures() to this new file.

Signed-off-by: Daniel Henrique Barboza 
---
po/POTFILES.in   |   1 +
src/qemu/Makefile.inc.am |   2 +
src/qemu/qemu_domain.c   | 286 +---
src/qemu/qemu_validate.c | 310 +++
src/qemu/qemu_validate.h |  29 
5 files changed, 344 insertions(+), 284 deletions(-)
create mode 100644 src/qemu/qemu_validate.c
create mode 100644 src/qemu/qemu_validate.h



Reviewed-by: Ján Tomko 
(no need to resend unless you disagree, I'll try to merge as much as I
can today so that new patches can use the file)



I'm fine with your changes and suggestions. Go for it.



Thanks,


DHB



Jano





Re: [PATCH 01/15] qemu: introducing qemu_validate.c/h

2020-04-03 Thread Ján Tomko

Moving the first functions seems more important than the fact that
we are introducing a new file.

qemu: move qemuDomainDefValidateFeatures to qemu_validate

On a Thursday in 2020, Daniel Henrique Barboza wrote:

While moving validations from qemu_command to qemu_domain,
it was suggested that we should instead move them to a new
file [1] because qemu_domain is already too crowded.



This will become a part of the git history, but the cover letter will
not, so the above [1] will become a dead reference.

I'd just drop the above paragraph.


This patch introduces a new file to host such validations from


s/such/domain/


the QEMU driver. And to get things started, let's move
qemuDomainDefValidateFeatures() to this new file.

Signed-off-by: Daniel Henrique Barboza 
---
po/POTFILES.in   |   1 +
src/qemu/Makefile.inc.am |   2 +
src/qemu/qemu_domain.c   | 286 +---
src/qemu/qemu_validate.c | 310 +++
src/qemu/qemu_validate.h |  29 
5 files changed, 344 insertions(+), 284 deletions(-)
create mode 100644 src/qemu/qemu_validate.c
create mode 100644 src/qemu/qemu_validate.h



Reviewed-by: Ján Tomko 
(no need to resend unless you disagree, I'll try to merge as much as I
can today so that new patches can use the file)

Jano


signature.asc
Description: PGP signature


Re: [libvirt PATCH 3/3] qemu: block: external snapshot-delete implementation for straightforward cases

2020-04-03 Thread Pavel Mores
On Tue, Mar 31, 2020 at 12:06:15PM +0200, Peter Krempa wrote:
> On Tue, Mar 31, 2020 at 11:18:29 +0200, Pavel Mores wrote:
> 
> > +}
> > +
> > +if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN)
> > +topPath = disk->src->path;
> > +else
> > +topPath = snapdisk->src->path;
> 
> You must not use paths for doing this lookup. Paths at best work for
> local files only and this would make the code not future proof.
> 
> Also you want to verify that:
> - images you want to merge are actually in the backing chain
> - the backing chain looks as snapshots describe it (e.g you unplug vda
>   and plug a different chain back)
> 
> Doing the validation above will necessarily give you a
> virStorageSourcePtr for the appropriate member of the backing chain and
> that one should be used as argument for the commit operation.

I'm afraid I'm not following this.  qemuDomainBlockCommitImpl(), just like
qemuDomainBlockCommit() take paths so that's what I'm passing them.  What do
you mean, I should use virStorageSourcePtr as argument for the commit
operation?

pvl



Re: [libvirt PATCH 3/3] qemu: block: external snapshot-delete implementation for straightforward cases

2020-04-03 Thread Peter Krempa
On Fri, Apr 03, 2020 at 14:34:29 +0200, Pavel Mores wrote:
> On Tue, Mar 31, 2020 at 12:06:15PM +0200, Peter Krempa wrote:
> > On Tue, Mar 31, 2020 at 11:18:29 +0200, Pavel Mores wrote:
> > 
> > > +}
> > > +
> > > +if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN)
> > > +topPath = disk->src->path;
> > > +else
> > > +topPath = snapdisk->src->path;
> > 
> > You must not use paths for doing this lookup. Paths at best work for
> > local files only and this would make the code not future proof.
> > 
> > Also you want to verify that:
> > - images you want to merge are actually in the backing chain
> > - the backing chain looks as snapshots describe it (e.g you unplug vda
> >   and plug a different chain back)
> > 
> > Doing the validation above will necessarily give you a
> > virStorageSourcePtr for the appropriate member of the backing chain and
> > that one should be used as argument for the commit operation.
> 
> I'm afraid I'm not following this.  qemuDomainBlockCommitImpl(), just like
> qemuDomainBlockCommit() take paths so that's what I'm passing them.  What do
> you mean, I should use virStorageSourcePtr as argument for the commit
> operation?

I'm saying you should not use paths at all. Use virStorageSource
directly. If you look inside qemuDomainBlockCommitImpl there are calls
which take path and look up the virStorageSource.

Specifically e.g. for NBD disks path may be NULL, thus must not be used
if your code has to work for everything. It's okay only to use them when
passed by user, but not internally.



Re: [PATCH 00/15] move validations out of qemu_domain.c

2020-04-03 Thread Daniel Henrique Barboza

Ping

On 3/26/20 6:31 PM, Daniel Henrique Barboza wrote:

This is a suggestion made by Peter in [1], in the review
discussion of a series in which I started moving qemuCaps
validation from qemu_command.c to qemu_domain.c [2]. I'll
quote here what he said back then:

"My only suggestion is that after this we should move all
validation into a separate file. qemu_domain was a code dumping
place for a long time and since we now have a lot of common code
moving it out would be benficial for cleaning up an making it
more obvious."

This is my first go at it with a new file called 'qemu_validate.c'.
  The code changes are trivial - just moving stuff from qemu_domain
to qemu_validate - but the amount of changes can sure make for
really tedious reviews. Patches were split according to my own
criteria of how annoying would it be to review each one. The
maintainer is, as always, welcome to squash them up as necessary.

There are still validations to be moved inside qemu_domain.c
after this series. I chose to do this first round to validate
the idea instead of rocking a 40-something patch series all of a
sudden. Once this is figured out we can proceed with the moving.

After all this is settled I intend to continue the work I started
in [2], but using qemu_validate.c instead of qemu_domain.c as
destination.

[1] https://www.redhat.com/archives/libvir-list/2019-December/msg00608.html
[2] https://www.redhat.com/archives/libvir-list/2019-December/msg00570.html

Daniel Henrique Barboza (15):
   qemu: introducing qemu_validate.c/h
   qemu: move static functions of qemuDomainDefValidate()
   qemu: move qemuDomainValidateDef() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateAddress() to qemu_validation.c
   qemu: move qemuDomainDeviceDefValidateAddress() to qemu_validate.c
   qemu: move qemuDomainChrDefValidate() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateHostdev() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateVideo() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateDisk() to qemu_validate.c
   qemu: move qemuValidateDomainDeviceDefController() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateGraphics() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateFS() to qemu_validate.c
   qemu: move qemuDomainDeviceDefValidateSound() to qemu_validate.c
   qemu: move remaining qemuDomainDeviceDefValidate() helpers
   qemu: move qemuValidateDomainDeviceDef() to qemu_validate.c

  po/POTFILES.in   |1 +
  src/qemu/Makefile.inc.am |2 +
  src/qemu/qemu_domain.c   | 3895 ++
  src/qemu/qemu_validate.c | 3592 +++
  src/qemu/qemu_validate.h |   34 +
  tests/qemublocktest.c|3 +-
  6 files changed, 3801 insertions(+), 3726 deletions(-)
  create mode 100644 src/qemu/qemu_validate.c
  create mode 100644 src/qemu/qemu_validate.h





Re: [PATCH] qemu_checkpoint.c: Use g_autofree in qemuCheckpointPrepare()

2020-04-03 Thread Ján Tomko

On a Friday in 2020, Seeteena Thoufeek wrote:

This is the only instance of g_autofree change applicable for
qemu_checkpoint.c

Signed-off-by: Seeteena Thoufeek 
---
src/qemu/qemu_checkpoint.c | 17 ++---
1 file changed, 6 insertions(+), 11 deletions(-)



Reviewed-by: Ján Tomko 
and pushed

Jano


signature.asc
Description: PGP signature


Re: [libvirt-jenkins-ci PATCH 2/7] lcitool: Configure ccache using environment variables

2020-04-03 Thread Erik Skultety
On Mon, Mar 30, 2020 at 01:18:49PM +0100, Daniel P. Berrangé wrote:
> On Mon, Mar 30, 2020 at 02:11:29PM +0200, Andrea Bolognani wrote:
> > On Mon, 2020-03-30 at 12:45 +0100, Daniel P. Berrangé wrote:
> > > On Fri, Mar 27, 2020 at 08:34:54PM +0100, Andrea Bolognani wrote:
> > > > +export CCACHE_MAXSIZE="2G"
> > >
> > > I was wondering what a good size for ccache would be. Is there any history
> > > to why we picked 2G ?  Having it too big didn't really matter for the
> > > Jenkins builders as it is kept local.  For GitLab the cache is downloaded
> > > at start of the job off cloud cstorage. So we want it large enough to fit
> > > a libvirt.git compile but small enough that outdated cruft gets purged
> > > reasonably quickly, so we don't waste time in GitLab CI downloading GB's
> > > of data that is no longer needed in the cache.
> > >
> > > NB, this is NOT an objection to this patch, as 2GB is a pre-existing value
> > > we used. Just want to know how we should consider tuning it in future.
> >
> > I think we just scaled it down (from the default of 5 GiB) so that
> > it would use most of the disk space that remained free in the VM's
> > 15 GiB disk, while leaving some leeway to allow for repositories to
> > grow. Nothing more scientific than that, I'm afraid.
>
> Ok, I'll see if I can get some usage stats out of ccache for our CI jobs on
> GitLab.
>
> > Note that, for VMs, we're building not just libvirt but a bunch of
> > other projects, so if we wanted to tweak it we'd have to take that
> > into account as well and not size it for just libvirt itself.
>
> True, but I imagine in terms of object size all the other projects probably
> barely reach 5% of the main libvirt.git build size, so likely lost in the
> noise.

The cache size that able to cover other libvirt-related projects which we
currently cover in jenkins is IMO a bit irrelevant in the context of gitlab,
because each project has their own namespace and their own pipeline, I've heard
from crosa (on CC) that inter-project pipeline dependencies exist to some
extend although such executions were not very reliable. Regarding the efforts
moving all workloads we can to gitlab from other sources of CI, solving the
current setup that we have in jenkins is going to be a challenge as I don't
think libvirt as a project on gitlab should run builds for other projects, they
can do it for themselves, we can and should only provide a base they can
consume for their upstream build tests.

Erik



[PATCH] qemu_checkpoint.c: Use g_autofree in qemuCheckpointPrepare()

2020-04-03 Thread Seeteena Thoufeek
This is the only instance of g_autofree change applicable for
qemu_checkpoint.c

Signed-off-by: Seeteena Thoufeek 
---
 src/qemu/qemu_checkpoint.c | 17 ++---
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c
index 3a510c9..ccd10cb 100644
--- a/src/qemu/qemu_checkpoint.c
+++ b/src/qemu/qemu_checkpoint.c
@@ -405,9 +405,8 @@ qemuCheckpointPrepare(virQEMUDriverPtr driver,
   virDomainObjPtr vm,
   virDomainCheckpointDefPtr def)
 {
-int ret = -1;
 size_t i;
-char *xml = NULL;
+g_autofree char *xml = NULL;
 qemuDomainObjPrivatePtr priv = vm->privateData;
 
 /* Easiest way to clone inactive portion of vm->def is via
@@ -419,10 +418,10 @@ qemuCheckpointPrepare(virQEMUDriverPtr driver,
 priv->qemuCaps,
 
VIR_DOMAIN_DEF_PARSE_INACTIVE |
 
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
-goto cleanup;
+return -1;
 
 if (virDomainCheckpointAlignDisks(def) < 0)
-goto cleanup;
+return -1;
 
 for (i = 0; i < def->ndisks; i++) {
 virDomainCheckpointDiskDefPtr disk = >disks[i];
@@ -434,7 +433,7 @@ qemuCheckpointPrepare(virQEMUDriverPtr driver,
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("bitmap for disk '%s' must match checkpoint name 
'%s'"),
disk->name, def->parent.name);
-goto cleanup;
+return -1;
 }
 
 if (vm->def->disks[i]->src->format != VIR_STORAGE_FILE_QCOW2) {
@@ -444,15 +443,11 @@ qemuCheckpointPrepare(virQEMUDriverPtr driver,
disk->name,
virStorageFileFormatTypeToString(
vm->def->disks[i]->src->format));
-goto cleanup;
+return -1;
 }
 }
 
-ret = 0;
-
- cleanup:
-VIR_FREE(xml);
-return ret;
+return 0;
 }
 
 static int
-- 
1.8.3.1




Re: [libvirt-jenkins-ci PATCH] lcitool: Fix $PYTHON value in environment

2020-04-03 Thread Daniel P . Berrangé
On Fri, Apr 03, 2020 at 01:19:41PM +0200, Andrea Bolognani wrote:
> Starting with commit
> 
>   commit d76f41ece09b9aaf492553fe466c30a22c78e509
>   Author: Andrea Bolognani 
>   Date:   Fri Mar 27 17:21:26 2020 +0100
> 
> lcitool: Include paths in the inventory
> 
> Figuring them out at runtime is neat, but in practice they don't
> change frequently enough for it to be necessary; more importantly,
> including them in the inventory means we can use them in the
> Dockerfile generator in addition to the Ansible playbooks.
> 
> Signed-off-by: Andrea Bolognani 
> Reviewed-by: Daniel P. Berrangé 
> 
> we have hardcoded the path of the Python interpreter to be used for
> builds in the inventory; an unforeseen consequence of this change is
> that Python builds on CentOS 7 have started failing. The reason for
> that is simple, but not immediately obvious.
> 
> While on most target platforms we have a single Python interpreter
> installed, on CentOS 7 we still need two: Python 3 works fine when
> it comes to building projects, but it's missing a bunch of modules
> that Ansible needs to run, so we're stuck with Python 2 for Ansible
> use. This has worked fine for us so far.
> 
> As part of the change above, however, due to a naming clash we have
> ended up in a situation where the bootstrap task, which installs a
> Python suitable for Ansible, overrides the Python intended for builds
> as set in the inventory. Of course this would result in breakages
> only on CentOS 7, where the two Pythons differ.
> 
> Fix this by removing the runtime detection from the bootstrap task
> and storing the relevant information in the inventory.
> 
> Signed-off-by: Andrea Bolognani 
> ---
>  guests/host_vars/libvirt-centos-7/main.yml|  1 +
>  guests/host_vars/libvirt-centos-8/main.yml|  1 +
>  guests/host_vars/libvirt-debian-10/main.yml   |  1 +
>  guests/host_vars/libvirt-debian-9/main.yml|  1 +
>  guests/host_vars/libvirt-debian-sid/main.yml  |  1 +
>  guests/host_vars/libvirt-fedora-30/main.yml   |  1 +
>  guests/host_vars/libvirt-fedora-31/main.yml   |  1 +
>  guests/host_vars/libvirt-fedora-rawhide/main.yml  |  1 +
>  guests/host_vars/libvirt-freebsd-11/main.yml  |  1 +
>  guests/host_vars/libvirt-freebsd-12/main.yml  |  1 +
>  guests/host_vars/libvirt-freebsd-current/main.yml |  1 +
>  guests/host_vars/libvirt-opensuse-151/main.yml|  1 +
>  guests/host_vars/libvirt-ubuntu-1604/main.yml |  1 +
>  guests/host_vars/libvirt-ubuntu-1804/main.yml |  1 +
>  guests/playbooks/update/tasks/bootstrap.yml   | 11 +--
>  15 files changed, 15 insertions(+), 10 deletions(-)

Reviewed-by: Daniel P. Berrangé 


Regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|



[libvirt-jenkins-ci PATCH] lcitool: Fix $PYTHON value in environment

2020-04-03 Thread Andrea Bolognani
Starting with commit

  commit d76f41ece09b9aaf492553fe466c30a22c78e509
  Author: Andrea Bolognani 
  Date:   Fri Mar 27 17:21:26 2020 +0100

lcitool: Include paths in the inventory

Figuring them out at runtime is neat, but in practice they don't
change frequently enough for it to be necessary; more importantly,
including them in the inventory means we can use them in the
Dockerfile generator in addition to the Ansible playbooks.

Signed-off-by: Andrea Bolognani 
Reviewed-by: Daniel P. Berrangé 

we have hardcoded the path of the Python interpreter to be used for
builds in the inventory; an unforeseen consequence of this change is
that Python builds on CentOS 7 have started failing. The reason for
that is simple, but not immediately obvious.

While on most target platforms we have a single Python interpreter
installed, on CentOS 7 we still need two: Python 3 works fine when
it comes to building projects, but it's missing a bunch of modules
that Ansible needs to run, so we're stuck with Python 2 for Ansible
use. This has worked fine for us so far.

As part of the change above, however, due to a naming clash we have
ended up in a situation where the bootstrap task, which installs a
Python suitable for Ansible, overrides the Python intended for builds
as set in the inventory. Of course this would result in breakages
only on CentOS 7, where the two Pythons differ.

Fix this by removing the runtime detection from the bootstrap task
and storing the relevant information in the inventory.

Signed-off-by: Andrea Bolognani 
---
 guests/host_vars/libvirt-centos-7/main.yml|  1 +
 guests/host_vars/libvirt-centos-8/main.yml|  1 +
 guests/host_vars/libvirt-debian-10/main.yml   |  1 +
 guests/host_vars/libvirt-debian-9/main.yml|  1 +
 guests/host_vars/libvirt-debian-sid/main.yml  |  1 +
 guests/host_vars/libvirt-fedora-30/main.yml   |  1 +
 guests/host_vars/libvirt-fedora-31/main.yml   |  1 +
 guests/host_vars/libvirt-fedora-rawhide/main.yml  |  1 +
 guests/host_vars/libvirt-freebsd-11/main.yml  |  1 +
 guests/host_vars/libvirt-freebsd-12/main.yml  |  1 +
 guests/host_vars/libvirt-freebsd-current/main.yml |  1 +
 guests/host_vars/libvirt-opensuse-151/main.yml|  1 +
 guests/host_vars/libvirt-ubuntu-1604/main.yml |  1 +
 guests/host_vars/libvirt-ubuntu-1804/main.yml |  1 +
 guests/playbooks/update/tasks/bootstrap.yml   | 11 +--
 15 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/guests/host_vars/libvirt-centos-7/main.yml 
b/guests/host_vars/libvirt-centos-7/main.yml
index f1fef44..104b702 100644
--- a/guests/host_vars/libvirt-centos-7/main.yml
+++ b/guests/host_vars/libvirt-centos-7/main.yml
@@ -30,4 +30,5 @@ python: /usr/bin/python3
 su: /bin/su
 sudoers: /etc/sudoers
 
+ansible_python_package: python2
 ansible_python_interpreter: /usr/bin/python2
diff --git a/guests/host_vars/libvirt-centos-8/main.yml 
b/guests/host_vars/libvirt-centos-8/main.yml
index 48edb78..441802c 100644
--- a/guests/host_vars/libvirt-centos-8/main.yml
+++ b/guests/host_vars/libvirt-centos-8/main.yml
@@ -30,4 +30,5 @@ python: /usr/bin/python3
 su: /bin/su
 sudoers: /etc/sudoers
 
+ansible_python_package: python3
 ansible_python_interpreter: /usr/bin/python3
diff --git a/guests/host_vars/libvirt-debian-10/main.yml 
b/guests/host_vars/libvirt-debian-10/main.yml
index 37036e6..e3aca55 100644
--- a/guests/host_vars/libvirt-debian-10/main.yml
+++ b/guests/host_vars/libvirt-debian-10/main.yml
@@ -32,4 +32,5 @@ python: /usr/bin/python3
 su: /bin/su
 sudoers: /etc/sudoers
 
+ansible_python_package: python3
 ansible_python_interpreter: /usr/bin/python3
diff --git a/guests/host_vars/libvirt-debian-9/main.yml 
b/guests/host_vars/libvirt-debian-9/main.yml
index b46efd1..0599aa4 100644
--- a/guests/host_vars/libvirt-debian-9/main.yml
+++ b/guests/host_vars/libvirt-debian-9/main.yml
@@ -32,4 +32,5 @@ python: /usr/bin/python3
 su: /bin/su
 sudoers: /etc/sudoers
 
+ansible_python_package: python3
 ansible_python_interpreter: /usr/bin/python3
diff --git a/guests/host_vars/libvirt-debian-sid/main.yml 
b/guests/host_vars/libvirt-debian-sid/main.yml
index 36045cd..565b0be 100644
--- a/guests/host_vars/libvirt-debian-sid/main.yml
+++ b/guests/host_vars/libvirt-debian-sid/main.yml
@@ -32,4 +32,5 @@ python: /usr/bin/python3
 su: /bin/su
 sudoers: /etc/sudoers
 
+ansible_python_package: python3
 ansible_python_interpreter: /usr/bin/python3
diff --git a/guests/host_vars/libvirt-fedora-30/main.yml 
b/guests/host_vars/libvirt-fedora-30/main.yml
index 71b8e7b..d31a84a 100644
--- a/guests/host_vars/libvirt-fedora-30/main.yml
+++ b/guests/host_vars/libvirt-fedora-30/main.yml
@@ -45,4 +45,5 @@ python: /usr/bin/python3
 su: /bin/su
 sudoers: /etc/sudoers
 
+ansible_python_package: python3
 ansible_python_interpreter: /usr/bin/python3
diff --git a/guests/host_vars/libvirt-fedora-31/main.yml 
b/guests/host_vars/libvirt-fedora-31/main.yml
index c692715..389cfac 100644

[libvirt PATCH] github: enable lockdown of issues and merge requests

2020-04-03 Thread Daniel P . Berrangé
Libvirt uses GitHub as an automated read-only mirror. The goals were to
have a disaster recovery backup for libvirt.org, a way to make it easy
for people to clone their own private copy of libvirt Git, and finally
as a way to interact with apps like Travis.

The project description was set to a message telling people that we
don't respond to pull requests. This was quite a negative message to
potential contributors, and also did not give them any guidance about
the right way to submit to libvirt. Many also missed the description and
submitted issues or pull requests regardless.

It is possible to disable the issue tracker in GitHub, but there is no
way to disable merge requests. Disabling the issue tracker would also
leave the problem of users not being given any positive information
about where they should be reporting instead.

There is a fairly new 3rd party application built for GitHub that
provides a bot which auto-responds to both issues and merge requests,
closing and locking them, with a arbitrary comment:

   https://github.com/apps/repo-lockdown

This commit adds a suitable configuration file for libvirt, which
tries to give a positive response to user's issue/pullreq and guide
them to the desired contribution path on GitLab.

Signed-off-by: Daniel P. Berrangé 
---

FYI, I have configured the test.git repo to demonstrate the operation.

See the comments / actions performed here:

  https://github.com/libvirt/test/pull/3
  https://github.com/libvirt/test/issues/2

This lockdown.yml file will need to be created in each libvirt git
repo, with just the URL changed. If this patch is approved, then I
propose to directly push the equivalent config file to every other
git repo, without spamming libvir-list for review of each.

Ideally we should be creating a CONTRIBUTING.md file in each repo
too, as both GitHub and GitLab direct users to look at this file
for information about how to contribute. This is how we could
guide people to use GitLab in the first place, avoiding them
filing issues/pulls on the wrong site and triggering this bot.

 .github/lockdown.yml | 36 
 1 file changed, 36 insertions(+)
 create mode 100644 .github/lockdown.yml

diff --git a/.github/lockdown.yml b/.github/lockdown.yml
new file mode 100644
index 00..09cbdf1b4a
--- /dev/null
+++ b/.github/lockdown.yml
@@ -0,0 +1,36 @@
+# Configuration for Repo Lockdown - https://github.com/dessant/repo-lockdown
+
+# Close issues and pull requests
+close: true
+
+# Lock issues and pull requests
+lock: true
+
+# Optionally, specify configuration settings just for `issues` or `pulls`
+issues:
+  comment: |
+Thank you for your interest in the libvirt project.
+
+Since this repository is a read-only mirror of the project's master 
repostory hosted on GitLab, issues opened here are not processed.
+
+We kindly request that new issues are reported to
+
+  https://gitlab.com/libvirt/libvirt/-/issues/new
+
+Thank you for your time and understanding.
+
+pulls:
+  comment: |
+Thank you for your interest in the libvirt project.
+
+Since this repository is a read-only mirror of the project's master 
repostory hosted on GitLab, merge requests opened here are not processed.
+
+We kindly request that contributors fork the project at
+
+  https://gitlab.com/libvirt/libvirt/
+
+push changes to the fork, and then open a new merge request at
+
+  https://gitlab.com/libvirt/libvirt/-/merge_requests/new
+
+Thank you for your time and understanding.
-- 
2.24.1



  1   2   >