diff --git a/sysfile.c b/sysfile.c
index ce812f516352793245d83f169c1cc3b3966a2b0d..8808073bcbd23e8df19b954ca4c920e0877064c3 100644
--- a/sysfile.c
+++ b/sysfile.c
@@ -199,6 +199,10 @@ sys_unlink(void)
   memset(&de, 0, sizeof(de));
   if(writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
     panic("unlink: writei");
+  if(ip->type == T_DIR){
+    dp->nlink--;
+    iupdate(dp);
+  }
   iunlockput(dp);
 
   ip->nlink--;
@@ -247,8 +251,10 @@ create(char *path, int canexist, short type, short major, short minor)
   }
 
   if(dirlink(dp, name, ip->inum) < 0){
-    dp->nlink--;
-    iupdate(dp);
+    if(type == T_DIR){
+      dp->nlink--;
+      iupdate(dp);
+    }
     iunlockput(dp);
 
     ip->nlink = 0;