Files
Ryan El Kochta 1653b017f5 Make /proc/sys/kernel/hostname and /proc/sys/kernel/domainname pollable
Adds the infrastructure for a DynamicBytesFile to become pollable
(perhaps with select, poll, or epoll). Simply arrange for a
DynamicBytesPoller to be notified whenever the relevant file is updated
and implement PollableDynamicBytesSource on the DynamicBytesSource.

EPOLLPRI and EPOLLERR are triggered for these files, which seems to
match Linux's implementation for /proc/sys files.

The first two files to support this are hostname and domainname in
/proc/sys/kernel. This is used by systemd-journald to monitor for
hostname changes.
2026-06-24 10:39:07 -07:00

181 lines
4.1 KiB
Python

load("//pkg/sync/locking:locking.bzl", "declare_mutex", "declare_rwmutex")
load("//tools:defs.bzl", "go_library", "go_test")
load("//tools/go_generics:defs.bzl", "go_template_instance")
package(default_applicable_licenses = ["//:license"])
licenses(["notice"])
go_template_instance(
name = "dentry_list",
out = "dentry_list.go",
package = "kernfs",
prefix = "dentry",
template = "//pkg/ilist:generic_list",
types = {
"Element": "*Dentry",
"Linker": "*Dentry",
},
)
go_template_instance(
name = "fstree",
out = "fstree.go",
package = "kernfs",
prefix = "generic",
template = "//pkg/sentry/vfs/genericfstree:generic_fstree",
types = {
"Dentry": "Dentry",
"Filesystem": "Filesystem",
},
)
go_template_instance(
name = "slot_list",
out = "slot_list.go",
package = "kernfs",
prefix = "slot",
template = "//pkg/ilist:generic_list",
types = {
"Element": "*slot",
"Linker": "*slot",
},
)
go_template_instance(
name = "static_directory_refs",
out = "static_directory_refs.go",
package = "kernfs",
prefix = "StaticDirectory",
template = "//pkg/refs:refs_template",
types = {
"T": "StaticDirectory",
},
)
go_template_instance(
name = "dir_refs",
out = "dir_refs.go",
package = "kernfs_test",
prefix = "dir",
template = "//pkg/refs:refs_template",
types = {
"T": "dir",
},
)
go_template_instance(
name = "readonly_dir_refs",
out = "readonly_dir_refs.go",
package = "kernfs_test",
prefix = "readonlyDir",
template = "//pkg/refs:refs_template",
types = {
"T": "readonlyDir",
},
)
go_template_instance(
name = "synthetic_directory_refs",
out = "synthetic_directory_refs.go",
package = "kernfs",
prefix = "syntheticDirectory",
template = "//pkg/refs:refs_template",
types = {
"T": "syntheticDirectory",
},
)
declare_rwmutex(
name = "ancestry_mutex",
out = "ancestry_mutex.go",
package = "kernfs",
prefix = "ancestry",
)
declare_mutex(
name = "deferred_dec_refs_mutex",
out = "deferred_dec_refs_mutex.go",
package = "kernfs",
prefix = "deferredDecRefs",
)
declare_rwmutex(
name = "filesystem_mutex",
out = "filesystem_mutex.go",
package = "kernfs",
prefix = "filesystem",
)
go_library(
name = "kernfs",
srcs = [
"ancestry_mutex.go",
"deferred_dec_refs_mutex.go",
"dentry_list.go",
"dynamic_bytes_file.go",
"fd_impl_util.go",
"filesystem.go",
"filesystem_mutex.go",
"fstree.go",
"inode_impl_util.go",
"kernfs.go",
"save_restore.go",
"slot_list.go",
"static_directory_refs.go",
"symlink.go",
"synthetic_directory.go",
"synthetic_directory_refs.go",
],
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
"//pkg/atomicbitops",
"//pkg/context",
"//pkg/errors/linuxerr",
"//pkg/fspath",
"//pkg/hostarch",
"//pkg/log",
"//pkg/refs",
"//pkg/safemem",
"//pkg/sentry/fsimpl/lock",
"//pkg/sentry/fsutil",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/ktime",
"//pkg/sentry/memmap",
"//pkg/sentry/socket/unix/transport",
"//pkg/sentry/vfs",
"//pkg/sync",
"//pkg/sync/locking",
"//pkg/usermem",
"//pkg/waiter",
],
)
go_test(
name = "kernfs_test",
size = "small",
srcs = [
"dir_refs.go",
"kernfs_test.go",
"readonly_dir_refs.go",
],
deps = [
":kernfs",
"//pkg/abi/linux",
"//pkg/atomicbitops",
"//pkg/context",
"//pkg/errors/linuxerr",
"//pkg/fspath",
"//pkg/hostarch",
"//pkg/log",
"//pkg/refs",
"//pkg/sentry/contexttest",
"//pkg/sentry/fsimpl/testutil",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/vfs",
"//pkg/usermem",
"@com_github_google_go_cmp//cmp:go_default_library",
],
)