From 655b50cc531a3b1a707490c1d0bde01a74b45ada Mon Sep 17 00:00:00 2001 From: Lucas Manning Date: Fri, 15 Mar 2024 11:01:05 -0700 Subject: [PATCH] Change statfs of /sys/fs/cgroup to return TMPFS_MAGIC. PiperOrigin-RevId: 616184176 --- pkg/sentry/fsimpl/sys/sys.go | 23 ++++++++++++++++++++++- test/syscalls/linux/cgroup.cc | 8 ++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/pkg/sentry/fsimpl/sys/sys.go b/pkg/sentry/fsimpl/sys/sys.go index 281b8e80a..dd9c1636d 100644 --- a/pkg/sentry/fsimpl/sys/sys.go +++ b/pkg/sentry/fsimpl/sys/sys.go @@ -113,7 +113,7 @@ func (fsType FilesystemType) GetFilesystem(ctx context.Context, vfsObj *vfs.Virt // cgroupfs, but the kernel creates the mountpoint. For the sentry, the // launcher mounts cgroupfs. if k.CgroupRegistry() != nil { - fsDirChildren["cgroup"] = fs.newDir(ctx, creds, defaultSysDirMode, nil) + fsDirChildren["cgroup"] = fs.newCgroupDir(ctx, creds, defaultSysDirMode, nil) } classSub := map[string]kernfs.Inode{ @@ -327,6 +327,15 @@ func (fs *filesystem) newDir(ctx context.Context, creds *auth.Credentials, mode return d } +func (fs *filesystem) newCgroupDir(ctx context.Context, creds *auth.Credentials, mode linux.FileMode, contents map[string]kernfs.Inode) kernfs.Inode { + d := &cgroupDir{} + d.InodeAttrs.Init(ctx, creds, linux.UNNAMED_MAJOR, fs.devMinor, fs.NextIno(), linux.ModeDirectory|0755) + d.OrderedChildren.Init(kernfs.OrderedChildrenOptions{}) + d.InitRefs() + d.IncLinks(d.OrderedChildren.Populate(contents)) + return d +} + // SetStat implements kernfs.Inode.SetStat not allowing inode attributes to be changed. func (*dir) SetStat(context.Context, *vfs.Filesystem, *auth.Credentials, vfs.SetStatOptions) error { return linuxerr.EPERM @@ -355,6 +364,18 @@ func (d *dir) StatFS(ctx context.Context, fs *vfs.Filesystem) (linux.Statfs, err return vfs.GenericStatFS(linux.SYSFS_MAGIC), nil } +// cgroupDir implements kernfs.Inode. +// +// +stateify savable +type cgroupDir struct { + dir +} + +// StatFS implements kernfs.Inode.StatFS. +func (d *cgroupDir) StatFS(ctx context.Context, fs *vfs.Filesystem) (linux.Statfs, error) { + return vfs.GenericStatFS(linux.TMPFS_MAGIC), nil +} + // cpuFile implements kernfs.Inode. // // +stateify savable diff --git a/test/syscalls/linux/cgroup.cc b/test/syscalls/linux/cgroup.cc index 2db528f14..ed7eac6d1 100644 --- a/test/syscalls/linux/cgroup.cc +++ b/test/syscalls/linux/cgroup.cc @@ -150,6 +150,14 @@ TEST(Cgroup, Statfs) { } } +TEST(Cgroup, StatfsCgroupDir) { + SKIP_IF(!CgroupsAvailable()); + + struct statfs st; + EXPECT_THAT(statfs("/sys/fs/cgroup", &st), SyscallSucceeds()); + EXPECT_EQ(st.f_type, TMPFS_MAGIC); +} + TEST(Cgroup, CgroupsCannotMountTwice) { SKIP_IF(!CgroupsAvailable());