diff --git a/scheme/user.rs b/scheme/user.rs
index c209ecfb9c3bf153d3b68a3d0eb469644157dc8e..7da21d47f0c3908c84ed86c7526b8cab1f5c1179 100644
--- a/scheme/user.rs
+++ b/scheme/user.rs
@@ -9,7 +9,7 @@ use syscall::{convert_to_result, Call, Error, Result};
 
 use super::Scheme;
 
-#[derive(Copy, Clone, Debug)]
+#[derive(Copy, Clone, Debug, Default)]
 #[repr(packed)]
 pub struct Packet {
     pub id: usize,
diff --git a/syscall/process.rs b/syscall/process.rs
index 44175d7a12154d31f69f0b33b76a7cce2e9bfd43..b6be85fa52d3860b4fc17e6732fd1927bebdea1d 100644
--- a/syscall/process.rs
+++ b/syscall/process.rs
@@ -178,6 +178,8 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
             }
         }
 
+        // If not cloning files, dup to get a new number from scheme
+        // This has to be done outside the context lock to prevent deadlocks
         if flags & CLONE_FILES == 0 {
             for (fd, mut file_option) in files.lock().iter_mut().enumerate() {
                 let new_file_option = if let Some(file) = *file_option {
@@ -357,7 +359,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> {
         //TODO: Only read elf header, not entire file. Then read required segments
         let mut data = vec![];
         loop {
-            let mut buf = [0; 4096];
+            let mut buf = [0; 16384];
             let count = syscall::read(file, &mut buf)?;
             if count > 0 {
                 data.extend_from_slice(&buf[..count]);