diff options
| author | rsc <rsc> | 2009-05-31 01:44:20 +0000 | 
|---|---|---|
| committer | rsc <rsc> | 2009-05-31 01:44:20 +0000 | 
| commit | 13ae8808c4ebb1c2a48abad1d16428042d943e0e (patch) | |
| tree | 1abc67de5d37789ce9b6cf44b1014225ce1cb8e2 | |
| parent | f12551b5996ae6121d33afc94002ce6f7c64dcfd (diff) | |
| download | xv6-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.c | 39 | 
1 files changed, 15 insertions, 24 deletions
| @@ -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);  } | 
