summaryrefslogtreecommitdiffstats
path: root/vm/page.c
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2012-06-21 22:09:14 +0200
committermanuel <manuel@mausz.at>2012-06-21 22:09:14 +0200
commita77555afd3fbf5d3e32099772c664d0e6d5260e0 (patch)
treed566558046a58a89c05ca85a9ff4cc603e8d1e98 /vm/page.c
parent4fd6a30d164874fd660aacc36b44842e14bba208 (diff)
downloadprogos-a77555afd3fbf5d3e32099772c664d0e6d5260e0.tar.gz
progos-a77555afd3fbf5d3e32099772c664d0e6d5260e0.tar.bz2
progos-a77555afd3fbf5d3e32099772c664d0e6d5260e0.zip
add locking around file syscalls inside page table
Diffstat (limited to 'vm/page.c')
-rw-r--r--vm/page.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/vm/page.c b/vm/page.c
index b98c553..c10113a 100644
--- a/vm/page.c
+++ b/vm/page.c
@@ -121,7 +121,9 @@ page_load (struct page_table_entry *pte)
121 return true; 121 return true;
122 122
123 data = &pte->segment; 123 data = &pte->segment;
124 process_lock_filesys ();
124 file_seek (data->file, data->ofs); 125 file_seek (data->file, data->ofs);
126 process_unlock_filesys ();
125 127
126 /* Get a page of memory. */ 128 /* Get a page of memory. */
127 uint8_t *kpage = palloc_get_page (PAL_USER); 129 uint8_t *kpage = palloc_get_page (PAL_USER);
@@ -129,12 +131,15 @@ page_load (struct page_table_entry *pte)
129 return false; 131 return false;
130 132
131 /* Load this page. */ 133 /* Load this page. */
134 process_lock_filesys ();
132 if (file_read (data->file, kpage, data->read_bytes) 135 if (file_read (data->file, kpage, data->read_bytes)
133 != (int) data->read_bytes) 136 != (int) data->read_bytes)
134 { 137 {
135 palloc_free_page (kpage); 138 palloc_free_page (kpage);
139 process_unlock_filesys ();
136 return false; 140 return false;
137 } 141 }
142 process_unlock_filesys ();
138 memset (kpage + data->read_bytes, 0, PGSIZE - data->read_bytes); 143 memset (kpage + data->read_bytes, 0, PGSIZE - data->read_bytes);
139 144
140 /* Add the page to the process's address space. */ 145 /* Add the page to the process's address space. */