aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorJakob Unterwurzacher2016-09-21 23:22:13 +0200
committerJakob Unterwurzacher2016-09-25 16:43:17 +0200
commitb34a665da4a15762fc2e21e125ba705f691ec5d7 (patch)
treec08b961470ae254936ac4ee5747c07a313f865f0 /internal
parent01c18dbcab455f90ced6a3e35a6c9e645b1c5e2a (diff)
nametransform: implement ReadDirIV without Openat
As ReadDirIV operates on a path anyway, opening the directory has no clear safety advantage w.r.t. concurrent renames. If the backing directory is a reverse-mounted gocryptfs filesystem, each directory open is an OPENDIR, and this causes a full directory read! This patch improves the "ls -lR" performance of an DIR --> gocryptfs-reverse --> gocryptfs chain by a factor of ~10. OPENDIR counts for ls -lR: Before 15570 After 2745
Diffstat (limited to 'internal')
-rw-r--r--internal/nametransform/diriv.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/internal/nametransform/diriv.go b/internal/nametransform/diriv.go
index 11bd729..66548f1 100644
--- a/internal/nametransform/diriv.go
+++ b/internal/nametransform/diriv.go
@@ -24,13 +24,12 @@ const (
// ReadDirIV - read the "gocryptfs.diriv" file from "dir" (absolute ciphertext path)
// This function is exported because it allows for an efficient readdir implementation.
func ReadDirIV(dir string) (iv []byte, err error) {
- dirfd, err := os.Open(dir)
+ fd, err := os.Open(filepath.Join(dir, DirIVFilename))
if err != nil {
return nil, err
}
- defer dirfd.Close()
-
- return ReadDirIVAt(dirfd)
+ defer fd.Close()
+ return fdReadDirIV(fd)
}
// ReadDirIVAt reads "gocryptfs.diriv" from the directory that is opened as "dirfd".
@@ -44,7 +43,11 @@ func ReadDirIVAt(dirfd *os.File) (iv []byte, err error) {
}
fd := os.NewFile(uintptr(fdRaw), DirIVFilename)
defer fd.Close()
+ return fdReadDirIV(fd)
+}
+// fdReadDirIV reads and verifies the DirIV from an opened gocryptfs.diriv file.
+func fdReadDirIV(fd *os.File) (iv []byte, err error) {
// We want to detect if the file is bigger than DirIVLen, so
// make the buffer 1 byte bigger than neccessary.
iv = make([]byte, DirIVLen+1)