diff options
-rw-r--r-- | kernel/file.h | 2 | ||||
-rw-r--r-- | kernel/fs.c | 63 | ||||
-rw-r--r-- | kernel/fs.h | 8 | ||||
-rw-r--r-- | kernel/param.h | 2 |
4 files changed, 10 insertions, 65 deletions
diff --git a/kernel/file.h b/kernel/file.h index 05d9377..eed08eb 100644 --- a/kernel/file.h +++ b/kernel/file.h @@ -33,7 +33,7 @@ struct inode { short minor; short nlink; uint size; - uint addrs[NDIRECT+2]; + uint addrs[NDIRECT+1]; }; // map major device number to device functions. diff --git a/kernel/fs.c b/kernel/fs.c index 57b36a1..6c4079e 100644 --- a/kernel/fs.c +++ b/kernel/fs.c @@ -396,7 +396,7 @@ bmap(struct inode *ip, uint bn) } bn -= NDIRECT; - if(bn < NSG_INDIRECT){ + if(bn < NINDIRECT){ // Load indirect block, allocating if necessary. if((addr = ip->addrs[NDIRECT]) == 0){ addr = balloc(ip->dev); @@ -416,38 +416,6 @@ bmap(struct inode *ip, uint bn) brelse(bp); return addr; } - bn -= NSG_INDIRECT; - - if(bn < NDB_INDIRECT){ - // Load indirect block in each level, allocating if necessary. - if((addr = ip->addrs[NDIRECT+1]) == 0){ - addr = balloc(ip->dev); - if(addr == 0) - return 0; - ip->addrs[NDIRECT+1] = addr; - } - bp = bread(ip->dev, addr); - a = (uint*)bp->data; - if((addr = a[bn/NSG_INDIRECT]) == 0){ - addr = balloc(ip->dev); - if(addr){ - a[bn/NSG_INDIRECT] = addr; - log_write(bp); - } - } - brelse(bp); - bp = bread(ip->dev, addr); - a = (uint*)bp->data; - if((addr = a[bn%NSG_INDIRECT]) == 0){ - addr = balloc(ip->dev); - if(addr){ - a[bn%NSG_INDIRECT] = addr; - log_write(bp); - } - } - brelse(bp); - return addr; - } panic("bmap: out of range"); } @@ -456,9 +424,9 @@ bmap(struct inode *ip, uint bn) void itrunc(struct inode *ip) { - int i, j, k; - struct buf *bp, *l2bp; - uint *a, *l2a; + int i, j; + struct buf *bp; + uint *a; for(i = 0; i < NDIRECT; i++){ if(ip->addrs[i]){ @@ -470,7 +438,7 @@ itrunc(struct inode *ip) if(ip->addrs[NDIRECT]){ bp = bread(ip->dev, ip->addrs[NDIRECT]); a = (uint*)bp->data; - for(j = 0; j < NSG_INDIRECT; j++){ + for(j = 0; j < NINDIRECT; j++){ if(a[j]) bfree(ip->dev, a[j]); } @@ -479,27 +447,6 @@ itrunc(struct inode *ip) ip->addrs[NDIRECT] = 0; } - if(ip->addrs[NDIRECT+1]){ - bp = bread(ip->dev, ip->addrs[NDIRECT+1]); - a = (uint*)bp->data; - for(j = 0; j < NSG_INDIRECT; j++){ - if(a[j]){ - l2bp = bread(ip->dev, a[j]); - l2a = (uint*)l2bp->data; - for(k = 0; k < NSG_INDIRECT; k++) - { - if(l2a[k]){ - bfree(ip->dev, l2a[k]); - } - } - brelse(l2bp); bfree(ip->dev, a[j]); - } - } - brelse(bp); - bfree(ip->dev, ip->addrs[NDIRECT+1]); - ip->addrs[NDIRECT+1] = 0; - } - ip->size = 0; iupdate(ip); } diff --git a/kernel/fs.h b/kernel/fs.h index 9ae5ece..139dcc9 100644 --- a/kernel/fs.h +++ b/kernel/fs.h @@ -24,10 +24,8 @@ struct superblock { #define FSMAGIC 0x10203040 -#define NDIRECT 11 -#define NSG_INDIRECT (BSIZE / sizeof(uint)) -#define NDB_INDIRECT (NSG_INDIRECT * NSG_INDIRECT) -#define NINDIRECT (NSG_INDIRECT + NDB_INDIRECT) +#define NDIRECT 12 +#define NINDIRECT (BSIZE / sizeof(uint)) #define MAXFILE (NDIRECT + NINDIRECT) // On-disk inode structure @@ -37,7 +35,7 @@ struct dinode { short minor; // Minor device number (T_DEVICE only) short nlink; // Number of links to inode in file system uint size; // Size of file (bytes) - uint addrs[NDIRECT+2]; // Data block addresses + uint addrs[NDIRECT+1]; // Data block addresses }; // Inodes per block. diff --git a/kernel/param.h b/kernel/param.h index 4ed7a51..d7e935a 100644 --- a/kernel/param.h +++ b/kernel/param.h @@ -13,5 +13,5 @@ #define MAXOPBLOCKS 10 // max # of blocks any FS op writes #define LOGSIZE (MAXOPBLOCKS*3) // max data blocks in on-disk log #define NBUF (MAXOPBLOCKS*3) // size of disk block cache -#define FSSIZE 200000 // size of file system in blocks +#define FSSIZE 2000 // size of file system in blocks #define MAXPATH 128 // maximum file path name |