summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-03-16 11:11:53 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-03-16 11:26:47 +0100
commit0def77a920885491bce2d5c06248a0066bc36767 (patch)
treebfb200fff2c679320514fe21db7773716d99d6e8
parent6b6af5c6dea1a6011d7e116e6e285111f033a34d (diff)
downloadpintos-0def77a920885491bce2d5c06248a0066bc36767.tar.gz
lock create/remove
-rw-r--r--src/filesys/filesys.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/filesys/filesys.c b/src/filesys/filesys.c
index fedda08..789bcf2 100644
--- a/src/filesys/filesys.c
+++ b/src/filesys/filesys.c
@@ -8,6 +8,8 @@
#include "filesys/directory.h"
#include "devices/disk.h"
+static struct lock create_lock;
+
/* The disk that contains the file system. */
struct disk *filesys_disk;
@@ -22,6 +24,8 @@ filesys_init (bool format)
if (filesys_disk == NULL)
PANIC ("hd0:1 (hdb) not present, file system initialization failed");
+ lock_init (&create_lock);
+
inode_init ();
free_map_init ();
@@ -48,12 +52,14 @@ filesys_create (const char *name, off_t initial_size)
{
disk_sector_t inode_sector = 0;
struct dir *dir = dir_open_root ();
+ lock_acquire (&create_lock);
bool success = (dir != NULL
- && free_map_allocate (1, &inode_sector)
- && inode_create (inode_sector, initial_size)
- && dir_add (dir, name, inode_sector));
- if (!success && inode_sector != 0)
- free_map_release (inode_sector, 1);
+ && free_map_allocate (1, &inode_sector) // find sector
+ && inode_create (inode_sector, initial_size) // create inode pointing to sector
+ && dir_add (dir, name, inode_sector)); // add dir entry pointing to inode
+ lock_release (&create_lock);
+ if (!success && inode_sector != 0) // oops, we got a sector but file creation failed
+ free_map_release (inode_sector, 1); // so deallocate the sector
dir_close (dir);
return success;