summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fs
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/sentry/fs')
-rw-r--r--pkg/sentry/fs/BUILD36
-rw-r--r--pkg/sentry/fs/ashmem/BUILD17
-rw-r--r--pkg/sentry/fs/ashmem/area.go8
-rw-r--r--pkg/sentry/fs/ashmem/device.go22
-rw-r--r--pkg/sentry/fs/ashmem/pin_board.go2
-rw-r--r--pkg/sentry/fs/attr.go12
-rw-r--r--pkg/sentry/fs/binder/BUILD13
-rw-r--r--pkg/sentry/fs/binder/binder.go26
-rw-r--r--pkg/sentry/fs/dentry.go4
-rw-r--r--pkg/sentry/fs/dev/BUILD20
-rw-r--r--pkg/sentry/fs/dev/dev.go2
-rw-r--r--pkg/sentry/fs/dev/fs.go2
-rw-r--r--pkg/sentry/fs/dev/full.go2
-rw-r--r--pkg/sentry/fs/dev/null.go3
-rw-r--r--pkg/sentry/fs/dev/random.go1
-rw-r--r--pkg/sentry/fs/dirent.go2
-rw-r--r--pkg/sentry/fs/dirent_cache.go2
-rw-r--r--pkg/sentry/fs/fdpipe/BUILD31
-rw-r--r--pkg/sentry/fs/fdpipe/pipe.go2
-rw-r--r--pkg/sentry/fs/file.go2
-rw-r--r--pkg/sentry/fs/file_overlay.go4
-rw-r--r--pkg/sentry/fs/filesystems.go2
-rw-r--r--pkg/sentry/fs/filetest/BUILD18
-rw-r--r--pkg/sentry/fs/flags.go2
-rw-r--r--pkg/sentry/fs/fsutil/BUILD20
-rw-r--r--pkg/sentry/fs/fsutil/dirty_set.go2
-rw-r--r--pkg/sentry/fs/fsutil/handle.go2
-rw-r--r--pkg/sentry/fs/fsutil/host_file_mapper.go2
-rw-r--r--pkg/sentry/fs/fsutil/inode.go6
-rw-r--r--pkg/sentry/fs/fsutil/inode_cached.go2
-rw-r--r--pkg/sentry/fs/gofer/BUILD23
-rw-r--r--pkg/sentry/fs/gofer/file.go2
-rw-r--r--pkg/sentry/fs/gofer/fs.go2
-rw-r--r--pkg/sentry/fs/gofer/inode.go4
-rw-r--r--pkg/sentry/fs/gofer/session.go3
-rw-r--r--pkg/sentry/fs/host/BUILD27
-rw-r--r--pkg/sentry/fs/host/descriptor.go2
-rw-r--r--pkg/sentry/fs/host/file.go2
-rw-r--r--pkg/sentry/fs/host/fs.go6
-rw-r--r--pkg/sentry/fs/host/inode.go4
-rw-r--r--pkg/sentry/fs/host/socket.go2
-rw-r--r--pkg/sentry/fs/inode.go4
-rw-r--r--pkg/sentry/fs/inode_inotify.go2
-rw-r--r--pkg/sentry/fs/inotify.go2
-rw-r--r--pkg/sentry/fs/inotify_event.go2
-rw-r--r--pkg/sentry/fs/inotify_watch.go2
-rw-r--r--pkg/sentry/fs/lock/BUILD15
-rw-r--r--pkg/sentry/fs/lock/lock.go6
-rw-r--r--pkg/sentry/fs/mount.go4
-rw-r--r--pkg/sentry/fs/mount_overlay.go4
-rw-r--r--pkg/sentry/fs/mounts.go2
-rw-r--r--pkg/sentry/fs/overlay.go2
-rw-r--r--pkg/sentry/fs/proc/BUILD34
-rw-r--r--pkg/sentry/fs/proc/cpuinfo.go2
-rw-r--r--pkg/sentry/fs/proc/exec_args.go2
-rw-r--r--pkg/sentry/fs/proc/fds.go6
-rw-r--r--pkg/sentry/fs/proc/file.go1
-rw-r--r--pkg/sentry/fs/proc/filesystems.go2
-rw-r--r--pkg/sentry/fs/proc/fs.go2
-rw-r--r--pkg/sentry/fs/proc/loadavg.go2
-rw-r--r--pkg/sentry/fs/proc/meminfo.go2
-rw-r--r--pkg/sentry/fs/proc/mounts.go4
-rw-r--r--pkg/sentry/fs/proc/proc.go4
-rw-r--r--pkg/sentry/fs/proc/seqfile/BUILD30
-rw-r--r--pkg/sentry/fs/proc/seqfile/seqfile.go4
-rw-r--r--pkg/sentry/fs/proc/stat.go2
-rw-r--r--pkg/sentry/fs/proc/sys.go5
-rw-r--r--pkg/sentry/fs/proc/sys_net.go2
-rw-r--r--pkg/sentry/fs/proc/task.go20
-rw-r--r--pkg/sentry/fs/proc/uid_gid_map.go3
-rw-r--r--pkg/sentry/fs/proc/uptime.go2
-rw-r--r--pkg/sentry/fs/proc/version.go2
-rw-r--r--pkg/sentry/fs/ramfs/BUILD21
-rw-r--r--pkg/sentry/fs/ramfs/dir.go2
-rw-r--r--pkg/sentry/fs/ramfs/ramfs.go2
-rw-r--r--pkg/sentry/fs/ramfs/socket.go2
-rw-r--r--pkg/sentry/fs/ramfs/symlink.go2
-rw-r--r--pkg/sentry/fs/ramfs/test/BUILD18
-rw-r--r--pkg/sentry/fs/sys/BUILD14
-rw-r--r--pkg/sentry/fs/sys/fs.go2
-rw-r--r--pkg/sentry/fs/sys/sys.go5
-rw-r--r--pkg/sentry/fs/timerfd/BUILD18
-rw-r--r--pkg/sentry/fs/timerfd/timerfd.go4
-rw-r--r--pkg/sentry/fs/tmpfs/BUILD17
-rw-r--r--pkg/sentry/fs/tmpfs/file_regular.go2
-rw-r--r--pkg/sentry/fs/tmpfs/fs.go2
-rw-r--r--pkg/sentry/fs/tmpfs/inode_file.go2
-rw-r--r--pkg/sentry/fs/tmpfs/tmpfs.go8
-rw-r--r--pkg/sentry/fs/tty/BUILD20
-rw-r--r--pkg/sentry/fs/tty/dir.go18
-rw-r--r--pkg/sentry/fs/tty/fs.go4
-rw-r--r--pkg/sentry/fs/tty/inode.go2
-rw-r--r--pkg/sentry/fs/tty/line_discipline.go6
-rw-r--r--pkg/sentry/fs/tty/master.go4
-rw-r--r--pkg/sentry/fs/tty/queue.go4
-rw-r--r--pkg/sentry/fs/tty/slave.go4
-rw-r--r--pkg/sentry/fs/tty/terminal.go2
97 files changed, 303 insertions, 404 deletions
diff --git a/pkg/sentry/fs/BUILD b/pkg/sentry/fs/BUILD
index e3c9a9b70..18cd5ae8e 100644
--- a/pkg/sentry/fs/BUILD
+++ b/pkg/sentry/fs/BUILD
@@ -1,40 +1,7 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "fs_state",
- srcs = [
- "attr.go",
- "dentry.go",
- "dirent.go",
- "dirent_cache.go",
- "dirent_list.go",
- "dirent_state.go",
- "file.go",
- "file_overlay.go",
- "file_state.go",
- "filesystems.go",
- "flags.go",
- "inode.go",
- "inode_inotify.go",
- "inode_operations.go",
- "inode_overlay.go",
- "inotify.go",
- "inotify_event.go",
- "inotify_watch.go",
- "mock.go",
- "mount.go",
- "mount_overlay.go",
- "mount_state.go",
- "mounts.go",
- "overlay.go",
- "path.go",
- ],
- out = "fs_state.go",
- package = "fs",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "fs",
@@ -54,7 +21,6 @@ go_library(
"filesystems.go",
"flags.go",
"fs.go",
- "fs_state.go",
"inode.go",
"inode_inotify.go",
"inode_operations.go",
diff --git a/pkg/sentry/fs/ashmem/BUILD b/pkg/sentry/fs/ashmem/BUILD
index 9f166799a..dc893d22f 100644
--- a/pkg/sentry/fs/ashmem/BUILD
+++ b/pkg/sentry/fs/ashmem/BUILD
@@ -1,26 +1,12 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
load("//tools/go_generics:defs.bzl", "go_template_instance")
-go_stateify(
- name = "ashmem_state",
- srcs = [
- "area.go",
- "device.go",
- "pin_board.go",
- "uint64_range.go",
- "uint64_set.go",
- ],
- out = "ashmem_state.go",
- package = "ashmem",
-)
-
go_library(
name = "ashmem",
srcs = [
"area.go",
- "ashmem_state.go",
"device.go",
"pin_board.go",
"uint64_range.go",
@@ -41,7 +27,6 @@ go_library(
"//pkg/sentry/platform",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
],
diff --git a/pkg/sentry/fs/ashmem/area.go b/pkg/sentry/fs/ashmem/area.go
index e4f76f0d0..bfd7f2762 100644
--- a/pkg/sentry/fs/ashmem/area.go
+++ b/pkg/sentry/fs/ashmem/area.go
@@ -39,10 +39,12 @@ const (
)
// Area implements fs.FileOperations.
+//
+// +stateify savable
type Area struct {
- fsutil.NoFsync
- fsutil.DeprecatedFileOperations
- fsutil.NotDirReaddir
+ fsutil.NoFsync `state:"nosave"`
+ fsutil.DeprecatedFileOperations `state:"nosave"`
+ fsutil.NotDirReaddir `state:"nosave"`
ad *Device
diff --git a/pkg/sentry/fs/ashmem/device.go b/pkg/sentry/fs/ashmem/device.go
index c5b51d4a7..d0986fa11 100644
--- a/pkg/sentry/fs/ashmem/device.go
+++ b/pkg/sentry/fs/ashmem/device.go
@@ -27,17 +27,19 @@ import (
)
// Device implements fs.InodeOperations.
+//
+// +stateify savable
type Device struct {
- fsutil.DeprecatedFileOperations
- fsutil.InodeNoExtendedAttributes
- fsutil.InodeNotDirectory
- fsutil.InodeNotRenameable
- fsutil.InodeNotSocket
- fsutil.InodeNotSymlink
- fsutil.NoFsync
- fsutil.NoMappable
- fsutil.NoopWriteOut
- fsutil.NotDirReaddir
+ fsutil.DeprecatedFileOperations `state:"nosave"`
+ fsutil.InodeNoExtendedAttributes `state:"nosave"`
+ fsutil.InodeNotDirectory `state:"nosave"`
+ fsutil.InodeNotRenameable `state:"nosave"`
+ fsutil.InodeNotSocket `state:"nosave"`
+ fsutil.InodeNotSymlink `state:"nosave"`
+ fsutil.NoFsync `state:"nosave"`
+ fsutil.NoMappable `state:"nosave"`
+ fsutil.NoopWriteOut `state:"nosave"`
+ fsutil.NotDirReaddir `state:"nosave"`
mu sync.Mutex `state:"nosave"`
unstable fs.UnstableAttr
diff --git a/pkg/sentry/fs/ashmem/pin_board.go b/pkg/sentry/fs/ashmem/pin_board.go
index c7fb3822c..ecba395a0 100644
--- a/pkg/sentry/fs/ashmem/pin_board.go
+++ b/pkg/sentry/fs/ashmem/pin_board.go
@@ -56,6 +56,8 @@ func (setFunctions) Split(Range, noValue, uint64) (noValue, noValue) {
// segment.Set is used for implementation where segments represent
// ranges of pinned bytes, while gaps represent ranges of unpinned
// bytes. All ranges are page-aligned.
+//
+// +stateify savable
type PinBoard struct {
Set
}
diff --git a/pkg/sentry/fs/attr.go b/pkg/sentry/fs/attr.go
index 56a2ad6f7..4178f18b2 100644
--- a/pkg/sentry/fs/attr.go
+++ b/pkg/sentry/fs/attr.go
@@ -91,6 +91,8 @@ func (n InodeType) String() string {
// StableAttr contains Inode attributes that will be stable throughout the
// lifetime of the Inode.
+//
+// +stateify savable
type StableAttr struct {
// Type is the InodeType of a InodeOperations.
Type InodeType
@@ -150,6 +152,8 @@ func IsCharDevice(s StableAttr) bool {
// UnstableAttr contains Inode attributes that may change over the lifetime
// of the Inode.
+//
+// +stateify savable
type UnstableAttr struct {
// Size is the file size in bytes.
Size int64
@@ -186,6 +190,8 @@ func WithCurrentTime(ctx context.Context, u UnstableAttr) UnstableAttr {
}
// AttrMask contains fields to mask StableAttr and UnstableAttr.
+//
+// +stateify savable
type AttrMask struct {
Type bool
DeviceID bool
@@ -227,6 +233,8 @@ func (a AttrMask) Union(b AttrMask) AttrMask {
}
// PermMask are file access permissions.
+//
+// +stateify savable
type PermMask struct {
// Read indicates reading is permitted.
Read bool
@@ -280,6 +288,8 @@ func (p PermMask) SupersetOf(other PermMask) bool {
// FilePermissions represents the permissions of a file, with
// Read/Write/Execute bits for user, group, and other.
+//
+// +stateify savable
type FilePermissions struct {
User PermMask
Group PermMask
@@ -370,6 +380,8 @@ func (f FilePermissions) AnyRead() bool {
}
// FileOwner represents ownership of a file.
+//
+// +stateify savable
type FileOwner struct {
UID auth.KUID
GID auth.KGID
diff --git a/pkg/sentry/fs/binder/BUILD b/pkg/sentry/fs/binder/BUILD
index ec3928baf..a077b91d2 100644
--- a/pkg/sentry/fs/binder/BUILD
+++ b/pkg/sentry/fs/binder/BUILD
@@ -1,25 +1,16 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-
-go_stateify(
- name = "binder_state",
- srcs = ["binder.go"],
- out = "binder_state.go",
- package = "binder",
-)
+load("//tools/go_stateify:defs.bzl", "go_library")
go_library(
name = "binder",
srcs = [
"binder.go",
- "binder_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/binder",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
- "//pkg/log",
"//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/fs",
@@ -30,8 +21,6 @@ go_library(
"//pkg/sentry/platform",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
- "//pkg/tcpip/transport/unix",
],
)
diff --git a/pkg/sentry/fs/binder/binder.go b/pkg/sentry/fs/binder/binder.go
index 3f87b6b08..502a262dd 100644
--- a/pkg/sentry/fs/binder/binder.go
+++ b/pkg/sentry/fs/binder/binder.go
@@ -40,15 +40,17 @@ const (
)
// Device implements fs.InodeOperations.
+//
+// +stateify savable
type Device struct {
- fsutil.InodeNoExtendedAttributes
- fsutil.InodeNotDirectory
- fsutil.InodeNotRenameable
- fsutil.InodeNotSocket
- fsutil.InodeNotSymlink
- fsutil.NoMappable
- fsutil.NoopWriteOut
- fsutil.DeprecatedFileOperations
+ fsutil.InodeNoExtendedAttributes `state:"nosave"`
+ fsutil.InodeNotDirectory `state:"nosave"`
+ fsutil.InodeNotRenameable `state:"nosave"`
+ fsutil.InodeNotSocket `state:"nosave"`
+ fsutil.InodeNotSymlink `state:"nosave"`
+ fsutil.NoMappable `state:"nosave"`
+ fsutil.NoopWriteOut `state:"nosave"`
+ fsutil.DeprecatedFileOperations `state:"nosave"`
// mu protects unstable.
mu sync.Mutex `state:"nosave"`
@@ -186,10 +188,12 @@ func (bd *Device) StatFS(context.Context) (fs.Info, error) {
}
// Proc implements fs.FileOperations and fs.IoctlGetter.
+//
+// +stateify savable
type Proc struct {
- fsutil.NoFsync
- fsutil.DeprecatedFileOperations
- fsutil.NotDirReaddir
+ fsutil.NoFsync `state:"nosave"`
+ fsutil.DeprecatedFileOperations `state:"nosave"`
+ fsutil.NotDirReaddir `state:"nosave"`
bd *Device
task *kernel.Task
diff --git a/pkg/sentry/fs/dentry.go b/pkg/sentry/fs/dentry.go
index d42e8da81..b347468ff 100644
--- a/pkg/sentry/fs/dentry.go
+++ b/pkg/sentry/fs/dentry.go
@@ -21,6 +21,8 @@ import (
)
// DentAttr is the metadata of a directory entry. It is a subset of StableAttr.
+//
+// +stateify savable
type DentAttr struct {
// Type is the InodeType of an Inode.
Type InodeType
@@ -154,6 +156,8 @@ func GenericReaddir(ctx *DirCtx, s *SortedDentryMap) (int, error) {
}
// SortedDentryMap is a sorted map of names and fs.DentAttr entries.
+//
+// +stateify savable
type SortedDentryMap struct {
// names is always kept in sorted-order.
names []string
diff --git a/pkg/sentry/fs/dev/BUILD b/pkg/sentry/fs/dev/BUILD
index ea41615fd..fc069bb5f 100644
--- a/pkg/sentry/fs/dev/BUILD
+++ b/pkg/sentry/fs/dev/BUILD
@@ -1,25 +1,11 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-
-go_stateify(
- name = "dev_state",
- srcs = [
- "dev.go",
- "fs.go",
- "full.go",
- "null.go",
- "random.go",
- ],
- out = "dev_state.go",
- package = "dev",
-)
+load("//tools/go_stateify:defs.bzl", "go_library")
go_library(
name = "dev",
srcs = [
"dev.go",
- "dev_state.go",
"device.go",
"fs.go",
"full.go",
@@ -30,8 +16,6 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
- "//pkg/amutex",
- "//pkg/log",
"//pkg/rand",
"//pkg/sentry/context",
"//pkg/sentry/device",
@@ -45,9 +29,7 @@ go_library(
"//pkg/sentry/mm",
"//pkg/sentry/platform",
"//pkg/sentry/safemem",
- "//pkg/sentry/usage",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/fs/dev/dev.go b/pkg/sentry/fs/dev/dev.go
index 36c61bfc2..3f4f2a40a 100644
--- a/pkg/sentry/fs/dev/dev.go
+++ b/pkg/sentry/fs/dev/dev.go
@@ -27,6 +27,8 @@ import (
)
// Dev is the root node.
+//
+// +stateify savable
type Dev struct {
ramfs.Dir
}
diff --git a/pkg/sentry/fs/dev/fs.go b/pkg/sentry/fs/dev/fs.go
index 3c79f3782..2ae49be4e 100644
--- a/pkg/sentry/fs/dev/fs.go
+++ b/pkg/sentry/fs/dev/fs.go
@@ -29,6 +29,8 @@ const binderEnabledKey = "binder_enabled"
const ashmemEnabledKey = "ashmem_enabled"
// filesystem is a devtmpfs.
+//
+// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/dev/full.go b/pkg/sentry/fs/dev/full.go
index e13eb6c03..492b8eb3a 100644
--- a/pkg/sentry/fs/dev/full.go
+++ b/pkg/sentry/fs/dev/full.go
@@ -26,6 +26,8 @@ import (
)
// fullDevice is used to implement /dev/full.
+//
+// +stateify savable
type fullDevice struct {
ramfs.Entry
}
diff --git a/pkg/sentry/fs/dev/null.go b/pkg/sentry/fs/dev/null.go
index 66b8ba967..2977c8670 100644
--- a/pkg/sentry/fs/dev/null.go
+++ b/pkg/sentry/fs/dev/null.go
@@ -29,6 +29,7 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
+// +stateify savable
type nullDevice struct {
ramfs.Entry
}
@@ -54,6 +55,7 @@ func (n *nullDevice) Truncate(context.Context, *fs.Inode, int64) error {
return nil
}
+// +stateify savable
type zeroDevice struct {
nullDevice
}
@@ -80,6 +82,7 @@ func (zd *zeroDevice) GetFile(ctx context.Context, dirent *fs.Dirent, flags fs.F
}), nil
}
+// +stateify savable
type zeroFileOperations struct {
fs.FileOperations
}
diff --git a/pkg/sentry/fs/dev/random.go b/pkg/sentry/fs/dev/random.go
index 33a045a05..47b76218f 100644
--- a/pkg/sentry/fs/dev/random.go
+++ b/pkg/sentry/fs/dev/random.go
@@ -24,6 +24,7 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
+// +stateify savable
type randomDevice struct {
ramfs.Entry
}
diff --git a/pkg/sentry/fs/dirent.go b/pkg/sentry/fs/dirent.go
index f9bf2fba6..4658d044f 100644
--- a/pkg/sentry/fs/dirent.go
+++ b/pkg/sentry/fs/dirent.go
@@ -81,6 +81,8 @@ var renameMu sync.RWMutex
//
// Dirents currently do not attempt to free entries that lack application references under
// memory pressure.
+//
+// +stateify savable
type Dirent struct {
// AtomicRefCount is our reference count.
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/dirent_cache.go b/pkg/sentry/fs/dirent_cache.go
index e786e4f65..c680e4828 100644
--- a/pkg/sentry/fs/dirent_cache.go
+++ b/pkg/sentry/fs/dirent_cache.go
@@ -25,6 +25,8 @@ import (
//
// A nil DirentCache corresponds to a cache with size 0. All methods can be
// called, but nothing is actually cached.
+//
+// +stateify savable
type DirentCache struct {
// Maximum size of the cache. This must be saved manually, to handle the case
// when cache is nil.
diff --git a/pkg/sentry/fs/fdpipe/BUILD b/pkg/sentry/fs/fdpipe/BUILD
index 4fcb06f1f..ffe4204bc 100644
--- a/pkg/sentry/fs/fdpipe/BUILD
+++ b/pkg/sentry/fs/fdpipe/BUILD
@@ -1,54 +1,27 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "pipe_state",
- srcs = [
- "pipe.go",
- "pipe_state.go",
- ],
- out = "pipe_autogen_state.go",
- imports = ["gvisor.googlesource.com/gvisor/pkg/sentry/fs"],
- package = "fdpipe",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "fdpipe",
srcs = [
"pipe.go",
- "pipe_autogen_state.go",
"pipe_opener.go",
"pipe_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/fdpipe",
+ imports = ["gvisor.googlesource.com/gvisor/pkg/sentry/fs"],
visibility = ["//pkg/sentry:internal"],
deps = [
- "//pkg/abi/linux",
- "//pkg/amutex",
"//pkg/fd",
"//pkg/log",
- "//pkg/metric",
- "//pkg/p9",
- "//pkg/refs",
"//pkg/secio",
"//pkg/sentry/context",
- "//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/fsutil",
- "//pkg/sentry/fs/lock",
- "//pkg/sentry/kernel/auth",
- "//pkg/sentry/kernel/time",
- "//pkg/sentry/memmap",
- "//pkg/sentry/platform",
"//pkg/sentry/safemem",
- "//pkg/sentry/uniqueid",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
- "//pkg/tcpip",
- "//pkg/tcpip/transport/unix",
- "//pkg/unet",
"//pkg/waiter",
"//pkg/waiter/fdnotifier",
],
diff --git a/pkg/sentry/fs/fdpipe/pipe.go b/pkg/sentry/fs/fdpipe/pipe.go
index 7b318e35f..2e34604e6 100644
--- a/pkg/sentry/fs/fdpipe/pipe.go
+++ b/pkg/sentry/fs/fdpipe/pipe.go
@@ -34,6 +34,8 @@ import (
)
// pipeOperations are the fs.FileOperations of a host pipe.
+//
+// +stateify savable
type pipeOperations struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/fs/file.go b/pkg/sentry/fs/file.go
index 6d93ef760..8e535a618 100644
--- a/pkg/sentry/fs/file.go
+++ b/pkg/sentry/fs/file.go
@@ -47,6 +47,8 @@ const FileMaxOffset = math.MaxInt64
// and write(2).
//
// FIXME: Split synchronization from cancellation.
+//
+// +stateify savable
type File struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/file_overlay.go b/pkg/sentry/fs/file_overlay.go
index 36b2cf75e..113962368 100644
--- a/pkg/sentry/fs/file_overlay.go
+++ b/pkg/sentry/fs/file_overlay.go
@@ -60,6 +60,8 @@ func overlayFile(ctx context.Context, inode *Inode, flags FileFlags) (*File, err
}
// overlayFileOperations implements FileOperations for a file in an overlay.
+//
+// +stateify savable
type overlayFileOperations struct {
// upperMu protects upper below. In contrast lower is stable.
upperMu sync.Mutex `state:"nosave"`
@@ -375,6 +377,8 @@ func readdirOne(ctx context.Context, d *Dirent) (map[string]DentAttr, error) {
// overlayMappingIdentity wraps a MappingIdentity, and also holds a reference
// on a file during its lifetime.
+//
+// +stateify savable
type overlayMappingIdentity struct {
refs.AtomicRefCount
id memmap.MappingIdentity
diff --git a/pkg/sentry/fs/filesystems.go b/pkg/sentry/fs/filesystems.go
index 200e792f4..5a1e7a270 100644
--- a/pkg/sentry/fs/filesystems.go
+++ b/pkg/sentry/fs/filesystems.go
@@ -125,6 +125,8 @@ func GetFilesystems() []Filesystem {
}
// MountSourceFlags represents all mount option flags as a struct.
+//
+// +stateify savable
type MountSourceFlags struct {
// ReadOnly corresponds to mount(2)'s "MS_RDONLY" and indicates that
// the filesystem should be mounted read-only.
diff --git a/pkg/sentry/fs/filetest/BUILD b/pkg/sentry/fs/filetest/BUILD
index f481c57fb..d137fee4c 100644
--- a/pkg/sentry/fs/filetest/BUILD
+++ b/pkg/sentry/fs/filetest/BUILD
@@ -1,34 +1,20 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-
-go_stateify(
- name = "filetest_state",
- srcs = [
- "filetest.go",
- ],
- out = "filetest_state.go",
- package = "filetest",
-)
+load("//tools/go_stateify:defs.bzl", "go_library")
go_library(
name = "filetest",
testonly = 1,
- srcs = [
- "filetest.go",
- "filetest_state.go",
- ],
+ srcs = ["filetest.go"],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/filetest",
visibility = ["//pkg/sentry:internal"],
deps = [
- "//pkg/refs",
"//pkg/sentry/context",
"//pkg/sentry/context/contexttest",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/waiter",
],
)
diff --git a/pkg/sentry/fs/flags.go b/pkg/sentry/fs/flags.go
index da0ff58af..1aa271560 100644
--- a/pkg/sentry/fs/flags.go
+++ b/pkg/sentry/fs/flags.go
@@ -19,6 +19,8 @@ import (
)
// FileFlags encodes file flags.
+//
+// +stateify savable
type FileFlags struct {
// Direct indicates that I/O should be done directly.
Direct bool
diff --git a/pkg/sentry/fs/fsutil/BUILD b/pkg/sentry/fs/fsutil/BUILD
index 6eea64298..3512bae6f 100644
--- a/pkg/sentry/fs/fsutil/BUILD
+++ b/pkg/sentry/fs/fsutil/BUILD
@@ -1,24 +1,7 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "fsutil_state",
- srcs = [
- "dirty_set_impl.go",
- "file.go",
- "file_range_set_impl.go",
- "frame_ref_set_impl.go",
- "handle.go",
- "host_file_mapper.go",
- "host_file_mapper_state.go",
- "inode.go",
- "inode_cached.go",
- ],
- out = "fsutil_state.go",
- package = "fsutil",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_template_instance(
name = "dirty_set_impl",
@@ -84,7 +67,6 @@ go_library(
"frame_ref_set.go",
"frame_ref_set_impl.go",
"fsutil.go",
- "fsutil_state.go",
"handle.go",
"host_file_mapper.go",
"host_file_mapper_state.go",
diff --git a/pkg/sentry/fs/fsutil/dirty_set.go b/pkg/sentry/fs/fsutil/dirty_set.go
index 9c6c98542..8e31e48fd 100644
--- a/pkg/sentry/fs/fsutil/dirty_set.go
+++ b/pkg/sentry/fs/fsutil/dirty_set.go
@@ -32,6 +32,8 @@ import (
// DirtyInfo is the value type of DirtySet, and represents information about a
// Mappable offset that is dirty (the cached data for that offset is newer than
// its source).
+//
+// +stateify savable
type DirtyInfo struct {
// Keep is true if the represented offset is concurrently writable, such
// that writing the data for that offset back to the source does not
diff --git a/pkg/sentry/fs/fsutil/handle.go b/pkg/sentry/fs/fsutil/handle.go
index 149c0f84a..e7efd3c0f 100644
--- a/pkg/sentry/fs/fsutil/handle.go
+++ b/pkg/sentry/fs/fsutil/handle.go
@@ -27,6 +27,8 @@ import (
//
// FIXME: Remove Handle entirely in favor of individual fs.File
// implementations using simple generic utilities.
+//
+// +stateify savable
type Handle struct {
NoopRelease `state:"nosave"`
NoIoctl `state:"nosave"`
diff --git a/pkg/sentry/fs/fsutil/host_file_mapper.go b/pkg/sentry/fs/fsutil/host_file_mapper.go
index d0a27fc1c..9c1e2f76f 100644
--- a/pkg/sentry/fs/fsutil/host_file_mapper.go
+++ b/pkg/sentry/fs/fsutil/host_file_mapper.go
@@ -29,6 +29,8 @@ import (
// HostFileMapper caches mappings of an arbitrary host file descriptor. It is
// used by implementations of memmap.Mappable that represent a host file
// descriptor.
+//
+// +stateify savable
type HostFileMapper struct {
// HostFile conceptually breaks the file into pieces called chunks, of
// size and alignment chunkSize, and caches mappings of the file on a chunk
diff --git a/pkg/sentry/fs/fsutil/inode.go b/pkg/sentry/fs/fsutil/inode.go
index e1ad07df2..177396fdc 100644
--- a/pkg/sentry/fs/fsutil/inode.go
+++ b/pkg/sentry/fs/fsutil/inode.go
@@ -31,6 +31,8 @@ func NewSimpleInodeOperations(i InodeSimpleAttributes) fs.InodeOperations {
}
// simpleInodeOperations is a simple implementation of Inode.
+//
+// +stateify savable
type simpleInodeOperations struct {
DeprecatedFileOperations `state:"nosave"`
InodeNotDirectory `state:"nosave"`
@@ -48,6 +50,8 @@ type simpleInodeOperations struct {
// InodeSimpleAttributes implements a subset of the Inode interface. It provides
// read-only access to attributes.
+//
+// +stateify savable
type InodeSimpleAttributes struct {
// FSType is the filesystem type reported by StatFS.
FSType uint64
@@ -110,6 +114,8 @@ func (*InodeSimpleAttributes) Truncate(context.Context, *fs.Inode, int64) error
//
// Users need not initialize Xattrs to non-nil (it will be initialized
// when the first extended attribute is set.
+//
+// +stateify savable
type InMemoryAttributes struct {
Unstable fs.UnstableAttr
Xattrs map[string][]byte
diff --git a/pkg/sentry/fs/fsutil/inode_cached.go b/pkg/sentry/fs/fsutil/inode_cached.go
index cba642a8f..0a320e2d8 100644
--- a/pkg/sentry/fs/fsutil/inode_cached.go
+++ b/pkg/sentry/fs/fsutil/inode_cached.go
@@ -55,6 +55,8 @@ import (
//
// Implementations of InodeOperations.WriteOut must call Sync to write out
// in-memory modifications of data and metadata to the CachedFileObject.
+//
+// +stateify savable
type CachingInodeOperations struct {
// backingFile is a handle to a cached file object.
backingFile CachedFileObject
diff --git a/pkg/sentry/fs/gofer/BUILD b/pkg/sentry/fs/gofer/BUILD
index 1277379e7..cb17339c9 100644
--- a/pkg/sentry/fs/gofer/BUILD
+++ b/pkg/sentry/fs/gofer/BUILD
@@ -1,21 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "gofer_state",
- srcs = [
- "file.go",
- "file_state.go",
- "fs.go",
- "inode.go",
- "inode_state.go",
- "session.go",
- "session_state.go",
- ],
- out = "gofer_state.go",
- package = "gofer",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "gofer",
@@ -27,7 +12,6 @@ go_library(
"file.go",
"file_state.go",
"fs.go",
- "gofer_state.go",
"handles.go",
"inode.go",
"inode_state.go",
@@ -41,7 +25,6 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
- "//pkg/amutex",
"//pkg/fd",
"//pkg/log",
"//pkg/metric",
@@ -54,15 +37,11 @@ go_library(
"//pkg/sentry/fs/fdpipe",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/fs/host",
- "//pkg/sentry/fs/lock",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
"//pkg/sentry/memmap",
- "//pkg/sentry/platform",
"//pkg/sentry/safemem",
- "//pkg/sentry/uniqueid",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip",
"//pkg/tcpip/transport/unix",
diff --git a/pkg/sentry/fs/gofer/file.go b/pkg/sentry/fs/gofer/file.go
index 039618808..46a6bbd5d 100644
--- a/pkg/sentry/fs/gofer/file.go
+++ b/pkg/sentry/fs/gofer/file.go
@@ -33,6 +33,8 @@ import (
var openedWX = metric.MustCreateNewUint64Metric("/gofer/opened_write_execute_file", true /* sync */, "Number of times a writable+executable file was opened from a gofer.")
// fileOperations implements fs.FileOperations for a remote file system.
+//
+// +stateify savable
type fileOperations struct {
fsutil.NoIoctl `state:"nosave"`
waiter.AlwaysReady `state:"nosave"`
diff --git a/pkg/sentry/fs/gofer/fs.go b/pkg/sentry/fs/gofer/fs.go
index dd5d43c47..3ae93f059 100644
--- a/pkg/sentry/fs/gofer/fs.go
+++ b/pkg/sentry/fs/gofer/fs.go
@@ -83,6 +83,8 @@ var (
)
// filesystem is a 9p client.
+//
+// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/gofer/inode.go b/pkg/sentry/fs/gofer/inode.go
index df584c382..7fc8f77b0 100644
--- a/pkg/sentry/fs/gofer/inode.go
+++ b/pkg/sentry/fs/gofer/inode.go
@@ -35,6 +35,8 @@ import (
)
// inodeOperations implements fs.InodeOperations.
+//
+// +stateify savable
type inodeOperations struct {
fsutil.InodeNotVirtual `state:"nosave"`
fsutil.InodeNoExtendedAttributes `state:"nosave"`
@@ -68,6 +70,8 @@ type inodeOperations struct {
// circular load dependency between it and inodeOperations). Even with
// lazy loading, this approach defines the dependencies between objects
// and the expected load behavior more concretely.
+//
+// +stateify savable
type inodeFileState struct {
// s is common file system state for Gofers.
s *session `state:"wait"`
diff --git a/pkg/sentry/fs/gofer/session.go b/pkg/sentry/fs/gofer/session.go
index b6841526a..648a11435 100644
--- a/pkg/sentry/fs/gofer/session.go
+++ b/pkg/sentry/fs/gofer/session.go
@@ -27,6 +27,7 @@ import (
"gvisor.googlesource.com/gvisor/pkg/unet"
)
+// +stateify savable
type endpointMap struct {
mu sync.RWMutex `state:"nosave"`
// TODO: Make map with private unix sockets savable.
@@ -63,6 +64,8 @@ func (e *endpointMap) get(key device.MultiDeviceKey) unix.BoundEndpoint {
}
// session holds state for each 9p session established during sys_mount.
+//
+// +stateify savable
type session struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/host/BUILD b/pkg/sentry/fs/host/BUILD
index 23ec66f50..29c79284a 100644
--- a/pkg/sentry/fs/host/BUILD
+++ b/pkg/sentry/fs/host/BUILD
@@ -1,23 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "host_state",
- srcs = [
- "control.go",
- "descriptor.go",
- "descriptor_state.go",
- "file.go",
- "fs.go",
- "inode.go",
- "inode_state.go",
- "socket.go",
- "socket_state.go",
- ],
- out = "host_state.go",
- package = "host",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "host",
@@ -28,7 +11,6 @@ go_library(
"device.go",
"file.go",
"fs.go",
- "host_state.go",
"inode.go",
"inode_state.go",
"ioctl_unsafe.go",
@@ -42,7 +24,6 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
- "//pkg/amutex",
"//pkg/fd",
"//pkg/log",
"//pkg/refs",
@@ -52,20 +33,14 @@ go_library(
"//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/fsutil",
- "//pkg/sentry/fs/lock",
"//pkg/sentry/kernel",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
"//pkg/sentry/memmap",
- "//pkg/sentry/platform",
"//pkg/sentry/safemem",
- "//pkg/sentry/socket",
"//pkg/sentry/socket/control",
"//pkg/sentry/socket/unix",
- "//pkg/sentry/uniqueid",
- "//pkg/sentry/usage",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip",
"//pkg/tcpip/link/rawfile",
diff --git a/pkg/sentry/fs/host/descriptor.go b/pkg/sentry/fs/host/descriptor.go
index 613bd06e8..3aee4d11c 100644
--- a/pkg/sentry/fs/host/descriptor.go
+++ b/pkg/sentry/fs/host/descriptor.go
@@ -25,6 +25,8 @@ import (
)
// descriptor wraps a host fd.
+//
+// +stateify savable
type descriptor struct {
// donated is true if the host fd was donated by another process.
donated bool
diff --git a/pkg/sentry/fs/host/file.go b/pkg/sentry/fs/host/file.go
index bdf844337..f9bef6d93 100644
--- a/pkg/sentry/fs/host/file.go
+++ b/pkg/sentry/fs/host/file.go
@@ -37,6 +37,8 @@ import (
)
// fileOperations implements fs.FileOperations for a host file descriptor.
+//
+// +stateify savable
type fileOperations struct {
fsutil.NoopRelease `state:"nosave"`
diff --git a/pkg/sentry/fs/host/fs.go b/pkg/sentry/fs/host/fs.go
index 974700636..e46ae433c 100644
--- a/pkg/sentry/fs/host/fs.go
+++ b/pkg/sentry/fs/host/fs.go
@@ -51,6 +51,8 @@ const maxTraversals = 10
// to lock down the configurations. This filesystem should only be mounted at root.
//
// Think twice before exposing this to applications.
+//
+// +stateify savable
type Filesystem struct {
// whitelist is a set of host paths to whitelist.
paths []string
@@ -266,8 +268,10 @@ func newMountSource(ctx context.Context, root string, mounter fs.FileOwner, file
}
// superOperations implements fs.MountSourceOperations.
+//
+// +stateify savable
type superOperations struct {
- fs.SimpleMountSourceOperations `state:"nosave"`
+ fs.SimpleMountSourceOperations
// root is the path of the mount point. All inode mappings
// are relative to this root.
diff --git a/pkg/sentry/fs/host/inode.go b/pkg/sentry/fs/host/inode.go
index 226bc5164..761ccde33 100644
--- a/pkg/sentry/fs/host/inode.go
+++ b/pkg/sentry/fs/host/inode.go
@@ -34,6 +34,8 @@ import (
// inodeOperations implements fs.InodeOperations for an fs.Inodes backed
// by a host file descriptor.
+//
+// +stateify savable
type inodeOperations struct {
fsutil.InodeNotVirtual `state:"nosave"`
fsutil.InodeNoExtendedAttributes `state:"nosave"`
@@ -65,6 +67,8 @@ type inodeOperations struct {
// circular load dependency between it and inodeOperations). Even with
// lazy loading, this approach defines the dependencies between objects
// and the expected load behavior more concretely.
+//
+// +stateify savable
type inodeFileState struct {
// Common file system state.
mops *superOperations `state:"wait"`
diff --git a/pkg/sentry/fs/host/socket.go b/pkg/sentry/fs/host/socket.go
index f4689f51f..1d93eb1e3 100644
--- a/pkg/sentry/fs/host/socket.go
+++ b/pkg/sentry/fs/host/socket.go
@@ -34,6 +34,8 @@ import (
)
// endpoint encapsulates the state needed to represent a host Unix socket.
+//
+// +stateify savable
type endpoint struct {
queue waiter.Queue `state:"nosave"`
diff --git a/pkg/sentry/fs/inode.go b/pkg/sentry/fs/inode.go
index 6c8e6f188..d0dbce5dd 100644
--- a/pkg/sentry/fs/inode.go
+++ b/pkg/sentry/fs/inode.go
@@ -28,6 +28,8 @@ import (
// Inode is a file system object that can be simultaneously referenced by different
// components of the VFS (Dirent, fs.File, etc).
+//
+// +stateify savable
type Inode struct {
// AtomicRefCount is our reference count.
refs.AtomicRefCount
@@ -58,6 +60,8 @@ type Inode struct {
// Note that in Linux fcntl(2) and flock(2) locks are _not_ cooperative, because race and
// deadlock conditions make merging them prohibitive. We do the same and keep them oblivious
// to each other but provide a "context" as a convenient container.
+//
+// +stateify savable
type LockCtx struct {
// Posix is a set of POSIX-style regional advisory locks, see fcntl(2).
Posix lock.Locks
diff --git a/pkg/sentry/fs/inode_inotify.go b/pkg/sentry/fs/inode_inotify.go
index 358bbecdf..683140afe 100644
--- a/pkg/sentry/fs/inode_inotify.go
+++ b/pkg/sentry/fs/inode_inotify.go
@@ -20,6 +20,8 @@ import (
)
// Watches is the collection of inotify watches on an inode.
+//
+// +stateify savable
type Watches struct {
// mu protects the fields below.
mu sync.RWMutex `state:"nosave"`
diff --git a/pkg/sentry/fs/inotify.go b/pkg/sentry/fs/inotify.go
index 6f5e8ce5e..2aabdded8 100644
--- a/pkg/sentry/fs/inotify.go
+++ b/pkg/sentry/fs/inotify.go
@@ -34,6 +34,8 @@ import (
//
// Lock ordering:
// Inotify.mu -> Inode.Watches.mu -> Watch.mu -> Inotify.evMu
+//
+// +stateify savable
type Inotify struct {
// Unique identifier for this inotify instance. We don't just reuse the
// inotify fd because fds can be duped. These should not be exposed to the
diff --git a/pkg/sentry/fs/inotify_event.go b/pkg/sentry/fs/inotify_event.go
index 217915ba4..e9b5e0f56 100644
--- a/pkg/sentry/fs/inotify_event.go
+++ b/pkg/sentry/fs/inotify_event.go
@@ -28,6 +28,8 @@ import (
const inotifyEventBaseSize = 16
// Event represents a struct inotify_event from linux.
+//
+// +stateify savable
type Event struct {
ilist.Entry
diff --git a/pkg/sentry/fs/inotify_watch.go b/pkg/sentry/fs/inotify_watch.go
index 8904ef544..3e1959e83 100644
--- a/pkg/sentry/fs/inotify_watch.go
+++ b/pkg/sentry/fs/inotify_watch.go
@@ -27,6 +27,8 @@ import (
// holding an extra ref on each dirent known (by inotify) to point to the
// inode. These are known as pins. For a full discussion, see
// fs/g3doc/inotify.md.
+//
+// +stateify savable
type Watch struct {
// Inotify instance which owns this watch.
owner *Inotify
diff --git a/pkg/sentry/fs/lock/BUILD b/pkg/sentry/fs/lock/BUILD
index 2607d7ed3..3159ff1da 100644
--- a/pkg/sentry/fs/lock/BUILD
+++ b/pkg/sentry/fs/lock/BUILD
@@ -1,18 +1,7 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "lock_state",
- srcs = [
- "lock.go",
- "lock_range.go",
- "lock_set.go",
- ],
- out = "lock_state.go",
- package = "lock",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_template_instance(
name = "lock_range",
@@ -49,13 +38,11 @@ go_library(
"lock_range.go",
"lock_set.go",
"lock_set_functions.go",
- "lock_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/lock",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/log",
- "//pkg/state",
"//pkg/waiter",
],
)
diff --git a/pkg/sentry/fs/lock/lock.go b/pkg/sentry/fs/lock/lock.go
index 24d54c989..e9b376eb6 100644
--- a/pkg/sentry/fs/lock/lock.go
+++ b/pkg/sentry/fs/lock/lock.go
@@ -88,6 +88,8 @@ const LockEOF = math.MaxUint64
//
// A Lock may be downgraded from a write lock to a read lock only if
// the write lock's uid is the same as the read lock.
+//
+// +stateify savable
type Lock struct {
// Readers are the set of read lock holders identified by UniqueID.
// If len(Readers) > 0 then HasWriter must be false.
@@ -103,6 +105,8 @@ type Lock struct {
}
// Locks is a thread-safe wrapper around a LockSet.
+//
+// +stateify savable
type Locks struct {
// mu protects locks below.
mu sync.Mutex `state:"nosave"`
@@ -111,7 +115,7 @@ type Locks struct {
locks LockSet
// blockedQueue is the queue of waiters that are waiting on a lock.
- blockedQueue waiter.Queue
+ blockedQueue waiter.Queue `state:"zerovalue"`
}
// Blocker is the interface used for blocking locks. Passing a nil Blocker
diff --git a/pkg/sentry/fs/mount.go b/pkg/sentry/fs/mount.go
index eb1897174..4ede767f9 100644
--- a/pkg/sentry/fs/mount.go
+++ b/pkg/sentry/fs/mount.go
@@ -101,6 +101,8 @@ func (i InodeMappings) String() string {
// (e.g. cannot be mounted at different locations).
//
// TODO: Move mount-specific information out of MountSource.
+//
+// +stateify savable
type MountSource struct {
refs.AtomicRefCount
@@ -260,6 +262,8 @@ func NewNonCachingMountSource(filesystem Filesystem, flags MountSourceFlags) *Mo
}
// SimpleMountSourceOperations implements MountSourceOperations.
+//
+// +stateify savable
type SimpleMountSourceOperations struct {
keep bool
}
diff --git a/pkg/sentry/fs/mount_overlay.go b/pkg/sentry/fs/mount_overlay.go
index 1be81e3a1..d135e8a37 100644
--- a/pkg/sentry/fs/mount_overlay.go
+++ b/pkg/sentry/fs/mount_overlay.go
@@ -18,6 +18,8 @@ import "gvisor.googlesource.com/gvisor/pkg/sentry/context"
// overlayMountSourceOperations implements MountSourceOperations for an overlay
// mount point.
+//
+// +stateify savable
type overlayMountSourceOperations struct {
upper *MountSource
lower *MountSource
@@ -72,6 +74,8 @@ func (o *overlayMountSourceOperations) Destroy() {
}
// type overlayFilesystem is the filesystem for overlay mounts.
+//
+// +stateify savable
type overlayFilesystem struct{}
// Name implements Filesystem.Name.
diff --git a/pkg/sentry/fs/mounts.go b/pkg/sentry/fs/mounts.go
index 87da4ee0e..144d3427d 100644
--- a/pkg/sentry/fs/mounts.go
+++ b/pkg/sentry/fs/mounts.go
@@ -32,6 +32,8 @@ import (
const DefaultTraversalLimit = 10
// MountNamespace defines a collection of mounts.
+//
+// +stateify savable
type MountNamespace struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/overlay.go b/pkg/sentry/fs/overlay.go
index 7357d6401..af13dc8c7 100644
--- a/pkg/sentry/fs/overlay.go
+++ b/pkg/sentry/fs/overlay.go
@@ -145,6 +145,8 @@ func newOverlayInode(ctx context.Context, o *overlayEntry, msrc *MountSource) *I
}
// overlayEntry is the overlay metadata of an Inode. It implements Mappable.
+//
+// +stateify savable
type overlayEntry struct {
// lowerExists is true if an Inode exists for this file in the lower
// filesystem. If lowerExists is true, then the overlay must create
diff --git a/pkg/sentry/fs/proc/BUILD b/pkg/sentry/fs/proc/BUILD
index 870df47b2..2d9f07f2f 100644
--- a/pkg/sentry/fs/proc/BUILD
+++ b/pkg/sentry/fs/proc/BUILD
@@ -1,32 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "proc_state",
- srcs = [
- "cpuinfo.go",
- "exec_args.go",
- "fds.go",
- "file.go",
- "filesystems.go",
- "fs.go",
- "loadavg.go",
- "meminfo.go",
- "mounts.go",
- "net.go",
- "proc.go",
- "stat.go",
- "sys.go",
- "sys_net.go",
- "task.go",
- "uid_gid_map.go",
- "uptime.go",
- "version.go",
- ],
- out = "proc_state.go",
- package = "proc",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "proc",
@@ -42,7 +16,6 @@ go_library(
"mounts.go",
"net.go",
"proc.go",
- "proc_state.go",
"rpcinet_proc.go",
"stat.go",
"sys.go",
@@ -56,9 +29,6 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
- "//pkg/amutex",
- "//pkg/log",
- "//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/fs",
"//pkg/sentry/fs/proc/device",
@@ -73,8 +43,6 @@ go_library(
"//pkg/sentry/socket/rpcinet",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
- "//pkg/state",
- "//pkg/syserr",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/fs/proc/cpuinfo.go b/pkg/sentry/fs/proc/cpuinfo.go
index f80aaa5b1..4dfec03a4 100644
--- a/pkg/sentry/fs/proc/cpuinfo.go
+++ b/pkg/sentry/fs/proc/cpuinfo.go
@@ -27,6 +27,8 @@ import (
// cpuinfo is a file describing the CPU capabilities.
//
// Presently cpuinfo never changes, so it doesn't need to be a SeqFile.
+//
+// +stateify savable
type cpuinfo struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/exec_args.go b/pkg/sentry/fs/proc/exec_args.go
index 0e1523bf1..a69cbaa0e 100644
--- a/pkg/sentry/fs/proc/exec_args.go
+++ b/pkg/sentry/fs/proc/exec_args.go
@@ -37,6 +37,8 @@ const (
// execArgFile is a file containing the exec args (either cmdline or environ)
// for a given task.
+//
+// +stateify savable
type execArgFile struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/fds.go b/pkg/sentry/fs/proc/fds.go
index 194a9c12a..cca8f874c 100644
--- a/pkg/sentry/fs/proc/fds.go
+++ b/pkg/sentry/fs/proc/fds.go
@@ -138,6 +138,8 @@ func (f *fd) Close() error {
}
// fdDir implements /proc/TID/fd.
+//
+// +stateify savable
type fdDir struct {
ramfs.Dir
@@ -197,6 +199,8 @@ func (f *fdDir) DeprecatedReaddir(ctx context.Context, dirCtx *fs.DirCtx, offset
}
// fdInfo is a single file in /proc/TID/fdinfo/.
+//
+// +stateify savable
type fdInfo struct {
ramfs.File
@@ -229,6 +233,8 @@ func (*fdInfo) Truncate(ctx context.Context, inode *fs.Inode, size int64) error
// fdInfoDir implements /proc/TID/fdinfo. It embeds an fdDir, but overrides
// Lookup and Readdir.
+//
+// +stateify savable
type fdInfoDir struct {
ramfs.Dir
diff --git a/pkg/sentry/fs/proc/file.go b/pkg/sentry/fs/proc/file.go
index 9a433cdf8..4b2d08e75 100644
--- a/pkg/sentry/fs/proc/file.go
+++ b/pkg/sentry/fs/proc/file.go
@@ -22,6 +22,7 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
+// +stateify savable
type file struct {
fs.InodeOperations
diff --git a/pkg/sentry/fs/proc/filesystems.go b/pkg/sentry/fs/proc/filesystems.go
index 37db9cf9c..49b92fd8a 100644
--- a/pkg/sentry/fs/proc/filesystems.go
+++ b/pkg/sentry/fs/proc/filesystems.go
@@ -24,6 +24,8 @@ import (
)
// filesystemsData backs /proc/filesystems.
+//
+// +stateify savable
type filesystemsData struct{}
// NeedsUpdate returns true on the first generation. The set of registered file
diff --git a/pkg/sentry/fs/proc/fs.go b/pkg/sentry/fs/proc/fs.go
index 3aadd6ac4..061824b8c 100644
--- a/pkg/sentry/fs/proc/fs.go
+++ b/pkg/sentry/fs/proc/fs.go
@@ -22,6 +22,8 @@ import (
)
// filesystem is a procfs.
+//
+// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/proc/loadavg.go b/pkg/sentry/fs/proc/loadavg.go
index 7583b6ccd..6fac251d2 100644
--- a/pkg/sentry/fs/proc/loadavg.go
+++ b/pkg/sentry/fs/proc/loadavg.go
@@ -23,6 +23,8 @@ import (
)
// loadavgData backs /proc/loadavg.
+//
+// +stateify savable
type loadavgData struct{}
// NeedsUpdate implements seqfile.SeqSource.NeedsUpdate.
diff --git a/pkg/sentry/fs/proc/meminfo.go b/pkg/sentry/fs/proc/meminfo.go
index 49cb0faed..53dfd59ef 100644
--- a/pkg/sentry/fs/proc/meminfo.go
+++ b/pkg/sentry/fs/proc/meminfo.go
@@ -26,6 +26,8 @@ import (
)
// meminfoData backs /proc/meminfo.
+//
+// +stateify savable
type meminfoData struct {
// k is the owning Kernel.
k *kernel.Kernel
diff --git a/pkg/sentry/fs/proc/mounts.go b/pkg/sentry/fs/proc/mounts.go
index 108432f4e..2b8167c28 100644
--- a/pkg/sentry/fs/proc/mounts.go
+++ b/pkg/sentry/fs/proc/mounts.go
@@ -71,6 +71,8 @@ func forEachMountSource(t *kernel.Task, fn func(string, *fs.MountSource)) {
}
// mountInfoFile is used to implement /proc/[pid]/mountinfo.
+//
+// +stateify savable
type mountInfoFile struct {
t *kernel.Task
}
@@ -152,6 +154,8 @@ func (mif *mountInfoFile) ReadSeqFileData(ctx context.Context, handle seqfile.Se
}
// mountsFile is used to implement /proc/[pid]/mountinfo.
+//
+// +stateify savable
type mountsFile struct {
t *kernel.Task
}
diff --git a/pkg/sentry/fs/proc/proc.go b/pkg/sentry/fs/proc/proc.go
index b2a8d639c..07029a7bb 100644
--- a/pkg/sentry/fs/proc/proc.go
+++ b/pkg/sentry/fs/proc/proc.go
@@ -33,6 +33,8 @@ import (
)
// proc is a root proc node.
+//
+// +stateify savable
type proc struct {
ramfs.Dir
@@ -47,6 +49,8 @@ type proc struct {
// stubProcFSFile is a file type that can be used to return file contents
// which are constant. This file is not writable and will always have mode
// 0444.
+//
+// +stateify savable
type stubProcFSFile struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/seqfile/BUILD b/pkg/sentry/fs/proc/seqfile/BUILD
index c84f7e20d..53c475652 100644
--- a/pkg/sentry/fs/proc/seqfile/BUILD
+++ b/pkg/sentry/fs/proc/seqfile/BUILD
@@ -1,22 +1,10 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "seqfile_state",
- srcs = [
- "seqfile.go",
- ],
- out = "seqfile_state.go",
- package = "seqfile",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "seqfile",
- srcs = [
- "seqfile.go",
- "seqfile_state.go",
- ],
+ srcs = ["seqfile.go"],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/proc/seqfile",
visibility = ["//pkg/sentry:internal"],
deps = [
@@ -26,26 +14,16 @@ go_library(
"//pkg/sentry/fs/ramfs",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
- "//pkg/state",
],
)
-go_stateify(
- name = "seqfile_test_state",
- srcs = ["seqfile_test.go"],
- out = "seqfile_test_state.go",
- package = "seqfile",
-)
-
go_test(
name = "seqfile_test",
size = "small",
- srcs = [
- "seqfile_test.go",
- "seqfile_test_state.go",
- ],
+ srcs = ["seqfile_test.go"],
embed = [":seqfile"],
deps = [
+ "//pkg/sentry/context",
"//pkg/sentry/context/contexttest",
"//pkg/sentry/fs",
"//pkg/sentry/fs/ramfs/test",
diff --git a/pkg/sentry/fs/proc/seqfile/seqfile.go b/pkg/sentry/fs/proc/seqfile/seqfile.go
index c08565f8a..51cae5e37 100644
--- a/pkg/sentry/fs/proc/seqfile/seqfile.go
+++ b/pkg/sentry/fs/proc/seqfile/seqfile.go
@@ -30,6 +30,8 @@ import (
type SeqHandle interface{}
// SeqData holds the data for one unit in the file.
+//
+// +stateify savable
type SeqData struct {
// The data to be returned to the user.
Buf []byte
@@ -82,6 +84,8 @@ func (s *SeqGenerationCounter) IsCurrent(generation int64) bool {
}
// SeqFile is used to provide dynamic files that can be ordered by record.
+//
+// +stateify savable
type SeqFile struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/stat.go b/pkg/sentry/fs/proc/stat.go
index 284f3e52b..bf7650211 100644
--- a/pkg/sentry/fs/proc/stat.go
+++ b/pkg/sentry/fs/proc/stat.go
@@ -25,6 +25,8 @@ import (
)
// statData backs /proc/stat.
+//
+// +stateify savable
type statData struct {
// k is the owning Kernel.
k *kernel.Kernel
diff --git a/pkg/sentry/fs/proc/sys.go b/pkg/sentry/fs/proc/sys.go
index aab891c53..a2d36ca23 100644
--- a/pkg/sentry/fs/proc/sys.go
+++ b/pkg/sentry/fs/proc/sys.go
@@ -28,6 +28,8 @@ import (
)
// hostname is a file containing the system hostname.
+//
+// +stateify savable
type hostname struct {
ramfs.Entry
}
@@ -52,6 +54,8 @@ func (p *proc) newHostname(ctx context.Context, msrc *fs.MountSource) *fs.Inode
}
// mmapMinAddrData backs /proc/sys/vm/mmap_min_addr.
+//
+// +stateify savable
type mmapMinAddrData struct {
k *kernel.Kernel
}
@@ -74,6 +78,7 @@ func (d *mmapMinAddrData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHand
}, 0
}
+// +stateify savable
type overcommitMemory struct{}
func (*overcommitMemory) NeedsUpdate(generation int64) bool {
diff --git a/pkg/sentry/fs/proc/sys_net.go b/pkg/sentry/fs/proc/sys_net.go
index f3a5043f8..beb25be20 100644
--- a/pkg/sentry/fs/proc/sys_net.go
+++ b/pkg/sentry/fs/proc/sys_net.go
@@ -33,6 +33,7 @@ const (
tcpWMem
)
+// +stateify savable
type tcpMem struct {
ramfs.Entry
s inet.Stack
@@ -100,6 +101,7 @@ func (m *tcpMem) DeprecatedPwritev(ctx context.Context, src usermem.IOSequence,
return n, cperr
}
+// +stateify savable
type tcpSack struct {
ramfs.Entry
s inet.Stack
diff --git a/pkg/sentry/fs/proc/task.go b/pkg/sentry/fs/proc/task.go
index efc635946..748ca4320 100644
--- a/pkg/sentry/fs/proc/task.go
+++ b/pkg/sentry/fs/proc/task.go
@@ -52,6 +52,8 @@ func getTaskMM(t *kernel.Task) (*mm.MemoryManager, error) {
}
// taskDir represents a task-level directory.
+//
+// +stateify savable
type taskDir struct {
ramfs.Dir
@@ -92,6 +94,8 @@ func newTaskDir(t *kernel.Task, msrc *fs.MountSource, pidns *kernel.PIDNamespace
}
// subtasks represents a /proc/TID/task directory.
+//
+// +stateify savable
type subtasks struct {
ramfs.Dir
@@ -167,6 +171,8 @@ func (s *subtasks) DeprecatedReaddir(ctx context.Context, dirCtx *fs.DirCtx, off
}
// exe is an fs.InodeOperations symlink for the /proc/PID/exe file.
+//
+// +stateify savable
type exe struct {
ramfs.Symlink
@@ -226,6 +232,8 @@ func (e *exe) Readlink(ctx context.Context, inode *fs.Inode) (string, error) {
// namespaceFile represents a file in the namespacefs, such as the files in
// /proc/<pid>/ns.
+//
+// +stateify savable
type namespaceFile struct {
ramfs.Symlink
@@ -274,6 +282,8 @@ func newNamespaceDir(t *kernel.Task, msrc *fs.MountSource) *fs.Inode {
}
// mapsData implements seqfile.SeqSource for /proc/[pid]/maps.
+//
+// +stateify savable
type mapsData struct {
t *kernel.Task
}
@@ -311,6 +321,7 @@ func (md *mapsData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle) ([
return []seqfile.SeqData{}, 0
}
+// +stateify savable
type taskStatData struct {
t *kernel.Task
@@ -391,6 +402,8 @@ func (s *taskStatData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle)
}
// statmData implements seqfile.SeqSource for /proc/[pid]/statm.
+//
+// +stateify savable
type statmData struct {
t *kernel.Task
}
@@ -425,6 +438,8 @@ func (s *statmData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle) ([
}
// statusData implements seqfile.SeqSource for /proc/[pid]/status.
+//
+// +stateify savable
type statusData struct {
t *kernel.Task
pidns *kernel.PIDNamespace
@@ -490,6 +505,7 @@ type ioUsage interface {
IOUsage() *usage.IO
}
+// +stateify savable
type ioData struct {
ioUsage
}
@@ -530,6 +546,8 @@ func (i *ioData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle) ([]se
// On Linux, /proc/[pid]/comm is writable, and writing to the comm file changes
// the thread name. We don't implement this yet as there are no known users of
// this feature.
+//
+// +stateify savable
type comm struct {
ramfs.Entry
@@ -559,6 +577,8 @@ func (c *comm) DeprecatedPreadv(ctx context.Context, dst usermem.IOSequence, off
}
// auxvec is a file containing the auxiliary vector for a task.
+//
+// +stateify savable
type auxvec struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/uid_gid_map.go b/pkg/sentry/fs/proc/uid_gid_map.go
index 85acb5163..9811d9c9d 100644
--- a/pkg/sentry/fs/proc/uid_gid_map.go
+++ b/pkg/sentry/fs/proc/uid_gid_map.go
@@ -29,6 +29,8 @@ import (
// An idMapSeqSource is a seqfile.SeqSource that returns UID or GID mappings
// from a task's user namespace.
+//
+// +stateify savable
type idMapSeqSource struct {
t *kernel.Task
gids bool
@@ -70,6 +72,7 @@ type idMapSeqHandle struct {
value int
}
+// +stateify savable
type idMapSeqFile struct {
seqfile.SeqFile
}
diff --git a/pkg/sentry/fs/proc/uptime.go b/pkg/sentry/fs/proc/uptime.go
index 4679d5821..f3a9b81df 100644
--- a/pkg/sentry/fs/proc/uptime.go
+++ b/pkg/sentry/fs/proc/uptime.go
@@ -27,6 +27,8 @@ import (
)
// uptime is a file containing the system uptime.
+//
+// +stateify savable
type uptime struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/version.go b/pkg/sentry/fs/proc/version.go
index c0f2e87e3..00f6a2afd 100644
--- a/pkg/sentry/fs/proc/version.go
+++ b/pkg/sentry/fs/proc/version.go
@@ -23,6 +23,8 @@ import (
)
// versionData backs /proc/version.
+//
+// +stateify savable
type versionData struct {
// k is the owning Kernel.
k *kernel.Kernel
diff --git a/pkg/sentry/fs/ramfs/BUILD b/pkg/sentry/fs/ramfs/BUILD
index d84f2c624..5230157fe 100644
--- a/pkg/sentry/fs/ramfs/BUILD
+++ b/pkg/sentry/fs/ramfs/BUILD
@@ -1,19 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "ramfs_state",
- srcs = [
- "dir.go",
- "file.go",
- "ramfs.go",
- "socket.go",
- "symlink.go",
- ],
- out = "ramfs_state.go",
- package = "ramfs",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "ramfs",
@@ -21,7 +8,6 @@ go_library(
"dir.go",
"file.go",
"ramfs.go",
- "ramfs_state.go",
"socket.go",
"symlink.go",
"tree.go",
@@ -29,12 +15,8 @@ go_library(
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/ramfs",
visibility = ["//pkg/sentry:internal"],
deps = [
- "//pkg/amutex",
- "//pkg/log",
- "//pkg/refs",
"//pkg/secio",
"//pkg/sentry/context",
- "//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
@@ -42,7 +24,6 @@ go_library(
"//pkg/sentry/memmap",
"//pkg/sentry/safemem",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
diff --git a/pkg/sentry/fs/ramfs/dir.go b/pkg/sentry/fs/ramfs/dir.go
index 19d5612ed..04432f28c 100644
--- a/pkg/sentry/fs/ramfs/dir.go
+++ b/pkg/sentry/fs/ramfs/dir.go
@@ -44,6 +44,8 @@ type CreateOps struct {
}
// Dir represents a single directory in the filesystem.
+//
+// +stateify savable
type Dir struct {
Entry
diff --git a/pkg/sentry/fs/ramfs/ramfs.go b/pkg/sentry/fs/ramfs/ramfs.go
index d6cfaf753..13e72e775 100644
--- a/pkg/sentry/fs/ramfs/ramfs.go
+++ b/pkg/sentry/fs/ramfs/ramfs.go
@@ -60,6 +60,8 @@ var (
// Entry represents common internal state for file and directory nodes.
// This may be used by other packages to easily create ramfs files.
+//
+// +stateify savable
type Entry struct {
waiter.AlwaysReady `state:"nosave"`
fsutil.NoMappable `state:"nosave"`
diff --git a/pkg/sentry/fs/ramfs/socket.go b/pkg/sentry/fs/ramfs/socket.go
index b0c79325f..93427a1ff 100644
--- a/pkg/sentry/fs/ramfs/socket.go
+++ b/pkg/sentry/fs/ramfs/socket.go
@@ -21,6 +21,8 @@ import (
)
// Socket represents a socket.
+//
+// +stateify savable
type Socket struct {
Entry
diff --git a/pkg/sentry/fs/ramfs/symlink.go b/pkg/sentry/fs/ramfs/symlink.go
index 9bbf78619..1c54d9991 100644
--- a/pkg/sentry/fs/ramfs/symlink.go
+++ b/pkg/sentry/fs/ramfs/symlink.go
@@ -22,6 +22,8 @@ import (
)
// Symlink represents a symlink.
+//
+// +stateify savable
type Symlink struct {
Entry
diff --git a/pkg/sentry/fs/ramfs/test/BUILD b/pkg/sentry/fs/ramfs/test/BUILD
index 57fee45e2..187eac49d 100644
--- a/pkg/sentry/fs/ramfs/test/BUILD
+++ b/pkg/sentry/fs/ramfs/test/BUILD
@@ -1,30 +1,16 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-
-go_stateify(
- name = "test_state",
- srcs = [
- "test.go",
- ],
- out = "test_state.go",
- package = "test",
-)
+load("//tools/go_stateify:defs.bzl", "go_library")
go_library(
name = "test",
testonly = 1,
- srcs = [
- "test.go",
- "test_state.go",
- ],
+ srcs = ["test.go"],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/ramfs/test",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/sentry/context",
- "//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/ramfs",
- "//pkg/state",
],
)
diff --git a/pkg/sentry/fs/sys/BUILD b/pkg/sentry/fs/sys/BUILD
index 095ff1f25..bc24e980e 100644
--- a/pkg/sentry/fs/sys/BUILD
+++ b/pkg/sentry/fs/sys/BUILD
@@ -1,16 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-
-go_stateify(
- name = "sys_state",
- srcs = [
- "fs.go",
- "sys.go",
- ],
- out = "sys_state.go",
- package = "sys",
-)
+load("//tools/go_stateify:defs.bzl", "go_library")
go_library(
name = "sys",
@@ -18,7 +8,6 @@ go_library(
"device.go",
"fs.go",
"sys.go",
- "sys_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/sys",
visibility = ["//pkg/sentry:internal"],
@@ -28,6 +17,5 @@ go_library(
"//pkg/sentry/fs",
"//pkg/sentry/fs/ramfs",
"//pkg/sentry/usermem",
- "//pkg/state",
],
)
diff --git a/pkg/sentry/fs/sys/fs.go b/pkg/sentry/fs/sys/fs.go
index c6d5f7fd8..625525540 100644
--- a/pkg/sentry/fs/sys/fs.go
+++ b/pkg/sentry/fs/sys/fs.go
@@ -20,6 +20,8 @@ import (
)
// filesystem is a sysfs.
+//
+// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/sys/sys.go b/pkg/sentry/fs/sys/sys.go
index ccf56f644..b9b2fb4a1 100644
--- a/pkg/sentry/fs/sys/sys.go
+++ b/pkg/sentry/fs/sys/sys.go
@@ -22,12 +22,13 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
-type Dir struct {
+// +stateify savable
+type dir struct {
ramfs.Dir
}
func newDir(ctx context.Context, msrc *fs.MountSource, contents map[string]*fs.Inode) *fs.Inode {
- d := &Dir{}
+ d := &dir{}
d.InitDir(ctx, contents, fs.RootOwner, fs.FilePermsFromMode(0555))
return fs.NewInode(d, msrc, fs.StableAttr{
DeviceID: sysfsDevice.DeviceID(),
diff --git a/pkg/sentry/fs/timerfd/BUILD b/pkg/sentry/fs/timerfd/BUILD
index 8b1b7872e..ffdd7e0dc 100644
--- a/pkg/sentry/fs/timerfd/BUILD
+++ b/pkg/sentry/fs/timerfd/BUILD
@@ -1,33 +1,19 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-
-go_stateify(
- name = "timerfd_state",
- srcs = [
- "timerfd.go",
- ],
- out = "timerfd_state.go",
- package = "timerfd",
-)
+load("//tools/go_stateify:defs.bzl", "go_library")
go_library(
name = "timerfd",
- srcs = [
- "timerfd.go",
- "timerfd_state.go",
- ],
+ srcs = ["timerfd.go"],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/timerfd",
visibility = ["//pkg/sentry:internal"],
deps = [
- "//pkg/refs",
"//pkg/sentry/context",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
"//pkg/waiter",
],
diff --git a/pkg/sentry/fs/timerfd/timerfd.go b/pkg/sentry/fs/timerfd/timerfd.go
index ae58f6fd7..767db95a0 100644
--- a/pkg/sentry/fs/timerfd/timerfd.go
+++ b/pkg/sentry/fs/timerfd/timerfd.go
@@ -30,6 +30,8 @@ import (
)
// TimerOperations implements fs.FileOperations for timerfds.
+//
+// +stateify savable
type TimerOperations struct {
fsutil.ZeroSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
@@ -38,7 +40,7 @@ type TimerOperations struct {
fsutil.NoMMap `state:"nosave"`
fsutil.NoIoctl `state:"nosave"`
- events waiter.Queue `state:"nosave"`
+ events waiter.Queue `state:"zerovalue"`
timer *ktime.Timer
// val is the number of timer expirations since the last successful call to
diff --git a/pkg/sentry/fs/tmpfs/BUILD b/pkg/sentry/fs/tmpfs/BUILD
index 473ab4296..cfe11ab02 100644
--- a/pkg/sentry/fs/tmpfs/BUILD
+++ b/pkg/sentry/fs/tmpfs/BUILD
@@ -1,18 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "tmpfs_state",
- srcs = [
- "file_regular.go",
- "fs.go",
- "inode_file.go",
- "tmpfs.go",
- ],
- out = "tmpfs_state.go",
- package = "tmpfs",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "tmpfs",
@@ -22,13 +10,11 @@ go_library(
"fs.go",
"inode_file.go",
"tmpfs.go",
- "tmpfs_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/tmpfs",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
- "//pkg/log",
"//pkg/sentry/context",
"//pkg/sentry/device",
"//pkg/sentry/fs",
@@ -41,7 +27,6 @@ go_library(
"//pkg/sentry/safemem",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
],
diff --git a/pkg/sentry/fs/tmpfs/file_regular.go b/pkg/sentry/fs/tmpfs/file_regular.go
index 9811d90bc..342688f81 100644
--- a/pkg/sentry/fs/tmpfs/file_regular.go
+++ b/pkg/sentry/fs/tmpfs/file_regular.go
@@ -25,6 +25,8 @@ import (
// regularFileOperations implements fs.FileOperations for a regular
// tmpfs file.
+//
+// +stateify savable
type regularFileOperations struct {
waiter.AlwaysReady `state:"nosave"`
fsutil.NoopRelease `state:"nosave"`
diff --git a/pkg/sentry/fs/tmpfs/fs.go b/pkg/sentry/fs/tmpfs/fs.go
index 5bd9ade52..ca620e65e 100644
--- a/pkg/sentry/fs/tmpfs/fs.go
+++ b/pkg/sentry/fs/tmpfs/fs.go
@@ -47,6 +47,8 @@ const (
var modeRegexp = regexp.MustCompile("0[0-7][0-7][0-7]")
// Filesystem is a tmpfs.
+//
+// +stateify savable
type Filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/tmpfs/inode_file.go b/pkg/sentry/fs/tmpfs/inode_file.go
index 4e803c9ff..1e4fe47d2 100644
--- a/pkg/sentry/fs/tmpfs/inode_file.go
+++ b/pkg/sentry/fs/tmpfs/inode_file.go
@@ -43,6 +43,8 @@ import (
// include an InvalidatorRegion associated with that reference. When the
// referenced portion of the file is removed (with Truncate), the associated
// InvalidatorRegion is invalidated.
+//
+// +stateify savable
type fileInodeOperations struct {
fsutil.DeprecatedFileOperations `state:"nosave"`
fsutil.InodeNotDirectory `state:"nosave"`
diff --git a/pkg/sentry/fs/tmpfs/tmpfs.go b/pkg/sentry/fs/tmpfs/tmpfs.go
index 1cc7ae491..10cb5451d 100644
--- a/pkg/sentry/fs/tmpfs/tmpfs.go
+++ b/pkg/sentry/fs/tmpfs/tmpfs.go
@@ -49,6 +49,8 @@ func rename(ctx context.Context, oldParent *fs.Inode, oldName string, newParent
}
// Dir is a directory.
+//
+// +stateify savable
type Dir struct {
ramfs.Dir
@@ -122,6 +124,8 @@ func (*Dir) StatFS(context.Context) (fs.Info, error) {
}
// Symlink is a symlink.
+//
+// +stateify savable
type Symlink struct {
ramfs.Symlink
}
@@ -149,6 +153,8 @@ func (s *Symlink) StatFS(context.Context) (fs.Info, error) {
}
// Socket is a socket.
+//
+// +stateify savable
type Socket struct {
ramfs.Socket
}
@@ -176,6 +182,8 @@ func (s *Socket) StatFS(context.Context) (fs.Info, error) {
}
// Fifo is a tmpfs named pipe.
+//
+// +stateify savable
type Fifo struct {
ramfs.Entry
}
diff --git a/pkg/sentry/fs/tty/BUILD b/pkg/sentry/fs/tty/BUILD
index 363897b2c..3c446eef4 100644
--- a/pkg/sentry/fs/tty/BUILD
+++ b/pkg/sentry/fs/tty/BUILD
@@ -1,22 +1,6 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
-
-go_stateify(
- name = "tty_state",
- srcs = [
- "dir.go",
- "fs.go",
- "inode.go",
- "line_discipline.go",
- "master.go",
- "queue.go",
- "slave.go",
- "terminal.go",
- ],
- out = "tty_state.go",
- package = "tty",
-)
+load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
go_library(
name = "tty",
@@ -29,7 +13,6 @@ go_library(
"queue.go",
"slave.go",
"terminal.go",
- "tty_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/tty",
visibility = ["//pkg/sentry:internal"],
@@ -44,7 +27,6 @@ go_library(
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
- "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
diff --git a/pkg/sentry/fs/tty/dir.go b/pkg/sentry/fs/tty/dir.go
index 2c5b2aed6..c91091db4 100644
--- a/pkg/sentry/fs/tty/dir.go
+++ b/pkg/sentry/fs/tty/dir.go
@@ -49,14 +49,16 @@ import (
// corresponding Dirents hold on their parent (this directory).
//
// dirInodeOperations implements fs.InodeOperations.
+//
+// +stateify savable
type dirInodeOperations struct {
- fsutil.DeprecatedFileOperations
- fsutil.InodeNotSocket
- fsutil.InodeNotRenameable
- fsutil.InodeNotSymlink
- fsutil.InodeNoExtendedAttributes
- fsutil.NoMappable
- fsutil.NoopWriteOut
+ fsutil.DeprecatedFileOperations `state:"nosave"`
+ fsutil.InodeNotSocket `state:"nosave"`
+ fsutil.InodeNotRenameable `state:"nosave"`
+ fsutil.InodeNotSymlink `state:"nosave"`
+ fsutil.InodeNoExtendedAttributes `state:"nosave"`
+ fsutil.NoMappable `state:"nosave"`
+ fsutil.NoopWriteOut `state:"nosave"`
// msrc is the super block this directory is on.
//
@@ -348,6 +350,8 @@ func (d *dirInodeOperations) masterClose(t *Terminal) {
//
// This is nearly identical to fsutil.DirFileOperations, except that it takes
// df.di.mu in IterateDir.
+//
+// +stateify savable
type dirFileOperations struct {
waiter.AlwaysReady `state:"nosave"`
fsutil.NoopRelease `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/fs.go b/pkg/sentry/fs/tty/fs.go
index dbaffe95e..e28635607 100644
--- a/pkg/sentry/fs/tty/fs.go
+++ b/pkg/sentry/fs/tty/fs.go
@@ -28,6 +28,8 @@ var ptsDevice = device.NewAnonDevice()
//
// This devpts is always in the new "multi-instance" mode. i.e., it contains a
// ptmx device tied to this mount.
+//
+// +stateify savable
type filesystem struct{}
func init() {
@@ -69,6 +71,8 @@ func (f *filesystem) Mount(ctx context.Context, device string, flags fs.MountSou
}
// superOperations implements fs.MountSourceOperations, preventing caching.
+//
+// +stateify savable
type superOperations struct{}
// Revalidate implements fs.DirentOperations.Revalidate.
diff --git a/pkg/sentry/fs/tty/inode.go b/pkg/sentry/fs/tty/inode.go
index 04b9a7727..c0fa2b407 100644
--- a/pkg/sentry/fs/tty/inode.go
+++ b/pkg/sentry/fs/tty/inode.go
@@ -31,6 +31,8 @@ import (
//
// * fs.InodeOperations.Release
// * fs.InodeOperations.GetFile
+//
+// +stateify savable
type inodeOperations struct {
fsutil.DeprecatedFileOperations `state:"nosave"`
fsutil.InodeNoExtendedAttributes `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/line_discipline.go b/pkg/sentry/fs/tty/line_discipline.go
index f094635f5..d243ee40e 100644
--- a/pkg/sentry/fs/tty/line_discipline.go
+++ b/pkg/sentry/fs/tty/line_discipline.go
@@ -72,6 +72,8 @@ const (
// termiosMu
// inQueue.mu
// outQueue.mu
+//
+// +stateify savable
type lineDiscipline struct {
// inQueue is the input queue of the terminal.
inQueue queue
@@ -183,6 +185,8 @@ type transformer interface {
// outputQueueTransformer implements transformer. It performs line discipline
// transformations on the output queue.
+//
+// +stateify savable
type outputQueueTransformer struct{}
// transform does output processing for one end of the pty. See
@@ -254,6 +258,8 @@ func (*outputQueueTransformer) transform(l *lineDiscipline, q *queue, buf []byte
// inputQueueTransformer implements transformer. It performs line discipline
// transformations on the input queue.
+//
+// +stateify savable
type inputQueueTransformer struct{}
// transform does input processing for one end of the pty. Characters read are
diff --git a/pkg/sentry/fs/tty/master.go b/pkg/sentry/fs/tty/master.go
index 74cdbe874..c7198e218 100644
--- a/pkg/sentry/fs/tty/master.go
+++ b/pkg/sentry/fs/tty/master.go
@@ -27,6 +27,8 @@ import (
// masterInodeOperations are the fs.InodeOperations for the master end of the
// Terminal (ptmx file).
+//
+// +stateify savable
type masterInodeOperations struct {
inodeOperations
@@ -96,6 +98,8 @@ func (mi *masterInodeOperations) GetFile(ctx context.Context, d *fs.Dirent, flag
}
// masterFileOperations are the fs.FileOperations for the master end of a terminal.
+//
+// +stateify savable
type masterFileOperations struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/queue.go b/pkg/sentry/fs/tty/queue.go
index 026d5e077..42c105abc 100644
--- a/pkg/sentry/fs/tty/queue.go
+++ b/pkg/sentry/fs/tty/queue.go
@@ -32,11 +32,13 @@ import (
// processed (i.e. undergo termios transformations) as they are added to the
// read buffer. The read buffer is readable when its length is nonzero and
// readable is true.
+//
+// +stateify savable
type queue struct {
// mu protects everything in queue.
mu sync.Mutex `state:"nosave"`
- waiter.Queue `state:"nosave"`
+ waiter.Queue `state:"zerovalue"`
// readBuf is buffer of data ready to be read when readable is true.
// This data has been processed.
diff --git a/pkg/sentry/fs/tty/slave.go b/pkg/sentry/fs/tty/slave.go
index f5eec726e..1c562b172 100644
--- a/pkg/sentry/fs/tty/slave.go
+++ b/pkg/sentry/fs/tty/slave.go
@@ -27,6 +27,8 @@ import (
// slaveInodeOperations are the fs.InodeOperations for the slave end of the
// Terminal (pts file).
+//
+// +stateify savable
type slaveInodeOperations struct {
inodeOperations
@@ -86,6 +88,8 @@ func (si *slaveInodeOperations) GetFile(ctx context.Context, d *fs.Dirent, flags
}
// slaveFileOperations are the fs.FileOperations for the slave end of a terminal.
+//
+// +stateify savable
type slaveFileOperations struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/terminal.go b/pkg/sentry/fs/tty/terminal.go
index fa5b00409..3cb135124 100644
--- a/pkg/sentry/fs/tty/terminal.go
+++ b/pkg/sentry/fs/tty/terminal.go
@@ -21,6 +21,8 @@ import (
)
// Terminal is a pseudoterminal.
+//
+// +stateify savable
type Terminal struct {
refs.AtomicRefCount