#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;
|
|
}
|
|
|