aboutsummaryrefslogtreecommitdiff
path: root/internal/fusefrontend/fs_dir.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2017-09-05 22:08:59 +0200
committerJakob Unterwurzacher2017-09-05 22:10:08 +0200
commit6f3b65d924d8ab0827516ee274935b2c18979e10 (patch)
treefdc0bcecb3ed74ff4f745393b6a9383977716d36 /internal/fusefrontend/fs_dir.go
parent3a5a783b54a913294658041f22066e0618ee91f3 (diff)
fusefrontend: reorder logic in Rmdir to get rid of one indentation level
Handle the errors first so that the normal code path is not indented. This should not cause any behavoir changes.
Diffstat (limited to 'internal/fusefrontend/fs_dir.go')
-rw-r--r--internal/fusefrontend/fs_dir.go84
1 files changed, 42 insertions, 42 deletions
diff --git a/internal/fusefrontend/fs_dir.go b/internal/fusefrontend/fs_dir.go
index 0252c2a..c1bf9bf 100644
--- a/internal/fusefrontend/fs_dir.go
+++ b/internal/fusefrontend/fs_dir.go
@@ -175,58 +175,58 @@ func (fs *FS) Rmdir(path string, context *fuse.Context) (code fuse.Status) {
}
dirfd := os.NewFile(uintptr(dirfdRaw), cName)
defer dirfd.Close()
-
+ // Check directory contents
children, err := dirfd.Readdirnames(10)
- if err == nil {
- // If the directory is not empty besides gocryptfs.diriv, do not even
- // attempt the dance around gocryptfs.diriv.
- if len(children) > 1 {
- return fuse.ToStatus(syscall.ENOTEMPTY)
- }
- // Move "gocryptfs.diriv" to the parent dir as "gocryptfs.diriv.rmdir.XYZ"
- tmpName := fmt.Sprintf("gocryptfs.diriv.rmdir.%d", cryptocore.RandUint64())
- tlog.Debug.Printf("Rmdir: Renaming %s to %s", nametransform.DirIVFilename, tmpName)
- // The directory is in an inconsistent state between rename and rmdir.
- // Protect against concurrent readers.
- fs.dirIVLock.Lock()
- defer fs.dirIVLock.Unlock()
- err = syscallcompat.Renameat(int(dirfd.Fd()), nametransform.DirIVFilename,
- int(parentDirFd.Fd()), tmpName)
- if err != nil {
- tlog.Warn.Printf("Rmdir: Renaming %s to %s failed: %v",
- nametransform.DirIVFilename, tmpName, err)
- return fuse.ToStatus(err)
- }
- // Actual Rmdir
- // TODO Use syscall.Unlinkat with the AT_REMOVEDIR flag once it is available
- // in Go
- err = syscall.Rmdir(cPath)
- if err != nil {
- // This can happen if another file in the directory was created in the
- // meantime, undo the rename
- err2 := syscallcompat.Renameat(int(parentDirFd.Fd()), tmpName,
- int(dirfd.Fd()), nametransform.DirIVFilename)
- if err != nil {
- tlog.Warn.Printf("Rmdir: Rename rollback failed: %v", err2)
- }
- return fuse.ToStatus(err)
- }
- // Delete "gocryptfs.diriv.rmdir.XYZ"
- err = syscallcompat.Unlinkat(int(parentDirFd.Fd()), tmpName)
- if err != nil {
- tlog.Warn.Printf("Rmdir: Could not clean up %s: %v", tmpName, err)
- }
- } else if err == io.EOF {
+ if err == io.EOF {
// The directory is empty
tlog.Warn.Printf("Rmdir: %q: gocryptfs.diriv is missing", cPath)
err = syscall.Rmdir(cPath)
if err != nil {
return fuse.ToStatus(err)
}
- } else {
+ }
+ if err != nil {
tlog.Warn.Printf("Rmdir: Readdirnames: %v", err)
return fuse.ToStatus(err)
}
+ // If the directory is not empty besides gocryptfs.diriv, do not even
+ // attempt the dance around gocryptfs.diriv.
+ if len(children) > 1 {
+ return fuse.ToStatus(syscall.ENOTEMPTY)
+ }
+ // Move "gocryptfs.diriv" to the parent dir as "gocryptfs.diriv.rmdir.XYZ"
+ tmpName := fmt.Sprintf("gocryptfs.diriv.rmdir.%d", cryptocore.RandUint64())
+ tlog.Debug.Printf("Rmdir: Renaming %s to %s", nametransform.DirIVFilename, tmpName)
+ // The directory is in an inconsistent state between rename and rmdir.
+ // Protect against concurrent readers.
+ fs.dirIVLock.Lock()
+ defer fs.dirIVLock.Unlock()
+ err = syscallcompat.Renameat(int(dirfd.Fd()), nametransform.DirIVFilename,
+ int(parentDirFd.Fd()), tmpName)
+ if err != nil {
+ tlog.Warn.Printf("Rmdir: Renaming %s to %s failed: %v",
+ nametransform.DirIVFilename, tmpName, err)
+ return fuse.ToStatus(err)
+ }
+ // Actual Rmdir
+ // TODO Use syscall.Unlinkat with the AT_REMOVEDIR flag once it is available
+ // in Go
+ err = syscall.Rmdir(cPath)
+ if err != nil {
+ // This can happen if another file in the directory was created in the
+ // meantime, undo the rename
+ err2 := syscallcompat.Renameat(int(parentDirFd.Fd()), tmpName,
+ int(dirfd.Fd()), nametransform.DirIVFilename)
+ if err != nil {
+ tlog.Warn.Printf("Rmdir: Rename rollback failed: %v", err2)
+ }
+ return fuse.ToStatus(err)
+ }
+ // Delete "gocryptfs.diriv.rmdir.XYZ"
+ err = syscallcompat.Unlinkat(int(parentDirFd.Fd()), tmpName)
+ if err != nil {
+ tlog.Warn.Printf("Rmdir: Could not clean up %s: %v", tmpName, err)
+ }
// Delete .name file
if nametransform.IsLongContent(cName) {
nametransform.DeleteLongName(parentDirFd, cName)