From 13ae8808c4ebb1c2a48abad1d16428042d943e0e Mon Sep 17 00:00:00 2001
From: rsc <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; 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);
 }
-- 
GitLab