diff options
author | kaashoek <kaashoek> | 2006-08-11 18:18:38 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-08-11 18:18:38 +0000 |
commit | 24437cd554995f729969299e72699e2ba5d9b068 (patch) | |
tree | e3b5aa572c9621d1f932788fc882d4e6d693473f /syscall.c | |
parent | 17a856577f9db766b8ef7099d0575d378dff5dd1 (diff) | |
download | xv6-labs-24437cd554995f729969299e72699e2ba5d9b068.tar.gz xv6-labs-24437cd554995f729969299e72699e2ba5d9b068.tar.bz2 xv6-labs-24437cd554995f729969299e72699e2ba5d9b068.zip |
fix deadlock---iput(dp) asap
working unlink, but doesn't free dir blocks that become empty
remove out-of-date comment in ioapic
Diffstat (limited to 'syscall.c')
-rw-r--r-- | syscall.c | 36 |
1 files changed, 8 insertions, 28 deletions
@@ -265,10 +265,9 @@ sys_open(void) if (l >= DIRSIZ) return -1; dp = iget(rootdev, 1); // XXX should parse name - if (dp->type != T_DIR) - return -1; - if ((ip = mknod (dp, cp->mem + arg0, T_FILE, 0, 0)) == 0) - return -1; + ip = mknod (dp, cp->mem + arg0, T_FILE, 0, 0); + iput(dp); + if (ip == 0) return -1; } else return -1; } if((fd = fd_alloc()) == 0){ @@ -319,45 +318,26 @@ sys_mknod(void) return -1; dp = iget(rootdev, 1); // XXX should parse name - if (dp->type != T_DIR) { - iput(dp); - return -1; - } - nip = mknod (dp, cp->mem + arg0, (short) arg1, (short) arg2, (short) arg3); - iput(dp); - - if (nip == 0) return -1; - iput(nip); - - return 0; + return (nip == 0) ? -1 : 0; } int sys_unlink(void) { struct proc *cp = curproc[cpu()]; - struct inode *ip; uint arg0; - + int r; + if(fetcharg(0, &arg0) < 0) return -1; - if(checkstring(arg0) < 0) return -1; - - ip = namei(cp->mem + arg0); - ip->nlink--; - if (ip->nlink <= 0) { - panic("sys_link: unimplemented\n"); - } - iupdate(ip); - iput(ip); - - return 0; + r = unlink(cp->mem + arg0); + return r; } int |