mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Use kernfs.Dentry for kernfs.Lookup.
Updates #1193. PiperOrigin-RevId: 332939026
This commit is contained in:
@@ -198,7 +198,7 @@ func (i *rootInode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.D
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.Inode.Lookup.
|
||||
func (i *rootInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (i *rootInode) Lookup(ctx context.Context, name string) (*kernfs.Dentry, error) {
|
||||
idx, err := strconv.ParseUint(name, 10, 32)
|
||||
if err != nil {
|
||||
return nil, syserror.ENOENT
|
||||
@@ -207,7 +207,7 @@ func (i *rootInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error
|
||||
defer i.mu.Unlock()
|
||||
if si, ok := i.replicas[uint32(idx)]; ok {
|
||||
si.dentry.IncRef()
|
||||
return si.dentry.VFSDentry(), nil
|
||||
return &si.dentry, nil
|
||||
|
||||
}
|
||||
return nil, syserror.ENOENT
|
||||
|
||||
@@ -402,7 +402,7 @@ func (i *inode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentr
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.Inode.Lookup.
|
||||
func (i *inode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (i *inode) Lookup(ctx context.Context, name string) (*kernfs.Dentry, error) {
|
||||
in := linux.FUSELookupIn{Name: name}
|
||||
return i.newEntry(ctx, name, 0, linux.FUSE_LOOKUP, &in)
|
||||
}
|
||||
@@ -432,7 +432,11 @@ func (i *inode) NewFile(ctx context.Context, name string, opts vfs.OpenOptions)
|
||||
},
|
||||
Name: name,
|
||||
}
|
||||
return i.newEntry(ctx, name, linux.S_IFREG, linux.FUSE_CREATE, &in)
|
||||
d, err := i.newEntry(ctx, name, linux.S_IFREG, linux.FUSE_CREATE, &in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return d.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// NewNode implements kernfs.Inode.NewNode.
|
||||
@@ -445,7 +449,11 @@ func (i *inode) NewNode(ctx context.Context, name string, opts vfs.MknodOptions)
|
||||
},
|
||||
Name: name,
|
||||
}
|
||||
return i.newEntry(ctx, name, opts.Mode.FileType(), linux.FUSE_MKNOD, &in)
|
||||
d, err := i.newEntry(ctx, name, opts.Mode.FileType(), linux.FUSE_MKNOD, &in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return d.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// NewSymlink implements kernfs.Inode.NewSymlink.
|
||||
@@ -454,7 +462,11 @@ func (i *inode) NewSymlink(ctx context.Context, name, target string) (*vfs.Dentr
|
||||
Name: name,
|
||||
Target: target,
|
||||
}
|
||||
return i.newEntry(ctx, name, linux.S_IFLNK, linux.FUSE_SYMLINK, &in)
|
||||
d, err := i.newEntry(ctx, name, linux.S_IFLNK, linux.FUSE_SYMLINK, &in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return d.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// Unlink implements kernfs.Inode.Unlink.
|
||||
@@ -489,7 +501,11 @@ func (i *inode) NewDir(ctx context.Context, name string, opts vfs.MkdirOptions)
|
||||
},
|
||||
Name: name,
|
||||
}
|
||||
return i.newEntry(ctx, name, linux.S_IFDIR, linux.FUSE_MKDIR, &in)
|
||||
d, err := i.newEntry(ctx, name, linux.S_IFDIR, linux.FUSE_MKDIR, &in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return d.VFSDentry(), nil
|
||||
}
|
||||
|
||||
// RmDir implements kernfs.Inode.RmDir.
|
||||
@@ -521,7 +537,7 @@ func (i *inode) RmDir(ctx context.Context, name string, child *vfs.Dentry) error
|
||||
|
||||
// newEntry calls FUSE server for entry creation and allocates corresponding entry according to response.
|
||||
// Shared by FUSE_MKNOD, FUSE_MKDIR, FUSE_SYMLINK, FUSE_LINK and FUSE_LOOKUP.
|
||||
func (i *inode) newEntry(ctx context.Context, name string, fileType linux.FileMode, opcode linux.FUSEOpcode, payload marshal.Marshallable) (*vfs.Dentry, error) {
|
||||
func (i *inode) newEntry(ctx context.Context, name string, fileType linux.FileMode, opcode linux.FUSEOpcode, payload marshal.Marshallable) (*kernfs.Dentry, error) {
|
||||
kernelTask := kernel.TaskFromContext(ctx)
|
||||
if kernelTask == nil {
|
||||
log.Warningf("fusefs.Inode.newEntry: couldn't get kernel task from context", i.nodeID)
|
||||
@@ -551,7 +567,7 @@ func (i *inode) newEntry(ctx context.Context, name string, fileType linux.FileMo
|
||||
} else {
|
||||
i.dentry.InsertChild(name, child)
|
||||
}
|
||||
return child.VFSDentry(), nil
|
||||
return child, nil
|
||||
}
|
||||
|
||||
// Getlink implements kernfs.Inode.Getlink.
|
||||
|
||||
@@ -127,20 +127,15 @@ func (fs *Filesystem) revalidateChildLocked(ctx context.Context, vfsObj *vfs.Vir
|
||||
}
|
||||
}
|
||||
if child == nil {
|
||||
// Dentry isn't cached; it either doesn't exist or failed
|
||||
// revalidation. Attempt to resolve it via Lookup.
|
||||
//
|
||||
// FIXME(gvisor.dev/issue/1193): Inode.Lookup() should return
|
||||
// *(kernfs.)Dentry, not *vfs.Dentry, since (kernfs.)Filesystem assumes
|
||||
// that all dentries in the filesystem are (kernfs.)Dentry and performs
|
||||
// vfs.DentryImpl casts accordingly.
|
||||
childVFSD, err := parent.inode.Lookup(ctx, name)
|
||||
// Dentry isn't cached; it either doesn't exist or failed revalidation.
|
||||
// Attempt to resolve it via Lookup.
|
||||
c, err := parent.inode.Lookup(ctx, name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Reference on childVFSD dropped by a corresponding Valid.
|
||||
child = childVFSD.Impl().(*Dentry)
|
||||
parent.InsertChildLocked(name, child)
|
||||
parent.InsertChildLocked(name, c)
|
||||
child = c
|
||||
}
|
||||
return child, nil
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ func (InodeNotDirectory) Rename(context.Context, string, string, *vfs.Dentry, *v
|
||||
}
|
||||
|
||||
// Lookup implements Inode.Lookup.
|
||||
func (InodeNotDirectory) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (InodeNotDirectory) Lookup(ctx context.Context, name string) (*Dentry, error) {
|
||||
panic("Lookup called on non-directory inode")
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ func (InodeNotDirectory) Valid(context.Context) bool {
|
||||
type InodeNoDynamicLookup struct{}
|
||||
|
||||
// Lookup implements Inode.Lookup.
|
||||
func (InodeNoDynamicLookup) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (InodeNoDynamicLookup) Lookup(ctx context.Context, name string) (*Dentry, error) {
|
||||
return nil, syserror.ENOENT
|
||||
}
|
||||
|
||||
|
||||
@@ -449,7 +449,7 @@ type inodeDynamicLookup interface {
|
||||
//
|
||||
// Lookup returns the child with an extra reference and the caller owns this
|
||||
// reference.
|
||||
Lookup(ctx context.Context, name string) (*vfs.Dentry, error)
|
||||
Lookup(ctx context.Context, name string) (*Dentry, error)
|
||||
|
||||
// Valid should return true if this inode is still valid, or needs to
|
||||
// be resolved again by a call to Lookup.
|
||||
|
||||
@@ -69,7 +69,7 @@ func (fs *filesystem) newSubtasks(task *kernel.Task, pidns *kernel.PIDNamespace,
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *subtasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (i *subtasksInode) Lookup(ctx context.Context, name string) (*kernfs.Dentry, error) {
|
||||
tid, err := strconv.ParseUint(name, 10, 32)
|
||||
if err != nil {
|
||||
return nil, syserror.ENOENT
|
||||
@@ -82,9 +82,7 @@ func (i *subtasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, e
|
||||
if subTask.ThreadGroup() != i.task.ThreadGroup() {
|
||||
return nil, syserror.ENOENT
|
||||
}
|
||||
|
||||
subTaskDentry := i.fs.newTaskInode(subTask, i.pidns, false, i.cgroupControllers)
|
||||
return subTaskDentry.VFSDentry(), nil
|
||||
return i.fs.newTaskInode(subTask, i.pidns, false, i.cgroupControllers), nil
|
||||
}
|
||||
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.IterDirents.
|
||||
|
||||
@@ -136,7 +136,7 @@ func (fs *filesystem) newFDDirInode(task *kernel.Task) *kernfs.Dentry {
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *fdDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (i *fdDirInode) Lookup(ctx context.Context, name string) (*kernfs.Dentry, error) {
|
||||
fdInt, err := strconv.ParseInt(name, 10, 32)
|
||||
if err != nil {
|
||||
return nil, syserror.ENOENT
|
||||
@@ -145,8 +145,7 @@ func (i *fdDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, erro
|
||||
if !taskFDExists(ctx, i.task, fd) {
|
||||
return nil, syserror.ENOENT
|
||||
}
|
||||
taskDentry := i.fs.newFDSymlink(i.task, fd, i.fs.NextIno())
|
||||
return taskDentry.VFSDentry(), nil
|
||||
return i.fs.newFDSymlink(i.task, fd, i.fs.NextIno()), nil
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.Open.
|
||||
@@ -270,7 +269,7 @@ func (fs *filesystem) newFDInfoDirInode(task *kernel.Task) *kernfs.Dentry {
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *fdInfoDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (i *fdInfoDirInode) Lookup(ctx context.Context, name string) (*kernfs.Dentry, error) {
|
||||
fdInt, err := strconv.ParseInt(name, 10, 32)
|
||||
if err != nil {
|
||||
return nil, syserror.ENOENT
|
||||
@@ -283,8 +282,7 @@ func (i *fdInfoDirInode) Lookup(ctx context.Context, name string) (*vfs.Dentry,
|
||||
task: i.task,
|
||||
fd: fd,
|
||||
}
|
||||
dentry := i.fs.newTaskOwnedFile(i.task, i.fs.NextIno(), 0444, data)
|
||||
return dentry.VFSDentry(), nil
|
||||
return i.fs.newTaskOwnedFile(i.task, i.fs.NextIno(), 0444, data), nil
|
||||
}
|
||||
|
||||
// Open implements kernfs.Inode.Open.
|
||||
|
||||
@@ -52,8 +52,8 @@ type tasksInode struct {
|
||||
|
||||
// '/proc/self' and '/proc/thread-self' have custom directory offsets in
|
||||
// Linux. So handle them outside of OrderedChildren.
|
||||
selfSymlink *vfs.Dentry
|
||||
threadSelfSymlink *vfs.Dentry
|
||||
selfSymlink *kernfs.Dentry
|
||||
threadSelfSymlink *kernfs.Dentry
|
||||
|
||||
// cgroupControllers is a map of controller name to directory in the
|
||||
// cgroup hierarchy. These controllers are immutable and will be listed
|
||||
@@ -81,8 +81,8 @@ func (fs *filesystem) newTasksInode(k *kernel.Kernel, pidns *kernel.PIDNamespace
|
||||
inode := &tasksInode{
|
||||
pidns: pidns,
|
||||
fs: fs,
|
||||
selfSymlink: fs.newSelfSymlink(root, fs.NextIno(), pidns).VFSDentry(),
|
||||
threadSelfSymlink: fs.newThreadSelfSymlink(root, fs.NextIno(), pidns).VFSDentry(),
|
||||
selfSymlink: fs.newSelfSymlink(root, fs.NextIno(), pidns),
|
||||
threadSelfSymlink: fs.newThreadSelfSymlink(root, fs.NextIno(), pidns),
|
||||
cgroupControllers: cgroupControllers,
|
||||
}
|
||||
inode.InodeAttrs.Init(root, linux.UNNAMED_MAJOR, fs.devMinor, fs.NextIno(), linux.ModeDirectory|0555)
|
||||
@@ -99,7 +99,7 @@ func (fs *filesystem) newTasksInode(k *kernel.Kernel, pidns *kernel.PIDNamespace
|
||||
}
|
||||
|
||||
// Lookup implements kernfs.inodeDynamicLookup.Lookup.
|
||||
func (i *tasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, error) {
|
||||
func (i *tasksInode) Lookup(ctx context.Context, name string) (*kernfs.Dentry, error) {
|
||||
// Try to lookup a corresponding task.
|
||||
tid, err := strconv.ParseUint(name, 10, 64)
|
||||
if err != nil {
|
||||
@@ -118,8 +118,7 @@ func (i *tasksInode) Lookup(ctx context.Context, name string) (*vfs.Dentry, erro
|
||||
return nil, syserror.ENOENT
|
||||
}
|
||||
|
||||
taskDentry := i.fs.newTaskInode(task, i.pidns, true, i.cgroupControllers)
|
||||
return taskDentry.VFSDentry(), nil
|
||||
return i.fs.newTaskInode(task, i.pidns, true, i.cgroupControllers), nil
|
||||
}
|
||||
|
||||
// IterDirents implements kernfs.inodeDynamicLookup.IterDirents.
|
||||
|
||||
Reference in New Issue
Block a user