diff options
Diffstat (limited to 'src/filesys/free-map.c')
| -rw-r--r-- | src/filesys/free-map.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/filesys/free-map.c b/src/filesys/free-map.c index 1cd9175..8b8aeae 100644 --- a/src/filesys/free-map.c +++ b/src/filesys/free-map.c @@ -4,8 +4,11 @@ #include "filesys/file.h" #include "filesys/filesys.h" #include "filesys/inode.h" +#include "threads/synch.h" static struct file *free_map_file; /* Free map file. */ + +static struct lock free_map_lock; static struct bitmap *free_map; /* Free map, one bit per disk sector. */ /* Initializes the free map. */ @@ -15,6 +18,7 @@ free_map_init (void) free_map = bitmap_create (disk_size (filesys_disk)); if (free_map == NULL) PANIC ("bitmap creation failed--disk is too large"); + lock_init (&free_map_lock); bitmap_mark (free_map, FREE_MAP_SECTOR); bitmap_mark (free_map, ROOT_DIR_SECTOR); } @@ -26,6 +30,7 @@ free_map_init (void) bool free_map_allocate (size_t cnt, disk_sector_t *sectorp) { + lock_acquire (&free_map_lock); disk_sector_t sector = bitmap_scan_and_flip (free_map, 0, cnt, false); if (sector != BITMAP_ERROR && free_map_file != NULL @@ -34,6 +39,7 @@ free_map_allocate (size_t cnt, disk_sector_t *sectorp) bitmap_set_multiple (free_map, sector, cnt, false); sector = BITMAP_ERROR; } + lock_release (&free_map_lock); if (sector != BITMAP_ERROR) *sectorp = sector; return sector != BITMAP_ERROR; @@ -43,9 +49,11 @@ free_map_allocate (size_t cnt, disk_sector_t *sectorp) void free_map_release (disk_sector_t sector, size_t cnt) { + lock_acquire (&free_map_lock); ASSERT (bitmap_all (free_map, sector, cnt)); bitmap_set_multiple (free_map, sector, cnt, false); bitmap_write (free_map, free_map_file); + lock_release (&free_map_lock); } /* Opens the free map file and reads it from disk. */ @@ -55,8 +63,10 @@ free_map_open (void) free_map_file = file_open (inode_open (FREE_MAP_SECTOR)); if (free_map_file == NULL) PANIC ("can't open free map"); + lock_acquire (&free_map_lock); if (!bitmap_read (free_map, free_map_file)) PANIC ("can't read free map"); + lock_release (&free_map_lock); } /* Writes the free map to disk and closes the free map file. */ |
