os_kernel_lab/labcodes/lab8/kern/fs/vfs/vfs.c
2013-09-17 22:21:48 +08:00

98 lines
1.9 KiB
C

#include <defs.h>
#include <stdio.h>
#include <string.h>
#include <vfs.h>
#include <inode.h>
#include <sem.h>
#include <kmalloc.h>
#include <error.h>
static semaphore_t bootfs_sem;
static struct inode *bootfs_node = NULL;
extern void vfs_devlist_init(void);
// __alloc_fs - allocate memory for fs, and set fs type
struct fs *
__alloc_fs(int type) {
struct fs *fs;
if ((fs = kmalloc(sizeof(struct fs))) != NULL) {
fs->fs_type = type;
}
return fs;
}
// vfs_init - vfs initialize
void
vfs_init(void) {
sem_init(&bootfs_sem, 1);
vfs_devlist_init();
}
// lock_bootfs - lock for bootfs
static void
lock_bootfs(void) {
down(&bootfs_sem);
}
// ulock_bootfs - ulock for bootfs
static void
unlock_bootfs(void) {
up(&bootfs_sem);
}
// change_bootfs - set the new fs inode
static void
change_bootfs(struct inode *node) {
struct inode *old;
lock_bootfs();
{
old = bootfs_node, bootfs_node = node;
}
unlock_bootfs();
if (old != NULL) {
vop_ref_dec(old);
}
}
// vfs_set_bootfs - change the dir of file system
int
vfs_set_bootfs(char *fsname) {
struct inode *node = NULL;
if (fsname != NULL) {
char *s;
if ((s = strchr(fsname, ':')) == NULL || s[1] != '\0') {
return -E_INVAL;
}
int ret;
if ((ret = vfs_chdir(fsname)) != 0) {
return ret;
}
if ((ret = vfs_get_curdir(&node)) != 0) {
return ret;
}
}
change_bootfs(node);
return 0;
}
// vfs_get_bootfs - get the inode of bootfs
int
vfs_get_bootfs(struct inode **node_store) {
struct inode *node = NULL;
if (bootfs_node != NULL) {
lock_bootfs();
{
if ((node = bootfs_node) != NULL) {
vop_ref_inc(bootfs_node);
}
}
unlock_bootfs();
}
if (node == NULL) {
return -E_NOENT;
}
*node_store = node;
return 0;
}