Make directory interface more like file interface.
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 19 May 2006 04:47:28 +0000 (04:47 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 19 May 2006 04:47:28 +0000 (04:47 +0000)
In reference solution, push locking up to inode layer, simplifying
changes to directory code.

src/filesys/directory.c
src/filesys/directory.h
src/filesys/filesys.c

index 5f7dd9ed002ee0bf16582c5a65b80306a8c1832c..45bbdaed320b3ff801e72588c8518fa670db0bb2 100644 (file)
@@ -28,37 +28,39 @@ dir_create (disk_sector_t sector, size_t entry_cnt)
   return inode_create (sector, entry_cnt * sizeof (struct dir_entry));
 }
 
-/* Opens the directory in the given INODE, of which it takes
-   ownership, and sets *DIRP to the new directory or a null
-   pointer on failure.  Return true if successful, false on
-   failure. */
-bool
-dir_open (struct inode *inode, struct dir **dirp) 
+/* Opens and returns the directory for the given INODE, of which
+   it takes ownership.  Returns a null pointer on failure. */
+struct dir *
+dir_open (struct inode *inode) 
 {
-  struct dir *dir = NULL;
-  
-  ASSERT (dirp != NULL);
-
-  if (inode != NULL) 
+  struct dir *dir = calloc (1, sizeof *dir);
+  if (inode != NULL && dir != NULL)
     {
-      dir = malloc (sizeof *dir);
-      if (dir != NULL) 
-        dir->inode = inode;
+      dir->inode = inode;
+      return dir;
+    }
+  else
+    {
+      inode_close (inode);
+      free (dir);
+      return NULL; 
     }
-  
-  *dirp = dir;
-  if (dir == NULL)
-    inode_close (inode);
-  return dir != NULL;
 }
 
-/* Opens the root directory and sets *DIRP to it or to a null
-   pointer on failure.  Return true if successful, false on
-   failure. */
-bool
-dir_open_root (struct dir **dirp)
+/* Opens the root directory and returns a directory for it.
+   Return true if successful, false on failure. */
+struct dir *
+dir_open_root (void)
+{
+  return dir_open (inode_open (ROOT_DIR_SECTOR));
+}
+
+/* Opens and returns a new directory for the same inode as DIR.
+   Returns a null pointer on failure. */
+struct dir *
+dir_reopen (struct dir *dir) 
 {
-  return dir_open (inode_open (ROOT_DIR_SECTOR), dirp);
+  return dir_open (inode_reopen (dir->inode));
 }
 
 /* Destroys DIR and frees associated resources. */
index abc3029f9e86cea3c861a9ca711956a6d77efc1f..cc8692d50e2174d9194994afe4176d94df748e5d 100644 (file)
 #define NAME_MAX 14
 
 struct inode;
-struct dir;
 bool dir_create (disk_sector_t sector, size_t entry_cnt);
-bool dir_open (struct inode *, struct dir **);
-bool dir_open_root (struct dir **);
+struct dir *dir_open (struct inode *);
+struct dir *dir_open_root (void);
+struct dir *dir_reopen (struct dir *);
 void dir_close (struct dir *);
 bool dir_lookup (const struct dir *, const char *name, struct inode **);
 bool dir_add (struct dir *, const char *name, disk_sector_t);
index 0ca8e9eb8cef71372934df32c9c148e2065f1fcf..39bdff91aa99b5c0f37b7dc4bfb9f8e0af64029d 100644 (file)
@@ -46,9 +46,9 @@ filesys_done (void)
 bool
 filesys_create (const char *name, off_t initial_size) 
 {
-  struct dir *dir;
   disk_sector_t inode_sector = 0;
-  bool success = (dir_open_root (&dir)
+  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));
@@ -67,10 +67,10 @@ filesys_create (const char *name, off_t initial_size)
 struct file *
 filesys_open (const char *name)
 {
-  struct dir *dir;
+  struct dir *dir = dir_open_root ();
   struct inode *inode = NULL;
 
-  if (dir_open_root (&dir))
+  if (dir != NULL)
     dir_lookup (dir, name, &inode);
   dir_close (dir);
 
@@ -84,9 +84,8 @@ filesys_open (const char *name)
 bool
 filesys_remove (const char *name) 
 {
-  struct dir *dir = NULL;
-  bool success = (dir_open_root (&dir)
-                  && dir_remove (dir, name));
+  struct dir *dir = dir_open_root ();
+  bool success = dir != NULL && dir_remove (dir, name);
   dir_close (dir); 
 
   return success;
@@ -99,13 +98,15 @@ filesys_remove (const char *name)
 bool
 filesys_list (void) 
 {
-  struct dir *dir = NULL;
-  bool success = dir_open_root (&dir);
-  if (success)
-    dir_list (dir);
-  dir_close (dir);
-
-  return success;
+  struct dir *dir = dir_open_root ();
+  if (dir != NULL) 
+    {
+      dir_list (dir);
+      dir_close (dir);
+      return true;
+    }
+  else
+    return false;
 }
 \f
 static void must_succeed_function (int, bool) NO_INLINE;