diff options
author | kaashoek <kaashoek> | 2006-08-24 17:28:01 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-08-24 17:28:01 +0000 |
commit | 1be766853771bda6023b8024041453413fb777bb (patch) | |
tree | beead0b9746200d952b9273e8b0abd609b38b8c5 /fs.c | |
parent | ea2909b6b5ceb54383ab23fd195ebae29cfdb7ca (diff) | |
download | xv6-labs-1be766853771bda6023b8024041453413fb777bb.tar.gz xv6-labs-1be766853771bda6023b8024041453413fb777bb.tar.bz2 xv6-labs-1be766853771bda6023b8024041453413fb777bb.zip |
fix bugs in indirect-file code
clean up test program
Diffstat (limited to 'fs.c')
-rw-r--r-- | fs.c | 21 |
1 files changed, 10 insertions, 11 deletions
@@ -241,8 +241,7 @@ bmap(struct inode *ip, uint bn) if (x == 0) panic("bmap 2"); } else { - cprintf("indirect block read\n"); - inbp = bread(ip->dev, INDIRECT); + inbp = bread(ip->dev, ip->addrs[INDIRECT]); a = (uint *) inbp->data; x = a[bn - NDIRECT]; brelse(inbp); @@ -256,21 +255,23 @@ void iunlink(struct inode *ip) { int i, j; + struct buf *inbp; // free inode, its blocks, and remove dir entry for (i = 0; i < NADDRS; i++) { if (ip->addrs[i] != 0) { if (i == INDIRECT) { + inbp = bread(ip->dev, ip->addrs[INDIRECT]); for (j = 0; j < NINDIRECT; j++) { - uint *a = (uint *) (ip->addrs[i]); + uint *a = (uint *) inbp->data; if (a[j] != 0) { bfree(ip->dev, a[j]); a[j] = 0; } } - } - else - bfree(ip->dev, ip->addrs[i]); + brelse(inbp); + } + bfree(ip->dev, ip->addrs[i]); ip->addrs[i] = 0; } } @@ -354,7 +355,7 @@ readi(struct inode *ip, char *dst, uint off, uint n) return target - n; } -int +static int newblock(struct inode *ip, uint lbn) { struct buf *inbp; @@ -368,20 +369,18 @@ newblock(struct inode *ip, uint lbn) ip->addrs[lbn] = b; } } else { - cprintf("newblock: use indirect block\n"); if (ip->addrs[INDIRECT] == 0) { - cprintf("newblock: allocate indirect block\n"); b = balloc(ip->dev); if (b <= 0) return -1; ip->addrs[INDIRECT] = b; } - inbp = bread(ip->dev, bmap(ip, INDIRECT)); + inbp = bread(ip->dev, ip->addrs[INDIRECT]); inaddrs = (uint *) inbp->data; if (inaddrs[lbn - NDIRECT] == 0) { b = balloc(ip->dev); if (b <= 0) return -1; inaddrs[lbn - NDIRECT] = b; - bwrite(inbp, INDIRECT); + bwrite(inbp, ip->addrs[INDIRECT]); } brelse(inbp); } |