Fixed package fuseutil.

geesefs-0-30-9
Aaron Jacobs 2015-07-27 15:15:07 +10:00
parent dd1fcfedf5
commit ea210ae2bb
2 changed files with 70 additions and 44 deletions

View File

@ -18,6 +18,8 @@ import (
"io" "io"
"sync" "sync"
"golang.org/x/net/context"
"github.com/jacobsa/fuse" "github.com/jacobsa/fuse"
"github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseops"
) )
@ -33,26 +35,26 @@ import (
// See NotImplementedFileSystem for a convenient way to embed default // See NotImplementedFileSystem for a convenient way to embed default
// implementations for methods you don't care about. // implementations for methods you don't care about.
type FileSystem interface { type FileSystem interface {
LookUpInode(*fuseops.LookUpInodeOp) error LookUpInode(context.Context, *fuseops.LookUpInodeOp) error
GetInodeAttributes(*fuseops.GetInodeAttributesOp) error GetInodeAttributes(context.Context, *fuseops.GetInodeAttributesOp) error
SetInodeAttributes(*fuseops.SetInodeAttributesOp) error SetInodeAttributes(context.Context, *fuseops.SetInodeAttributesOp) error
ForgetInode(*fuseops.ForgetInodeOp) error ForgetInode(context.Context, *fuseops.ForgetInodeOp) error
MkDir(*fuseops.MkDirOp) error MkDir(context.Context, *fuseops.MkDirOp) error
CreateFile(*fuseops.CreateFileOp) error CreateFile(context.Context, *fuseops.CreateFileOp) error
CreateSymlink(*fuseops.CreateSymlinkOp) error CreateSymlink(context.Context, *fuseops.CreateSymlinkOp) error
Rename(*fuseops.RenameOp) error Rename(context.Context, *fuseops.RenameOp) error
RmDir(*fuseops.RmDirOp) error RmDir(context.Context, *fuseops.RmDirOp) error
Unlink(*fuseops.UnlinkOp) error Unlink(context.Context, *fuseops.UnlinkOp) error
OpenDir(*fuseops.OpenDirOp) error OpenDir(context.Context, *fuseops.OpenDirOp) error
ReadDir(*fuseops.ReadDirOp) error ReadDir(context.Context, *fuseops.ReadDirOp) error
ReleaseDirHandle(*fuseops.ReleaseDirHandleOp) error ReleaseDirHandle(context.Context, *fuseops.ReleaseDirHandleOp) error
OpenFile(*fuseops.OpenFileOp) error OpenFile(context.Context, *fuseops.OpenFileOp) error
ReadFile(*fuseops.ReadFileOp) error ReadFile(context.Context, *fuseops.ReadFileOp) error
WriteFile(*fuseops.WriteFileOp) error WriteFile(context.Context, *fuseops.WriteFileOp) error
SyncFile(*fuseops.SyncFileOp) error SyncFile(context.Context, *fuseops.SyncFileOp) error
FlushFile(*fuseops.FlushFileOp) error FlushFile(context.Context, *fuseops.FlushFileOp) error
ReleaseFileHandle(*fuseops.ReleaseFileHandleOp) error ReleaseFileHandle(context.Context, *fuseops.ReleaseFileHandleOp) error
ReadSymlink(*fuseops.ReadSymlinkOp) error ReadSymlink(context.Context, *fuseops.ReadSymlinkOp) error
// Regard all inodes (including the root inode) as having their lookup counts // Regard all inodes (including the root inode) as having their lookup counts
// decremented to zero, and clean up any resources associated with the file // decremented to zero, and clean up any resources associated with the file
@ -91,7 +93,7 @@ func (s *fileSystemServer) ServeOps(c *fuse.Connection) {
}() }()
for { for {
op, err := c.ReadOp() ctx, op, err := c.ReadOp()
if err == io.EOF { if err == io.EOF {
break break
} }
@ -101,11 +103,14 @@ func (s *fileSystemServer) ServeOps(c *fuse.Connection) {
} }
s.opsInFlight.Add(1) s.opsInFlight.Add(1)
go s.handleOp(op) go s.handleOp(c, ctx, op)
} }
} }
func (s *fileSystemServer) handleOp(op fuseops.Op) { func (s *fileSystemServer) handleOp(
c *fuse.Connection,
ctx context.Context,
op fuseops.Op) {
defer s.opsInFlight.Done() defer s.opsInFlight.Done()
// Dispatch to the appropriate method. // Dispatch to the appropriate method.
@ -115,65 +120,65 @@ func (s *fileSystemServer) handleOp(op fuseops.Op) {
err = fuse.ENOSYS err = fuse.ENOSYS
case *fuseops.LookUpInodeOp: case *fuseops.LookUpInodeOp:
err = s.fs.LookUpInode(typed) err = s.fs.LookUpInode(ctx, typed)
case *fuseops.GetInodeAttributesOp: case *fuseops.GetInodeAttributesOp:
err = s.fs.GetInodeAttributes(typed) err = s.fs.GetInodeAttributes(ctx, typed)
case *fuseops.SetInodeAttributesOp: case *fuseops.SetInodeAttributesOp:
err = s.fs.SetInodeAttributes(typed) err = s.fs.SetInodeAttributes(ctx, typed)
case *fuseops.ForgetInodeOp: case *fuseops.ForgetInodeOp:
err = s.fs.ForgetInode(typed) err = s.fs.ForgetInode(ctx, typed)
case *fuseops.MkDirOp: case *fuseops.MkDirOp:
err = s.fs.MkDir(typed) err = s.fs.MkDir(ctx, typed)
case *fuseops.CreateFileOp: case *fuseops.CreateFileOp:
err = s.fs.CreateFile(typed) err = s.fs.CreateFile(ctx, typed)
case *fuseops.CreateSymlinkOp: case *fuseops.CreateSymlinkOp:
err = s.fs.CreateSymlink(typed) err = s.fs.CreateSymlink(ctx, typed)
case *fuseops.RenameOp: case *fuseops.RenameOp:
err = s.fs.Rename(typed) err = s.fs.Rename(ctx, typed)
case *fuseops.RmDirOp: case *fuseops.RmDirOp:
err = s.fs.RmDir(typed) err = s.fs.RmDir(ctx, typed)
case *fuseops.UnlinkOp: case *fuseops.UnlinkOp:
err = s.fs.Unlink(typed) err = s.fs.Unlink(ctx, typed)
case *fuseops.OpenDirOp: case *fuseops.OpenDirOp:
err = s.fs.OpenDir(typed) err = s.fs.OpenDir(ctx, typed)
case *fuseops.ReadDirOp: case *fuseops.ReadDirOp:
err = s.fs.ReadDir(typed) err = s.fs.ReadDir(ctx, typed)
case *fuseops.ReleaseDirHandleOp: case *fuseops.ReleaseDirHandleOp:
err = s.fs.ReleaseDirHandle(typed) err = s.fs.ReleaseDirHandle(ctx, typed)
case *fuseops.OpenFileOp: case *fuseops.OpenFileOp:
err = s.fs.OpenFile(typed) err = s.fs.OpenFile(ctx, typed)
case *fuseops.ReadFileOp: case *fuseops.ReadFileOp:
err = s.fs.ReadFile(typed) err = s.fs.ReadFile(ctx, typed)
case *fuseops.WriteFileOp: case *fuseops.WriteFileOp:
err = s.fs.WriteFile(typed) err = s.fs.WriteFile(ctx, typed)
case *fuseops.SyncFileOp: case *fuseops.SyncFileOp:
err = s.fs.SyncFile(typed) err = s.fs.SyncFile(ctx, typed)
case *fuseops.FlushFileOp: case *fuseops.FlushFileOp:
err = s.fs.FlushFile(typed) err = s.fs.FlushFile(ctx, typed)
case *fuseops.ReleaseFileHandleOp: case *fuseops.ReleaseFileHandleOp:
err = s.fs.ReleaseFileHandle(typed) err = s.fs.ReleaseFileHandle(ctx, typed)
case *fuseops.ReadSymlinkOp: case *fuseops.ReadSymlinkOp:
err = s.fs.ReadSymlink(typed) err = s.fs.ReadSymlink(ctx, typed)
} }
op.Respond(err) c.Reply(ctx, err)
} }

