diff options
author | Jakob Unterwurzacher | 2016-09-24 22:40:00 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2016-09-25 16:43:17 +0200 |
commit | 52a6f4f71ed464eb64dc05e0768d4af58bd2c195 (patch) | |
tree | 52740abbd7a29135f6919c66e793ce9c49c0fe2d /internal/fusefrontend_reverse/rfs.go | |
parent | 6ffd07f02aaf75f9a6a75982fd8c8cd3f279701b (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.go | 15 |
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 } |