This is an umbrella structure.
- fixed number of slots, blocks
- links to FSOs:
- FSO hash table
- priority queue (btree)
- delete queue
- open for write queue
- block, file counts
- priority weights
The fso class contains most of the information about a file system
object. It has pointers to the volume information, part of which is
copied to avoid lookups. There are pointers to the data, which can be
a symlink, file or directory object. Data structures of type binding
are used to store hoard and cml information.
Fso objects keep track of readers and writers of the object.
- component name
- state (normal, runt, dying)
- status block (Venus stat, a condensed version of ViceStatus, see vcrcommon)
vnode type in here, and size, mtime, etc.
- access control information
- flags (class FsoFlags)
- fake, fetching, replaceable, etc.
- for volume types (copied) e.g. backup, replicated, etc.
- mount state (normal, mount point, mount root)
links to root, mount point in latter cases
- symlinks stored directly in RVM
- files stored as container files (CacheFile)
- directories stored in RVM
written to container files upon open
- counts (readers, writers, openers, etc.)
- links to
- hash table (fsdb)
- priority queue
- delete queue
- open-for-write queue
- parent fso
- list of child fsos
- HDB bindings
- MLE bindings
The fso objects are related one-one to cache files. Methods exported
by cache files are simple on these are things like validate, move,
copy, remove, truncate, reset. It appears that historically
cachefiles could be accessed through inode calls. Currently cache
files and fsobjs are statically linked by embedding.
- statically bound to fsobj
- container files used in several ways
- to store a plain file
- to store a UNIX format directory as a plain file
(NB: this format is system independent now!)