diff options
-rw-r--r-- | internal/fusefrontend/fs_dir.go | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/internal/fusefrontend/fs_dir.go b/internal/fusefrontend/fs_dir.go index 30e715a..44a4ad2 100644 --- a/internal/fusefrontend/fs_dir.go +++ b/internal/fusefrontend/fs_dir.go @@ -242,16 +242,25 @@ func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, f return nil, fuse.ToStatus(err) } // Read ciphertext directory - cipherEntries, status := fs.FileSystem.OpenDir(cDirName, context) - if cipherEntries == nil { - return nil, status + cDirAbsPath := filepath.Join(fs.args.Cipherdir, cDirName) + var cipherEntries []fuse.DirEntry + var status fuse.Status + if syscallcompat.HaveGetdents { + // Getdents avoids calling Lstat on each file. + cipherEntries, err = syscallcompat.Getdents(cDirAbsPath) + if err != nil { + return nil, fuse.ToStatus(err) + } + } else { + cipherEntries, status = fs.FileSystem.OpenDir(cDirName, context) + if !status.Ok() { + return nil, status + } } // Get DirIV (stays nil if PlaintextNames is used) var cachedIV []byte - var cDirAbsPath string if !fs.args.PlaintextNames { // Read the DirIV once and use it for all later name decryptions - cDirAbsPath = filepath.Join(fs.args.Cipherdir, cDirName) cachedIV, err = nametransform.ReadDirIV(cDirAbsPath) if err != nil { // This can happen during normal operation when the directory has |