diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-06-12 01:37:24 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-06-12 01:37:24 +0000 |
commit | 9a68bd8e535e5d0b019c8412804e05340aa95d5c (patch) | |
tree | 0bf6e248851f24e3f5bf204a9e911d813869beac /pkg/sentry/fsimpl/overlay/fstree.go | |
parent | cc43d0e74eb9a7081aa262e21fd5d2c770ab50d6 (diff) | |
parent | 77c206e3719962d27cc60781ca59712b040587ab (diff) |
Merge release-20200522.0-145-g77c206e37 (automated)
Diffstat (limited to 'pkg/sentry/fsimpl/overlay/fstree.go')
-rw-r--r-- | pkg/sentry/fsimpl/overlay/fstree.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/pkg/sentry/fsimpl/overlay/fstree.go b/pkg/sentry/fsimpl/overlay/fstree.go new file mode 100644 index 000000000..1fa1b4ad3 --- /dev/null +++ b/pkg/sentry/fsimpl/overlay/fstree.go @@ -0,0 +1,46 @@ +package overlay + +import ( + "gvisor.dev/gvisor/pkg/fspath" + "gvisor.dev/gvisor/pkg/sentry/vfs" +) + +// IsAncestorDentry returns true if d is an ancestor of d2; that is, d is +// either d2's parent or an ancestor of d2's parent. +func genericIsAncestorDentry(d, d2 *dentry) bool { + for d2 != nil { + if d2.parent == d { + return true + } + if d2.parent == d2 { + return false + } + d2 = d2.parent + } + return false +} + +// ParentOrSelf returns d.parent. If d.parent is nil, ParentOrSelf returns d. +func genericParentOrSelf(d *dentry) *dentry { + if d.parent != nil { + return d.parent + } + return d +} + +// PrependPath is a generic implementation of FilesystemImpl.PrependPath(). +func genericPrependPath(vfsroot vfs.VirtualDentry, mnt *vfs.Mount, d *dentry, b *fspath.Builder) error { + for { + if mnt == vfsroot.Mount() && &d.vfsd == vfsroot.Dentry() { + return vfs.PrependPathAtVFSRootError{} + } + if &d.vfsd == mnt.Root() { + return nil + } + if d.parent == nil { + return vfs.PrependPathAtNonMountRootError{} + } + b.PrependComponent(d.name) + d = d.parent + } +} |