aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2017-10-21 18:06:55 +0200
committerJakob Unterwurzacher2017-10-21 18:06:55 +0200
commit4954c87979efaf5b8184efccc7d9a38c21e4209b (patch)
tree88dd50522544cce6da9ad86f1d4413317790a117
parent268e0484e24c3ecf9ec8df189a18cbbf36f81d1a (diff)
Always set "max_read" kernel option
We use fixed-size byte slice pools (sync.Pool) and cannot handle larger requests. So ask the kernel to not send bigger ones. Fixes https://github.com/rfjakob/gocryptfs/issues/145
-rw-r--r--mount.go10
1 files changed, 8 insertions, 2 deletions
diff --git a/mount.go b/mount.go
index 89ac6d8..143747c 100644
--- a/mount.go
+++ b/mount.go
@@ -2,6 +2,7 @@ package main
import (
"encoding/json"
+ "fmt"
"log/syslog"
"net"
"os"
@@ -250,9 +251,14 @@ func initFuseFrontend(masterkey []byte, args *argContainer, confFile *configfile
}
conn := nodefs.NewFileSystemConnector(pathFs.Root(), fuseOpts)
mOpts := fuse.MountOptions{
- // Bigger writes mean fewer calls and better throughput.
- // Capped to 128KiB on Linux.
+ // Writes and reads are usually capped at 128kiB on Linux through
+ // the FUSE_MAX_PAGES_PER_REQ kernel constant in fuse_i.h. Our
+ // sync.Pool buffer pools are sized acc. to the default. Users may set
+ // the kernel constant higher, and Synology NAS kernels are known to
+ // have it >128kiB. We cannot handle more than 128kiB, so we tell
+ // the kernel to limit the size explicitely.
MaxWrite: fuse.MAX_KERNEL_WRITE,
+ Options: []string{fmt.Sprintf("max_read=%d", fuse.MAX_KERNEL_WRITE)},
}
if args.allow_other {
tlog.Info.Printf(tlog.ColorYellow + "The option \"-allow_other\" is set. Make sure the file " +