@@ -273,7 +273,6 @@ func initFuseFrontend(args *argContainer) (rootNode fs.InodeEmbedder, wipeKeys f
273
273
LongNames : args .longnames ,
274
274
ConfigCustom : args ._configCustom ,
275
275
NoPrealloc : args .noprealloc ,
276
- SerializeReads : args .serialize_reads ,
277
276
ForceDecode : args .forcedecode ,
278
277
ForceOwner : args ._forceOwner ,
279
278
Exclude : args .exclude ,
@@ -377,6 +376,14 @@ func initGoFuse(rootNode fs.InodeEmbedder, args *argContainer) *fuse.Server {
377
376
MaxWrite : fuse .MAX_KERNEL_WRITE ,
378
377
Options : []string {fmt .Sprintf ("max_read=%d" , fuse .MAX_KERNEL_WRITE )},
379
378
Debug : args .fusedebug ,
379
+ // The kernel usually submits multiple read requests in parallel,
380
+ // which means we serve them in any order. Out-of-order reads are
381
+ // expensive on some backing network filesystems
382
+ // ( https://github.com/rfjakob/gocryptfs/issues/92 ).
383
+ //
384
+ // Setting SyncRead disables FUSE_CAP_ASYNC_READ. This makes the kernel
385
+ // do everything in-order without parallelism.
386
+ SyncRead : args .serialize_reads ,
380
387
}
381
388
382
389
mOpts := & fuseOpts .MountOptions
0 commit comments