summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fsimpl/overlay/copy_up.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/sentry/fsimpl/overlay/copy_up.go')
-rw-r--r--pkg/sentry/fsimpl/overlay/copy_up.go78
1 files changed, 0 insertions, 78 deletions
diff --git a/pkg/sentry/fsimpl/overlay/copy_up.go b/pkg/sentry/fsimpl/overlay/copy_up.go
index 360b77ef6..c589b4746 100644
--- a/pkg/sentry/fsimpl/overlay/copy_up.go
+++ b/pkg/sentry/fsimpl/overlay/copy_up.go
@@ -23,7 +23,6 @@ import (
"gvisor.dev/gvisor/pkg/context"
"gvisor.dev/gvisor/pkg/fspath"
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
- "gvisor.dev/gvisor/pkg/sentry/memmap"
"gvisor.dev/gvisor/pkg/sentry/vfs"
"gvisor.dev/gvisor/pkg/syserror"
"gvisor.dev/gvisor/pkg/usermem"
@@ -82,8 +81,6 @@ func (d *dentry) copyUpLocked(ctx context.Context) error {
Start: d.parent.upperVD,
Path: fspath.Parse(d.name),
}
- // Used during copy-up of memory-mapped regular files.
- var mmapOpts *memmap.MMapOpts
cleanupUndoCopyUp := func() {
var err error
if ftype == linux.S_IFDIR {
@@ -139,25 +136,6 @@ func (d *dentry) copyUpLocked(ctx context.Context) error {
break
}
}
- d.mapsMu.Lock()
- defer d.mapsMu.Unlock()
- if d.wrappedMappable != nil {
- // We may have memory mappings of the file on the lower layer.
- // Switch to mapping the file on the upper layer instead.
- mmapOpts = &memmap.MMapOpts{
- Perms: usermem.ReadWrite,
- MaxPerms: usermem.ReadWrite,
- }
- if err := newFD.ConfigureMMap(ctx, mmapOpts); err != nil {
- cleanupUndoCopyUp()
- return err
- }
- if mmapOpts.MappingIdentity != nil {
- mmapOpts.MappingIdentity.DecRef(ctx)
- }
- // Don't actually switch Mappables until the end of copy-up; see
- // below for why.
- }
if err := newFD.SetStat(ctx, vfs.SetStatOptions{
Stat: linux.Statx{
Mask: linux.STATX_UID | linux.STATX_GID,
@@ -287,62 +265,6 @@ func (d *dentry) copyUpLocked(ctx context.Context) error {
atomic.StoreUint64(&d.ino, upperStat.Ino)
}
- if mmapOpts != nil && mmapOpts.Mappable != nil {
- // Note that if mmapOpts != nil, then d.mapsMu is locked for writing
- // (from the S_IFREG path above).
-
- // Propagate mappings of d to the new Mappable. Remember which mappings
- // we added so we can remove them on failure.
- upperMappable := mmapOpts.Mappable
- allAdded := make(map[memmap.MappableRange]memmap.MappingsOfRange)
- for seg := d.lowerMappings.FirstSegment(); seg.Ok(); seg = seg.NextSegment() {
- added := make(memmap.MappingsOfRange)
- for m := range seg.Value() {
- if err := upperMappable.AddMapping(ctx, m.MappingSpace, m.AddrRange, seg.Start(), m.Writable); err != nil {
- for m := range added {
- upperMappable.RemoveMapping(ctx, m.MappingSpace, m.AddrRange, seg.Start(), m.Writable)
- }
- for mr, mappings := range allAdded {
- for m := range mappings {
- upperMappable.RemoveMapping(ctx, m.MappingSpace, m.AddrRange, mr.Start, m.Writable)
- }
- }
- return err
- }
- added[m] = struct{}{}
- }
- allAdded[seg.Range()] = added
- }
-
- // Switch to the new Mappable. We do this at the end of copy-up
- // because:
- //
- // - We need to switch Mappables (by changing d.wrappedMappable) before
- // invalidating Translations from the old Mappable (to pick up
- // Translations from the new one).
- //
- // - We need to lock d.dataMu while changing d.wrappedMappable, but
- // must invalidate Translations with d.dataMu unlocked (due to lock
- // ordering).
- //
- // - Consequently, once we unlock d.dataMu, other threads may
- // immediately observe the new (copied-up) Mappable, which we want to
- // delay until copy-up is guaranteed to succeed.
- d.dataMu.Lock()
- lowerMappable := d.wrappedMappable
- d.wrappedMappable = upperMappable
- d.dataMu.Unlock()
- d.lowerMappings.InvalidateAll(memmap.InvalidateOpts{})
-
- // Remove mappings from the old Mappable.
- for seg := d.lowerMappings.FirstSegment(); seg.Ok(); seg = seg.NextSegment() {
- for m := range seg.Value() {
- lowerMappable.RemoveMapping(ctx, m.MappingSpace, m.AddrRange, seg.Start(), m.Writable)
- }
- }
- d.lowerMappings.RemoveAll()
- }
-
atomic.StoreUint32(&d.copiedUp, 1)
return nil
}