summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2009-05-31 01:44:20 +0000
committerrsc <rsc>2009-05-31 01:44:20 +0000
commit13ae8808c4ebb1c2a48abad1d16428042d943e0e (patch)
tree1abc67de5d37789ce9b6cf44b1014225ce1cb8e2
parentf12551b5996ae6121d33afc94002ce6f7c64dcfd (diff)
downloadxv6-labs-13ae8808c4ebb1c2a48abad1d16428042d943e0e.tar.gz
xv6-labs-13ae8808c4ebb1c2a48abad1d16428042d943e0e.tar.bz2
xv6-labs-13ae8808c4ebb1c2a48abad1d16428042d943e0e.zip
tidy fs.c; bmap callers always expected allocation
-rw-r--r--fs.c39
1 files changed, 15 insertions, 24 deletions
diff --git a/fs.c b/fs.c
index abd7c0b..c03d69b 100644
--- a/fs.c
+++ b/fs.c
@@ -316,38 +316,28 @@ iupdate(struct inode *ip)
// listed in the block ip->addrs[INDIRECT].
// Return the disk block address of the nth block in inode ip.
-// If there is no such block, alloc controls whether one is allocated.
+// If there is no such block, bmap allocates one.
static uint
-bmap(struct inode *ip, uint bn, int alloc)
+bmap(struct inode *ip, uint bn)
{
uint addr, *a;
struct buf *bp;
if(bn < NDIRECT){
- if((addr = ip->addrs[bn]) == 0){
- if(!alloc)
- return -1;
+ if((addr = ip->addrs[bn]) == 0)
ip->addrs[bn] = addr = balloc(ip->dev);
- }
return addr;
}
bn -= NDIRECT;
if(bn < NINDIRECT){
// Load indirect block, allocating if necessary.
- if((addr = ip->addrs[NDIRECT]) == 0){
- if(!alloc)
- return -1;
+ if((addr = ip->addrs[NDIRECT]) == 0)
ip->addrs[NDIRECT] = addr = balloc(ip->dev);
- }
bp = bread(ip->dev, addr);
a = (uint*)bp->data;
if((addr = a[bn]) == 0){
- if(!alloc){
- brelse(bp);
- return -1;
- }
a[bn] = addr = balloc(ip->dev);
bwrite(bp);
}
@@ -422,7 +412,7 @@ readi(struct inode *ip, char *dst, uint off, uint n)
n = ip->size - off;
for(tot=0; tot<n; tot+=m, off+=m, dst+=m){
- bp = bread(ip->dev, bmap(ip, off/BSIZE, 0));
+ bp = bread(ip->dev, bmap(ip, off/BSIZE));
m = min(n - tot, BSIZE - off%BSIZE);
memmove(dst, bp->data + off%BSIZE, m);
brelse(bp);
@@ -444,13 +434,13 @@ writei(struct inode *ip, char *src, uint off, uint n)
return devsw[ip->major].write(ip, src, n);
}
- if(off + n < off)
+ if(off > ip->size || off + n < off)
return -1;
if(off + n > MAXFILE*BSIZE)
n = MAXFILE*BSIZE - off;
for(tot=0; tot<n; tot+=m, off+=m, src+=m){
- bp = bread(ip->dev, bmap(ip, off/BSIZE, 1));
+ bp = bread(ip->dev, bmap(ip, off/BSIZE));
m = min(n - tot, BSIZE - off%BSIZE);
memmove(bp->data + off%BSIZE, src, m);
bwrite(bp);
@@ -487,7 +477,7 @@ dirlookup(struct inode *dp, char *name, uint *poff)
panic("dirlookup not DIR");
for(off = 0; off < dp->size; off += BSIZE){
- bp = bread(dp->dev, bmap(dp, off / BSIZE, 0));
+ bp = bread(dp->dev, bmap(dp, off / BSIZE));
for(de = (struct dirent*)bp->data;
de < (struct dirent*)(bp->data + BSIZE);
de++){
@@ -507,9 +497,9 @@ dirlookup(struct inode *dp, char *name, uint *poff)
return 0;
}
-// Write a new directory entry (name, ino) into the directory dp.
+// Write a new directory entry (name, inum) into the directory dp.
int
-dirlink(struct inode *dp, char *name, uint ino)
+dirlink(struct inode *dp, char *name, uint inum)
{
int off;
struct dirent de;
@@ -530,7 +520,7 @@ dirlink(struct inode *dp, char *name, uint ino)
}
strncpy(de.name, name, DIRSIZ);
- de.inum = ino;
+ de.inum = inum;
if(writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
panic("dirlink");
@@ -549,6 +539,7 @@ dirlink(struct inode *dp, char *name, uint ino)
// Examples:
// skipelem("a/bb/c", name) = "bb/c", setting name = "a"
// skipelem("///a//bb", name) = "bb", setting name = "a"
+// skipelem("a", name) = "", setting name = "a"
// skipelem("", name) = skipelem("////", name) = 0
//
static char*
@@ -580,7 +571,7 @@ skipelem(char *path, char *name)
// If parent != 0, return the inode for the parent and copy the final
// path element into name, which must have room for DIRSIZ bytes.
static struct inode*
-_namei(char *path, int parent, char *name)
+namex(char *path, int parent, char *name)
{
struct inode *ip, *next;
@@ -618,11 +609,11 @@ struct inode*
namei(char *path)
{
char name[DIRSIZ];
- return _namei(path, 0, name);
+ return namex(path, 0, name);
}
struct inode*
nameiparent(char *path, char *name)
{
- return _namei(path, 1, name);
+ return namex(path, 1, name);
}