mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Implement memmap.MappingIdentity for vfs.FileDescription.
PiperOrigin-RevId: 285255855
This commit is contained in:
@@ -41,7 +41,6 @@ go_library(
|
||||
visibility = ["//pkg/sentry:internal"],
|
||||
deps = [
|
||||
"//pkg/log",
|
||||
"//pkg/refs",
|
||||
"//pkg/sentry/context",
|
||||
"//pkg/sentry/platform",
|
||||
"//pkg/sentry/usermem",
|
||||
|
||||
@@ -18,7 +18,6 @@ package memmap
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/refs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/context"
|
||||
"gvisor.dev/gvisor/pkg/sentry/platform"
|
||||
"gvisor.dev/gvisor/pkg/sentry/usermem"
|
||||
@@ -235,8 +234,11 @@ type InvalidateOpts struct {
|
||||
// coincidental; fs.File implements MappingIdentity, and some
|
||||
// fs.InodeOperations implement Mappable.)
|
||||
type MappingIdentity interface {
|
||||
// MappingIdentity is reference-counted.
|
||||
refs.RefCounter
|
||||
// IncRef increments the MappingIdentity's reference count.
|
||||
IncRef()
|
||||
|
||||
// DecRef decrements the MappingIdentity's reference count.
|
||||
DecRef()
|
||||
|
||||
// MappedName returns the application-visible name shown in
|
||||
// /proc/[pid]/maps.
|
||||
|
||||
@@ -24,6 +24,9 @@ type contextID int
|
||||
const (
|
||||
// CtxMountNamespace is a Context.Value key for a MountNamespace.
|
||||
CtxMountNamespace contextID = iota
|
||||
|
||||
// CtxRoot is a Context.Value key for a VFS root.
|
||||
CtxRoot
|
||||
)
|
||||
|
||||
// MountNamespaceFromContext returns the MountNamespace used by ctx. It does
|
||||
@@ -35,3 +38,13 @@ func MountNamespaceFromContext(ctx context.Context) *MountNamespace {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 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.
|
||||
func RootFromContext(ctx context.Context) VirtualDentry {
|
||||
if v := ctx.Value(CtxRoot); v != nil {
|
||||
return v.(VirtualDentry)
|
||||
}
|
||||
return VirtualDentry{}
|
||||
}
|
||||
|
||||
@@ -334,3 +334,47 @@ func (fd *FileDescription) Ioctl(ctx context.Context, uio usermem.IO, args arch.
|
||||
func (fd *FileDescription) SyncFS(ctx context.Context) error {
|
||||
return fd.vd.mount.fs.impl.Sync(ctx)
|
||||
}
|
||||
|
||||
// MappedName implements memmap.MappingIdentity.MappedName.
|
||||
func (fd *FileDescription) MappedName(ctx context.Context) string {
|
||||
vfsroot := RootFromContext(ctx)
|
||||
s, _ := fd.vd.mount.vfs.PathnameWithDeleted(ctx, vfsroot, fd.vd)
|
||||
if vfsroot.Ok() {
|
||||
vfsroot.DecRef()
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// DeviceID implements memmap.MappingIdentity.DeviceID.
|
||||
func (fd *FileDescription) DeviceID() uint64 {
|
||||
stat, err := fd.impl.Stat(context.Background(), StatOptions{
|
||||
// There is no STATX_DEV; we assume that Stat will return it if it's
|
||||
// available regardless of mask.
|
||||
Mask: 0,
|
||||
// fs/proc/task_mmu.c:show_map_vma() just reads inode::i_sb->s_dev
|
||||
// directly.
|
||||
Sync: linux.AT_STATX_DONT_SYNC,
|
||||
})
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return uint64(linux.MakeDeviceID(uint16(stat.DevMajor), stat.DevMinor))
|
||||
}
|
||||
|
||||
// InodeID implements memmap.MappingIdentity.InodeID.
|
||||
func (fd *FileDescription) InodeID() uint64 {
|
||||
stat, err := fd.impl.Stat(context.Background(), StatOptions{
|
||||
Mask: linux.STATX_INO,
|
||||
// fs/proc/task_mmu.c:show_map_vma() just reads inode::i_ino directly.
|
||||
Sync: linux.AT_STATX_DONT_SYNC,
|
||||
})
|
||||
if err != nil || stat.Mask&linux.STATX_INO == 0 {
|
||||
return 0
|
||||
}
|
||||
return stat.Ino
|
||||
}
|
||||
|
||||
// Msync implements memmap.MappingIdentity.Msync.
|
||||
func (fd *FileDescription) Msync(ctx context.Context, mr memmap.MappableRange) error {
|
||||
return fd.impl.Sync(ctx)
|
||||
}
|
||||
|
||||
@@ -252,3 +252,12 @@ func (fd *DynamicBytesFileDescriptionImpl) Seek(ctx context.Context, offset int6
|
||||
fd.off = offset
|
||||
return offset, nil
|
||||
}
|
||||
|
||||
// GenericConfigureMMap may be used by most implementations of
|
||||
// FileDescriptionImpl.ConfigureMMap.
|
||||
func GenericConfigureMMap(fd *FileDescription, m memmap.Mappable, opts *memmap.MMapOpts) error {
|
||||
opts.Mappable = m
|
||||
opts.MappingIdentity = fd
|
||||
fd.IncRef()
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user