diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs
index 100214a67d992a2cdc4942b8e2d110a39eccb217..e2c70f26f6c0673f50f6d9a6b6e179a71d3947a2 100644
--- a/src/syscall/fs.rs
+++ b/src/syscall/fs.rs
@@ -13,27 +13,24 @@ use crate::syscall::flag::*;
 
 
 pub fn file_op(a: usize, fd: FileHandle, c: usize, d: usize) -> Result<usize> {
-    let (file, pid, uid, gid) = {
-        let contexts = context::contexts();
-        let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
-        let context = context_lock.read();
-        let file = context.get_file(fd).ok_or(Error::new(EBADF))?;
-        (file, context.id, context.euid, context.egid)
+    let (scheme_id, scheme_number, current_cid, current_uid, current_gid) = match context::current()?.read() {
+        // TODO: Avoid semi-expensive Arc::clone by only accessing by reference?
+        ref current => match current.get_file(fd).ok_or(Error::new(EBADF))?.description.read() {
+            ref desc => {
+                (desc.scheme, desc.number, current.id, current.euid, current.egid)
+            }
+        }
     };
 
-    let scheme = {
-        let schemes = scheme::schemes();
-        let scheme = schemes.get(file.description.read().scheme).ok_or(Error::new(EBADF))?;
-        Arc::clone(scheme)
-    };
+    let scheme = Arc::clone(scheme::schemes().get(scheme_id).ok_or(Error::new(EBADF))?);
 
     let mut packet = Packet {
         id: 0,
-        pid: pid.into(),
-        uid,
-        gid,
+        pid: current_cid.into(),
+        uid: current_uid,
+        gid: current_gid,
         a,
-        b: file.description.read().number,
+        b: scheme_number,
         c,
         d
     };