lab 9:Fs(file system)
实验准备
通读第八章以及观看教学视频,理解目录与文件的组织方式,思考与阅读源码的实现方式。总的来说,本次作业难度不大,主要是对文件系统抽象的理解。
Large files
题目大意
为xv6实现一个二级间接数据块,使得文件大小为65803(原来为256+12),为此需要修改bmap和itrunc。
题目解答
这里由于有一个一级间接数据块可以参考,这里需要注意的是,bread对应一个brelse。同时,读完一个数据块需要释放,不能嵌套读取数据块。具体实现比较简单,注意一下细节即可。
static uint
bmap(struct inode *ip, uint bn)
{
uint addr, *a;
struct buf *bp;
// begin of DIRECT BLOCKS
if(bn < NDIRECT){
if((addr = ip->addrs[bn]) == 0)
ip->addrs[bn] = addr = balloc(ip->dev);
return addr;
}
// end of DIRECT BLOCKS
bn -= NDIRECT;
if(bn < NINDIRECT){
// Load indirect block, allocating if necessary.
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){
a[bn] = addr = balloc(ip->dev);
log_write(bp);
}
brelse(bp);
return addr;
}
//panic("cannot reach!");
bn-=NINDIRECT;
uint b = bn/NINDIRECT;
bn = bn-b*NINDIRECT;
if(b < NINDIRECT){
if((addr = ip->addrs[NDIRECT+1]) == 0){
ip->addrs[NDIRECT