215 lines
5.8 KiB
Go
215 lines
5.8 KiB
Go
// Copyright 2016 the Go-FUSE Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package fuse
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
// Locking raw FS.
|
|
|
|
type lockingRawFileSystem struct {
|
|
RawFS RawFileSystem
|
|
lock sync.Mutex
|
|
}
|
|
|
|
// Returns a Wrap
|
|
func NewLockingRawFileSystem(fs RawFileSystem) RawFileSystem {
|
|
return &lockingRawFileSystem{
|
|
RawFS: fs,
|
|
}
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) FS() RawFileSystem {
|
|
return fs.RawFS
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) locked() func() {
|
|
fs.lock.Lock()
|
|
return func() { fs.lock.Unlock() }
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Lookup(header *InHeader, name string, out *EntryOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Lookup(header, name, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) SetDebug(dbg bool) {
|
|
defer fs.locked()()
|
|
fs.RawFS.SetDebug(dbg)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Forget(nodeID uint64, nlookup uint64) {
|
|
defer fs.locked()()
|
|
fs.RawFS.Forget(nodeID, nlookup)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) GetAttr(input *GetAttrIn, out *AttrOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.GetAttr(input, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Open(input *OpenIn, out *OpenOut) (status Status) {
|
|
|
|
defer fs.locked()()
|
|
return fs.RawFS.Open(input, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) SetAttr(input *SetAttrIn, out *AttrOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.SetAttr(input, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Readlink(header *InHeader) (out []byte, code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Readlink(header)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Mknod(input *MknodIn, name string, out *EntryOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Mknod(input, name, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Mkdir(input *MkdirIn, name string, out *EntryOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Mkdir(input, name, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Unlink(header *InHeader, name string) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Unlink(header, name)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Rmdir(header *InHeader, name string) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Rmdir(header, name)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Symlink(header *InHeader, pointedTo string, linkName string, out *EntryOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Symlink(header, pointedTo, linkName, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Rename(input *RenameIn, oldName string, newName string) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Rename(input, oldName, newName)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Link(input *LinkIn, name string, out *EntryOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Link(input, name, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) SetXAttr(input *SetXAttrIn, attr string, data []byte) Status {
|
|
defer fs.locked()()
|
|
return fs.RawFS.SetXAttr(input, attr, data)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) GetXAttrData(header *InHeader, attr string) (data []byte, code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.GetXAttrData(header, attr)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) GetXAttrSize(header *InHeader, attr string) (sz int, code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.GetXAttrSize(header, attr)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) ListXAttr(header *InHeader) (data []byte, code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.ListXAttr(header)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) RemoveXAttr(header *InHeader, attr string) Status {
|
|
defer fs.locked()()
|
|
return fs.RawFS.RemoveXAttr(header, attr)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Access(input *AccessIn) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Access(input)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Create(input *CreateIn, name string, out *CreateOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Create(input, name, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) OpenDir(input *OpenIn, out *OpenOut) (status Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.OpenDir(input, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Release(input *ReleaseIn) {
|
|
defer fs.locked()()
|
|
fs.RawFS.Release(input)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) ReleaseDir(input *ReleaseIn) {
|
|
defer fs.locked()()
|
|
fs.RawFS.ReleaseDir(input)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Read(input *ReadIn, buf []byte) (ReadResult, Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Read(input, buf)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Flock(input *FlockIn, flags int) Status {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Flock(input, flags)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Write(input *WriteIn, data []byte) (written uint32, code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Write(input, data)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Flush(input *FlushIn) Status {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Flush(input)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Fsync(input *FsyncIn) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Fsync(input)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) ReadDir(input *ReadIn, out *DirEntryList) Status {
|
|
defer fs.locked()()
|
|
return fs.RawFS.ReadDir(input, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) ReadDirPlus(input *ReadIn, out *DirEntryList) Status {
|
|
defer fs.locked()()
|
|
return fs.RawFS.ReadDirPlus(input, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) FsyncDir(input *FsyncIn) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.FsyncDir(input)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Init(s *Server) {
|
|
defer fs.locked()()
|
|
fs.RawFS.Init(s)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) StatFs(header *InHeader, out *StatfsOut) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.StatFs(header, out)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) Fallocate(in *FallocateIn) (code Status) {
|
|
defer fs.locked()()
|
|
return fs.RawFS.Fallocate(in)
|
|
}
|
|
|
|
func (fs *lockingRawFileSystem) String() string {
|
|
defer fs.locked()()
|
|
return fmt.Sprintf("Locked(%s)", fs.RawFS.String())
|
|
}
|