diff --git a/dir.go b/dir.go index e500c69..c911d91 100644 --- a/dir.go +++ b/dir.go @@ -61,23 +61,24 @@ func (this *versionedDir) createDir(name string) (*versionedDir, error) { dir := newVersionedDir(node, this) this.dirs[name] = dir - return dir, nil } func (this *versionedDir) createFile(name string, flags int) (*versionedFile, error) { childPath := path.Join(this.node.path, name) + handle, err := os.OpenFile(this.node.ver.rebasePath(childPath), flags, 0644) + if err != nil { + return nil, err + } + node, err := newVersionedNode(childPath, this.node.ver) if err != nil { return nil, err } file := newVersionedFile(node, this) - if err := file.create(name, flags); err != nil { - return nil, err - } - + file.handle = handle this.files[name] = file return file, nil } diff --git a/file.go b/file.go index 8f1efb7..bf178f3 100644 --- a/file.go +++ b/file.go @@ -24,6 +24,7 @@ package main import ( "bazil.org/fuse" + "bazil.org/fuse/fs" "errors" "golang.org/x/net/context" "os" @@ -43,24 +44,18 @@ func newVersionedFile(node *versionedNode, parent *versionedDir) *versionedFile parent: parent} } -func (this *versionedFile) create(path string, flags int) error { - handle, err := os.OpenFile(this.node.ver.rebasePath(path), flags, 0644) +func (this *versionedFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) { + if this.handle != nil { + return nil, errors.New("attempted to open already opened file") + } + + handle, err := os.OpenFile(this.node.rebasedPath(), int(req.Flags), 0644) if err != nil { - return err + return nil, err } this.handle = handle - return nil -} - -func (this *versionedFile) release() bool { - if this.handle == nil { - return false - } - - this.handle.Close() - this.handle = nil - return true + return this, nil } func (this *versionedFile) Attr(attr *fuse.Attr) { @@ -94,11 +89,13 @@ func (this *versionedFile) Setattr(ctx context.Context, req *fuse.SetattrRequest } func (this *versionedFile) Release(ctx context.Context, req *fuse.ReleaseRequest) error { - if this.release() { - return nil + if this.handle == nil { + return errors.New("attempted to release unopened file") } - return errors.New("attempted to release unopened file") + this.handle.Close() + this.handle = nil + return nil } func (this *versionedFile) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {