mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Merge pull request #3972 from btw616:fix/comments
PiperOrigin-RevId: 332486111
This commit is contained in:
@@ -237,7 +237,7 @@ func (i *rootInode) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback,
|
||||
return offset, nil
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *rootInode) DecRef(context.Context) {
|
||||
i.rootInodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
|
||||
// EventFileDescription implements FileDescriptionImpl for file-based event
|
||||
// EventFileDescription implements vfs.FileDescriptionImpl for file-based event
|
||||
// notification (eventfd). Eventfds are usually internal to the Sentry but in
|
||||
// certain situations they may be converted into a host-backed eventfd.
|
||||
type EventFileDescription struct {
|
||||
@@ -106,7 +106,7 @@ func (efd *EventFileDescription) HostFD() (int, error) {
|
||||
return efd.hostfd, nil
|
||||
}
|
||||
|
||||
// Release implements FileDescriptionImpl.Release()
|
||||
// Release implements vfs.FileDescriptionImpl.Release.
|
||||
func (efd *EventFileDescription) Release(context.Context) {
|
||||
efd.mu.Lock()
|
||||
defer efd.mu.Unlock()
|
||||
@@ -119,7 +119,7 @@ func (efd *EventFileDescription) Release(context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
// Read implements FileDescriptionImpl.Read.
|
||||
// Read implements vfs.FileDescriptionImpl.Read.
|
||||
func (efd *EventFileDescription) Read(ctx context.Context, dst usermem.IOSequence, _ vfs.ReadOptions) (int64, error) {
|
||||
if dst.NumBytes() < 8 {
|
||||
return 0, syscall.EINVAL
|
||||
@@ -130,7 +130,7 @@ func (efd *EventFileDescription) Read(ctx context.Context, dst usermem.IOSequenc
|
||||
return 8, nil
|
||||
}
|
||||
|
||||
// Write implements FileDescriptionImpl.Write.
|
||||
// Write implements vfs.FileDescriptionImpl.Write.
|
||||
func (efd *EventFileDescription) Write(ctx context.Context, src usermem.IOSequence, _ vfs.WriteOptions) (int64, error) {
|
||||
if src.NumBytes() < 8 {
|
||||
return 0, syscall.EINVAL
|
||||
|
||||
@@ -490,7 +490,7 @@ func (fs *filesystem) UnlinkAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
return syserror.EROFS
|
||||
}
|
||||
|
||||
// BoundEndpointAt implements FilesystemImpl.BoundEndpointAt.
|
||||
// BoundEndpointAt implements vfs.FilesystemImpl.BoundEndpointAt.
|
||||
func (fs *filesystem) BoundEndpointAt(ctx context.Context, rp *vfs.ResolvingPath, opts vfs.BoundEndpointOptions) (transport.BoundEndpoint, error) {
|
||||
_, inode, err := fs.walk(ctx, rp, false)
|
||||
if err != nil {
|
||||
|
||||
@@ -61,7 +61,7 @@ func (in *inode) isSymlink() bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
// symlinkFD represents a symlink file description and implements implements
|
||||
// symlinkFD represents a symlink file description and implements
|
||||
// vfs.FileDescriptionImpl. which may only be used if open options contains
|
||||
// O_PATH. For this reason most of the functions return EBADF.
|
||||
type symlinkFD struct {
|
||||
|
||||
@@ -35,27 +35,27 @@ func (*directoryFD) Allocate(ctx context.Context, mode, offset, length uint64) e
|
||||
return syserror.EISDIR
|
||||
}
|
||||
|
||||
// PRead implements FileDescriptionImpl.PRead.
|
||||
// PRead implements vfs.FileDescriptionImpl.PRead.
|
||||
func (*directoryFD) PRead(ctx context.Context, dst usermem.IOSequence, offset int64, opts vfs.ReadOptions) (int64, error) {
|
||||
return 0, syserror.EISDIR
|
||||
}
|
||||
|
||||
// Read implements FileDescriptionImpl.Read.
|
||||
// Read implements vfs.FileDescriptionImpl.Read.
|
||||
func (*directoryFD) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.ReadOptions) (int64, error) {
|
||||
return 0, syserror.EISDIR
|
||||
}
|
||||
|
||||
// PWrite implements FileDescriptionImpl.PWrite.
|
||||
// PWrite implements vfs.FileDescriptionImpl.PWrite.
|
||||
func (*directoryFD) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, opts vfs.WriteOptions) (int64, error) {
|
||||
return 0, syserror.EISDIR
|
||||
}
|
||||
|
||||
// Write implements FileDescriptionImpl.Write.
|
||||
// Write implements vfs.FileDescriptionImpl.Write.
|
||||
func (*directoryFD) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error) {
|
||||
return 0, syserror.EISDIR
|
||||
}
|
||||
|
||||
// IterDirents implements FileDescriptionImpl.IterDirents.
|
||||
// IterDirents implements vfs.FileDescriptionImpl.IterDirents.
|
||||
func (dir *directoryFD) IterDirents(ctx context.Context, callback vfs.IterDirentsCallback) error {
|
||||
fusefs := dir.inode().fs
|
||||
task, creds := kernel.TaskFromContext(ctx), auth.CredentialsFromContext(ctx)
|
||||
|
||||
@@ -735,7 +735,7 @@ func (i *inode) Stat(ctx context.Context, fs *vfs.Filesystem, opts vfs.StatOptio
|
||||
return statFromFUSEAttr(attr, opts.Mask, i.fs.devMinor), nil
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *inode) DecRef(context.Context) {
|
||||
i.inodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
|
||||
@@ -1491,7 +1491,7 @@ func (fs *filesystem) UnlinkAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
return fs.unlinkAt(ctx, rp, false /* dir */)
|
||||
}
|
||||
|
||||
// BoundEndpointAt implements FilesystemImpl.BoundEndpointAt.
|
||||
// BoundEndpointAt implements vfs.FilesystemImpl.BoundEndpointAt.
|
||||
func (fs *filesystem) BoundEndpointAt(ctx context.Context, rp *vfs.ResolvingPath, opts vfs.BoundEndpointOptions) (transport.BoundEndpoint, error) {
|
||||
var ds *[]*dentry
|
||||
fs.renameMu.RLock()
|
||||
|
||||
@@ -139,12 +139,12 @@ func ImportFD(ctx context.Context, mnt *vfs.Mount, hostFD int, isTTY bool) (*vfs
|
||||
// filesystemType implements vfs.FilesystemType.
|
||||
type filesystemType struct{}
|
||||
|
||||
// GetFilesystem implements FilesystemType.GetFilesystem.
|
||||
// GetFilesystem implements vfs.FilesystemType.GetFilesystem.
|
||||
func (filesystemType) GetFilesystem(context.Context, *vfs.VirtualFilesystem, *auth.Credentials, string, vfs.GetFilesystemOptions) (*vfs.Filesystem, *vfs.Dentry, error) {
|
||||
panic("host.filesystemType.GetFilesystem should never be called")
|
||||
}
|
||||
|
||||
// Name implements FilesystemType.Name.
|
||||
// Name implements vfs.FilesystemType.Name.
|
||||
func (filesystemType) Name() string {
|
||||
return "none"
|
||||
}
|
||||
@@ -243,7 +243,7 @@ type inode struct {
|
||||
pf inodePlatformFile
|
||||
}
|
||||
|
||||
// CheckPermissions implements kernfs.Inode.
|
||||
// CheckPermissions implements kernfs.Inode.CheckPermissions.
|
||||
func (i *inode) CheckPermissions(ctx context.Context, creds *auth.Credentials, ats vfs.AccessTypes) error {
|
||||
var s syscall.Stat_t
|
||||
if err := syscall.Fstat(i.hostFD, &s); err != nil {
|
||||
@@ -252,7 +252,7 @@ func (i *inode) CheckPermissions(ctx context.Context, creds *auth.Credentials, a
|
||||
return vfs.GenericCheckPermissions(creds, ats, linux.FileMode(s.Mode), auth.KUID(s.Uid), auth.KGID(s.Gid))
|
||||
}
|
||||
|
||||
// Mode implements kernfs.Inode.
|
||||
// Mode implements kernfs.Inode.Mode.
|
||||
func (i *inode) Mode() linux.FileMode {
|
||||
var s syscall.Stat_t
|
||||
if err := syscall.Fstat(i.hostFD, &s); err != nil {
|
||||
@@ -263,7 +263,7 @@ func (i *inode) Mode() linux.FileMode {
|
||||
return linux.FileMode(s.Mode)
|
||||
}
|
||||
|
||||
// Stat implements kernfs.Inode.
|
||||
// Stat implements kernfs.Inode.Stat.
|
||||
func (i *inode) Stat(ctx context.Context, vfsfs *vfs.Filesystem, opts vfs.StatOptions) (linux.Statx, error) {
|
||||
if opts.Mask&linux.STATX__RESERVED != 0 {
|
||||
return linux.Statx{}, syserror.EINVAL
|
||||
@@ -376,7 +376,7 @@ func (i *inode) fstat(fs *filesystem) (linux.Statx, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
// SetStat implements kernfs.Inode.
|
||||
// SetStat implements kernfs.Inode.SetStat.
|
||||
func (i *inode) SetStat(ctx context.Context, fs *vfs.Filesystem, creds *auth.Credentials, opts vfs.SetStatOptions) error {
|
||||
s := &opts.Stat
|
||||
|
||||
@@ -435,17 +435,17 @@ func (i *inode) SetStat(ctx context.Context, fs *vfs.Filesystem, creds *auth.Cre
|
||||
return nil
|
||||
}
|
||||
|
||||
// IncRef implements kernfs.Inode.
|
||||
// IncRef implements kernfs.Inode.IncRef.
|
||||
func (i *inode) IncRef() {
|
||||
i.refs.IncRef()
|
||||
}
|
||||
|
||||
// TryIncRef implements kernfs.Inode.
|
||||
// TryIncRef implements kernfs.Inode.TryIncRef.
|
||||
func (i *inode) TryIncRef() bool {
|
||||
return i.refs.TryIncRef()
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *inode) DecRef(ctx context.Context) {
|
||||
i.refs.DecRef(func() {
|
||||
if i.wouldBlock {
|
||||
@@ -457,7 +457,7 @@ func (i *inode) DecRef(ctx context.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *inode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
// Once created, we cannot re-open a socket fd through /proc/[pid]/fd/.
|
||||
if i.Mode().FileType() == linux.S_IFSOCK {
|
||||
@@ -542,28 +542,28 @@ type fileDescription struct {
|
||||
offset int64
|
||||
}
|
||||
|
||||
// SetStat implements vfs.FileDescriptionImpl.
|
||||
// SetStat implements vfs.FileDescriptionImpl.SetStat.
|
||||
func (f *fileDescription) SetStat(ctx context.Context, opts vfs.SetStatOptions) error {
|
||||
creds := auth.CredentialsFromContext(ctx)
|
||||
return f.inode.SetStat(ctx, f.vfsfd.Mount().Filesystem(), creds, opts)
|
||||
}
|
||||
|
||||
// Stat implements vfs.FileDescriptionImpl.
|
||||
// Stat implements vfs.FileDescriptionImpl.Stat.
|
||||
func (f *fileDescription) Stat(ctx context.Context, opts vfs.StatOptions) (linux.Statx, error) {
|
||||
return f.inode.Stat(ctx, f.vfsfd.Mount().Filesystem(), opts)
|
||||
}
|
||||
|
||||
// Release implements vfs.FileDescriptionImpl.
|
||||
// Release implements vfs.FileDescriptionImpl.Release.
|
||||
func (f *fileDescription) Release(context.Context) {
|
||||
// noop
|
||||
}
|
||||
|
||||
// Allocate implements vfs.FileDescriptionImpl.
|
||||
// Allocate implements vfs.FileDescriptionImpl.Allocate.
|
||||
func (f *fileDescription) Allocate(ctx context.Context, mode, offset, length uint64) error {
|
||||
return unix.Fallocate(f.inode.hostFD, uint32(mode), int64(offset), int64(length))
|
||||
}
|
||||
|
||||
// PRead implements FileDescriptionImpl.
|
||||
// PRead implements vfs.FileDescriptionImpl.PRead.
|
||||
func (f *fileDescription) PRead(ctx context.Context, dst usermem.IOSequence, offset int64, opts vfs.ReadOptions) (int64, error) {
|
||||
i := f.inode
|
||||
if !i.seekable {
|
||||
@@ -573,7 +573,7 @@ func (f *fileDescription) PRead(ctx context.Context, dst usermem.IOSequence, off
|
||||
return readFromHostFD(ctx, i.hostFD, dst, offset, opts.Flags)
|
||||
}
|
||||
|
||||
// Read implements FileDescriptionImpl.
|
||||
// Read implements vfs.FileDescriptionImpl.Read.
|
||||
func (f *fileDescription) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.ReadOptions) (int64, error) {
|
||||
i := f.inode
|
||||
if !i.seekable {
|
||||
@@ -610,7 +610,7 @@ func readFromHostFD(ctx context.Context, hostFD int, dst usermem.IOSequence, off
|
||||
return int64(n), err
|
||||
}
|
||||
|
||||
// PWrite implements FileDescriptionImpl.
|
||||
// PWrite implements vfs.FileDescriptionImpl.PWrite.
|
||||
func (f *fileDescription) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, opts vfs.WriteOptions) (int64, error) {
|
||||
if !f.inode.seekable {
|
||||
return 0, syserror.ESPIPE
|
||||
@@ -619,7 +619,7 @@ func (f *fileDescription) PWrite(ctx context.Context, src usermem.IOSequence, of
|
||||
return f.writeToHostFD(ctx, src, offset, opts.Flags)
|
||||
}
|
||||
|
||||
// Write implements FileDescriptionImpl.
|
||||
// Write implements vfs.FileDescriptionImpl.Write.
|
||||
func (f *fileDescription) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error) {
|
||||
i := f.inode
|
||||
if !i.seekable {
|
||||
@@ -667,7 +667,7 @@ func (f *fileDescription) writeToHostFD(ctx context.Context, src usermem.IOSeque
|
||||
return int64(n), err
|
||||
}
|
||||
|
||||
// Seek implements FileDescriptionImpl.
|
||||
// Seek implements vfs.FileDescriptionImpl.Seek.
|
||||
//
|
||||
// Note that we do not support seeking on directories, since we do not even
|
||||
// allow directory fds to be imported at all.
|
||||
@@ -732,13 +732,13 @@ func (f *fileDescription) Seek(_ context.Context, offset int64, whence int32) (i
|
||||
return f.offset, nil
|
||||
}
|
||||
|
||||
// Sync implements FileDescriptionImpl.
|
||||
// Sync implements vfs.FileDescriptionImpl.Sync.
|
||||
func (f *fileDescription) Sync(context.Context) error {
|
||||
// TODO(gvisor.dev/issue/1897): Currently, we always sync everything.
|
||||
return unix.Fsync(f.inode.hostFD)
|
||||
}
|
||||
|
||||
// ConfigureMMap implements FileDescriptionImpl.
|
||||
// ConfigureMMap implements vfs.FileDescriptionImpl.ConfigureMMap.
|
||||
func (f *fileDescription) ConfigureMMap(_ context.Context, opts *memmap.MMapOpts) error {
|
||||
if !f.inode.canMap {
|
||||
return syserror.ENODEV
|
||||
|
||||
@@ -76,7 +76,7 @@ func (t *TTYFileDescription) Release(ctx context.Context) {
|
||||
t.fileDescription.Release(ctx)
|
||||
}
|
||||
|
||||
// PRead implements vfs.FileDescriptionImpl.
|
||||
// PRead implements vfs.FileDescriptionImpl.PRead.
|
||||
//
|
||||
// Reading from a TTY is only allowed for foreground process groups. Background
|
||||
// process groups will either get EIO or a SIGTTIN.
|
||||
@@ -94,7 +94,7 @@ func (t *TTYFileDescription) PRead(ctx context.Context, dst usermem.IOSequence,
|
||||
return t.fileDescription.PRead(ctx, dst, offset, opts)
|
||||
}
|
||||
|
||||
// Read implements vfs.FileDescriptionImpl.
|
||||
// Read implements vfs.FileDescriptionImpl.Read.
|
||||
//
|
||||
// Reading from a TTY is only allowed for foreground process groups. Background
|
||||
// process groups will either get EIO or a SIGTTIN.
|
||||
@@ -112,7 +112,7 @@ func (t *TTYFileDescription) Read(ctx context.Context, dst usermem.IOSequence, o
|
||||
return t.fileDescription.Read(ctx, dst, opts)
|
||||
}
|
||||
|
||||
// PWrite implements vfs.FileDescriptionImpl.
|
||||
// PWrite implements vfs.FileDescriptionImpl.PWrite.
|
||||
func (t *TTYFileDescription) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, opts vfs.WriteOptions) (int64, error) {
|
||||
t.mu.Lock()
|
||||
defer t.mu.Unlock()
|
||||
@@ -127,7 +127,7 @@ func (t *TTYFileDescription) PWrite(ctx context.Context, src usermem.IOSequence,
|
||||
return t.fileDescription.PWrite(ctx, src, offset, opts)
|
||||
}
|
||||
|
||||
// Write implements vfs.FileDescriptionImpl.
|
||||
// Write implements vfs.FileDescriptionImpl.Write.
|
||||
func (t *TTYFileDescription) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error) {
|
||||
t.mu.Lock()
|
||||
defer t.mu.Unlock()
|
||||
@@ -142,7 +142,7 @@ func (t *TTYFileDescription) Write(ctx context.Context, src usermem.IOSequence,
|
||||
return t.fileDescription.Write(ctx, src, opts)
|
||||
}
|
||||
|
||||
// Ioctl implements vfs.FileDescriptionImpl.
|
||||
// Ioctl implements vfs.FileDescriptionImpl.Ioctl.
|
||||
func (t *TTYFileDescription) Ioctl(ctx context.Context, io usermem.IO, args arch.SyscallArguments) (uintptr, error) {
|
||||
task := kernel.TaskFromContext(ctx)
|
||||
if task == nil {
|
||||
|
||||
@@ -801,7 +801,7 @@ func (fs *Filesystem) UnlinkAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
return nil
|
||||
}
|
||||
|
||||
// BoundEndpointAt implements FilesystemImpl.BoundEndpointAt.
|
||||
// BoundEndpointAt implements vfs.FilesystemImpl.BoundEndpointAt.
|
||||
func (fs *Filesystem) BoundEndpointAt(ctx context.Context, rp *vfs.ResolvingPath, opts vfs.BoundEndpointOptions) (transport.BoundEndpoint, error) {
|
||||
fs.mu.RLock()
|
||||
_, inode, err := fs.walkExistingLocked(ctx, rp)
|
||||
|
||||
@@ -594,7 +594,7 @@ func (s *StaticDirectory) Init(creds *auth.Credentials, devMajor, devMinor uint3
|
||||
s.InodeAttrs.Init(creds, devMajor, devMinor, ino, linux.ModeDirectory|perm)
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (s *StaticDirectory) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd, err := NewGenericDirectoryFD(rp.Mount(), vfsd, &s.OrderedChildren, &s.locks, &opts, s.fdOpts)
|
||||
if err != nil {
|
||||
@@ -608,7 +608,7 @@ func (*StaticDirectory) SetStat(context.Context, *vfs.Filesystem, *auth.Credenti
|
||||
return syserror.EPERM
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (s *StaticDirectory) DecRef(context.Context) {
|
||||
s.StaticDirectoryRefs.DecRef(s.Destroy)
|
||||
}
|
||||
@@ -616,7 +616,7 @@ func (s *StaticDirectory) DecRef(context.Context) {
|
||||
// AlwaysValid partially implements kernfs.inodeDynamicLookup.
|
||||
type AlwaysValid struct{}
|
||||
|
||||
// Valid implements kernfs.inodeDynamicLookup.
|
||||
// Valid implements kernfs.inodeDynamicLookup.Valid.
|
||||
func (*AlwaysValid) Valid(context.Context) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ func (s *StaticSymlink) Init(creds *auth.Credentials, devMajor uint32, devMinor
|
||||
s.InodeAttrs.Init(creds, devMajor, devMinor, ino, linux.ModeSymlink|0777)
|
||||
}
|
||||
|
||||
// Readlink implements Inode.
|
||||
// Readlink implements Inode.Readlink.
|
||||
func (s *StaticSymlink) Readlink(_ context.Context, _ *vfs.Mount) (string, error) {
|
||||
return s.target, nil
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ func (fs *filesystem) newSubtasks(task *kernel.Task, pidns *kernel.PIDNamespace,
|
||||
return dentry
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *subtasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
tid, err := strconv.ParseUint(name, 10, 32)
|
||||
if err != nil {
|
||||
@@ -87,7 +87,7 @@ func (i *subtasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, e
|
||||
return subTaskDentry.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.IterDirents.
|
||||
func (i *subtasksInode) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback, offset, relOffset int64) (int64, error) {
|
||||
tasks := i.task.ThreadGroup().MemberIDs(i.pidns)
|
||||
if len(tasks) == 0 {
|
||||
@@ -155,7 +155,7 @@ func (fd *subtasksFD) SetStat(ctx context.Context, opts vfs.SetStatOptions) erro
|
||||
return fd.GenericDirectoryFD.SetStat(ctx, opts)
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *subtasksInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd := &subtasksFD{task: i.task}
|
||||
if err := fd.Init(&i.OrderedChildren, &i.locks, &opts, kernfs.GenericDirectoryFDOptions{
|
||||
@@ -169,7 +169,7 @@ func (i *subtasksInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *v
|
||||
return fd.VFSFileDescription(), nil
|
||||
}
|
||||
|
||||
// Stat implements kernfs.Inode.
|
||||
// Stat implements kernfs.Inode.Stat.
|
||||
func (i *subtasksInode) Stat(ctx context.Context, vsfs *vfs.Filesystem, opts vfs.StatOptions) (linux.Statx, error) {
|
||||
stat, err := i.InodeAttrs.Stat(ctx, vsfs, opts)
|
||||
if err != nil {
|
||||
@@ -181,12 +181,12 @@ func (i *subtasksInode) Stat(ctx context.Context, vsfs *vfs.Filesystem, opts vfs
|
||||
return stat, nil
|
||||
}
|
||||
|
||||
// SetStat implements Inode.SetStat not allowing inode attributes to be changed.
|
||||
// SetStat implements kernfs.Inode.SetStat not allowing inode attributes to be changed.
|
||||
func (*subtasksInode) SetStat(context.Context, *vfs.Filesystem, *auth.Credentials, vfs.SetStatOptions) error {
|
||||
return syserror.EPERM
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *subtasksInode) DecRef(context.Context) {
|
||||
i.subtasksInodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ func (i *taskInode) Valid(ctx context.Context) bool {
|
||||
return i.task.ExitState() != kernel.TaskExitDead
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *taskInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd, err := kernfs.NewGenericDirectoryFD(rp.Mount(), vfsd, &i.OrderedChildren, &i.locks, &opts, kernfs.GenericDirectoryFDOptions{
|
||||
SeekEnd: kernfs.SeekEndZero,
|
||||
@@ -117,12 +117,12 @@ func (i *taskInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.D
|
||||
return fd.VFSFileDescription(), nil
|
||||
}
|
||||
|
||||
// SetStat implements Inode.SetStat not allowing inode attributes to be changed.
|
||||
// SetStat implements kernfs.Inode.SetStat not allowing inode attributes to be changed.
|
||||
func (*taskInode) SetStat(context.Context, *vfs.Filesystem, *auth.Credentials, vfs.SetStatOptions) error {
|
||||
return syserror.EPERM
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *taskInode) DecRef(context.Context) {
|
||||
i.taskInodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
@@ -168,7 +168,7 @@ func (fs *filesystem) newTaskOwnedDir(task *kernel.Task, ino uint64, perm linux.
|
||||
return d
|
||||
}
|
||||
|
||||
// Stat implements kernfs.Inode.
|
||||
// Stat implements kernfs.Inode.Stat.
|
||||
func (i *taskOwnedInode) Stat(ctx context.Context, fs *vfs.Filesystem, opts vfs.StatOptions) (linux.Statx, error) {
|
||||
stat, err := i.Inode.Stat(ctx, fs, opts)
|
||||
if err != nil {
|
||||
@@ -186,7 +186,7 @@ func (i *taskOwnedInode) Stat(ctx context.Context, fs *vfs.Filesystem, opts vfs.
|
||||
return stat, nil
|
||||
}
|
||||
|
||||
// CheckPermissions implements kernfs.Inode.
|
||||
// CheckPermissions implements kernfs.Inode.CheckPermissions.
|
||||
func (i *taskOwnedInode) CheckPermissions(_ context.Context, creds *auth.Credentials, ats vfs.AccessTypes) error {
|
||||
mode := i.Mode()
|
||||
uid, gid := i.getOwner(mode)
|
||||
|
||||
@@ -62,7 +62,7 @@ type fdDir struct {
|
||||
produceSymlink bool
|
||||
}
|
||||
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.IterDirents.
|
||||
func (i *fdDir) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback, offset, relOffset int64) (int64, error) {
|
||||
var fds []int32
|
||||
i.task.WithMuLocked(func(t *kernel.Task) {
|
||||
@@ -135,7 +135,7 @@ func (fs *filesystem) newFDDirInode(task *kernel.Task) *kernfs.Dentry {
|
||||
return dentry
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *fdDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
fdInt, err := strconv.ParseInt(name, 10, 32)
|
||||
if err != nil {
|
||||
@@ -149,7 +149,7 @@ func (i *fdDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, erro
|
||||
return taskDentry.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *fdDirInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd, err := kernfs.NewGenericDirectoryFD(rp.Mount(), vfsd, &i.OrderedChildren, &i.locks, &opts, kernfs.GenericDirectoryFDOptions{
|
||||
SeekEnd: kernfs.SeekEndZero,
|
||||
@@ -160,7 +160,7 @@ func (i *fdDirInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.
|
||||
return fd.VFSFileDescription(), nil
|
||||
}
|
||||
|
||||
// CheckPermissions implements kernfs.Inode.
|
||||
// CheckPermissions implements kernfs.Inode.CheckPermissions.
|
||||
//
|
||||
// This is to match Linux, which uses a special permission handler to guarantee
|
||||
// that a process can still access /proc/self/fd after it has executed
|
||||
@@ -182,7 +182,7 @@ func (i *fdDirInode) CheckPermissions(ctx context.Context, creds *auth.Credentia
|
||||
return err
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *fdDirInode) DecRef(context.Context) {
|
||||
i.fdDirInodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
@@ -269,7 +269,7 @@ func (fs *filesystem) newFDInfoDirInode(task *kernel.Task) *kernfs.Dentry {
|
||||
return dentry
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *fdInfoDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
fdInt, err := strconv.ParseInt(name, 10, 32)
|
||||
if err != nil {
|
||||
@@ -287,7 +287,7 @@ func (i *fdInfoDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry,
|
||||
return dentry.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *fdInfoDirInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd, err := kernfs.NewGenericDirectoryFD(rp.Mount(), vfsd, &i.OrderedChildren, &i.locks, &opts, kernfs.GenericDirectoryFDOptions{
|
||||
SeekEnd: kernfs.SeekEndZero,
|
||||
@@ -298,7 +298,7 @@ func (i *fdInfoDirInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *
|
||||
return fd.VFSFileDescription(), nil
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *fdInfoDirInode) DecRef(context.Context) {
|
||||
i.fdInfoDirInodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
|
||||
@@ -667,7 +667,7 @@ func (fs *filesystem) newExeSymlink(task *kernel.Task, ino uint64) *kernfs.Dentr
|
||||
return d
|
||||
}
|
||||
|
||||
// Readlink implements kernfs.Inode.
|
||||
// Readlink implements kernfs.Inode.Readlink.
|
||||
func (s *exeSymlink) Readlink(ctx context.Context, _ *vfs.Mount) (string, error) {
|
||||
if !kernel.ContextCanTrace(ctx, s.task, false) {
|
||||
return "", syserror.EACCES
|
||||
@@ -807,7 +807,7 @@ func (fs *filesystem) newNamespaceSymlink(task *kernel.Task, ino uint64, ns stri
|
||||
return d
|
||||
}
|
||||
|
||||
// Readlink implements Inode.
|
||||
// Readlink implements kernfs.Inode.Readlink.
|
||||
func (s *namespaceSymlink) Readlink(ctx context.Context, mnt *vfs.Mount) (string, error) {
|
||||
if err := checkTaskState(s.task); err != nil {
|
||||
return "", err
|
||||
@@ -815,7 +815,7 @@ func (s *namespaceSymlink) Readlink(ctx context.Context, mnt *vfs.Mount) (string
|
||||
return s.StaticSymlink.Readlink(ctx, mnt)
|
||||
}
|
||||
|
||||
// Getlink implements Inode.Getlink.
|
||||
// Getlink implements kernfs.Inode.Getlink.
|
||||
func (s *namespaceSymlink) Getlink(ctx context.Context, mnt *vfs.Mount) (vfs.VirtualDentry, string, error) {
|
||||
if err := checkTaskState(s.task); err != nil {
|
||||
return vfs.VirtualDentry{}, "", err
|
||||
@@ -852,7 +852,7 @@ func (i *namespaceInode) Init(creds *auth.Credentials, devMajor, devMinor uint32
|
||||
i.InodeAttrs.Init(creds, devMajor, devMinor, ino, linux.ModeRegular|perm)
|
||||
}
|
||||
|
||||
// Open implements Inode.Open.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *namespaceInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd := &namespaceFD{inode: i}
|
||||
i.IncRef()
|
||||
@@ -875,20 +875,20 @@ type namespaceFD struct {
|
||||
|
||||
var _ vfs.FileDescriptionImpl = (*namespaceFD)(nil)
|
||||
|
||||
// Stat implements FileDescriptionImpl.
|
||||
// Stat implements vfs.FileDescriptionImpl.Stat.
|
||||
func (fd *namespaceFD) Stat(ctx context.Context, opts vfs.StatOptions) (linux.Statx, error) {
|
||||
vfs := fd.vfsfd.VirtualDentry().Mount().Filesystem()
|
||||
return fd.inode.Stat(ctx, vfs, opts)
|
||||
}
|
||||
|
||||
// SetStat implements FileDescriptionImpl.
|
||||
// SetStat implements vfs.FileDescriptionImpl.SetStat.
|
||||
func (fd *namespaceFD) SetStat(ctx context.Context, opts vfs.SetStatOptions) error {
|
||||
vfs := fd.vfsfd.VirtualDentry().Mount().Filesystem()
|
||||
creds := auth.CredentialsFromContext(ctx)
|
||||
return fd.inode.SetStat(ctx, vfs, creds, opts)
|
||||
}
|
||||
|
||||
// Release implements FileDescriptionImpl.
|
||||
// Release implements vfs.FileDescriptionImpl.Release.
|
||||
func (fd *namespaceFD) Release(ctx context.Context) {
|
||||
fd.inode.DecRef(ctx)
|
||||
}
|
||||
|
||||
@@ -660,7 +660,7 @@ func sprintSlice(s []uint64) string {
|
||||
return r[1 : len(r)-1] // Remove "[]" introduced by fmt of slice.
|
||||
}
|
||||
|
||||
// Generate implements vfs.DynamicBytesSource.
|
||||
// Generate implements vfs.DynamicBytesSource.Generate.
|
||||
func (d *netSnmpData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
types := []interface{}{
|
||||
&inet.StatSNMPIP{},
|
||||
@@ -709,7 +709,7 @@ type netRouteData struct {
|
||||
|
||||
var _ dynamicInode = (*netRouteData)(nil)
|
||||
|
||||
// Generate implements vfs.DynamicBytesSource.
|
||||
// Generate implements vfs.DynamicBytesSource.Generate.
|
||||
// See Linux's net/ipv4/fib_trie.c:fib_route_seq_show.
|
||||
func (d *netRouteData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
fmt.Fprintf(buf, "%-127s\n", "Iface\tDestination\tGateway\tFlags\tRefCnt\tUse\tMetric\tMask\tMTU\tWindow\tIRTT")
|
||||
@@ -773,7 +773,7 @@ type netStatData struct {
|
||||
|
||||
var _ dynamicInode = (*netStatData)(nil)
|
||||
|
||||
// Generate implements vfs.DynamicBytesSource.
|
||||
// Generate implements vfs.DynamicBytesSource.Generate.
|
||||
// See Linux's net/ipv4/fib_trie.c:fib_route_seq_show.
|
||||
func (d *netStatData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
buf.WriteString("TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed " +
|
||||
|
||||
@@ -98,7 +98,7 @@ func (fs *filesystem) newTasksInode(k *kernel.Kernel, pidns *kernel.PIDNamespace
|
||||
return inode, dentry
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *tasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
// Try to lookup a corresponding task.
|
||||
tid, err := strconv.ParseUint(name, 10, 64)
|
||||
@@ -122,7 +122,7 @@ func (i *tasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, erro
|
||||
return taskDentry.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.IterDirents.
|
||||
func (i *tasksInode) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback, offset, _ int64) (int64, error) {
|
||||
// fs/proc/internal.h: #define FIRST_PROCESS_ENTRY 256
|
||||
const FIRST_PROCESS_ENTRY = 256
|
||||
@@ -200,7 +200,7 @@ func (i *tasksInode) IterDirents(ctx context.Context, cb vfs.IterDirentsCallback
|
||||
return maxTaskID, nil
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.
|
||||
// Open implements kernfs.Inode.Open.
|
||||
func (i *tasksInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentry, opts vfs.OpenOptions) (*vfs.FileDescription, error) {
|
||||
fd, err := kernfs.NewGenericDirectoryFD(rp.Mount(), vfsd, &i.OrderedChildren, &i.locks, &opts, kernfs.GenericDirectoryFDOptions{
|
||||
SeekEnd: kernfs.SeekEndZero,
|
||||
@@ -229,7 +229,7 @@ func (i *tasksInode) Stat(ctx context.Context, vsfs *vfs.Filesystem, opts vfs.St
|
||||
return stat, nil
|
||||
}
|
||||
|
||||
// DecRef implements kernfs.Inode.
|
||||
// DecRef implements kernfs.Inode.DecRef.
|
||||
func (i *tasksInode) DecRef(context.Context) {
|
||||
i.tasksInodeRefs.DecRef(i.Destroy)
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ func (s *selfSymlink) Getlink(ctx context.Context, mnt *vfs.Mount) (vfs.VirtualD
|
||||
return vfs.VirtualDentry{}, target, err
|
||||
}
|
||||
|
||||
// SetStat implements Inode.SetStat not allowing inode attributes to be changed.
|
||||
// SetStat implements kernfs.Inode.SetStat not allowing inode attributes to be changed.
|
||||
func (*selfSymlink) SetStat(context.Context, *vfs.Filesystem, *auth.Credentials, vfs.SetStatOptions) error {
|
||||
return syserror.EPERM
|
||||
}
|
||||
@@ -113,7 +113,7 @@ func (s *threadSelfSymlink) Getlink(ctx context.Context, mnt *vfs.Mount) (vfs.Vi
|
||||
return vfs.VirtualDentry{}, target, err
|
||||
}
|
||||
|
||||
// SetStat implements Inode.SetStat not allowing inode attributes to be changed.
|
||||
// SetStat implements kernfs.Inode.SetStat not allowing inode attributes to be changed.
|
||||
func (*threadSelfSymlink) SetStat(context.Context, *vfs.Filesystem, *auth.Credentials, vfs.SetStatOptions) error {
|
||||
return syserror.EPERM
|
||||
}
|
||||
@@ -125,7 +125,7 @@ type dynamicBytesFileSetAttr struct {
|
||||
kernfs.DynamicBytesFile
|
||||
}
|
||||
|
||||
// SetStat implements Inode.SetStat.
|
||||
// SetStat implements kernfs.Inode.SetStat.
|
||||
func (d *dynamicBytesFileSetAttr) SetStat(ctx context.Context, fs *vfs.Filesystem, creds *auth.Credentials, opts vfs.SetStatOptions) error {
|
||||
return d.DynamicBytesFile.InodeAttrs.SetStat(ctx, fs, creds, opts)
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ type tcpSackData struct {
|
||||
|
||||
var _ vfs.WritableDynamicBytesSource = (*tcpSackData)(nil)
|
||||
|
||||
// Generate implements vfs.DynamicBytesSource.
|
||||
// Generate implements vfs.DynamicBytesSource.Generate.
|
||||
func (d *tcpSackData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
if d.enabled == nil {
|
||||
sack, err := d.stack.TCPSACKEnabled()
|
||||
@@ -232,7 +232,7 @@ type tcpRecoveryData struct {
|
||||
|
||||
var _ vfs.WritableDynamicBytesSource = (*tcpRecoveryData)(nil)
|
||||
|
||||
// Generate implements vfs.DynamicBytesSource.
|
||||
// Generate implements vfs.DynamicBytesSource.Generate.
|
||||
func (d *tcpRecoveryData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
recovery, err := d.stack.TCPRecovery()
|
||||
if err != nil {
|
||||
@@ -284,7 +284,7 @@ type tcpMemData struct {
|
||||
|
||||
var _ vfs.WritableDynamicBytesSource = (*tcpMemData)(nil)
|
||||
|
||||
// Generate implements vfs.DynamicBytesSource.
|
||||
// Generate implements vfs.DynamicBytesSource.Generate.
|
||||
func (d *tcpMemData) Generate(ctx context.Context, buf *bytes.Buffer) error {
|
||||
d.mu.Lock()
|
||||
defer d.mu.Unlock()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user