]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_conf: Introduce metadata_lock_manager
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 21 Aug 2018 09:55:55 +0000 (11:55 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 18 Sep 2018 15:12:53 +0000 (17:12 +0200)
This config option allows users to set and enable lock manager
for domain metadata. The lock manager is going to be used by
security drivers to serialize each other when changing a file
ownership or changing the SELinux label. The only supported lock
manager is 'lockd' for now.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/libvirtd_qemu.aug
src/qemu/qemu.conf
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/test_libvirtd_qemu.aug.in

index ddc4bbfd1d7cfec40f92602d1e54e8b7e95027d7..42e325d4fbcc858362462ef9b6cdd11a4926074c 100644 (file)
@@ -98,6 +98,7 @@ module Libvirtd_qemu =
                  | bool_entry "relaxed_acs_check"
                  | bool_entry "allow_disk_format_probing"
                  | str_entry "lock_manager"
+                 | str_entry "metadata_lock_manager"
 
    let rpc_entry = int_entry "max_queued"
                  | int_entry "keepalive_interval"
index cd57b3cc699b9531b8308c08b4f37d7187429f1f..84492719c466c569ed29abb5d1f7b219021ed3f7 100644 (file)
 #lock_manager = "lockd"
 
 
+# To serialize two or more daemons trying to change metadata on a
+# file (e.g. a file on NFS share), libvirt offers a locking
+# mechanism. Currently, only "lockd" is supported (or no locking
+# at all if unset). Note that this is independent of lock_manager
+# described above.
+#
+#metadata_lock_manager = "lockd"
+
 
 # Set limit of maximum APIs queued on one domain. All other APIs
 # over this threshold will fail on acquiring job lock. Specially,
index 4d69b599fed88877ac35fba2944f62fffd668528..8c5f9021f9d619213add5d2a2a11957fbf738613 100644 (file)
@@ -430,6 +430,7 @@ static void virQEMUDriverConfigDispose(void *obj)
     virStringListFree(cfg->securityDriverNames);
 
     VIR_FREE(cfg->lockManagerName);
+    VIR_FREE(cfg->metadataLockManagerName);
 
     virFirmwareFreeList(cfg->firmwares, cfg->nfirmwares);
 
@@ -840,6 +841,18 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
 
     if (virConfGetValueString(conf, "lock_manager", &cfg->lockManagerName) < 0)
         goto cleanup;
+
+    if (virConfGetValueString(conf, "metadata_lock_manager",
+                              &cfg->metadataLockManagerName) < 0)
+        goto cleanup;
+    if (cfg->metadataLockManagerName &&
+        STRNEQ(cfg->metadataLockManagerName, "lockd")) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("unknown metadata lock manager name %s"),
+                       cfg->metadataLockManagerName);
+        goto cleanup;
+    }
+
     if (virConfGetValueString(conf, "stdio_handler", &stdioHandler) < 0)
         goto cleanup;
     if (stdioHandler) {
index a8d84efea2888476f0f1535f8224c64d47dc2cdb..c227ac72cc21d88a5fb59074d450123e9dab0f1c 100644 (file)
@@ -186,6 +186,7 @@ struct _virQEMUDriverConfig {
     bool autoStartBypassCache;
 
     char *lockManagerName;
+    char *metadataLockManagerName;
 
     int keepAliveInterval;
     unsigned int keepAliveCount;
index f1e8806ad20db1fcf21f20f19588c18865b95889..451e73126e356cfa37c96fcbd6d31157a377c1df 100644 (file)
@@ -81,6 +81,7 @@ module Test_libvirtd_qemu =
 { "mac_filter" = "1" }
 { "relaxed_acs_check" = "1" }
 { "lock_manager" = "lockd" }
+{ "metadata_lock_manager" = "lockd" }
 { "max_queued" = "0" }
 { "keepalive_interval" = "5" }
 { "keepalive_count" = "5" }