summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fs/gofer/path.go
diff options
context:
space:
mode:
authorNicolas Lacasse <nlacasse@google.com>2018-08-10 15:41:44 -0700
committerShentubot <shentubot@google.com>2018-08-10 15:43:03 -0700
commit567c5eed11cfcea78b80169487664106a41fa1fe (patch)
treecde494fdd518f3ff4e8b8a804a2df01a37953c18 /pkg/sentry/fs/gofer/path.go
parent3c60a192ca96838e895bd3607f8a85845245f81e (diff)
cache policy: Check policy before returning a negative dirent.
The cache policy determines whether Lookup should return a negative dirent, or just ENOENT. This CL fixes one spot where we returned a negative dirent without first consulting the policy. PiperOrigin-RevId: 208280230 Change-Id: I8f963bbdb45a95a74ad0ecc1eef47eff2092d3a4
Diffstat (limited to 'pkg/sentry/fs/gofer/path.go')
-rw-r--r--pkg/sentry/fs/gofer/path.go12
1 files changed, 8 insertions, 4 deletions
diff --git a/pkg/sentry/fs/gofer/path.go b/pkg/sentry/fs/gofer/path.go
index 15e9863fb..bec9680f8 100644
--- a/pkg/sentry/fs/gofer/path.go
+++ b/pkg/sentry/fs/gofer/path.go
@@ -29,15 +29,19 @@ import (
// Lookup loads an Inode at name into a Dirent based on the session's cache
// policy.
func (i *inodeOperations) Lookup(ctx context.Context, dir *fs.Inode, name string) (*fs.Dirent, error) {
- if i.session().cachePolicy.cacheReaddir() {
+ cp := i.session().cachePolicy
+ if cp.cacheReaddir() {
// Check to see if we have readdirCache that indicates the
// child does not exist. Avoid holding readdirMu longer than
// we need to.
i.readdirMu.Lock()
if i.readdirCache != nil && !i.readdirCache.Contains(name) {
- // No such child. Return a negative dirent.
+ // No such child.
i.readdirMu.Unlock()
- return fs.NewNegativeDirent(name), nil
+ if cp.cacheNegativeDirents() {
+ return fs.NewNegativeDirent(name), nil
+ }
+ return nil, syserror.ENOENT
}
i.readdirMu.Unlock()
}
@@ -46,7 +50,7 @@ func (i *inodeOperations) Lookup(ctx context.Context, dir *fs.Inode, name string
qids, newFile, mask, p9attr, err := i.fileState.file.walkGetAttr(ctx, []string{name})
if err != nil {
if err == syscall.ENOENT {
- if i.session().cachePolicy.cacheNegativeDirents() {
+ if cp.cacheNegativeDirents() {
// Return a negative Dirent. It will stay cached until something
// is created over it.
return fs.NewNegativeDirent(name), nil