in internal/fs/fs.go [646:684]
func (fs *fileSystem) checkInvariantsForInodes() {
// INVARIANT: For all keys k, fuseops.RootInodeID <= k < nextInodeID
for id := range fs.inodes {
if id < fuseops.RootInodeID || id >= fs.nextInodeID {
panic(fmt.Sprintf("Illegal inode ID: %v", id))
}
}
// INVARIANT: For all keys k, inodes[k].ID() == k
for id, in := range fs.inodes {
if in.ID() != id {
panic(fmt.Sprintf("ID mismatch: %v vs. %v", in.ID(), id))
}
}
// INVARIANT: inodes[fuseops.RootInodeID] is missing or of type inode.DirInode
//
// The missing case is when we've received a forget request for the root
// inode, while unmounting.
switch in := fs.inodes[fuseops.RootInodeID].(type) {
case nil:
case inode.DirInode:
default:
panic(fmt.Sprintf("Unexpected type for root: %v", reflect.TypeOf(in)))
}
// INVARIANT: For all v, if v.Name().IsDir() then v is inode.DirInode
for _, in := range fs.inodes {
if in.Name().IsDir() {
_, ok := in.(inode.DirInode)
if !ok {
panic(fmt.Sprintf(
"Unexpected inode type for name \"%s\": %v",
in.Name(),
reflect.TypeOf(in)))
}
}
}
}