OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [posix/] [mm0/] [include/] [vfs.h] - Rev 2

Compare with Previous | Blame | View Log

#ifndef __VFS_H__
#define __VFS_H__
 
#include <fs.h>
#include <malloc/malloc.h>
#include <l4/lib/list.h>
#include <memfs/memfs.h>
#include <l4/macros.h>
#include <stdio.h>
#include <task.h>
#include <path.h>
 
/* Top nibble of vnum indicates filesystem index */
#define VFS_FSIDX_MASK		0xF0000000
#define VFS_FSIDX_SHIFT		28
#define VFS_FSIDX_SIZE		16
 
extern struct link vnode_cache;
extern struct link dentry_cache;
extern struct id_pool *vfs_fsidx_pool;
 
/*
 * This is a temporary origacement for page cache support provided by mm0.
 * Normally mm0 tracks all vnode pages, but this is used to track pages in
 * directory vnodes, which are normally never mapped by tasks.
 */
static inline void *vfs_alloc_dirpage(struct vnode *v)
{
	/*
	 * Urgh, we allocate from the block cache of memfs to store generic vfs directory
	 * pages. This is currently the quickest we can allocate page-aligned memory.
	 */
	return memfs_alloc_block(v->sb->fs_super);
}
 
static inline void vfs_free_dirpage(struct vnode *v, void *block)
{
	memfs_free_block(v->sb->fs_super, block);
}
 
static inline struct dentry *vfs_alloc_dentry(void)
{
	struct dentry *d = kzalloc(sizeof(struct dentry));
 
	link_init(&d->child);
	link_init(&d->children);
	link_init(&d->vref);
	link_init(&d->cache_list);
 
	return d;
}
 
static inline void vfs_free_dentry(struct dentry *d)
{
	return kfree(d);
}
 
static inline struct vnode *vfs_alloc_vnode(void)
{
	struct vnode *v = kzalloc(sizeof(struct vnode));
 
	link_init(&v->dentries);
	link_init(&v->cache_list);
 
	return v;
}
 
static inline void vfs_free_vnode(struct vnode *v)
{
	BUG(); /* Are the dentries freed ??? */
	list_remove(&v->cache_list);
	kfree(v);
}
 
static inline struct superblock *vfs_alloc_superblock(void)
{
	struct superblock *sb = kmalloc(sizeof(struct superblock));
	int fsidx = id_new(vfs_fsidx_pool);
 
	sb->fsidx = fsidx << VFS_FSIDX_SHIFT;
	link_init(&sb->list);
 
	return sb;
}
 
struct vfs_mountpoint {
	struct superblock *sb;	/* The superblock of mounted filesystem */
	struct vnode *pivot;	/* The dentry upon which we mount */
};
 
extern struct vfs_mountpoint vfs_root;
 
int vfs_mount_root(struct superblock *sb);
struct vnode *generic_vnode_lookup(struct vnode *thisnode, struct pathdata *p,
				   const char *component);
struct vnode *vfs_vnode_lookup_bypath(struct pathdata *p);
struct vnode *vfs_vnode_lookup_byvnum(struct superblock *sb, unsigned long vnum);
 
int vfs_init(void);
 
#endif /* __VFS_H__ */
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.