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