diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-03-16 11:11:53 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-03-16 11:26:47 +0100 |
| commit | 0def77a920885491bce2d5c06248a0066bc36767 (patch) | |
| tree | bfb200fff2c679320514fe21db7773716d99d6e8 | |
| parent | 6b6af5c6dea1a6011d7e116e6e285111f033a34d (diff) | |
| download | pintos-0def77a920885491bce2d5c06248a0066bc36767.tar.gz | |
lock create/remove
| -rw-r--r-- | src/filesys/filesys.c | 16 |
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; |
