From 0def77a920885491bce2d5c06248a0066bc36767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Tue, 16 Mar 2021 11:11:53 +0100 Subject: lock create/remove --- src/filesys/filesys.c | 16 +++++++++++----- 1 file 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; -- cgit v1.2.1