From 13ae8808c4ebb1c2a48abad1d16428042d943e0e Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 31 May 2009 01:44:20 +0000 Subject: [PATCH] tidy fs.c; bmap callers always expected allocation --- fs.c | 39 +++++++++++++++------------------------ 1 file 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; totdev, 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; totdev, 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); }