From 4954c87979efaf5b8184efccc7d9a38c21e4209b Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sat, 21 Oct 2017 18:06:55 +0200 Subject: [PATCH] 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 --- mount.go | 10 ++++++++-- 1 file 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 " +