Fixed up memfs.go.

geesefs-0-30-9
Aaron Jacobs 2015-06-25 21:37:29 +10:00
parent a365c6c2cb
commit c7c0b23bc0
1 changed files with 5 additions and 32 deletions

View File

@ -40,7 +40,6 @@ type memFS struct {
// Mutable state
/////////////////////////
// When acquiring this lock, the caller must hold no inode locks.
mu syncutil.InvariantMutex
// The collection of live inodes, indexed by ID. IDs of free inodes that may
@ -140,31 +139,25 @@ func (fs *memFS) checkInvariants() {
}
}
// Find the given inode and return it with its lock held. Panic if it doesn't
// exist.
// Find the given inode. Panic if it doesn't exist.
//
// LOCKS_REQUIRED(fs.mu)
// LOCK_FUNCTION(inode.mu)
func (fs *memFS) getInodeOrDie(id fuseops.InodeID) (inode *inode) {
inode = fs.inodes[id]
if inode == nil {
panic(fmt.Sprintf("Unknown inode: %v", id))
}
inode.mu.Lock()
return
}
// Allocate a new inode, assigning it an ID that is not in use. Return it with
// its lock held.
// Allocate a new inode, assigning it an ID that is not in use.
//
// EXCLUSIVE_LOCKS_REQUIRED(fs.mu)
// EXCLUSIVE_LOCK_FUNCTION(inode.mu)
// LOCKS_REQUIRED(fs.mu)
func (fs *memFS) allocateInode(
attrs fuseops.InodeAttributes) (id fuseops.InodeID, inode *inode) {
// Create and lock the inode.
// Create the inode.
inode = newInode(fs.clock, attrs)
inode.mu.Lock()
// Re-use a free ID if possible. Otherwise mint a new one.
numFree := len(fs.freeInodes)
@ -180,7 +173,7 @@ func (fs *memFS) allocateInode(
return
}
// EXCLUSIVE_LOCKS_REQUIRED(fs.mu)
// LOCKS_REQUIRED(fs.mu)
func (fs *memFS) deallocateInode(id fuseops.InodeID) {
fs.freeInodes = append(fs.freeInodes, id)
fs.inodes[id] = nil
@ -197,7 +190,6 @@ func (fs *memFS) LookUpInode(
// Grab the parent directory.
inode := fs.getInodeOrDie(op.Parent)
defer inode.mu.Unlock()
// Does the directory have an entry with the given name?
childID, ok := inode.LookUpChild(op.Name)
@ -208,7 +200,6 @@ func (fs *memFS) LookUpInode(
// Grab the child.
child := fs.getInodeOrDie(childID)
defer child.mu.Unlock()
// Fill in the response.
op.Entry.Child = childID
@ -229,7 +220,6 @@ func (fs *memFS) GetInodeAttributes(
// Grab the inode.
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
// Fill in the response.
op.Attributes = inode.attrs
@ -248,7 +238,6 @@ func (fs *memFS) SetInodeAttributes(
// Grab the inode.
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
// Handle the request.
inode.SetAttributes(op.Size, op.Mode, op.Mtime)
@ -270,7 +259,6 @@ func (fs *memFS) MkDir(
// Grab the parent, which we will update shortly.
parent := fs.getInodeOrDie(op.Parent)
defer parent.mu.Unlock()
// Ensure that the name doesn't already exist, so we don't wind up with a
// duplicate.
@ -291,7 +279,6 @@ func (fs *memFS) MkDir(
// Allocate a child.
childID, child := fs.allocateInode(childAttrs)
defer child.mu.Unlock()
// Add an entry in the parent.
parent.AddChild(childID, op.Name, fuseutil.DT_Directory)
@ -315,7 +302,6 @@ func (fs *memFS) CreateFile(
// Grab the parent, which we will update shortly.
parent := fs.getInodeOrDie(op.Parent)
defer parent.mu.Unlock()
// Ensure that the name doesn't already exist, so we don't wind up with a
// duplicate.
@ -341,7 +327,6 @@ func (fs *memFS) CreateFile(
// Allocate a child.
childID, child := fs.allocateInode(childAttrs)
defer child.mu.Unlock()
// Add an entry in the parent.
parent.AddChild(childID, op.Name, fuseutil.DT_File)
@ -367,7 +352,6 @@ func (fs *memFS) CreateSymlink(
// Grab the parent, which we will update shortly.
parent := fs.getInodeOrDie(op.Parent)
defer parent.mu.Unlock()
// Ensure that the name doesn't already exist, so we don't wind up with a
// duplicate.
@ -393,7 +377,6 @@ func (fs *memFS) CreateSymlink(
// Allocate a child.
childID, child := fs.allocateInode(childAttrs)
defer child.mu.Unlock()
// Set up its target.
child.target = op.Target
@ -420,7 +403,6 @@ func (fs *memFS) RmDir(
// Grab the parent, which we will update shortly.
parent := fs.getInodeOrDie(op.Parent)
defer parent.mu.Unlock()
// Find the child within the parent.
childID, ok := parent.LookUpChild(op.Name)
@ -431,7 +413,6 @@ func (fs *memFS) RmDir(
// Grab the child.
child := fs.getInodeOrDie(childID)
defer child.mu.Unlock()
// Make sure the child is empty.
if child.Len() != 0 {
@ -455,7 +436,6 @@ func (fs *memFS) Unlink(
// Grab the parent, which we will update shortly.
parent := fs.getInodeOrDie(op.Parent)
defer parent.mu.Unlock()
// Find the child within the parent.
childID, ok := parent.LookUpChild(op.Name)
@ -466,7 +446,6 @@ func (fs *memFS) Unlink(
// Grab the child.
child := fs.getInodeOrDie(childID)
defer child.mu.Unlock()
// Remove the entry within the parent.
parent.RemoveChild(op.Name)
@ -486,7 +465,6 @@ func (fs *memFS) OpenDir(
// inode that doesn't exist, something screwed up earlier (a lookup, a
// cache invalidation, etc.).
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
if !inode.isDir() {
panic("Found non-dir.")
@ -502,7 +480,6 @@ func (fs *memFS) ReadDir(
// Grab the directory.
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
// Serve the request.
op.Data, err = inode.ReadDir(int(op.Offset), op.Size)
@ -523,7 +500,6 @@ func (fs *memFS) OpenFile(
// inode that doesn't exist, something screwed up earlier (a lookup, a
// cache invalidation, etc.).
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
if !inode.isFile() {
panic("Found non-file.")
@ -539,7 +515,6 @@ func (fs *memFS) ReadFile(
// Find the inode in question.
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
// Serve the request.
op.Data = make([]byte, op.Size)
@ -561,7 +536,6 @@ func (fs *memFS) WriteFile(
// Find the inode in question.
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
// Serve the request.
_, err = inode.WriteAt(op.Data, op.Offset)
@ -576,7 +550,6 @@ func (fs *memFS) ReadSymlink(
// Find the inode in question.
inode := fs.getInodeOrDie(op.Inode)
defer inode.mu.Unlock()
// Serve the request.
op.Target = inode.target