[libvirt] [PATCH v2 0/4] test_driver: implement FS-related APIs

Ilias Stamatis (4): test_driver: introduce domain-private data test_driver: implement virDomainFSFreeze test_driver: implement virDomainFSThaw test_driver: implement virDomainFSTrim src/test/test_driver.c | 200 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 199 insertions(+), 1 deletion(-) -- 2.22.0

vm-specific data can be used by APIs that need to preserve some state between calls Some of them are: - FS-related APIs for remembering which mountpoints are frozen - virDomainSetTime / virDomainGetTime for maintaining time information - virDomainSetIOThreadParams for storing the I/O thread parameters - virDomainManagedSaveDefineXML for internally storing the VM definition Signed-off-by: Ilias Stamatis <stamatis.iliass@gmail.com> Reviewed-by: Erik Skultety <eskultet@redhat.com> --- src/test/test_driver.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..88a1d330c1 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -386,6 +386,35 @@ testBuildCapabilities(virConnectPtr conn) } +typedef struct _testDomainObjPrivate testDomainObjPrivate; +typedef testDomainObjPrivate *testDomainObjPrivatePtr; +struct _testDomainObjPrivate { + testDriverPtr driver; +}; + + +static void * +testDomainObjPrivateAlloc(void *opaque) +{ + testDomainObjPrivatePtr priv; + + if (VIR_ALLOC(priv) < 0) + return NULL; + + priv->driver = opaque; + + return priv; +} + + +static void +testDomainObjPrivateFree(void *data) +{ + testDomainObjPrivatePtr priv = data; + VIR_FREE(priv); +} + + static testDriverPtr testDriverNew(void) { @@ -401,6 +430,10 @@ testDriverNew(void) VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT | VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING, }; + virDomainXMLPrivateDataCallbacks privatecb = { + .alloc = testDomainObjPrivateAlloc, + .free = testDomainObjPrivateFree, + }; testDriverPtr ret; if (testDriverInitialize() < 0) @@ -409,7 +442,7 @@ testDriverNew(void) if (!(ret = virObjectLockableNew(testDriverClass))) return NULL; - if (!(ret->xmlopt = virDomainXMLOptionNew(&config, NULL, &ns, NULL, NULL)) || + if (!(ret->xmlopt = virDomainXMLOptionNew(&config, &privatecb, &ns, NULL, NULL)) || !(ret->eventState = virObjectEventStateNew()) || !(ret->ifaces = virInterfaceObjListNew()) || !(ret->domains = virDomainObjListNew()) || -- 2.22.0

On success update the domain-private data. Consider / and /boot to be the only mountpoints avaiable in order to be consistent with the other FS-related calls. Signed-off-by: Ilias Stamatis <stamatis.iliass@gmail.com> --- src/test/test_driver.c | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 88a1d330c1..a8b75b175a 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -390,6 +390,8 @@ typedef struct _testDomainObjPrivate testDomainObjPrivate; typedef testDomainObjPrivate *testDomainObjPrivatePtr; struct _testDomainObjPrivate { testDriverPtr driver; + + bool frozen[2]; /* used by file system related calls */ }; @@ -402,6 +404,7 @@ testDomainObjPrivateAlloc(void *opaque) return NULL; priv->driver = opaque; + priv->frozen[0] = priv->frozen[1] = false; return priv; } @@ -4046,6 +4049,74 @@ static int testDomainUndefine(virDomainPtr domain) return testDomainUndefineFlags(domain, 0); } + +static int +testDomainFSFreeze(virDomainPtr dom, + const char **mountpoints, + unsigned int nmountpoints, + unsigned int flags) +{ + virDomainObjPtr vm; + testDomainObjPrivatePtr priv; + size_t i; + int ret = -1; + + virCheckFlags(0, -1); + + if (!(vm = testDomObjFromDomain(dom))) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto cleanup; + + priv = vm->privateData; + + if (nmountpoints == 0) { + ret = 0; + if (priv->frozen[0] == false) { + priv->frozen[0] = true; + ret++; + } + if (priv->frozen[1] == false) { + priv->frozen[1] = true; + ret++; + } + } else { + int nfreeze = 0; + bool freeze[2]; + + memcpy(&freeze, priv->frozen, 2); + + for (i = 0; i < nmountpoints; i++) { + if (STREQ(mountpoints[i], "/")) { + if (!freeze[0]) { + freeze[0] = true; + nfreeze++; + } + } else if (STREQ(mountpoints[i], "/boot")) { + if (!freeze[1]) { + freeze[1] = true; + nfreeze++; + } + } else { + virReportError(VIR_ERR_OPERATION_INVALID, + _("mount point not found: %s"), + mountpoints[i]); + goto cleanup; + } + } + + /* steal the helper copy */ + memcpy(priv->frozen, &freeze, 2); + ret = nfreeze; + } + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -8692,6 +8763,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainDefineXMLFlags = testDomainDefineXMLFlags, /* 1.2.12 */ .domainUndefine = testDomainUndefine, /* 0.1.11 */ .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ + .domainFSFreeze = testDomainFSFreeze, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0

On Sun, Aug 04, 2019 at 03:27:16PM +0200, Ilias Stamatis wrote:
On success update the domain-private data. Consider / and /boot to be the only mountpoints avaiable in order to be consistent with the other
s/avaiable/available
FS-related calls.
Signed-off-by: Ilias Stamatis <stamatis.iliass@gmail.com> --- src/test/test_driver.c | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 88a1d330c1..a8b75b175a 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -390,6 +390,8 @@ typedef struct _testDomainObjPrivate testDomainObjPrivate; typedef testDomainObjPrivate *testDomainObjPrivatePtr; struct _testDomainObjPrivate { testDriverPtr driver; + + bool frozen[2]; /* used by file system related calls */ };
@@ -402,6 +404,7 @@ testDomainObjPrivateAlloc(void *opaque) return NULL;
priv->driver = opaque; + priv->frozen[0] = priv->frozen[1] = false;
return priv; } @@ -4046,6 +4049,74 @@ static int testDomainUndefine(virDomainPtr domain) return testDomainUndefineFlags(domain, 0); }
+ +static int +testDomainFSFreeze(virDomainPtr dom, + const char **mountpoints, + unsigned int nmountpoints, + unsigned int flags) +{ + virDomainObjPtr vm; + testDomainObjPrivatePtr priv; + size_t i; + int ret = -1; + + virCheckFlags(0, -1); + + if (!(vm = testDomObjFromDomain(dom))) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto cleanup; + + priv = vm->privateData; + + if (nmountpoints == 0) { + ret = 0; + if (priv->frozen[0] == false) { + priv->frozen[0] = true; + ret++; + } + if (priv->frozen[1] == false) { + priv->frozen[1] = true; + ret++; + }
we can simplify ^this hunk a bit by applying what patch 3/4 does, so I'll squash the following in: --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4096,15 +4096,8 @@ testDomainFSFreeze(virDomainPtr dom, priv = vm->privateData; if (nmountpoints == 0) { - ret = 0; - if (priv->frozen[0] == false) { - priv->frozen[0] = true; - ret++; - } - if (priv->frozen[1] == false) { - priv->frozen[1] = true; - ret++; - } + ret = 2 - (priv->frozen[0] + priv->frozen[1]); + priv->frozen[0] = priv->frozen[1] = true; } else { int nfreeze = 0; bool freeze[2]; Reviewed-by: Erik Skultety <eskultet@redhat.com>

Signed-off-by: Ilias Stamatis <stamatis.iliass@gmail.com> --- src/test/test_driver.c | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index a8b75b175a..2a9041d777 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4117,6 +4117,66 @@ testDomainFSFreeze(virDomainPtr dom, } +static int +testDomainFSThaw(virDomainPtr dom, + const char **mountpoints, + unsigned int nmountpoints, + unsigned int flags) +{ + virDomainObjPtr vm; + testDomainObjPrivatePtr priv; + size_t i; + int ret = -1; + + virCheckFlags(0, -1); + + if (!(vm = testDomObjFromDomain(dom))) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto cleanup; + + priv = vm->privateData; + + if (nmountpoints == 0) { + ret = priv->frozen[0] + priv->frozen[1]; + priv->frozen[0] = priv->frozen[1] = false; + } else { + int nthaw = 0; + bool freeze[2]; + + memcpy(&freeze, priv->frozen, 2); + + for (i = 0; i < nmountpoints; i++) { + if (STREQ(mountpoints[i], "/")) { + if (freeze[0]) { + freeze[0] = false; + nthaw++; + } + } else if (STREQ(mountpoints[i], "/boot")) { + if (freeze[1]) { + freeze[1] = false; + nthaw++; + } + } else { + virReportError(VIR_ERR_OPERATION_INVALID, + _("mount point not found: %s"), + mountpoints[i]); + goto cleanup; + } + } + + /* steal the helper copy */ + memcpy(priv->frozen, &freeze, 2); + ret = nthaw; + } + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -8764,6 +8824,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainUndefine = testDomainUndefine, /* 0.1.11 */ .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ .domainFSFreeze = testDomainFSFreeze, /* 5.7.0 */ + .domainFSThaw = testDomainFSThaw, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0

Signed-off-by: Ilias Stamatis <stamatis.iliass@gmail.com> --- src/test/test_driver.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2a9041d777..cb373f61d3 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4177,6 +4177,37 @@ testDomainFSThaw(virDomainPtr dom, } +static int +testDomainFSTrim(virDomainPtr dom, + const char *mountPoint, + unsigned long long minimum ATTRIBUTE_UNUSED, + unsigned int flags) +{ + virDomainObjPtr vm; + int ret = -1; + + virCheckFlags(0, -1); + + if (!(vm = testDomObjFromDomain(dom))) + return -1; + + if (virDomainObjCheckActive(vm) < 0) + goto cleanup; + + if (mountPoint && STRNEQ(mountPoint, "/") && STRNEQ(mountPoint, "/boot")) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("mount point not found: %s"), + mountPoint); + goto cleanup; + } + + ret = 0; + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -8825,6 +8856,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ .domainFSFreeze = testDomainFSFreeze, /* 5.7.0 */ .domainFSThaw = testDomainFSThaw, /* 5.7.0 */ + .domainFSTrim = testDomainFSTrim, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0
participants (2)
-
Erik Skultety
-
Ilias Stamatis