summaryrefslogtreecommitdiff
path: root/internal/fusefrontend_reverse/rfs.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2016-09-24 22:40:00 +0200
committerJakob Unterwurzacher2016-09-25 16:43:17 +0200
commit52a6f4f71ed464eb64dc05e0768d4af58bd2c195 (patch)
tree52740abbd7a29135f6919c66e793ce9c49c0fe2d /internal/fusefrontend_reverse/rfs.go
parent6ffd07f02aaf75f9a6a75982fd8c8cd3f279701b (diff)
reverse: add longnameParentCache
findLongnameParent has to read the whole directory to find the right file; add a simple cache to avoid most directory scans.
Diffstat (limited to 'internal/fusefrontend_reverse/rfs.go')
-rw-r--r--internal/fusefrontend_reverse/rfs.go15
1 files changed, 11 insertions, 4 deletions
diff --git a/internal/fusefrontend_reverse/rfs.go b/internal/fusefrontend_reverse/rfs.go
index 7305687..9ebf91c 100644
--- a/internal/fusefrontend_reverse/rfs.go
+++ b/internal/fusefrontend_reverse/rfs.go
@@ -248,9 +248,15 @@ func (rfs *reverseFS) OpenDir(cipherPath string, context *fuse.Context) ([]fuse.
if entries == nil {
return nil, status
}
+ // Allocate maximum possible number of virtual files.
+ // If all files have long names we need a virtual ".name" file for each,
+ // plus one for gocryptfs.diriv.
+ virtualFiles := make([]fuse.DirEntry, len(entries)+1)
// Virtual gocryptfs.diriv file
- dirIVEntry := fuse.DirEntry{syscall.S_IFREG | 0400, nametransform.DirIVFilename}
- virtualFiles := []fuse.DirEntry{dirIVEntry}
+ virtualFiles[0] = fuse.DirEntry{syscall.S_IFREG | 0400, nametransform.DirIVFilename}
+ // Actually used entries
+ nVirtual := 1
+
// Encrypt names
dirIV := deriveDirIV(cipherPath)
for i := range entries {
@@ -263,12 +269,13 @@ func (rfs *reverseFS) OpenDir(cipherPath string, context *fuse.Context) ([]fuse.
if len(cName) > syscall.NAME_MAX {
cName = nametransform.HashLongName(cName)
dotNameFile := fuse.DirEntry{syscall.S_IFREG | 0600, cName + nametransform.LongNameSuffix}
- virtualFiles = append(virtualFiles, dotNameFile)
+ virtualFiles[nVirtual] = dotNameFile
+ nVirtual++
}
}
entries[i].Name = cName
}
- entries = append(entries, virtualFiles...)
+ entries = append(entries, virtualFiles[:nVirtual]...)
return entries, fuse.OK
}