diff options
author | Jakob Unterwurzacher | 2021-04-03 13:08:28 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2021-04-03 13:08:28 +0200 |
commit | 24d5d39300629de48bb5a3700b0c219f741da028 (patch) | |
tree | 4706420655f30382027e0dd4943d4df5667de41f /internal/fusefrontend/dircache.go | |
parent | 6aae2aad97aee1d269fdbafab6eafa6ff997a73a (diff) |
fs: add initial dirfd caching
dirfd caching was temporarily removed when moving
to the v2api. Add it back to gain back some lost speed.
Diffstat (limited to 'internal/fusefrontend/dircache.go')
-rw-r--r-- | internal/fusefrontend/dircache.go | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/internal/fusefrontend/dircache.go b/internal/fusefrontend/dircache.go index d6ec52c..f8932d8 100644 --- a/internal/fusefrontend/dircache.go +++ b/internal/fusefrontend/dircache.go @@ -21,13 +21,11 @@ const ( enableDebugMessages = false // Enable hit rate statistics printing enableStats = false - - pathFmt = "%-40q" ) type dirCacheEntryStruct struct { - // relative plaintext path to the directory - dirRelPath string + // pointer to the Node this entry belongs to + node *Node // fd to the directory (opened with O_PATH!) fd int // content of gocryptfs.diriv in this directory @@ -46,7 +44,7 @@ func (e *dirCacheEntryStruct) Clear() { } } e.fd = -1 - e.dirRelPath = "" + e.node = nil e.iv = nil } @@ -76,7 +74,7 @@ func (d *dirCacheStruct) Clear() { // Store the entry in the cache. The passed "fd" will be Dup()ed, and the caller // can close their copy at will. -func (d *dirCacheStruct) Store(dirRelPath string, fd int, iv []byte) { +func (d *dirCacheStruct) Store(node *Node, fd int, iv []byte) { // Note: package ensurefds012, imported from main, guarantees that dirCache // can never get fds 0,1,2. if fd <= 0 || len(iv) != nametransform.DirIVLen { @@ -94,9 +92,9 @@ func (d *dirCacheStruct) Store(dirRelPath string, fd int, iv []byte) { tlog.Warn.Printf("dirCache.Store: Dup failed: %v", err) return } - d.dbg("Store "+pathFmt+" fd=%d iv=%x\n", dirRelPath, fd2, iv) + d.dbg("dirCache.Store %p fd=%d iv=%x\n", node, fd2, iv) e.fd = fd2 - e.dirRelPath = dirRelPath + e.node = node e.iv = iv // expireThread is started on the first Lookup() if !d.expireThreadRunning { @@ -108,7 +106,7 @@ func (d *dirCacheStruct) Store(dirRelPath string, fd int, iv []byte) { // Lookup checks if relPath is in the cache, and returns an (fd, iv) pair. // It returns (-1, nil) if not found. The fd is internally Dup()ed and the // caller must close it when done. -func (d *dirCacheStruct) Lookup(dirRelPath string) (fd int, iv []byte) { +func (d *dirCacheStruct) Lookup(node *Node) (fd int, iv []byte) { d.Lock() defer d.Unlock() if enableStats { @@ -121,7 +119,7 @@ func (d *dirCacheStruct) Lookup(dirRelPath string) (fd int, iv []byte) { // Cache slot is empty continue } - if dirRelPath != e.dirRelPath { + if node != e.node { // Not the right path continue } @@ -135,7 +133,7 @@ func (d *dirCacheStruct) Lookup(dirRelPath string) (fd int, iv []byte) { break } if fd == 0 { - d.dbg("Lookup "+pathFmt+" miss\n", dirRelPath) + d.dbg("dirCache.Lookup %p miss\n", node) return -1, nil } if enableStats { @@ -144,7 +142,7 @@ func (d *dirCacheStruct) Lookup(dirRelPath string) (fd int, iv []byte) { if fd <= 0 || len(iv) != nametransform.DirIVLen { log.Panicf("Lookup sanity check failed: fd=%d len=%d", fd, len(iv)) } - d.dbg("Lookup "+pathFmt+" hit fd=%d dup=%d iv=%x\n", dirRelPath, e.fd, fd, iv) + d.dbg("dirCache.Lookup %p hit fd=%d dup=%d iv=%x\n", node, e.fd, fd, iv) return fd, iv } |