tidy fs.c; bmap callers always expected allocation
This commit is contained in:
parent
f12551b599
commit
13ae8808c4
39
fs.c
39
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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue