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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [posix/] [mm0/] [fs/] [vfs.c] - Rev 2

Compare with Previous | Blame | View Log

/*
 * High-level vfs implementation.
 *
 * Copyright (C) 2008 Bahadir Balban
 */
#include <fs.h>
#include <vfs.h>
#include <task.h>
#include <path.h>
 
LINK_DECLARE(vnode_cache);
LINK_DECLARE(dentry_cache);
 
struct vfs_mountpoint vfs_root;
struct id_pool *vfs_fsidx_pool;
 
/*
 * Vnodes in the vnode cache have 2 keys. One is their dentry names, the other
 * is their vnum. This one checks the vnode cache by the given vnum first.
 * If nothing is found, it reads the vnode from disk into cache. This is called
 * by system calls since tasks keep an fd-to-vnum table.
 */
struct vnode *vfs_vnode_lookup_byvnum(struct superblock *sb, unsigned long vnum)
{
	struct vnode *v;
	int err;
 
	/* Check the vnode flat list by vnum */
	list_foreach_struct(v, &vnode_cache, cache_list)
		if (v->vnum == vnum)
			return v;
 
	/* Check the actual filesystem for the vnode */
	v = vfs_alloc_vnode();
	v->vnum = vnum;
 
	/* Note this only checks given superblock */
	if ((err = sb->ops->read_vnode(sb, v)) < 0) {
		vfs_free_vnode(v);
		return PTR_ERR(err);
	}
 
	/* Add the vnode back to vnode flat list */
	list_insert(&v->cache_list, &vnode_cache);
 
	return v;
}
 
/*
 * Vnodes in the vnode cache have 2 keys. One is the set of dentry names they
 * have, the other is their vnum. This one checks the vnode cache by the path
 * first. If nothing is found, it reads the vnode from disk into the cache.
 */
struct vnode *vfs_vnode_lookup_bypath(struct pathdata *pdata)
{
	const char *firstcomp;
 
	/*
	 * This does vfs cache + fs lookup.
	 */
	BUG_ON(list_empty(&pdata->list));
	firstcomp = pathdata_next_component(pdata);
	return pdata->vstart->ops.lookup(pdata->vstart, pdata, firstcomp);
}
 
int vfs_mount_root(struct superblock *sb)
{
	/*
	 * Lookup the root vnode of this superblock.
	 * The root superblock has vnode number 0.
	 */
	vfs_root.pivot = vfs_vnode_lookup_byvnum(sb, sb->fsidx | 0);
	vfs_root.sb = sb;
 
	return 0;
}
 
 

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.