summaryrefslogtreecommitdiff
path: root/fs.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-12 01:25:45 +0000
committerkaashoek <kaashoek>2006-08-12 01:25:45 +0000
commit0633b9715e106ac97fafcf3a68c06da1f0cf873a (patch)
tree0049ae867f8f94fe0e819a9c33b7b84989561c43 /fs.c
parent24437cd554995f729969299e72699e2ba5d9b068 (diff)
downloadxv6-labs-0633b9715e106ac97fafcf3a68c06da1f0cf873a.tar.gz
xv6-labs-0633b9715e106ac97fafcf3a68c06da1f0cf873a.tar.bz2
xv6-labs-0633b9715e106ac97fafcf3a68c06da1f0cf873a.zip
unlink,mknod,create with multi-component pathnames should work now
remove console init code from userfs
Diffstat (limited to 'fs.c')
-rw-r--r--fs.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/fs.c b/fs.c
index 0f4ed79..0c00c6f 100644
--- a/fs.c
+++ b/fs.c
@@ -189,6 +189,7 @@ ialloc(uint dev, short type)
static void
ifree(struct inode *ip)
{
+ cprintf("ifree: %d\n", ip->inum);
ip->type = 0;
iupdate(ip);
}
@@ -340,7 +341,7 @@ writei(struct inode *ip, char *addr, uint off, uint n)
}
struct inode *
-namei(char *path)
+namei(char *path, uint *ret_pinum)
{
struct inode *dp;
char *cp = path;
@@ -349,17 +350,24 @@ namei(char *path)
struct dirent *ep;
int i;
unsigned ninum;
+ unsigned pinum;
dp = iget(rootdev, 1);
+ pinum = dp->inum;
while(*cp == '/')
cp++;
while(1){
- if(*cp == '\0')
+ if(*cp == '\0') {
+ if (ret_pinum)
+ *ret_pinum = pinum;
return dp;
+ }
if(dp->type != T_DIR){
+ if (ret_pinum)
+ *ret_pinum = pinum;
iput(dp);
return 0;
}
@@ -384,10 +392,13 @@ namei(char *path)
brelse(bp);
}
iput(dp);
+ if (ret_pinum)
+ *ret_pinum = pinum;
return 0;
found:
dev = dp->dev;
+ pinum = dp->inum;
iput(dp);
dp = iget(dev, ninum);
while(*cp == '/')
@@ -396,19 +407,28 @@ namei(char *path)
}
struct inode *
-mknod(struct inode *dp, char *cp, short type, short major, short minor)
+mknod(char *cp, short type, short major, short minor)
{
- struct inode *ip;
+ struct inode *ip, *dp;
struct dirent *ep = 0;
int off;
int i;
struct buf *bp = 0;
+ uint pinum = 0;
- cprintf("mknod: dir %d %s %d %d %d\n",
- dp->inum, cp, type, major, minor);
+ cprintf("mknod: %s %d %d %d\n", cp, type, major, minor);
+ if ((ip = namei(cp, &pinum)) != 0) {
+ iput(ip);
+ return 0;
+ }
+ cprintf("mknod: pinum = %d\n", pinum);
+ dp = iget(rootdev, pinum);
ip = ialloc(dp->dev, type);
- if (ip == 0) return 0;
+ if (ip == 0) {
+ iput(dp);
+ return 0;
+ }
ip->major = major;
ip->minor = minor;
ip->size = 0;
@@ -434,10 +454,9 @@ mknod(struct inode *dp, char *cp, short type, short major, short minor)
for(i = 0; i < DIRSIZ && cp[i]; i++) ep->name[i] = cp[i];
bwrite (dp->dev, bp, bmap(dp, off/BSIZE)); // write directory block
brelse(bp);
-
dp->size += sizeof(struct dirent); // update directory inode
iupdate (dp);
-
+ iput(dp);
return ip;
}
@@ -449,8 +468,9 @@ unlink(char *cp)
struct dirent *ep = 0;
int off;
struct buf *bp = 0;
+ uint pinum;
- if ((ip = namei(cp)) == 0) {
+ if ((ip = namei(cp, &pinum)) == 0) {
cprintf("file to be unlinked doesn't exist\n");
return -1;
}
@@ -475,7 +495,7 @@ unlink(char *cp)
iupdate(ip);
ifree(ip); // is this the right order?
- dp = iget(rootdev, 1); // XXX should parse name
+ dp = iget(rootdev, pinum);
for(off = 0; off < dp->size; off += BSIZE) {
bp = bread(dp->dev, bmap(dp, off / BSIZE));
for(ep = (struct dirent *) bp->data;