From f3e87bc838a09163f91ab79696a34f8c19386c55 Mon Sep 17 00:00:00 2001
From: kolya <kolya>
Date: Thu, 16 Oct 2008 15:18:49 +0000
Subject: [PATCH] make mkdir crash-safer, as noticed by many students on
 midterm

---
 sysfile.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/sysfile.c b/sysfile.c
index a23b48a..ce812f5 100644
--- a/sysfile.c
+++ b/sysfile.c
@@ -237,13 +237,6 @@ create(char *path, int canexist, short type, short major, short minor)
   ip->minor = minor;
   ip->nlink = 1;
   iupdate(ip);
-  
-  if(dirlink(dp, name, ip->inum) < 0){
-    ip->nlink = 0;
-    iunlockput(ip);
-    iunlockput(dp);
-    return 0;
-  }
 
   if(type == T_DIR){  // Create . and .. entries.
     dp->nlink++;  // for ".."
@@ -252,6 +245,17 @@ create(char *path, int canexist, short type, short major, short minor)
     if(dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0)
       panic("create dots");
   }
+
+  if(dirlink(dp, name, ip->inum) < 0){
+    dp->nlink--;
+    iupdate(dp);
+    iunlockput(dp);
+
+    ip->nlink = 0;
+    iunlockput(ip);
+    return 0;
+  }
+
   iunlockput(dp);
   return ip;
 }
-- 
GitLab