From 71c0481f0e42c6bf1749dde8a30d9a6b728e83a0 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 24 May 2020 23:36:11 +0200 Subject: [PATCH] Revert "fusefrontend: don't always clear the dircache in Rename" As noticed by @slackner in https://github.com/rfjakob/gocryptfs/commit/cb8872577d66ff0fc38bcd70493be06bc0f34ffa#commitcomment-39405233 , this is not safe. This reverts commit cb8872577d66ff0fc38bcd70493be06bc0f34ffa. --- internal/fusefrontend/fs.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index db473ee..e8dae9f 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -533,6 +533,7 @@ func (fs *FS) Symlink(target string, linkName string, context *fuse.Context) (co // // Symlink-safe through Renameat(). func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (code fuse.Status) { + defer fs.dirCache.Clear() if fs.isFiltered(newPath) { return fuse.EPERM } @@ -548,9 +549,6 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod defer syscall.Close(newDirfd) // Easy case. if fs.args.PlaintextNames { - // The rename may replace another directory. Make sure we drop the - // deleted directory from the cache. - defer fs.dirCache.Clear() return fuse.ToStatus(syscallcompat.Renameat(oldDirfd, oldCName, newDirfd, newCName)) } // Long destination file name: create .name file @@ -577,11 +575,6 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod // again. tlog.Debug.Printf("Rename: Handling ENOTEMPTY") if fs.Rmdir(newPath, context) == fuse.OK { - // The rename replaced another directory. Make sure we drop the - // deleted directory from the cache (note: fs.Rmdir also clears it, - // but this is not guaranteed forever, and a double clear does no - // harm). - defer fs.dirCache.Clear() err = syscallcompat.Renameat(oldDirfd, oldCName, newDirfd, newCName) } }