Hello! Can you consider possibility integration global vnode cache with one more generic FS function genfs_lookup(). genfs_lookup can be used by other FS, if FS no need something exotic. Interface for genfs_lookup() can be next:
/* * Call back function for initiate new created vnode (vnode / fs node pair). */ int fs_fill_vnode(struct mount *mp, ino_t fileno, struct vnode *vp) { .... vp->data = ... vp->v_op = ... vp->v_tag = ... .... } /* * Called from mount() for initiate new instance genfs_lookup for new mp. */ int genfs_init_lookup(struct mount *mp, int (fillvnode)(struct mount *, ino_t, struct vnode *), /* &fs_fill_vnode() */ int (*readdir)(void *)) { } /* * Called from unmount() for destroy instance genfs_lookup for mp. */ int genfs_remove_lookup(struct mount *mp) { } /* * Generic lookup for FSs. */ int genfs_lookup(void * v){ ... find fileno with the help of readdir() for vpp try find vnode for this fileno in cache vcache_lookup(struct mount *mp, void *fileno, size_t ino_t, struct vnode **vpp) if found not new vnode goto return else get and initiate new vnode(vnode / fs node pair) with call back fillvnode() return: .... maybe vget, vref, VOP_UNLOCK(*vpp) ... what need return 0; } Thanks in advance. Ilia.