X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffilesys%2Ffilesys.c;h=7a53f5ffd924ca7b1b384fd9b46b3256e14f30e6;hb=fd2a5afa946474ba0839de0e9da238dbaecbd6a5;hp=d0e5c496c2c0af8cb7e5c6ee57807b0c7c258869;hpb=18c42969655f3a3de4ed601d0f6ce865ecb4a1bf;p=pintos-anon diff --git a/src/filesys/filesys.c b/src/filesys/filesys.c index d0e5c49..7a53f5f 100644 --- a/src/filesys/filesys.c +++ b/src/filesys/filesys.c @@ -1,192 +1,103 @@ -#include "filesys.h" -#include "disk.h" -#include "directory.h" - -static struct disk *disk; - -static struct file free_map_file, root_dir_file; - -#define FREE_MAP_SECTOR 0 -#define ROOT_DIR_SECTOR 1 - -#define NUM_DIR_ENTRIES 10 -#define ROOT_DIR_FILE_SIZE (sizeof (struct dir_entry) * NUM_DIR_ENTRIES) - -static void -do_format (void) +#include "filesys/filesys.h" +#include +#include +#include +#include "filesys/file.h" +#include "filesys/free-map.h" +#include "filesys/inode.h" +#include "filesys/directory.h" + +/* Partition that contains the file system. */ +struct block *fs_device; + +static void do_format (void); + +/* Initializes the file system module. + If FORMAT is true, reformats the file system. */ +void +filesys_init (bool format) { - struct bitmap free_map; - struct filehdr map_hdr, dir_hdr; - struct dir dir; - - /* Create the initial bitmap and reserve sectors for the - free map and root directory file headers. */ - if (!bitmap_init (&free_map, disk_size (disk))) - panic ("bitmap creation failed"); - bitmap_mark (&free_map, FREE_MAP_SECTOR); - bitmap_mark (&free_map, ROOT_DIR_SECTOR); - - /* Allocate data sector(s) for the free map file - and write its file header to disk. */ - if (!filehdr_allocate (&map_hdr, bitmap_storage_size (&free_map))) - panic ("free map creation failed"); - filehdr_write (&map_hdr, FREE_MAP_SECTOR); - filehdr_destroy (&map_hdr); + fs_device = block_get_role (BLOCK_FILESYS); + if (fs_device == NULL) + PANIC ("No file system device found, can't initialize file system."); - /* Allocate data sector(s) for the root directory file - and write its file header to disk. */ - if (!filehdr_allocate (&dir_hdr, ROOT_DIR_FILE_SIZE)) - panic ("root directory creation failed"); - filehdr_write (&dir_hdr, FREE_MAP_SECTOR); - filehdr_destroy (&dir_hdr); + inode_init (); + free_map_init (); - /* Write out the free map now that we have space reserved - for it. */ - file_open (&free_map_file, FREE_MAP_SECTOR); - bitmapio_write (&free_map, free_map_file); - bitmap_destroy (&free_map); - file_close (&free_map_file); + if (format) + do_format (); - /* Write out the root directory in the same way. */ - file_open (&root_dir_file, ROOT_DIR_SECTOR); - if (!dir_init (&dir, NUM_DIR_ENTRIES)) - panic ("can't initialize root directory"); - dir_write (root_dir_file); - dir_destroy (&dir); - file_close (&free_map_file); + free_map_open (); } +/* Shuts down the file system module, writing any unwritten data + to disk. */ void -filesys_init (bool format) +filesys_done (void) { - disk = disk_get (1); - if (disk == NULL) - panic ("ide1:1 not present, filesystem initialization failed"); - - if (format) - do_format (); - - file_open (&free_map_file, FREE_MAP_SECTOR); - file_open (&root_dir_file, ROOT_DIR_SECTOR); + free_map_close (); } - + +/* Creates a file named NAME with the given INITIAL_SIZE. + Returns true if successful, false otherwise. + Fails if a file named NAME already exists, + or if internal memory allocation fails. */ bool filesys_create (const char *name, off_t initial_size) { - struct dir dir; - struct bitmap free_map; - disk_sector_no hdr_sector; - struct filehdr filehdr; - bool success = false; - - /* Read the root directory. */ - dir_init (&dir, NUM_DIR_ENTRIES); - dir_read (&dir, &root_dir_file); - if (dir_lookup (&dir, name, NULL)) - goto exit1; - - /* Allocate a block for the file header. */ - if (!bitmap_init (&free_map, disk_size (disk))) - goto exit1; - bitmapio_read (&free_map, &free_map_file); - hdr_sector = bitmap_find_and_set (&free_map); - if (hdr_sector == BITMAP_ERROR) - goto exit2; - - /* Add the file to the directory. */ - if (!dir_add (&dir, name, hdr_sector)) - goto exit2; + block_sector_t inode_sector = 0; + struct dir *dir = dir_open_root (); + bool success = (dir != NULL + && free_map_allocate (1, &inode_sector) + && inode_create (inode_sector, initial_size) + && dir_add (dir, name, inode_sector)); + if (!success && inode_sector != 0) + free_map_release (inode_sector, 1); + dir_close (dir); - /* Allocate space for the file. */ - if (!filehdr_allocate (&filehdr, initial_size)) - goto exit2; - - /* Write everything back. */ - filehdr_write (&filehdr, hdr_sector); - dir_write (&dir, &root_dir_file); - bitmapio_write (&free_map, &free_map_file); + return success; +} - success = true; +/* Opens the file with the given NAME. + Returns the new file if successful or a null pointer + otherwise. + Fails if no file named NAME exists, + or if an internal memory allocation fails. */ +struct file * +filesys_open (const char *name) +{ + struct dir *dir = dir_open_root (); + struct inode *inode = NULL; - /* Clean up. */ - filehdr_destroy (&filehdr); - exit2: - bitmap_destroy (&free_map); - exit1: - dir_destroy (&dir); + if (dir != NULL) + dir_lookup (dir, name, &inode); + dir_close (dir); - return success; + return file_open (inode); } +/* Deletes the file named NAME. + Returns true if successful, false on failure. + Fails if no file named NAME exists, + or if an internal memory allocation fails. */ bool filesys_remove (const char *name) { - struct dir dir; - disk_sector_no hdr_sector; - struct filehdr filehdr; - struct bitmap free_map; - bool success = false; - - /* Read the root directory. */ - dir_init (&dir, NUM_DIR_ENTRIES); - dir_read (&dir, &root_dir_file); - if (!dir_lookup (&dir, name, &hdr_sector)) - goto exit1; - - /* Read the file header. */ - if (!filehdr_read (&filehdr, hdr_sector)) - goto exit1; - - /* Allocate a block for the file header. */ - if (!bitmap_init (&free_map, disk_size (disk))) - goto exit2; - bitmapio_read (&free_map, &free_map_file); - - /* Deallocate. */ - filehdr_deallocate (&filehdr, &free_map); - bitmap_reset (&free_map, hdr_sector); - dir_remove (&dir, name); - - /* Write everything back. */ - bitmapio_write (&free_map, &free_map_file); - dir_write (&dir, &root_dir_file); - - success = true; - - /* Clean up. */ - bitmap_destroy (&free_map); - exit2: - filehdr_destroy (&filehdr); - exit1: - dir_destroy (&dir); + struct dir *dir = dir_open_root (); + bool success = dir != NULL && dir_remove (dir, name); + dir_close (dir); return success; } - -#undef NDEBUG -#include "debug.h" -#include "file.h" - -void -filesys_self_test (void) + +/* Formats the file system. */ +static void +do_format (void) { - static const char s[] = "This is a test string."; - struct file *file; - char s2[sizeof s]; - - ASSERT (filesys_create ("foo")); - ASSERT ((file = filesys_open ("foo")) != NULL); - ASSERT (file_write (file, s, sizeof s) == sizeof s); - ASSERT (file_tell (file) == sizeof s); - ASSERT (file_length (file) == sizeof s); - file_close (file); - - ASSERT ((file = filesys_open ("foo")) != NULL); - ASSERT (file_read (file, s2, sizeof s2) == sizeof s2); - ASSERT (memcmp (s, s2, sizeof s) == 0); - ASSERT (file_tell (file) == sizeof s2); - ASSERT (file_length (file) == sizeof s2); - file_close (file); - - ASSERT (filesys_remove ("foo")); + printf ("Formatting file system..."); + free_map_create (); + if (!dir_create (ROOT_DIR_SECTOR, 16)) + PANIC ("root directory creation failed"); + free_map_close (); + printf ("done.\n"); }