diff --git a/fs.c b/fs.c
index 6c552e6514e2fa7bacebae952b8940788bc135c5..80f522b3ee0231d2bc494c5afbf0c25d70b7f2f2 100644
--- a/fs.c
+++ b/fs.c
@@ -632,7 +632,7 @@ unlink(char *cp)
   memset(&de, 0, sizeof(de));
   if(writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
     panic("unlink dir write");
-
+  
   iupdate(dp);
   iput(dp);
 
diff --git a/fstests.c b/fstests.c
index ac9478e5a25d8b3bc10e9698eb0b1ddd6eda84c7..3967f13c022ed196ba9ad2f1eefa4be0f685ec42 100644
--- a/fstests.c
+++ b/fstests.c
@@ -150,8 +150,8 @@ createdelete()
   }
 
   if(pid)
-    wait();
-  else
+    exit();
+  else 
     exit();
 
   for(i = 0; i < n; i++){
@@ -160,8 +160,10 @@ createdelete()
     fd = open(name, 0);
     if((i == 0 || i >= n/2) && fd < 0){
       printf(1, "oops createdelete %s didn't exist\n", name);
+      exit();
     } else if((i >= 1 && i < n/2) && fd >= 0){
       printf(1, "oops createdelete %s did exist\n", name);
+      exit();
     }
     if(fd >= 0)
       close(fd);
@@ -171,8 +173,10 @@ createdelete()
     fd = open(name, 0);
     if((i == 0 || i >= n/2) && fd < 0){
       printf(1, "oops createdelete %s didn't exist\n", name);
+      exit();
     } else if((i >= 1 && i < n/2) && fd >= 0){
       printf(1, "oops createdelete %s did exist\n", name);
+      exit();
     }
     if(fd >= 0)
       close(fd);
diff --git a/proc.c b/proc.c
index 01f6aa45c797e2f2505e58958f65fe05132129b1..eca5e9759b891e78828bce394c7f22c58f8e5bed 100644
--- a/proc.c
+++ b/proc.c
@@ -337,6 +337,9 @@ proc_exit(void)
       cp->fds[fd] = 0;
     }
   }
+  
+  idecref(cp->cwd);
+  cp->cwd = 0;
 
   acquire(&proc_table_lock);
 
@@ -351,6 +354,7 @@ proc_exit(void)
       p->ppid = 1;
   
   // Jump into the scheduler, never to return.
+  cp->killed = 0;
   cp->state = ZOMBIE;
   sched();
   panic("zombie exit");
diff --git a/proc.h b/proc.h
index 5689bbcb08b2a4e68929267ba861d5314048e219..36b07a54087e41705433f795e948a9506ed5f625 100644
--- a/proc.h
+++ b/proc.h
@@ -46,12 +46,7 @@ struct proc{
   int killed;
   struct fd *fds[NOFILE];
   struct inode *cwd;
-
-  uint esp; // kernel stack pointer
-  uint ebp; // kernel frame pointer
-
   struct jmpbuf jmpbuf;
-
   struct trapframe *tf; // points into kstack, used to find user regs
 };
 
diff --git a/sh.c b/sh.c
index 2f2d2976b88fe8a7ee9b658fa36f6c92b5628863..5da556e0b28bd2479b6e321edd9e1dabdab0d8e4 100644
--- a/sh.c
+++ b/sh.c
@@ -22,7 +22,7 @@ char *argv[MAXARGS];
 char argv0buf[BUFSIZ];
 int argc;
 
-int debug = 1;
+int debug = 0;
 
 int parse(char *s);
 void runcmd(void);
diff --git a/syscall.c b/syscall.c
index 5a7a60dba73f7ce80e6b20e454130a7167e16e10..2918bb0a884c7b314fbe12a140608bb4d819deef 100644
--- a/syscall.c
+++ b/syscall.c
@@ -113,7 +113,6 @@ sys_pipe(void)
   return 0;
 
  oops:
-  cprintf("sys_pipe failed\n");
   if(rfd)
     fd_close(rfd);
   if(wfd)
@@ -602,14 +601,12 @@ sys_exec(void)
   return 0;
 
  bad:
-  cprintf("exec failed early\n");
   if(mem)
     kfree(mem, sz);
   iput(ip);
   return -1;
 
  bad2:
-  cprintf("exec failed late\n");
   iput(ip);
   proc_exit();
   return 0;