diff options
| author | Jakob Unterwurzacher | 2016-11-01 10:34:41 +0100 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2016-11-01 10:34:41 +0100 | 
| commit | a9c7565b8002a98f7dc77dfd675ecf1c803fe6b5 (patch) | |
| tree | 53eb77082018397b60c2f1b9b475f2f41c97e436 /internal | |
| parent | fd88dbd6873eb28b3b245c4e35933df6f3d3ad32 (diff) | |
fusefrontend: refactor dirIVCache
Simplify the code a bit.
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/nametransform/diriv.go | 4 | ||||
| -rw-r--r-- | internal/nametransform/diriv_cache.go | 47 | 
2 files changed, 28 insertions, 23 deletions
| diff --git a/internal/nametransform/diriv.go b/internal/nametransform/diriv.go index 30d4b87..f8734db 100644 --- a/internal/nametransform/diriv.go +++ b/internal/nametransform/diriv.go @@ -92,8 +92,8 @@ func (be *NameTransform) EncryptPathDirIV(plainPath string, rootDir string) (cip  	}  	// Check if the DirIV is cached  	parentDir := filepath.Dir(plainPath) -	found, iv, cParentDir := be.DirIVCache.lookup(parentDir) -	if found { +	iv, cParentDir := be.DirIVCache.lookup(parentDir) +	if iv != nil {  		cBaseName := be.EncryptName(baseName, iv)  		if be.longNames && len(cBaseName) > syscall.NAME_MAX {  			cBaseName = HashLongName(cBaseName) diff --git a/internal/nametransform/diriv_cache.go b/internal/nametransform/diriv_cache.go index c6f2ca9..068fd45 100644 --- a/internal/nametransform/diriv_cache.go +++ b/internal/nametransform/diriv_cache.go @@ -2,42 +2,47 @@ package nametransform  import "sync" -// A simple one-entry DirIV cache +// Single-entry DirIV cache. Stores the directory IV and the encrypted +// path.  type dirIVCache struct { -	// Invalidated? -	cleared bool -	// The DirIV -	iv []byte  	// Directory the DirIV belongs to  	dir string + +	// The DirIV +	iv []byte  	// Ecrypted version of "dir" -	translatedDir string -	// Synchronisation -	lock sync.RWMutex +	cDir string + +	// Invalidated? +	cleared bool +	sync.RWMutex  }  // lookup - fetch entry for "dir" from the cache -func (c *dirIVCache) lookup(dir string) (bool, []byte, string) { -	c.lock.RLock() -	defer c.lock.RUnlock() -	if !c.cleared && c.dir == dir { -		return true, c.iv, c.translatedDir +func (c *dirIVCache) lookup(dir string) ([]byte, string) { +	c.RLock() +	defer c.RUnlock() +	if c.cleared || c.dir != dir { +		return nil, ""  	} -	return false, nil, "" +	return c.iv, c.cDir  } -// store - write entry for "dir" into the caches -func (c *dirIVCache) store(dir string, iv []byte, translatedDir string) { -	c.lock.Lock() -	defer c.lock.Unlock() +// store - write entry for "dir" into the cache +func (c *dirIVCache) store(dir string, iv []byte, cDir string) { +	c.Lock() +	defer c.Unlock()  	c.cleared = false  	c.iv = iv  	c.dir = dir -	c.translatedDir = translatedDir +	c.cDir = cDir  } +// Clear ... clear the cache. +// Exported because it is called from fusefrontend when directories are +// renamed or deleted.  func (c *dirIVCache) Clear() { -	c.lock.Lock() -	defer c.lock.Unlock() +	c.Lock() +	defer c.Unlock()  	c.cleared = true  } | 
