Skip to content
Snippets Groups Projects
Commit bfd1129c authored by Tom Larsson's avatar Tom Larsson :speech_balloon:
Browse files

updates

parent 4bcb465a
No related branches found
No related tags found
No related merge requests found
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
#include <debug.h> #include <debug.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "filesys/file.h" #include "../filesys/file.h"
#include "filesys/free-map.h" #include "../filesys/free-map.h"
#include "filesys/inode.h" #include "../filesys/inode.h"
#include "filesys/directory.h" #include "../filesys/directory.h"
#include "devices/disk.h" #include "../devices/disk.h"
#include "threads/synch.h" #include "../threads/synch.h"
/* The disk that contains the file system. */ /* The disk that contains the file system. */
struct disk *filesys_disk; struct disk *filesys_disk;
...@@ -75,6 +75,7 @@ struct file * ...@@ -75,6 +75,7 @@ struct file *
filesys_open (const char *name) filesys_open (const char *name)
{ {
lock_acquire(&lock_filesys); lock_acquire(&lock_filesys);
struct dir *dir = dir_open_root (); struct dir *dir = dir_open_root ();
struct inode *inode = NULL; struct inode *inode = NULL;
...@@ -83,6 +84,7 @@ filesys_open (const char *name) ...@@ -83,6 +84,7 @@ filesys_open (const char *name)
dir_close (dir); dir_close (dir);
struct file *file = file_open(inode); struct file *file = file_open(inode);
lock_release(&lock_filesys); lock_release(&lock_filesys);
return file; return file;
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
static struct file *free_map_file; /* Free map file. */ static struct file *free_map_file; /* Free map file. */
static struct bitmap *free_map; /* Free map, one bit per disk sector. */ static struct bitmap *free_map; /* Free map, one bit per disk sector. */
struct lock map_lock; struct lock lock;
/* Initializes the free map. */ /* Initializes the free map. */
void void
free_map_init (void) free_map_init (void)
...@@ -18,7 +18,7 @@ free_map_init (void) ...@@ -18,7 +18,7 @@ free_map_init (void)
PANIC ("bitmap creation failed--disk is too large"); PANIC ("bitmap creation failed--disk is too large");
bitmap_mark (free_map, FREE_MAP_SECTOR); bitmap_mark (free_map, FREE_MAP_SECTOR);
bitmap_mark (free_map, ROOT_DIR_SECTOR); bitmap_mark (free_map, ROOT_DIR_SECTOR);
lock_init(&map_lock); lock_init(&lock);
} }
/* Allocates CNT consecutive sectors from the free map and stores /* Allocates CNT consecutive sectors from the free map and stores
...@@ -28,7 +28,8 @@ free_map_init (void) ...@@ -28,7 +28,8 @@ free_map_init (void)
bool bool
free_map_allocate (size_t cnt, disk_sector_t *sectorp) free_map_allocate (size_t cnt, disk_sector_t *sectorp)
{ {
lock_acquire(&map_lock); lock_acquire(&lock);
disk_sector_t sector = bitmap_scan_and_flip (free_map, 0, cnt, false); disk_sector_t sector = bitmap_scan_and_flip (free_map, 0, cnt, false);
if (sector != BITMAP_ERROR if (sector != BITMAP_ERROR
&& free_map_file != NULL && free_map_file != NULL
...@@ -37,17 +38,13 @@ free_map_allocate (size_t cnt, disk_sector_t *sectorp) ...@@ -37,17 +38,13 @@ free_map_allocate (size_t cnt, disk_sector_t *sectorp)
bitmap_set_multiple (free_map, sector, cnt, false); bitmap_set_multiple (free_map, sector, cnt, false);
sector = BITMAP_ERROR; sector = BITMAP_ERROR;
} }
bool sector_error = sector == BITMAP_ERROR;
if (!sector_error) if (sector != BITMAP_ERROR)
*sectorp = sector; *sectorp = sector;
lock_release(&map_lock); lock_release(&lock);
return !sector_error; return (sector != BITMAP_ERROR);
/*if (sector != BITMAP_ERROR)
*sectorp = sector;
lock_release(&map_lock);
return sector != BITMAP_ERROR;*/
} }
/* Makes CNT sectors starting at SECTOR available for use. */ /* Makes CNT sectors starting at SECTOR available for use. */
...@@ -55,10 +52,12 @@ void ...@@ -55,10 +52,12 @@ void
free_map_release (disk_sector_t sector, size_t cnt) free_map_release (disk_sector_t sector, size_t cnt)
{ {
ASSERT (bitmap_all (free_map, sector, cnt)); ASSERT (bitmap_all (free_map, sector, cnt));
lock_acquire(&map_lock); lock_acquire(&lock);
bitmap_set_multiple (free_map, sector, cnt, false); bitmap_set_multiple (free_map, sector, cnt, false);
bitmap_write (free_map, free_map_file); bitmap_write (free_map, free_map_file);
lock_release(&map_lock);
lock_release(&lock);
} }
/* Opens the free map file and reads it from disk. */ /* Opens the free map file and reads it from disk. */
......
...@@ -41,10 +41,9 @@ struct inode ...@@ -41,10 +41,9 @@ struct inode
//labb6 //labb6
int read; // Holds the amount of readers/ int read; // Holds the amount of readers/
struct semaphore sema_file_access; // Semaphore to handle the access to resources
struct lock read_count_lock; // lock to handle the access to /*read*/ struct lock read_count_lock; // lock to handle the access to /*read*/
struct lock file_queue_lock; // lock queue to prevent starvation struct lock file_queue_lock; // lock queue to prevent starvation
struct semaphore sema_file_access; // Semaphore to handle the access to resources
}; };
/* Returns the disk sector that contains byte offset POS within /* Returns the disk sector that contains byte offset POS within
...@@ -64,15 +63,15 @@ byte_to_sector (const struct inode *inode, off_t pos) ...@@ -64,15 +63,15 @@ byte_to_sector (const struct inode *inode, off_t pos)
/* List of open inodes, so that opening a single inode twice /* List of open inodes, so that opening a single inode twice
returns the same `struct inode'. */ returns the same `struct inode'. */
static struct list open_inodes; static struct list open_inodes;
// Lock to protect the list of open inodes
struct lock lock; struct lock lock_open;
/* Initializes the inode module. */ /* Initializes the inode module. */
void void
inode_init (void) inode_init (void)
{ {
list_init (&open_inodes); list_init (&open_inodes);
lock_init(&lock); lock_init(&lock_open);
} }
/* Initializes an inode with LENGTH bytes of data and /* Initializes an inode with LENGTH bytes of data and
...@@ -125,7 +124,7 @@ inode_open (disk_sector_t sector) ...@@ -125,7 +124,7 @@ inode_open (disk_sector_t sector)
struct list_elem *e; struct list_elem *e;
struct inode *inode; struct inode *inode;
lock_acquire(&lock); lock_acquire(&lock_open);
/* Check whether this inode is already open. */ /* Check whether this inode is already open. */
for (e = list_begin (&open_inodes); e != list_end (&open_inodes); for (e = list_begin (&open_inodes); e != list_end (&open_inodes);
...@@ -135,12 +134,14 @@ inode_open (disk_sector_t sector) ...@@ -135,12 +134,14 @@ inode_open (disk_sector_t sector)
if (inode->sector == sector) if (inode->sector == sector)
{ {
if (inode->removed) { if (inode->removed) {
lock_release(&lock); lock_release(&lock_open);
return NULL; return NULL;
} }
lock_release(&lock_open);
lock_release(&lock);
inode_reopen (inode); inode_reopen (inode);
return inode; return inode;
} }
} }
...@@ -148,7 +149,7 @@ inode_open (disk_sector_t sector) ...@@ -148,7 +149,7 @@ inode_open (disk_sector_t sector)
/* Allocate memory. */ /* Allocate memory. */
inode = malloc (sizeof *inode); inode = malloc (sizeof *inode);
if (inode == NULL){ if (inode == NULL){
lock_release(&lock); lock_release(&lock_open);
return NULL; return NULL;
} }
...@@ -160,14 +161,13 @@ inode_open (disk_sector_t sector) ...@@ -160,14 +161,13 @@ inode_open (disk_sector_t sector)
inode->removed = false; inode->removed = false;
inode->read = 0; inode->read = 0;
sema_init(&inode->sema_file_access, 1);
lock_init(&inode->read_count_lock); lock_init(&inode->read_count_lock);
lock_init(&inode->file_queue_lock); lock_init(&inode->file_queue_lock);
sema_init(&inode->sema_file_access, 1);
disk_read (filesys_disk, inode->sector, &inode->data); disk_read (filesys_disk, inode->sector, &inode->data);
lock_release(&lock); lock_release(&lock_open);
return inode; return inode;
} }
...@@ -175,13 +175,13 @@ inode_open (disk_sector_t sector) ...@@ -175,13 +175,13 @@ inode_open (disk_sector_t sector)
struct inode * struct inode *
inode_reopen (struct inode *inode) inode_reopen (struct inode *inode)
{ {
lock_acquire(&lock); lock_acquire(&lock_open);
if (inode != NULL) if (inode != NULL)
{ {
ASSERT(inode->open_cnt != 0); ASSERT(inode->open_cnt != 0);
inode->open_cnt++; inode->open_cnt++;
} }
lock_release(&lock); lock_release(&lock_open);
return inode; return inode;
} }
...@@ -203,7 +203,7 @@ inode_close (struct inode *inode) ...@@ -203,7 +203,7 @@ inode_close (struct inode *inode)
if (inode == NULL) if (inode == NULL)
return; return;
lock_acquire(&lock); lock_acquire(&lock_open);
/* Release resources if this was the last opener. */ /* Release resources if this was the last opener. */
if (--inode->open_cnt == 0) if (--inode->open_cnt == 0)
...@@ -222,7 +222,7 @@ inode_close (struct inode *inode) ...@@ -222,7 +222,7 @@ inode_close (struct inode *inode)
free (inode); free (inode);
} }
lock_release(&lock); lock_release(&lock_open);
} }
/* Marks INODE to be deleted when it is closed by the last caller who /* Marks INODE to be deleted when it is closed by the last caller who
...@@ -297,7 +297,6 @@ inode_read_at (struct inode *inode, void *buffer_, off_t size, off_t offset) ...@@ -297,7 +297,6 @@ inode_read_at (struct inode *inode, void *buffer_, off_t size, off_t offset)
bytes_read += chunk_size; bytes_read += chunk_size;
} }
free (bounce); free (bounce);
lock_acquire(&inode->read_count_lock); lock_acquire(&inode->read_count_lock);
inode->read--; inode->read--;
if (inode->read == 0){ if (inode->read == 0){
...@@ -322,9 +321,7 @@ inode_write_at (struct inode *inode, const void *buffer_, off_t size, ...@@ -322,9 +321,7 @@ inode_write_at (struct inode *inode, const void *buffer_, off_t size,
uint8_t *bounce = NULL; uint8_t *bounce = NULL;
lock_acquire(&inode->file_queue_lock); lock_acquire(&inode->file_queue_lock);
sema_down(&inode->sema_file_access); sema_down(&inode->sema_file_access);
lock_release(&inode->file_queue_lock); lock_release(&inode->file_queue_lock);
if (inode->deny_write_cnt) { if (inode->deny_write_cnt) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment