diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-04-21 19:20:51 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-04-21 19:20:51 +0000 |
commit | b5cdbb659d6ecd5a38090093369c81db76e8a152 (patch) | |
tree | 533d1ae7bafb1e27b601b62cc24b2cfc99ee6a5a /pkg/sentry/fsimpl/gofer/fstree.go | |
parent | 3477221b21c89c56d64b039324513cda51b3f50a (diff) | |
parent | 9b5e305e05ef3ad51778981062d6152cea1cd4fb (diff) |
Merge release-20200323.0-203-g9b5e305 (automated)
Diffstat (limited to 'pkg/sentry/fsimpl/gofer/fstree.go')
-rwxr-xr-x | pkg/sentry/fsimpl/gofer/fstree.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/pkg/sentry/fsimpl/gofer/fstree.go b/pkg/sentry/fsimpl/gofer/fstree.go new file mode 100755 index 000000000..9ef0dd8c8 --- /dev/null +++ b/pkg/sentry/fsimpl/gofer/fstree.go @@ -0,0 +1,45 @@ +package gofer + +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 { + if d2.parent == d { + return true + } + if d2.parent == d2 { + return false + } + d2 = d2.parent + } +} + +// 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 + } +} |