00001 #include "filesys/filesys.h"
00002
00003 #include <debug.h>
00004 #include <stdio.h>
00005 #include <string.h>
00006 #include "filesys/file.h"
00007 #include "filesys/free-map.h"
00008 #include "filesys/inode.h"
00009 #include "filesys/directory.h"
00010
00011
00012 struct block *fs_device;
00013
00014 static void do_format (void);
00015
00016
00017
00018 void
00019 filesys_init (bool format)
00020 {
00021 fs_device = block_get_role (BLOCK_FILESYS);
00022 if (fs_device == NULL)
00023 PANIC ("No file system device found, can't initialize file system.");
00024
00025 inode_init ();
00026 free_map_init ();
00027
00028 if (format)
00029 do_format ();
00030
00031 free_map_open ();
00032 }
00033
00034
00035
00036 void
00037 filesys_done (void)
00038 {
00039 free_map_close ();
00040 }
00041
00042
00043
00044
00045
00046 bool
00047 filesys_create (const char *name, off_t initial_size)
00048 {
00049 block_sector_t inode_sector = 0;
00050 struct dir *dir = dir_open_root ();
00051 bool success = (dir != NULL
00052 && free_map_allocate (1, &inode_sector)
00053 && inode_create (inode_sector, initial_size)
00054 && dir_add (dir, name, inode_sector));
00055 if (!success && inode_sector != 0)
00056 free_map_release (inode_sector, 1);
00057 dir_close (dir);
00058
00059 return success;
00060 }
00061
00062
00063
00064
00065
00066
00067 struct file *
00068 filesys_open (const char *name)
00069 {
00070 struct dir *dir = dir_open_root ();
00071 struct inode *inode = NULL;
00072
00073 if (dir != NULL)
00074 dir_lookup (dir, name, &inode);
00075 dir_close (dir);
00076
00077 return file_open (inode);
00078 }
00079
00080
00081
00082
00083
00084 bool
00085 filesys_remove (const char *name)
00086 {
00087 struct dir *dir = dir_open_root ();
00088 bool success = dir != NULL && dir_remove (dir, name);
00089 dir_close (dir);
00090
00091 return success;
00092 }
00093
00094
00095 static void
00096 do_format (void)
00097 {
00098 printf ("Formatting file system...");
00099 free_map_create ();
00100 if (!dir_create (ROOT_DIR_SECTOR, 16))
00101 PANIC ("root directory creation failed");
00102 free_map_close ();
00103 printf ("done.\n");
00104 }