summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkolya <kolya>2008-10-17 12:42:13 +0000
committerkolya <kolya>2008-10-17 12:42:13 +0000
commit15a269363777c0cd95e2a56e7def0a4dc3122e21 (patch)
treef653c907fab5acc8d5dc4600b7596297ba4eee66
parentf3e87bc838a09163f91ab79696a34f8c19386c55 (diff)
downloadxv6-labs-15a269363777c0cd95e2a56e7def0a4dc3122e21.tar.gz
xv6-labs-15a269363777c0cd95e2a56e7def0a4dc3122e21.tar.bz2
xv6-labs-15a269363777c0cd95e2a56e7def0a4dc3122e21.zip
try harder to get directory refcounts right
-rw-r--r--sysfile.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sysfile.c b/sysfile.c
index ce812f5..8808073 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;