summaryrefslogtreecommitdiffstats
path: root/src/filesys/free-map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/filesys/free-map.c')
-rw-r--r--src/filesys/free-map.c10
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. */