Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
pintos lab 3
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Tom Larsson
pintos lab 3
Commits
bfd1129c
There was an error fetching the commit references. Please try again later.
Commit
bfd1129c
authored
5 years ago
by
Tom Larsson
Browse files
Options
Downloads
Patches
Plain Diff
updates
parent
4bcb465a
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/filesys/filesys.c
+8
-6
8 additions, 6 deletions
src/filesys/filesys.c
src/filesys/free-map.c
+12
-13
12 additions, 13 deletions
src/filesys/free-map.c
src/filesys/inode.c
+16
-19
16 additions, 19 deletions
src/filesys/inode.c
with
36 additions
and
38 deletions
src/filesys/filesys.c
+
8
−
6
View file @
bfd1129c
...
@@ -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
;
}
}
...
...
This diff is collapsed.
Click to expand it.
src/filesys/free-map.c
+
12
−
13
View file @
bfd1129c
...
@@ -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. */
...
...
This diff is collapsed.
Click to expand it.
src/filesys/inode.c
+
16
−
19
View file @
bfd1129c
...
@@ -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
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment