From c5bf40bfa6afa4ec27052120e268a55213709ca4 Mon Sep 17 00:00:00 2001 From: Nikolay Shirokovskiy Date: Thu, 9 Jul 2020 10:46:34 +0300 Subject: [PATCH] libvirt: add stateShutdownPrepare/stateShutdownWait to drivers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stateShutdownPrepare is supposed to inform driver that it will be closed soon so that the driver can prepare and finish all background threads quickly on stateShutdownWait call. Signed-off-by: Nikolay Shirokovskiy Reviewed-by: Daniel P. Berrangé Reviewed-by: Daniel Henrique Barboza --- scripts/check-drivername.py | 2 ++ src/driver-state.h | 8 +++++++ src/libvirt.c | 42 +++++++++++++++++++++++++++++++++++++ src/libvirt_internal.h | 2 ++ src/libvirt_private.syms | 2 ++ 5 files changed, 56 insertions(+) diff --git a/scripts/check-drivername.py b/scripts/check-drivername.py index 39eff836c7..cce8e7dc88 100644 --- a/scripts/check-drivername.py +++ b/scripts/check-drivername.py @@ -50,6 +50,8 @@ for drvfile in drvfiles: "virDrvStateCleanup", "virDrvStateReload", "virDrvStateStop", + "virDrvStateShutdownPrepare", + "virDrvStateShutdownWait", "virDrvConnectSupportsFeature", "virDrvConnectURIProbe", "virDrvDomainMigratePrepare", diff --git a/src/driver-state.h b/src/driver-state.h index 6b3f501e05..767d8e898d 100644 --- a/src/driver-state.h +++ b/src/driver-state.h @@ -45,6 +45,12 @@ typedef int typedef int (*virDrvStateStop)(void); +typedef int +(*virDrvStateShutdownPrepare)(void); + +typedef int +(*virDrvStateShutdownWait)(void); + typedef struct _virStateDriver virStateDriver; typedef virStateDriver *virStateDriverPtr; @@ -55,4 +61,6 @@ struct _virStateDriver { virDrvStateCleanup stateCleanup; virDrvStateReload stateReload; virDrvStateStop stateStop; + virDrvStateShutdownPrepare stateShutdownPrepare; + virDrvStateShutdownWait stateShutdownWait; }; diff --git a/src/libvirt.c b/src/libvirt.c index 39e465dd1c..0748eb2352 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -672,6 +672,48 @@ virStateInitialize(bool privileged, } +/** + * virStateShutdownPrepare: + * + * Run each virtualization driver's shutdown prepare method. + * + * Returns 0 if all succeed, -1 upon any failure. + */ +int +virStateShutdownPrepare(void) +{ + size_t i; + + for (i = 0; i < virStateDriverTabCount; i++) { + if (virStateDriverTab[i]->stateShutdownPrepare && + virStateDriverTab[i]->stateShutdownPrepare() < 0) + return -1; + } + return 0; +} + + +/** + * virStateShutdownWait: + * + * Run each virtualization driver's shutdown wait method. + * + * Returns 0 if all succeed, -1 upon any failure. + */ +int +virStateShutdownWait(void) +{ + size_t i; + + for (i = 0; i < virStateDriverTabCount; i++) { + if (virStateDriverTab[i]->stateShutdownWait && + virStateDriverTab[i]->stateShutdownWait() < 0) + return -1; + } + return 0; +} + + /** * virStateCleanup: * diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h index cb239b3c1c..2bf7744bd6 100644 --- a/src/libvirt_internal.h +++ b/src/libvirt_internal.h @@ -34,6 +34,8 @@ int virStateInitialize(bool privileged, const char *root, virStateInhibitCallback inhibit, void *opaque); +int virStateShutdownPrepare(void); +int virStateShutdownWait(void); int virStateCleanup(void); int virStateReload(void); int virStateStop(void); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 1272ac6506..3b9606a366 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1509,6 +1509,8 @@ virSetSharedStorageDriver; virStateCleanup; virStateInitialize; virStateReload; +virStateShutdownPrepare; +virStateShutdownWait; virStateStop; virStreamInData;