summaryrefslogtreecommitdiff
path: root/internal/fusefrontend_reverse/rpath.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2017-01-03 18:14:01 +0100
committerJakob Unterwurzacher2017-01-03 18:14:01 +0100
commitfe1705c55b5091d2d789b235fd02363b70cecc38 (patch)
tree30ed167873ce301f527e5619d62b9fafbb302dde /internal/fusefrontend_reverse/rpath.go
parentef089c9f804556c8b7208991a482360637aa63bd (diff)
reverse: add single-entry path cache
Speeds up the "ls -lR" benchmark from 2.6 seconds to 2.0.
Diffstat (limited to 'internal/fusefrontend_reverse/rpath.go')
-rw-r--r--internal/fusefrontend_reverse/rpath.go17
1 files changed, 15 insertions, 2 deletions
diff --git a/internal/fusefrontend_reverse/rpath.go b/internal/fusefrontend_reverse/rpath.go
index af49776..9f52b28 100644
--- a/internal/fusefrontend_reverse/rpath.go
+++ b/internal/fusefrontend_reverse/rpath.go
@@ -82,18 +82,31 @@ func (rfs *ReverseFS) decryptPath(relPath string) (string, error) {
if rfs.args.PlaintextNames || relPath == "" {
return relPath, nil
}
+ // Check if the parent dir is in the cache
+ cDir := saneDir(relPath)
+ dirIV, pDir := rPathCache.lookup(cDir)
+ if dirIV != nil {
+ cName := filepath.Base(relPath)
+ pName, err := rfs.rDecryptName(cName, dirIV, pDir)
+ if err != nil {
+ return "", err
+ }
+ return filepath.Join(pDir, pName), nil
+ }
parts := strings.Split(relPath, "/")
var transformedParts []string
for i := range parts {
// Start at the top and recurse
currentCipherDir := filepath.Join(parts[:i]...)
currentPlainDir := filepath.Join(transformedParts[:i]...)
- dirIV := derivePathIV(currentCipherDir, ivPurposeDirIV)
+ dirIV = derivePathIV(currentCipherDir, ivPurposeDirIV)
transformedPart, err := rfs.rDecryptName(parts[i], dirIV, currentPlainDir)
if err != nil {
return "", err
}
transformedParts = append(transformedParts, transformedPart)
}
- return filepath.Join(transformedParts...), nil
+ pRelPath := filepath.Join(transformedParts...)
+ rPathCache.store(cDir, dirIV, saneDir(pRelPath))
+ return pRelPath, nil
}