diff options
| author | Jakob Unterwurzacher | 2017-08-15 18:35:30 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2017-08-15 19:04:02 +0200 | 
| commit | 989b88098951e5ad68b66049e59fd2ca475c4711 (patch) | |
| tree | 189387bad1071586c246b17f2b0a4373aca56399 /internal | |
| parent | e50a6a57e57bc3cc925ba9a6e7f4dc1da4da3c84 (diff) | |
fusefrontend: use Getdents if available
Getdents avoids calling Lstat on each file.
Diffstat (limited to 'internal')
| -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 | 
