github.com/MerlinKodo/gvisor@v0.0.0-20231110090155-957f62ecf90e/pkg/sentry/fsimpl/tmpfs/fstree.go (about) 1 package tmpfs 2 3 import ( 4 "github.com/MerlinKodo/gvisor/pkg/fspath" 5 "github.com/MerlinKodo/gvisor/pkg/sentry/vfs" 6 ) 7 8 // IsAncestorDentry returns true if d is an ancestor of d2; that is, d is 9 // either d2's parent or an ancestor of d2's parent. 10 func genericIsAncestorDentry(d, d2 *dentry) bool { 11 for d2 != nil { 12 if d2.parent == d { 13 return true 14 } 15 if d2.parent == d2 { 16 return false 17 } 18 d2 = d2.parent 19 } 20 return false 21 } 22 23 // ParentOrSelf returns d.parent. If d.parent is nil, ParentOrSelf returns d. 24 func genericParentOrSelf(d *dentry) *dentry { 25 if d.parent != nil { 26 return d.parent 27 } 28 return d 29 } 30 31 // PrependPath is a generic implementation of FilesystemImpl.PrependPath(). 32 func genericPrependPath(vfsroot vfs.VirtualDentry, mnt *vfs.Mount, d *dentry, b *fspath.Builder) error { 33 for { 34 if mnt == vfsroot.Mount() && &d.vfsd == vfsroot.Dentry() { 35 return vfs.PrependPathAtVFSRootError{} 36 } 37 if mnt != nil && &d.vfsd == mnt.Root() { 38 return nil 39 } 40 if d.parent == nil { 41 return vfs.PrependPathAtNonMountRootError{} 42 } 43 b.PrependComponent(d.name) 44 d = d.parent 45 } 46 } 47 48 // DebugPathname returns a pathname to d relative to its filesystem root. 49 // DebugPathname does not correspond to any Linux function; it's used to 50 // generate dentry pathnames for debugging. 51 func genericDebugPathname(d *dentry) string { 52 var b fspath.Builder 53 _ = genericPrependPath(vfs.VirtualDentry{}, nil, d, &b) 54 return b.String() 55 }