View File

@ -17,6 +17,7 @@ package fuseutil
import ( import (
"github.com/jacobsa/fuse" "github.com/jacobsa/fuse"
"github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseops"
"golang.org/x/net/context"
) )
// A FileSystem that responds to all ops with fuse.ENOSYS. Embed this in your // A FileSystem that responds to all ops with fuse.ENOSYS. Embed this in your
@ -29,120 +30,140 @@ type NotImplementedFileSystem struct {
var _ FileSystem = &NotImplementedFileSystem{} var _ FileSystem = &NotImplementedFileSystem{}
func (fs *NotImplementedFileSystem) LookUpInode( func (fs *NotImplementedFileSystem) LookUpInode(
ctx context.Context,
op *fuseops.LookUpInodeOp) (err error) { op *fuseops.LookUpInodeOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) GetInodeAttributes( func (fs *NotImplementedFileSystem) GetInodeAttributes(
ctx context.Context,
op *fuseops.GetInodeAttributesOp) (err error) { op *fuseops.GetInodeAttributesOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) SetInodeAttributes( func (fs *NotImplementedFileSystem) SetInodeAttributes(
ctx context.Context,
op *fuseops.SetInodeAttributesOp) (err error) { op *fuseops.SetInodeAttributesOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) ForgetInode( func (fs *NotImplementedFileSystem) ForgetInode(
ctx context.Context,
op *fuseops.ForgetInodeOp) (err error) { op *fuseops.ForgetInodeOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) MkDir( func (fs *NotImplementedFileSystem) MkDir(
ctx context.Context,
op *fuseops.MkDirOp) (err error) { op *fuseops.MkDirOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) CreateFile( func (fs *NotImplementedFileSystem) CreateFile(
ctx context.Context,
op *fuseops.CreateFileOp) (err error) { op *fuseops.CreateFileOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) CreateSymlink( func (fs *NotImplementedFileSystem) CreateSymlink(
ctx context.Context,
op *fuseops.CreateSymlinkOp) (err error) { op *fuseops.CreateSymlinkOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) Rename( func (fs *NotImplementedFileSystem) Rename(
ctx context.Context,
op *fuseops.RenameOp) (err error) { op *fuseops.RenameOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) RmDir( func (fs *NotImplementedFileSystem) RmDir(
ctx context.Context,
op *fuseops.RmDirOp) (err error) { op *fuseops.RmDirOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) Unlink( func (fs *NotImplementedFileSystem) Unlink(
ctx context.Context,
op *fuseops.UnlinkOp) (err error) { op *fuseops.UnlinkOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) OpenDir( func (fs *NotImplementedFileSystem) OpenDir(
ctx context.Context,
op *fuseops.OpenDirOp) (err error) { op *fuseops.OpenDirOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) ReadDir( func (fs *NotImplementedFileSystem) ReadDir(
ctx context.Context,
op *fuseops.ReadDirOp) (err error) { op *fuseops.ReadDirOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) ReleaseDirHandle( func (fs *NotImplementedFileSystem) ReleaseDirHandle(
ctx context.Context,
op *fuseops.ReleaseDirHandleOp) (err error) { op *fuseops.ReleaseDirHandleOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) OpenFile( func (fs *NotImplementedFileSystem) OpenFile(
ctx context.Context,
op *fuseops.OpenFileOp) (err error) { op *fuseops.OpenFileOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) ReadFile( func (fs *NotImplementedFileSystem) ReadFile(
ctx context.Context,
op *fuseops.ReadFileOp) (err error) { op *fuseops.ReadFileOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) WriteFile( func (fs *NotImplementedFileSystem) WriteFile(
ctx context.Context,
op *fuseops.WriteFileOp) (err error) { op *fuseops.WriteFileOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) SyncFile( func (fs *NotImplementedFileSystem) SyncFile(
ctx context.Context,
op *fuseops.SyncFileOp) (err error) { op *fuseops.SyncFileOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) FlushFile( func (fs *NotImplementedFileSystem) FlushFile(
ctx context.Context,
op *fuseops.FlushFileOp) (err error) { op *fuseops.FlushFileOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) ReleaseFileHandle( func (fs *NotImplementedFileSystem) ReleaseFileHandle(
ctx context.Context,
op *fuseops.ReleaseFileHandleOp) (err error) { op *fuseops.ReleaseFileHandleOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return
} }
func (fs *NotImplementedFileSystem) ReadSymlink( func (fs *NotImplementedFileSystem) ReadSymlink(
ctx context.Context,
op *fuseops.ReadSymlinkOp) (err error) { op *fuseops.ReadSymlinkOp) (err error) {
err = fuse.ENOSYS err = fuse.ENOSYS
return return