This will call FITRIM within guest. The API has 4 arguments,
however, only 2 will be used for now (@dom and @minumum).
The rest two are there if in future qemu guest agent learns them.
---
include/libvirt/libvirt.h.in | 4 +++
src/driver.h | 6 ++++
src/libvirt.c | 55 ++++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 ++++
4 files changed, 70 insertions(+), 0 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 84dcde1..bd03315 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -4457,6 +4457,10 @@ int virDomainOpenGraphics(virDomainPtr dom,
int virDomainInjectNMI(virDomainPtr domain, unsigned int flags);
+int virDomainFSTrim(virDomainPtr dom,
+ const char *mountPoint,
+ unsigned long long minimum,
+ unsigned int flags);
/**
* virSchedParameterType:
diff --git a/src/driver.h b/src/driver.h
index 7ba66ad..5163840 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -903,6 +903,11 @@ typedef int
unsigned char **cpumap,
unsigned int *online,
unsigned int flags);
+typedef int
+ (*virDrvDomainFSTrim)(virDomainPtr dom,
+ const char *mountPoint,
+ unsigned long long minimum,
+ unsigned int flags);
/**
* _virDriver:
@@ -1094,6 +1099,7 @@ struct _virDriver {
virDrvNodeGetMemoryParameters nodeGetMemoryParameters;
virDrvNodeSetMemoryParameters nodeSetMemoryParameters;
virDrvNodeGetCPUMap nodeGetCPUMap;
+ virDrvDomainFSTrim domainFSTrim;
};
typedef int
diff --git a/src/libvirt.c b/src/libvirt.c
index 4af6089..23c36f9 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -20224,3 +20224,58 @@ error:
virDispatchError(conn);
return -1;
}
+
+/**
+ * virDomainFSTrim:
+ * @dom: a domain object
+ * @mountPoint: which mount point trim
+ * @minimum: Minimum contiguous free range to discard in bytes
+ * @flags: extra flags, not used yet, so callers should always pass 0
+ *
+ * Calls FITRIM within the guest (hence guest agent may be
+ * required depending on hypervisor used). Either call it on each
+ * mounted filesystem (@mountPoint is NULL) or just on specified
+ * @mountPoint. @minimum tell that free ranges smaller than this
+ * may be ignored (this is a hint and the guest may not respect
+ * it). By increasing this value, the fstrim operation will
+ * complete more quickly for filesystems with badly fragmented
+ * free space, although not all blocks will be discarded.
+ *
+ * Returns 0 on success, -1 otherwise.
+ */
+int
+virDomainFSTrim(virDomainPtr dom,
+ const char *mountPoint,
+ unsigned long long minimum,
+ unsigned int flags)
+{
+ VIR_DOMAIN_DEBUG(dom, "mountPoint=%s, minimum=%llu, flags=%x",
+ mountPoint, minimum, flags);
+
+ virResetLastError();
+
+ if (!VIR_IS_DOMAIN(dom)) {
+ virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virDispatchError(NULL);
+ return -1;
+ }
+
+ if (dom->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ if (dom->conn->driver->domainFSTrim) {
+ int ret = dom->conn->driver->domainFSTrim(dom, mountPoint,
+ minimum, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ virDispatchError(dom->conn);
+ return -1;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index f494821..f699e93 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -574,4 +574,9 @@ LIBVIRT_1.0.0 {
virNodeGetCPUMap;
} LIBVIRT_0.10.2;
+LIBVIRT_1.0.1 {
+ global:
+ virDomainFSTrim;
+} LIBVIRT_1.0.0;
+
# .... define new API here using predicted next version number ....
--
1.7.8.6