Filled in some inode implementation.
parent
830f272aab
commit
44b62ac9c3
|
@ -137,10 +137,6 @@ func (fs *memFS) LookUpInode(
|
||||||
inode := fs.getInodeForReadingOrDie(req.Parent)
|
inode := fs.getInodeForReadingOrDie(req.Parent)
|
||||||
defer inode.mu.RUnlock()
|
defer inode.mu.RUnlock()
|
||||||
|
|
||||||
if !inode.dir {
|
|
||||||
panic("Found non-dir.")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does the directory have an entry with the given name?
|
// Does the directory have an entry with the given name?
|
||||||
childID, ok := inode.LookUpChild(req.Name)
|
childID, ok := inode.LookUpChild(req.Name)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -223,15 +219,11 @@ func (fs *memFS) ReadDir(
|
||||||
panic("Found non-dir.")
|
panic("Found non-dir.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the entries requested.
|
// Serve the request.
|
||||||
for i := int(req.Offset); i < len(inode.entries); i++ {
|
resp.Data, err = inode.ReadDir(int(req.Offset), req.Size)
|
||||||
resp.Data = fuseutil.AppendDirent(resp.Data, inode.entries[i])
|
if err != nil {
|
||||||
|
err = fmt.Errorf("inode.ReadDir: %v", err)
|
||||||
// Trim and stop early if we've exceeded the requested size.
|
return
|
||||||
if len(resp.Data) > req.Size {
|
|
||||||
resp.Data = resp.Data[:req.Size]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -55,7 +55,14 @@ type inode struct {
|
||||||
contents []byte // GUARDED_BY(mu)
|
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()
|
func (inode *inode) checkInvariants()
|
||||||
|
|
||||||
|
@ -63,4 +70,32 @@ func (inode *inode) checkInvariants()
|
||||||
//
|
//
|
||||||
// REQUIRES: inode.dir
|
// REQUIRES: inode.dir
|
||||||
// SHARED_LOCKS_REQUIRED(inode.mu)
|
// 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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue