diff options
Diffstat (limited to 'internal/fusefrontend')
| -rw-r--r-- | internal/fusefrontend/args.go | 2 | ||||
| -rw-r--r-- | internal/fusefrontend/file.go | 11 | ||||
| -rw-r--r-- | internal/fusefrontend/fs.go | 5 | 
3 files changed, 18 insertions, 0 deletions
| diff --git a/internal/fusefrontend/args.go b/internal/fusefrontend/args.go index f76848d..4029913 100644 --- a/internal/fusefrontend/args.go +++ b/internal/fusefrontend/args.go @@ -27,4 +27,6 @@ type Args struct {  	// Use HKDF key derivation.  	// Corresponds to the HKDF feature flag introduced in gocryptfs v1.3.  	HKDF bool +	// Try to serialize read operations, "-serialize_reads" +	SerializeReads bool  } diff --git a/internal/fusefrontend/file.go b/internal/fusefrontend/file.go index dac7510..b41f220 100644 --- a/internal/fusefrontend/file.go +++ b/internal/fusefrontend/file.go @@ -17,6 +17,7 @@ import (  	"github.com/hanwen/go-fuse/fuse/nodefs"  	"github.com/rfjakob/gocryptfs/internal/contentenc" +	"github.com/rfjakob/gocryptfs/internal/serialize_reads"  	"github.com/rfjakob/gocryptfs/internal/syscallcompat"  	"github.com/rfjakob/gocryptfs/internal/tlog"  ) @@ -176,6 +177,7 @@ func (f *file) doRead(off uint64, length uint64) ([]byte, fuse.Status) {  	alignedOffset, alignedLength := blocks[0].JointCiphertextRange(blocks)  	skip := blocks[0].Skip  	tlog.Debug.Printf("JointCiphertextRange(%d, %d) -> %d, %d, %d", off, length, alignedOffset, alignedLength, skip) +  	ciphertext := make([]byte, int(alignedLength))  	n, err := f.fd.ReadAt(ciphertext, int64(alignedOffset))  	// We don't care if the file ID changes after we have read the data. Drop the lock. @@ -224,8 +226,17 @@ func (f *file) Read(buf []byte, off int64) (resultData fuse.ReadResult, code fus  		return nil, fuse.EBADF  	} +	if f.fs.args.SerializeReads { +		serialize_reads.Wait(off, len(buf)) +	} + +	fmt.Printf("%02d\n", off/131072)  	out, status := f.doRead(uint64(off), uint64(len(buf))) +	if f.fs.args.SerializeReads { +		serialize_reads.Done() +	} +  	if status == fuse.EIO {  		tlog.Warn.Printf("ino%d: Read: returning EIO, offset=%d, length=%d", f.devIno.ino, len(buf), off)  	} diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index 9ffcff1..28c43b6 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -17,6 +17,7 @@ import (  	"github.com/rfjakob/gocryptfs/internal/contentenc"  	"github.com/rfjakob/gocryptfs/internal/cryptocore"  	"github.com/rfjakob/gocryptfs/internal/nametransform" +	"github.com/rfjakob/gocryptfs/internal/serialize_reads"  	"github.com/rfjakob/gocryptfs/internal/syscallcompat"  	"github.com/rfjakob/gocryptfs/internal/tlog"  ) @@ -43,6 +44,10 @@ func NewFS(args Args) *FS {  	contentEnc := contentenc.New(cryptoCore, contentenc.DefaultBS)  	nameTransform := nametransform.New(cryptoCore.EMECipher, args.LongNames, args.Raw64) +	if args.SerializeReads { +		serialize_reads.Init() +	} +  	return &FS{  		FileSystem:    pathfs.NewLoopbackFileSystem(args.Cipherdir),  		args:          args, | 
