summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/vfs/context.go
diff options
context:
space:
mode:
authorNicolas Lacasse <nlacasse@google.com>2020-08-21 14:28:27 -0700
committergVisor bot <gvisor-bot@google.com>2020-08-21 14:30:03 -0700
commit5ec3d4ed3e3cda8944e851ef845f6d275999858a (patch)
treee09f2887c1bfdaa1733b024276af4923120382c1 /pkg/sentry/vfs/context.go
parentc9e752b6440cfa78f7bdcd47af4c4f5fe33d57b4 (diff)
Make mounts ReadWrite first, then later change to ReadOnly.
This lets us create "synthetic" mountpoint directories in ReadOnly mounts during VFS setup. Also add context.WithMountNamespace, as some filesystems (like overlay) require a MountNamespace on ctx to handle vfs.Filesystem Operations. PiperOrigin-RevId: 327874971
Diffstat (limited to 'pkg/sentry/vfs/context.go')
-rw-r--r--pkg/sentry/vfs/context.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/pkg/sentry/vfs/context.go b/pkg/sentry/vfs/context.go
index c9e724fef..97018651f 100644
--- a/pkg/sentry/vfs/context.go
+++ b/pkg/sentry/vfs/context.go
@@ -40,6 +40,30 @@ func MountNamespaceFromContext(ctx context.Context) *MountNamespace {
return nil
}
+type mountNamespaceContext struct {
+ context.Context
+ mntns *MountNamespace
+}
+
+// Value implements Context.Value.
+func (mc mountNamespaceContext) Value(key interface{}) interface{} {
+ switch key {
+ case CtxMountNamespace:
+ mc.mntns.IncRef()
+ return mc.mntns
+ default:
+ return mc.Context.Value(key)
+ }
+}
+
+// WithMountNamespace returns a copy of ctx with the given MountNamespace.
+func WithMountNamespace(ctx context.Context, mntns *MountNamespace) context.Context {
+ return &mountNamespaceContext{
+ Context: ctx,
+ mntns: mntns,
+ }
+}
+
// RootFromContext returns the VFS root used by ctx. It takes a reference on
// the returned VirtualDentry. If ctx does not have a specific VFS root,
// RootFromContext returns a zero-value VirtualDentry.