diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2018-08-06 13:42:14 +0900 |
---|---|---|
committer | The Plumber <50238977+systemd-rhel-bot@users.noreply.github.com> | 2020-06-08 22:00:46 +0200 |
commit | d8024b3de8ce376cdea48ffa59a44b050f215470 (patch) | |
tree | 3cb90bd101cc8c84a67e3c691841f90029d0f8ca | |
parent | 04f21709ff081a5f1a2b5ca746582a9c5c03db7f (diff) | |
download | systemd-d8024b3de8ce376cdea48ffa59a44b050f215470.tar.gz |
core: introduce cgroup_add_device_allow()
(cherry picked from commit fd870bac25c2dd36affaed0251b5a7023f635306)
Related: #1763435
-rw-r--r-- | src/core/cgroup.c | 29 | ||||
-rw-r--r-- | src/core/cgroup.h | 2 | ||||
-rw-r--r-- | src/core/load-fragment.c | 13 |
3 files changed, 32 insertions, 12 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 9d09c65453..a17b38f914 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -341,6 +341,35 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) { } } +int cgroup_add_device_allow(CGroupContext *c, const char *dev, const char *mode) { + _cleanup_free_ CGroupDeviceAllow *a = NULL; + _cleanup_free_ char *d = NULL; + + assert(c); + assert(dev); + assert(isempty(mode) || in_charset(mode, "rwm")); + + a = new(CGroupDeviceAllow, 1); + if (!a) + return -ENOMEM; + + d = strdup(dev); + if (!d) + return -ENOMEM; + + *a = (CGroupDeviceAllow) { + .path = TAKE_PTR(d), + .r = isempty(mode) || !!strchr(mode, 'r'), + .w = isempty(mode) || !!strchr(mode, 'w'), + .m = isempty(mode) || !!strchr(mode, 'm'), + }; + + LIST_PREPEND(device_allow, c->device_allow, a); + TAKE_PTR(a); + + return 0; +} + static int lookup_block_device(const char *p, dev_t *ret) { struct stat st; int r; diff --git a/src/core/cgroup.h b/src/core/cgroup.h index 5e1be87b20..8102b442b8 100644 --- a/src/core/cgroup.h +++ b/src/core/cgroup.h @@ -153,6 +153,8 @@ void cgroup_context_free_io_device_latency(CGroupContext *c, CGroupIODeviceLaten void cgroup_context_free_blockio_device_weight(CGroupContext *c, CGroupBlockIODeviceWeight *w); void cgroup_context_free_blockio_device_bandwidth(CGroupContext *c, CGroupBlockIODeviceBandwidth *b); +int cgroup_add_device_allow(CGroupContext *c, const char *dev, const char *mode); + CGroupMask unit_get_own_mask(Unit *u); CGroupMask unit_get_delegate_mask(Unit *u); CGroupMask unit_get_members_mask(Unit *u); diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index d43b0f08f9..89a3457acc 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -3250,7 +3250,6 @@ int config_parse_device_allow( _cleanup_free_ char *path = NULL, *resolved = NULL; CGroupContext *c = data; - CGroupDeviceAllow *a; const char *p = rvalue; int r; @@ -3299,17 +3298,7 @@ int config_parse_device_allow( return 0; } - a = new0(CGroupDeviceAllow, 1); - if (!a) - return log_oom(); - - a->path = TAKE_PTR(resolved); - a->r = isempty(p) || !!strchr(p, 'r'); - a->w = isempty(p) || !!strchr(p, 'w'); - a->m = isempty(p) || !!strchr(p, 'm'); - - LIST_PREPEND(device_allow, c->device_allow, a); - return 0; + return cgroup_add_device_allow(c, resolved, p); } int config_parse_io_device_weight( |