Get rid of file system "dump" operations because they weren't useful
[pintos-anon] / src / filesys / filesys.c
index 59212ca774f3cf64e3878d82a593216bf294101d..b77d2718e824cc73315d3083255f30a0fc34a460 100644 (file)
 
 /* 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
        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. */