From 3379842d1e59dac551b8a4947f1878c1567a20ab Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 2 Mar 2015 14:06:32 +1100 Subject: [PATCH] Switched to an array of inodes for memfs, like a real file system. --- samples/memfs/fs.go | 23 ++++++++++++----------- samples/memfs/inode.go | 13 +++++++++++++ 2 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 samples/memfs/inode.go diff --git a/samples/memfs/fs.go b/samples/memfs/fs.go index 919618e..0feac15 100644 --- a/samples/memfs/fs.go +++ b/samples/memfs/fs.go @@ -25,20 +25,21 @@ type memFS struct { mu syncutil.InvariantMutex - // The next inode to issue. + // The collection of all inodes that have ever been created, indexed by inode + // ID. Some inodes are not in use if they have been unlinked, and no inode + // with ID less than fuse.RootInodeID is ever used. // - // INVARIANT: nextInode > 0 - nextInode fuse.InodeID // GUARDED_BY(mu) + // INVARIANT: len(inodes) > fuse.RootInodeID + // INVARIANT: For all i < fuse.RootInodeID, inodes[i].impl == nil + // INVARIANT: inodes[fuse.RootInodeID].impl is of type *memDir + inodes []inode // GUARDED_BY(mu) - // A map from inode number to file or directory with that inode. + // A list of inode IDs within inodes available for reuse, not including the + // reserved IDs less than fuse.RootInodeID. // - // INVARIANT: inodeIndex[fuse.RootInodeID] != nil - // INVARIANT: For all keys k, k > 0 - // INVARIANT: For all keys k, k < nextInode - // INVARIANT: For all keys k, inodeIndex[k] is *memFile or *memDir - // INVARIANT: For all keys k, inodeIndex[k].inode == k - // INVARIANT: For all dirs d, all of d's children are in the map. - inodeIndex map[fuse.InodeID]interface{} // GUARDED_BY(mu) + // INVARIANT: This is all and only indices i of inodes such that i > + // fuse.RootInodeID and inodes[i].impl == nil + freeInodes []fuse.InodeID // GUARDED_BY(mu) } // Create a file system that stores data and metadata in memory. diff --git a/samples/memfs/inode.go b/samples/memfs/inode.go new file mode 100644 index 0000000..70c6f0c --- /dev/null +++ b/samples/memfs/inode.go @@ -0,0 +1,13 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// Author: jacobsa@google.com (Aaron Jacobs) + +package memfs + +// Common attributes for files and directories. +type inode struct { + // The *memFile or *memDir for this inode, or nil if the inode is available + // for reuse. + // + // INVARIANT: impl is nil, or of type *memFile or *memDir + impl interface{} +}