From 8c1b363f74f4db4e413fe17e327a82bd6ef66837 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 22 Oct 2017 14:43:24 +0200 Subject: [PATCH] reverse mode: disable ClientInodes (hard link tracking) Disable hard link tracking to avoid strange breakage on duplicate inode numbers ( https://github.com/rfjakob/gocryptfs/issues/149 ). Reverse mode is read-only, so we don't need a working link(). --- mount.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mount.go b/mount.go index 143747c..4f57381 100644 --- a/mount.go +++ b/mount.go @@ -221,10 +221,19 @@ func initFuseFrontend(masterkey []byte, args *argContainer, confFile *configfile tlog.Debug.Printf("frontendArgs: %s", string(jsonBytes)) var finalFs pathfs.FileSystem var ctlSockBackend ctlsock.Interface + // pathFsOpts are passed into go-fuse/pathfs + pathFsOpts := &pathfs.PathNodeFsOptions{ClientInodes: true} if args.reverse { + // The dance with the intermediate variables is because we need to + // cast the FS into pathfs.FileSystem *and* ctlsock.Interface. This + // avoids using interface{}. fs := fusefrontend_reverse.NewFS(masterkey, frontendArgs) finalFs = fs ctlSockBackend = fs + // Reverse mode is read-only, so we don't need a working link(). + // Disable hard link tracking to avoid strange breakage on duplicate + // inode numbers ( https://github.com/rfjakob/gocryptfs/issues/149 ). + pathFsOpts.ClientInodes = false } else { fs := fusefrontend.NewFS(masterkey, frontendArgs) finalFs = fs @@ -240,7 +249,6 @@ func initFuseFrontend(masterkey []byte, args *argContainer, confFile *configfile if args._ctlsockFd != nil { go ctlsock.Serve(args._ctlsockFd, ctlSockBackend) } - pathFsOpts := &pathfs.PathNodeFsOptions{ClientInodes: true} pathFs := pathfs.NewPathNodeFs(finalFs, pathFsOpts) fuseOpts := &nodefs.Options{ // These options are to be compatible with libfuse defaults,