diff --git a/samples/memfs/fs.go b/samples/memfs/fs.go index e4dc23e..6908002 100644 --- a/samples/memfs/fs.go +++ b/samples/memfs/fs.go @@ -137,10 +137,6 @@ func (fs *memFS) LookUpInode( inode := fs.getInodeForReadingOrDie(req.Parent) defer inode.mu.RUnlock() - if !inode.dir { - panic("Found non-dir.") - } - // Does the directory have an entry with the given name? childID, ok := inode.LookUpChild(req.Name) if !ok { @@ -223,15 +219,11 @@ func (fs *memFS) ReadDir( panic("Found non-dir.") } - // Return the entries requested. - for i := int(req.Offset); i < len(inode.entries); i++ { - resp.Data = fuseutil.AppendDirent(resp.Data, inode.entries[i]) - - // Trim and stop early if we've exceeded the requested size. - if len(resp.Data) > req.Size { - resp.Data = resp.Data[:req.Size] - break - } + // Serve the request. + resp.Data, err = inode.ReadDir(int(req.Offset), req.Size) + if err != nil { + err = fmt.Errorf("inode.ReadDir: %v", err) + return } return diff --git a/samples/memfs/inode.go b/samples/memfs/inode.go index 5ae3c22..463e56a 100644 --- a/samples/memfs/inode.go +++ b/samples/memfs/inode.go @@ -55,7 +55,14 @@ type inode struct { contents []byte // GUARDED_BY(mu) } -func newInode(dir bool) (inode *inode) +func newInode(dir bool) (in *inode) { + in = &inode{ + dir: dir, + } + + in.mu = syncutil.NewInvariantMutex(in.checkInvariants) + return +} func (inode *inode) checkInvariants() @@ -63,4 +70,32 @@ func (inode *inode) checkInvariants() // // REQUIRES: inode.dir // SHARED_LOCKS_REQUIRED(inode.mu) -func (inode *inode) LookUpChild(name string) (id fuse.InodeID, ok bool) +func (inode *inode) LookUpChild(name string) (id fuse.InodeID, ok bool) { + if !inode.dir { + panic("LookUpChild called on non-directory.") + } + + panic("TODO") +} + +// Serve a ReadDir request. +// +// REQUIRED: inode.dir +// SHARED_LOCKS_REQUIRED(inode.mu) +func (inode *inode) ReadDir(offset int, size int) (data []byte, err error) { + if !inode.dir { + panic("ReadDir called on non-directory.") + } + + for i := offset; i < len(inode.entries); i++ { + data = fuseutil.AppendDirent(data, inode.entries[i]) + + // Trim and stop early if we've exceeded the requested size. + if len(data) > size { + data = data[:size] + break + } + } + + return +}