diff --git a/context/context.rs b/context/context.rs
index 43bdc61c441f116af8ac2d20fcbb65b245f7e724..4b4cc3a7d568b176153a3c5f8189561d193ba1fa 100644
--- a/context/context.rs
+++ b/context/context.rs
@@ -93,7 +93,7 @@ impl Context {
 
     /// Add a file to the lowest available slot.
     /// Return the file descriptor number or None if no slot was found
-    pub fn add_file(&mut self, file: File) -> Option<usize> {
+    pub fn add_file(&self, file: File) -> Option<usize> {
         let mut files = self.files.lock();
         for (i, mut file_option) in files.iter_mut().enumerate() {
             if file_option.is_none() {
@@ -122,7 +122,7 @@ impl Context {
 
     /// Remove a file
     // TODO: adjust files vector to smaller size if possible
-    pub fn remove_file(&mut self, i: usize) -> Option<File> {
+    pub fn remove_file(&self, i: usize) -> Option<File> {
         let mut files = self.files.lock();
         if i < files.len() {
             files[i].take()
diff --git a/syscall/fs.rs b/syscall/fs.rs
index acf457e29ef7e42c0f318b7d76b42394013d46c3..c992bbaac7858fea7ca17ef1447680d23ec77dc7 100644
--- a/syscall/fs.rs
+++ b/syscall/fs.rs
@@ -61,7 +61,14 @@ pub fn write(fd: usize, buf: &[u8]) -> Result<usize> {
 
 /// Open syscall
 pub fn open(path: &[u8], flags: usize) -> Result<usize> {
-    let mut parts = path.splitn(2, |&b| b == b':');
+    let path_canon = {
+        let contexts = context::contexts();
+        let context_lock = contexts.current().ok_or(Error::NoProcess)?;
+        let context = context_lock.read();
+        context.canonicalize(path)
+    };
+
+    let mut parts = path_canon.splitn(2, |&b| b == b':');
     let namespace_opt = parts.next();
     let reference_opt = parts.next();
 
@@ -75,7 +82,7 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
 
     let contexts = context::contexts();
     let context_lock = contexts.current().ok_or(Error::NoProcess)?;
-    let mut context = context_lock.write();
+    let context = context_lock.read();
     context.add_file(::context::file::File {
         scheme: scheme_id,
         number: file_id
@@ -87,7 +94,7 @@ pub fn close(fd: usize) -> Result<usize> {
     let file = {
         let contexts = context::contexts();
         let context_lock = contexts.current().ok_or(Error::NoProcess)?;
-        let mut context = context_lock.write();
+        let context = context_lock.read();
         let file = context.remove_file(fd).ok_or(Error::BadFile)?;
         file
     };