tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Vnode API change: add global vnode cache

Currently all file systems have to implement their own cache of
vnode / fs node pairs.  Most file systems use a copy and pasted
version of ufs_ihash.

So add a global vnode cache with lookup and remove:

 * Lookup a vnode / fs node pair by key and return it referenced through vpp.
vcache_lookup(struct mount *mp, void *key, size_t key_len, struct vnode **vpp)

 * Remove a vnode / fs node pair from the cache.
vcache_remove(struct mount *mp, void *key, size_t key_len)

On cache miss vcache_lookup() will call a new vfs operation:

 * Read an inode from disk and initialize this vnode / inode pair.
 * Caller assures no other thread will try to load this inode.
vfs_load_node(struct mount *mp, struct vnode *vp,
    const void *key, size_t key_len, void **new_key)

to load and initialize this vnode / fs node pair.  The vnode cache
guarantees this call to be exclusive, no other thread will try to
load this vnode / fs node pair.  The vnode will not appear on any
list before this operation completes.

Diff implementing this for file systems sharing ufs_ihash and replacing
VFS_VGET()/VOP_UNLOCK() sequences with vcache_lookup() is here:

Comments or objections anyone?

J. Hannken-Illjes - - TU Braunschweig 

Home | Main Index | Thread Index | Old Index