X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffilesys%2Ffilesys.c;h=b77d2718e824cc73315d3083255f30a0fc34a460;hb=3c4ff7ffae2e6f05a2c78ec77814dbc5a98c4f98;hp=59212ca774f3cf64e3878d82a593216bf294101d;hpb=c00124df280431bb3f1fd26ef0f5c863365c6474;p=pintos-anon diff --git a/src/filesys/filesys.c b/src/filesys/filesys.c index 59212ca..b77d271 100644 --- a/src/filesys/filesys.c +++ b/src/filesys/filesys.c @@ -38,10 +38,11 @@ /* Filesystem. - For the purposes of the "user processes" assignment (project - 2), please treat all the code in the filesys directory as a - black box. No changes should be needed. For that project, a - single lock external to the filesystem code suffices. + For the purposes of the "user processes" and "virtual memory" + assignments (projects 2 and 3), please treat all the code in + the filesys directory as a black box. No changes should be + needed. For those projects, a single lock external to the + filesystem code suffices. The filesystem consists of a set of files. Each file has a header called an `index node' or `inode', represented by @@ -73,10 +74,9 @@ directory is represented as a file, the number of files that may be created is also limited. - - No indirect blocks. This limits maximum file size to the - number of sector pointers that fit in a single inode - times the size of a sector, or 126 * 512 == 63 kB given - 32-bit sizes and 512-byte sectors. + - File data is allocated as a single extent, so that + external fragmentation can become a serious problem as a + file system is used over time. - No subdirectories. @@ -149,7 +149,6 @@ filesys_create (const char *name, off_t initial_size) { struct dir *dir = NULL; struct bitmap *free_map = NULL; - struct inode *inode = NULL; disk_sector_t inode_sector; bool success = false; @@ -166,7 +165,7 @@ filesys_create (const char *name, off_t initial_size) if (free_map == NULL) goto done; bitmap_read (free_map, free_map_file); - inode_sector = bitmap_find_and_set (free_map); + inode_sector = bitmap_scan_and_flip (free_map, 0, 1, false); if (inode_sector == BITMAP_ERROR) goto done; @@ -175,12 +174,10 @@ filesys_create (const char *name, off_t initial_size) goto done; /* Allocate space for the file. */ - inode = inode_create (free_map, inode_sector, initial_size); - if (inode == NULL) + if (!inode_create (free_map, inode_sector, initial_size)) goto done; /* Write everything back. */ - inode_commit (inode); dir_write (dir, root_dir_file); bitmap_write (free_map, free_map_file); @@ -188,7 +185,6 @@ filesys_create (const char *name, off_t initial_size) /* Clean up. */ done: - inode_close (inode); bitmap_destroy (free_map); dir_destroy (dir); @@ -197,7 +193,8 @@ filesys_create (const char *name, off_t initial_size) /* Opens a file named NAME and initializes FILE for usage with the file_*() functions declared in file.h. - Returns true if successful, false on failure. + 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 * @@ -241,7 +238,7 @@ filesys_remove (const char *name) if (!dir_lookup (dir, name, &inode_sector)) goto done; - /* Open the inode and delete it it. */ + /* Open the inode and delete it. */ inode = inode_open (inode_sector); if (inode == NULL) goto done; @@ -279,35 +276,6 @@ filesys_list (void) return true; } -/* Dumps the filesystem state to the system console, - including the free map, the list of files, and file contents. - Returns true if successful, false on failure, - which occurs only if an internal memory allocation fails. */ -bool -filesys_dump (void) -{ - struct bitmap *free_map; - struct dir *dir; - - printf ("Free map:\n"); - free_map = bitmap_create (disk_size (filesys_disk)); - if (free_map == NULL) - return false; - bitmap_read (free_map, free_map_file); - bitmap_dump (free_map); - bitmap_destroy (free_map); - printf ("\n"); - - dir = dir_create (NUM_DIR_ENTRIES); - if (dir == NULL) - return false; - dir_read (dir, root_dir_file); - dir_dump (dir); - dir_destroy (dir); - - return true; -} - static void must_succeed_function (int, bool) NO_INLINE; #define MUST_SUCCEED(EXPR) must_succeed_function (__LINE__, EXPR) @@ -347,14 +315,12 @@ filesys_self_test (void) Delete file while open to check proper semantics. */ MUST_SUCCEED ((file = filesys_open ("foo")) != NULL); MUST_SUCCEED (filesys_remove ("foo")); + MUST_SUCCEED (filesys_open ("foo") == NULL); MUST_SUCCEED (file_read (file, s2, sizeof s) == sizeof s); MUST_SUCCEED (memcmp (s, s2, sizeof s) == 0); MUST_SUCCEED (file_tell (file) == sizeof s); MUST_SUCCEED (file_length (file) == sizeof s); file_close (file); - - /* Make sure file is deleted. */ - MUST_SUCCEED ((file = filesys_open ("foo")) == NULL); } printf ("filesys: self test ok\n"); @@ -365,7 +331,6 @@ static void do_format (void) { struct bitmap *free_map; - struct inode *map_inode, *dir_inode; struct dir *dir; printf ("Formatting filesystem..."); @@ -378,23 +343,11 @@ do_format (void) 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 inode to disk. */ - map_inode = inode_create (free_map, FREE_MAP_SECTOR, - bitmap_file_size (free_map)); - if (map_inode == NULL) + /* Allocate free map and root dir files. */ + if (!inode_create (free_map, FREE_MAP_SECTOR, bitmap_file_size (free_map))) PANIC ("free map creation failed--disk is too large"); - inode_commit (map_inode); - inode_close (map_inode); - - /* Allocate data sector(s) for the root directory file - and write its inodes to disk. */ - dir_inode = inode_create (free_map, ROOT_DIR_SECTOR, - dir_size (NUM_DIR_ENTRIES)); - if (dir_inode == NULL) + if (!inode_create (free_map, ROOT_DIR_SECTOR, dir_size (NUM_DIR_ENTRIES))) PANIC ("root directory creation failed"); - inode_commit (dir_inode); - inode_close (dir_inode); /* Write out the free map now that we have space reserved for it. */