initial version
This commit is contained in:
97
code/lab8/kern/fs/vfs/vfs.c
Normal file
97
code/lab8/kern/fs/vfs/vfs.c
Normal file
@@ -0,0 +1,97 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user