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());