00001 #include "filesys/free-map.h"
00002
00003 #include <bitmap.h>
00004 #include <debug.h>
00005 #include "filesys/file.h"
00006 #include "filesys/filesys.h"
00007 #include "filesys/inode.h"
00008
00009 static struct file *free_map_file;
00010 static struct bitmap *free_map;
00011
00012
00013 void
00014 free_map_init (void)
00015 {
00016 free_map = bitmap_create (block_size (fs_device));
00017 if (free_map == NULL)
00018 PANIC ("bitmap creation failed--file system device is too large");
00019 bitmap_mark (free_map, FREE_MAP_SECTOR);
00020 bitmap_mark (free_map, ROOT_DIR_SECTOR);
00021 }
00022
00023
00024
00025
00026
00027 bool
00028 free_map_allocate (size_t cnt, block_sector_t *sectorp)
00029 {
00030 block_sector_t sector = bitmap_scan_and_flip (free_map, 0, cnt, false);
00031 if (sector != BITMAP_ERROR
00032 && free_map_file != NULL
00033 && !bitmap_write (free_map, free_map_file))
00034 {
00035 bitmap_set_multiple (free_map, sector, cnt, false);
00036 sector = BITMAP_ERROR;
00037 }
00038 if (sector != BITMAP_ERROR)
00039 *sectorp = sector;
00040 return sector != BITMAP_ERROR;
00041 }
00042
00043
00044 void
00045 free_map_release (block_sector_t sector, size_t cnt)
00046 {
00047 ASSERT (bitmap_all (free_map, sector, cnt));
00048 bitmap_set_multiple (free_map, sector, cnt, false);
00049 bitmap_write (free_map, free_map_file);
00050 }
00051
00052
00053 void
00054 free_map_open (void)
00055 {
00056 free_map_file = file_open (inode_open (FREE_MAP_SECTOR));
00057 if (free_map_file == NULL)
00058 PANIC ("can't open free map");
00059 if (!bitmap_read (free_map, free_map_file))
00060 PANIC ("can't read free map");
00061 }
00062
00063
00064 void
00065 free_map_close (void)
00066 {
00067 file_close (free_map_file);
00068 }
00069
00070
00071
00072 void
00073 free_map_create (void)
00074 {
00075
00076 if (!inode_create (FREE_MAP_SECTOR, bitmap_file_size (free_map)))
00077 PANIC ("free map creation failed");
00078
00079
00080 free_map_file = file_open (inode_open (FREE_MAP_SECTOR));
00081 if (free_map_file == NULL)
00082 PANIC ("can't open free map");
00083 if (!bitmap_write (free_map, free_map_file))
00084 PANIC ("can't write free map");
00085 }