X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffilesys%2Ffilesys.c;h=798989065f11110135fb1200e9aa50cbd7f39477;hb=07ee003af55dc3aab779e95ef2a4f095f6b65964;hp=8bd39e80ff52ef82eaf1056117448373daf8b7fa;hpb=993c1d9f4452e2edd851f3175dfdf317f18bdb9f;p=pintos-anon diff --git a/src/filesys/filesys.c b/src/filesys/filesys.c index 8bd39e8..7989890 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. @@ -131,6 +131,15 @@ filesys_init (bool format) PANIC ("can't open root dir file"); } +/* Shuts down the filesystem module, writing any unwritten data + to disk. + Currently there's nothing to do. You'll need to add code here + when you implement write-behind caching. */ +void +filesys_done (void) +{ +} + /* Creates a file named NAME with the given INITIAL_SIZE. Returns true if successful, false otherwise. Fails if a file named NAME already exists, @@ -140,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; @@ -157,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; @@ -166,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); @@ -179,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); @@ -188,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 * @@ -232,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; @@ -338,14 +344,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"); @@ -356,7 +360,6 @@ static void do_format (void) { struct bitmap *free_map; - struct inode *map_inode, *dir_inode; struct dir *dir; printf ("Formatting filesystem..."); @@ -369,23 +372,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. */