vfs: stop reading File members from outside file.go

This also fixes locking for ReadFileHandle and WriteFileHandle
accessing File members
This commit is contained in:
Nick Craig-Wood 2020-04-14 18:03:45 +01:00
parent 268fcbb973
commit 238f26cc90
3 changed files with 15 additions and 8 deletions

View File

@ -607,6 +607,13 @@ func (f *File) VFS() *VFS {
return f.d.vfs
}
// Fs returns the underlying Fs for the file
func (f *File) Fs() fs.Fs {
f.mu.RLock()
defer f.mu.RUnlock()
return f.d.f
}
// Open a file according to the flags provided
//
// O_RDONLY open the file read-only.

View File

@ -47,7 +47,7 @@ func newReadFileHandle(f *File) (*ReadFileHandle, error) {
var mhash *hash.MultiHasher
var err error
o := f.getObject()
if !f.d.vfs.Opt.NoChecksum {
if !f.VFS().Opt.NoChecksum {
hashes := hash.NewHashSet(o.Fs().Hashes().GetOne()) // just pick one hash
mhash, err = hash.NewMultiHasherTypes(hashes)
if err != nil {
@ -57,7 +57,7 @@ func newReadFileHandle(f *File) (*ReadFileHandle, error) {
fh := &ReadFileHandle{
remote: o.Remote(),
noSeek: f.d.vfs.Opt.NoSeek,
noSeek: f.VFS().Opt.NoSeek,
file: f,
hash: mhash,
size: nonNegative(o.Size()),
@ -74,7 +74,7 @@ func (fh *ReadFileHandle) openPending() (err error) {
return nil
}
o := fh.file.getObject()
r, err := chunkedreader.New(context.TODO(), o, int64(fh.file.d.vfs.Opt.ChunkSize), int64(fh.file.d.vfs.Opt.ChunkSizeLimit)).Open()
r, err := chunkedreader.New(context.TODO(), o, int64(fh.file.VFS().Opt.ChunkSize), int64(fh.file.VFS().Opt.ChunkSizeLimit)).Open()
if err != nil {
return err
}
@ -147,7 +147,7 @@ func (fh *ReadFileHandle) seek(offset int64, reopen bool) (err error) {
}
// re-open with a seek
o := fh.file.getObject()
r = chunkedreader.New(context.TODO(), o, int64(fh.file.d.vfs.Opt.ChunkSize), int64(fh.file.d.vfs.Opt.ChunkSizeLimit))
r = chunkedreader.New(context.TODO(), o, int64(fh.file.VFS().Opt.ChunkSize), int64(fh.file.VFS().Opt.ChunkSizeLimit))
_, err := r.Seek(offset, 0)
if err != nil {
fs.Debugf(fh.remote, "ReadFileHandle.Read seek failed: %v", err)
@ -235,7 +235,7 @@ func (fh *ReadFileHandle) readAt(p []byte, off int64) (n int, err error) {
// The default time here was made by finding the
// smallest when mounting a local backend that didn't
// cause seeks.
maxWait := fh.file.d.vfs.Opt.ReadWait
maxWait := fh.file.VFS().Opt.ReadWait
timeout := time.NewTimer(maxWait)
done := make(chan struct{})
abort := int32(0)

View File

@ -69,7 +69,7 @@ func (fh *WriteFileHandle) openPending() (err error) {
pipeReader, fh.pipeWriter = io.Pipe()
go func() {
// NB Rcat deals with Stats.Transferring etc
o, err := operations.Rcat(context.TODO(), fh.file.d.f, fh.remote, pipeReader, time.Now())
o, err := operations.Rcat(context.TODO(), fh.file.Fs(), fh.remote, pipeReader, time.Now())
if err != nil {
fs.Errorf(fh.remote, "WriteFileHandle.New Rcat failed: %v", err)
}
@ -80,7 +80,7 @@ func (fh *WriteFileHandle) openPending() (err error) {
}()
fh.file.setSize(0)
fh.truncated = true
fh.file.d.addObject(fh.file) // make sure the directory has this object in it now
fh.file.Dir().addObject(fh.file) // make sure the directory has this object in it now
fh.opened = true
return nil
}
@ -132,7 +132,7 @@ func (fh *WriteFileHandle) writeAt(p []byte, off int64) (n int, err error) {
}
if fh.offset != off {
// Set a background timer so we don't wait forever
maxWait := fh.file.d.vfs.Opt.WriteWait
maxWait := fh.file.VFS().Opt.WriteWait
timeout := time.NewTimer(maxWait)
done := make(chan struct{})
abort := int32(0)