Fix bitmap usage.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 30 Aug 2004 18:07:59 +0000 (18:07 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 30 Aug 2004 18:07:59 +0000 (18:07 +0000)
src/filesys/filesys.c
src/filesys/filesys.h
src/lib/bitmap.c
src/lib/bitmap.h

index 0b96c2723a1949bcaf1d2f2bb7a85334d1d8bdfb..d0e5c496c2c0af8cb7e5c6ee57807b0c7c258869 100644 (file)
@@ -21,7 +21,8 @@ do_format (void)
 
   /* Create the initial bitmap and reserve sectors for the
      free map and root directory file headers. */
-  bitmap_init (&free_map, disk_size (disk));
+  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);
 
@@ -85,7 +86,8 @@ filesys_create (const char *name, off_t initial_size)
     goto exit1;
 
   /* Allocate a block for the file header. */
-  bitmap_init (&free_map, disk_size (disk));
+  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)
@@ -129,13 +131,15 @@ filesys_remove (const char *name)
   dir_init (&dir, NUM_DIR_ENTRIES);
   dir_read (&dir, &root_dir_file);
   if (!dir_lookup (&dir, name, &hdr_sector))
-    goto exit;
+    goto exit1;
 
   /* Read the file header. */
-  filehdr_read (&filehdr, hdr_sector);
+  if (!filehdr_read (&filehdr, hdr_sector))
+    goto exit1;
 
   /* Allocate a block for the file header. */
-  bitmap_init (&free_map, disk_size (disk));
+  if (!bitmap_init (&free_map, disk_size (disk)))
+    goto exit2;
   bitmapio_read (&free_map, &free_map_file);
 
   /* Deallocate. */
@@ -150,9 +154,10 @@ filesys_remove (const char *name)
   success = true;
 
   /* Clean up. */
-  filehdr_destroy (&filehdr);
   bitmap_destroy (&free_map);
- exit:
+ exit2:
+  filehdr_destroy (&filehdr);
+ exit1:
   dir_destroy (&dir);
 
   return success;
index 4f31b7c1ce96d7d72288c4d6b91d1b5850d6acad..3de5f85d7b1f4446e5635cdcc160242010dd9d73 100644 (file)
@@ -2,6 +2,7 @@
 #define HEADER_FILESYS_H 1
 
 #include <stdbool.h>
+#include <stdint.h>
 
 #ifndef OFF_T
 #define OFF_T
index 616056f3dba32fbf67a5e4c6f6ae6db15287665d..46235b205d78092a7526cbd0c2ffa900bdf93df8 100644 (file)
@@ -5,7 +5,6 @@
 #include "lib.h"
 #include "malloc.h"
 
-typedef unsigned long elem_type;
 #define ELEM_BITS (sizeof (elem_type) * CHAR_BIT)
 #define ELEM_IDX(BIT_IDX) ((BIT_IDX) / ELEM_BITS)
 #define BIT_MASK(BIT_IDX) ((elem_type) 1 << ((BIT_IDX) % ELEM_BITS))
@@ -22,16 +21,16 @@ byte_cnt (const struct bitmap *b)
   return sizeof (elem_type) * elem_cnt (b);
 }
 
-void
+bool
 bitmap_init (struct bitmap *b, size_t bit_cnt) 
 {
   b->bit_cnt = bit_cnt;
   b->bits = malloc (byte_cnt (b));
   if (b->bits == NULL && bit_cnt > 0) 
-    return NULL;
+    return false;
 
   bitmap_set_all (b, false);
-  return b;
+  return true;
 }
 
 size_t
index ba4465e4e595cf040574f8388be5bade0f837d85..896a1e8e7b66a9b6e1b4f4626011c9a475fbd21e 100644 (file)
@@ -4,16 +4,19 @@
 #include <stdbool.h>
 #include <stddef.h>
 
+typedef unsigned long elem_type;
+
 struct bitmap
   {
     size_t bit_cnt;
     elem_type *bits;
   };
 
-void bitmap_init (struct bitmap *, size_t bit_cnt);
+bool bitmap_init (struct bitmap *, size_t bit_cnt);
 void bitmap_destroy (struct bitmap *);
 
 size_t bitmap_size (const struct bitmap *);
+size_t bitmap_storage_size (const struct bitmap *);
 
 void bitmap_set (struct bitmap *, size_t idx, bool);
 void bitmap_set_all (struct bitmap *, bool);