summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNick Rosbrook <enr0n@ubuntu.com>2023-09-28 20:10:59 +0200
committerNick Rosbrook <enr0n@ubuntu.com>2023-10-13 21:13:11 +0200
commitb426b4eed8d83ac3111c8d9814b96bca0d88382f (patch)
tree8beab72085b84fa0b56c71533a59ade9aa14763b /src
parentcore: fix checking for extension-releases for ExtensionImages/Directories (diff)
downloadsystemd-b426b4eed8d83ac3111c8d9814b96bca0d88382f.tar.xz
systemd-b426b4eed8d83ac3111c8d9814b96bca0d88382f.zip
cgroup-util: add cg_is_delegated helper
Take is_delegated from cgroup-show.c, and make it a generic helper function. This new helper will be used again in a later commit.
Diffstat (limited to '')
-rw-r--r--src/basic/cgroup-util.c19
-rw-r--r--src/basic/cgroup-util.h2
-rw-r--r--src/shared/cgroup-show.c32
3 files changed, 25 insertions, 28 deletions
diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c
index db803084ae..7df419d607 100644
--- a/src/basic/cgroup-util.c
+++ b/src/basic/cgroup-util.c
@@ -2268,6 +2268,25 @@ int cg_hybrid_unified(void) {
return r == CGROUP_UNIFIED_SYSTEMD && !unified_systemd_v232;
}
+int cg_is_delegated(const char *path) {
+ int r;
+
+ assert(path);
+
+ r = cg_get_xattr_bool(path, "trusted.delegate");
+ if (ERRNO_IS_NEG_XATTR_ABSENT(r)) {
+ /* If the trusted xattr isn't set (preferred), then check the
+ * untrusted one. Under the assumption that whoever is trusted
+ * enough to own the cgroup, is also trusted enough to decide
+ * if it is delegated or not this should be safe. */
+ r = cg_get_xattr_bool(path, "user.delegate");
+ if (ERRNO_IS_NEG_XATTR_ABSENT(r))
+ return false;
+ }
+
+ return r;
+}
+
const uint64_t cgroup_io_limit_defaults[_CGROUP_IO_LIMIT_TYPE_MAX] = {
[CGROUP_IO_RBPS_MAX] = CGROUP_LIMIT_MAX,
[CGROUP_IO_WBPS_MAX] = CGROUP_LIMIT_MAX,
diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h
index 625816d9cf..7e79735c3f 100644
--- a/src/basic/cgroup-util.h
+++ b/src/basic/cgroup-util.h
@@ -210,6 +210,8 @@ int cg_rmdir(const char *controller, const char *path);
int cg_is_threaded(const char *path);
+int cg_is_delegated(const char *path);
+
typedef enum {
CG_KEY_MODE_GRACEFUL = 1 << 0,
} CGroupKeyMode;
diff --git a/src/shared/cgroup-show.c b/src/shared/cgroup-show.c
index d2d0339910..32e1176a57 100644
--- a/src/shared/cgroup-show.c
+++ b/src/shared/cgroup-show.c
@@ -128,33 +128,6 @@ static int show_cgroup_one_by_path(
return 0;
}
-static int is_delegated(int cgfd, const char *path) {
- _cleanup_free_ char *b = NULL;
- int r;
-
- assert(cgfd >= 0 || path);
-
- const char *t = cgfd >= 0 ? FORMAT_PROC_FD_PATH(cgfd) : path;
-
- r = getxattr_malloc(t, "trusted.delegate", &b);
- if (ERRNO_IS_NEG_XATTR_ABSENT(r)) {
- /* If the trusted xattr isn't set (preferred), then check the untrusted one. Under the
- * assumption that whoever is trusted enough to own the cgroup, is also trusted enough to
- * decide if it is delegated or not this should be safe. */
- r = getxattr_malloc(t, "user.delegate", &b);
- if (ERRNO_IS_NEG_XATTR_ABSENT(r))
- return false;
- }
- if (r < 0)
- return log_debug_errno(r, "Failed to read delegate xattr from %s, ignoring: %m", t);
-
- r = parse_boolean(b);
- if (r < 0)
- return log_debug_errno(r, "Failed to parse delegate xattr from %s, ignoring: %m", t);
-
- return r;
-}
-
static int show_cgroup_name(
const char *path,
const char *prefix,
@@ -173,7 +146,10 @@ static int show_cgroup_name(
log_debug_errno(errno, "Failed to open cgroup '%s', ignoring: %m", path);
}
- delegate = is_delegated(fd, path) > 0;
+ r = cg_is_delegated(fd >= 0 ? FORMAT_PROC_FD_PATH(fd) : path);
+ if (r < 0)
+ log_debug_errno(r, "Failed to check if cgroup is delegated, ignoring: %m");
+ delegate = r > 0;
if (FLAGS_SET(flags, OUTPUT_CGROUP_ID)) {
cg_file_handle fh = CG_FILE_HANDLE_INIT;