Add a function - cgroup_convert_cgroup() - that can convert from
one cgroup version to another.  This function will be the building
block for the libcgroup abstraction layer.

Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com>
---
 src/abstraction-common.c | 31 +++++++++++++++++++++++++++++++
 src/abstraction-common.h | 17 +++++++++++++++++
 src/libcgroup.map        |  1 +
 3 files changed, 49 insertions(+)

diff --git a/src/abstraction-common.c b/src/abstraction-common.c
index 8c57f1a07d8d..f69c8af28a4b 100644
--- a/src/abstraction-common.c
+++ b/src/abstraction-common.c
@@ -58,3 +58,34 @@ int cgroup_strtol(const char * const in_str, int base,
 out:
        return ret;
 }
+
+int cgroup_convert_cgroup(struct cgroup * const out_cgroup,
+                         enum cg_version_t out_version,
+                         const struct cgroup * const in_cgroup,
+                         enum cg_version_t in_version)
+{
+       struct cgroup_controller *cgc;
+       int ret = 0;
+       int i;
+
+       for (i = 0; i < in_cgroup->index; i++) {
+               cgc = cgroup_add_controller(out_cgroup,
+                                           in_cgroup->controller[i]->name);
+               if (cgc == NULL) {
+                       ret = ECGFAIL;
+                       goto out;
+               }
+
+               /* the user has overridden the version */
+               if (in_version == CGROUP_V1 || in_version == CGROUP_V2) {
+                       in_cgroup->controller[i]->version = in_version;
+               }
+
+               cgc->version = out_version;
+
+               /* Controller conversions will go here */
+       }
+
+out:
+       return ret;
+}
diff --git a/src/abstraction-common.h b/src/abstraction-common.h
index 03275412a9e8..9a4e4d09fd77 100644
--- a/src/abstraction-common.h
+++ b/src/abstraction-common.h
@@ -39,6 +39,23 @@ __BEGIN_DECLS
 int cgroup_strtol(const char * const in_str, int base,
                  long int * const out_value);
 
+/**
+ * Convert from one cgroup version to another version
+ *
+ * @param out_cgroup Destination cgroup
+ * @param out_version Destination cgroup version
+ * @param in_cgroup Source cgroup
+ * @param in_version Source cgroup version, only used if set to v1 or v2
+ *
+ * @return 0 on success
+ *         ECGFAIL conversion failed
+ *         ECGCONTROLLERNOTEQUAL incorrect controller version provided
+ */
+int cgroup_convert_cgroup(struct cgroup * const out_cgroup,
+                         enum cg_version_t out_version,
+                         const struct cgroup * const in_cgroup,
+                         enum cg_version_t in_version);
+
 __END_DECLS
 
 #endif /* __ABSTRACTION_COMMON */
diff --git a/src/libcgroup.map b/src/libcgroup.map
index 896796566526..d3451a531e0f 100644
--- a/src/libcgroup.map
+++ b/src/libcgroup.map
@@ -137,4 +137,5 @@ CGROUP_0.43 {
        cgroup_test_subsys_mounted;
        cg_mount_table;
        cg_mount_table_lock;
+       cgroup_convert_cgroup;
 } CGROUP_0.42;
-- 
2.26.2



_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to