update name of code to labcodes
This commit is contained in:
99
labcodes/lab8/kern/fs/fs.c
Normal file
99
labcodes/lab8/kern/fs/fs.c
Normal file
@@ -0,0 +1,99 @@
|
||||
#include <defs.h>
|
||||
#include <kmalloc.h>
|
||||
#include <sem.h>
|
||||
#include <vfs.h>
|
||||
#include <dev.h>
|
||||
#include <file.h>
|
||||
#include <sfs.h>
|
||||
#include <inode.h>
|
||||
#include <assert.h>
|
||||
//called when init_main proc start
|
||||
void
|
||||
fs_init(void) {
|
||||
vfs_init();
|
||||
dev_init();
|
||||
sfs_init();
|
||||
}
|
||||
|
||||
void
|
||||
fs_cleanup(void) {
|
||||
vfs_cleanup();
|
||||
}
|
||||
|
||||
void
|
||||
lock_files(struct files_struct *filesp) {
|
||||
down(&(filesp->files_sem));
|
||||
}
|
||||
|
||||
void
|
||||
unlock_files(struct files_struct *filesp) {
|
||||
up(&(filesp->files_sem));
|
||||
}
|
||||
//Called when a new proc init
|
||||
struct files_struct *
|
||||
files_create(void) {
|
||||
//cprintf("[files_create]\n");
|
||||
static_assert((int)FILES_STRUCT_NENTRY > 128);
|
||||
struct files_struct *filesp;
|
||||
if ((filesp = kmalloc(sizeof(struct files_struct) + FILES_STRUCT_BUFSIZE)) != NULL) {
|
||||
filesp->pwd = NULL;
|
||||
filesp->fd_array = (void *)(filesp + 1);
|
||||
filesp->files_count = 0;
|
||||
sem_init(&(filesp->files_sem), 1);
|
||||
fd_array_init(filesp->fd_array);
|
||||
}
|
||||
return filesp;
|
||||
}
|
||||
//Called when a proc exit
|
||||
void
|
||||
files_destroy(struct files_struct *filesp) {
|
||||
// cprintf("[files_destroy]\n");
|
||||
assert(filesp != NULL && files_count(filesp) == 0);
|
||||
if (filesp->pwd != NULL) {
|
||||
vop_ref_dec(filesp->pwd);
|
||||
}
|
||||
int i;
|
||||
struct file *file = filesp->fd_array;
|
||||
for (i = 0; i < FILES_STRUCT_NENTRY; i ++, file ++) {
|
||||
if (file->status == FD_OPENED) {
|
||||
fd_array_close(file);
|
||||
}
|
||||
assert(file->status == FD_NONE);
|
||||
}
|
||||
kfree(filesp);
|
||||
}
|
||||
|
||||
void
|
||||
files_closeall(struct files_struct *filesp) {
|
||||
// cprintf("[files_closeall]\n");
|
||||
assert(filesp != NULL && files_count(filesp) > 0);
|
||||
int i;
|
||||
struct file *file = filesp->fd_array;
|
||||
//skip the stdin & stdout
|
||||
for (i = 2, file += 2; i < FILES_STRUCT_NENTRY; i ++, file ++) {
|
||||
if (file->status == FD_OPENED) {
|
||||
fd_array_close(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
dup_files(struct files_struct *to, struct files_struct *from) {
|
||||
// cprintf("[dup_fs]\n");
|
||||
assert(to != NULL && from != NULL);
|
||||
assert(files_count(to) == 0 && files_count(from) > 0);
|
||||
if ((to->pwd = from->pwd) != NULL) {
|
||||
vop_ref_inc(to->pwd);
|
||||
}
|
||||
int i;
|
||||
struct file *to_file = to->fd_array, *from_file = from->fd_array;
|
||||
for (i = 0; i < FILES_STRUCT_NENTRY; i ++, to_file ++, from_file ++) {
|
||||
if (from_file->status == FD_OPENED) {
|
||||
/* alloc_fd first */
|
||||
to_file->status = FD_INIT;
|
||||
fd_array_dup(to_file, from_file);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user