From 9f3b219e704670eba5c12f8fb635a82f8becf4d0 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Wed, 28 Jun 2023 15:36:31 -0700 Subject: [PATCH] cgroups: allow statfs on cgroup files PiperOrigin-RevId: 544179511 --- pkg/sentry/fsimpl/cgroupfs/cgroupfs.go | 2 ++ test/syscalls/linux/cgroup.cc | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/pkg/sentry/fsimpl/cgroupfs/cgroupfs.go b/pkg/sentry/fsimpl/cgroupfs/cgroupfs.go index 504f5cadf..e186c351d 100644 --- a/pkg/sentry/fsimpl/cgroupfs/cgroupfs.go +++ b/pkg/sentry/fsimpl/cgroupfs/cgroupfs.go @@ -683,6 +683,8 @@ type writableControllerFileImpl interface { // +stateify savable type controllerFile struct { kernfs.DynamicBytesFile + implStatFS + allowBackgroundAccess bool } diff --git a/test/syscalls/linux/cgroup.cc b/test/syscalls/linux/cgroup.cc index 3b09dfa04..8bd51ad97 100644 --- a/test/syscalls/linux/cgroup.cc +++ b/test/syscalls/linux/cgroup.cc @@ -16,7 +16,9 @@ // which isn't expected to work, or be safe on a general linux system. #include +#include #include +#include #include #include @@ -157,6 +159,21 @@ TEST(Cgroup, ProcsAndTasks) { } } +TEST(Cgroup, Statfs) { + SKIP_IF(!CgroupsAvailable()); + + Mounter m(ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir())); + Cgroup c = ASSERT_NO_ERRNO_AND_VALUE(m.MountCgroupfs("")); + + struct statfs st; + EXPECT_THAT(statfs(c.Relpath("cgroup.procs").c_str(), &st), + SyscallSucceeds()); + EXPECT_EQ(st.f_type, CGROUP_SUPER_MAGIC); + + EXPECT_THAT(statfs(c.Relpath(".").c_str(), &st), SyscallSucceeds()); + EXPECT_EQ(st.f_type, CGROUP_SUPER_MAGIC); +} + TEST(Cgroup, ControllersMustBeInUniqueHierarchy) { SKIP_IF(!CgroupsAvailable());