From 7af22864221bb5df15b57f6f4c25aef943ae03ad Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 4 May 2015 16:30:03 +1000 Subject: [PATCH] Began on interruptfs. --- samples/interruptfs/interrupt_fs.go | 124 ++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 samples/interruptfs/interrupt_fs.go diff --git a/samples/interruptfs/interrupt_fs.go b/samples/interruptfs/interrupt_fs.go new file mode 100644 index 0000000..08f561b --- /dev/null +++ b/samples/interruptfs/interrupt_fs.go @@ -0,0 +1,124 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cachingfs + +import ( + "fmt" + "os" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" +) + +var rootAttrs = fuseops.InodeAttributes{ + Nlink: 1, + Mode: os.ModeDir | 0777, +} + +const fooID = fuseops.RootInodeID + 1 + +var fooAttrs = fuseops.InodeAttributes{ + Nlink: 1, + Mode: 0777, +} + +// A file system containing exactly one file, named "foo". Reads to the file +// always hang until interrupted. Exposes a method for synchronizing with the +// arrival of a read. +// +// Must be created with New. +type InterruptFS struct { + fuseutil.NotImplementedFileSystem +} + +func New() (fs *InterruptFS) { + panic("TODO") +} + +//////////////////////////////////////////////////////////////////////// +// Public interface +//////////////////////////////////////////////////////////////////////// + +// Block until there is a read in flight. +// +// LOCKS_EXCLUDED(fs.mu) +func (fs *InterruptFS) WaitForReadInFlight() { + panic("TODO") +} + +//////////////////////////////////////////////////////////////////////// +// FileSystem methods +//////////////////////////////////////////////////////////////////////// + +func (fs *InterruptFS) Init( + op *fuseops.InitOp) { + var err error + defer fuseutil.RespondToOp(op, &err) + + return +} + +func (fs *InterruptFS) LookUpInode( + op *fuseops.LookUpInodeOp) { + var err error + defer fuseutil.RespondToOp(op, &err) + + // We support only one parent. + if op.Parent != fuseops.RootInodeID { + err = fmt.Errorf("Unexpected parent: %v", op.Parent) + return + } + + // We support only one name. + if op.Name != "foo" { + err = fuse.ENOENT + return + } + + // Fill in the response. + op.Entry.Child = fooID + op.Entry.Attributes = fooAttrs + + return +} + +func (fs *InterruptFS) GetInodeAttributes( + op *fuseops.GetInodeAttributesOp) { + var err error + defer fuseutil.RespondToOp(op, &err) + + switch op.Inode { + case fuseops.RootInodeID: + op.Attributes = rootAttrs + + case fooID: + op.Attributes = fooAttrs + + default: + err = fmt.Errorf("Unexpected inode ID: %v", op.Inode) + return + } + + return +} + +func (fs *InterruptFS) OpenFile( + op *fuseops.OpenFileOp) { + var err error + defer fuseutil.RespondToOp(op, &err) + + return +}