_bmap()
1、_bmap()函数用于把一个文件数据块映射到盘块的处理操作
因为一个i节点对应一个文件,所以上面的i节点映射的逻辑块号就是文件数据存放的逻辑块号;i_zone[0]到i_zone[6]是直接逻辑块号,i_zone[7]是一次间接逻辑块号,i_zone[8]是二次间接逻辑块号;文件中的数据存放在哪个硬盘上的逻辑块上就是由这个数组来映射的,根据这个也可以知道一个文件的最大存储是多少?
//把文件上的数据块映射到磁盘上,inode 文件i节点;block 文件中数据块号,create是否创建标志
static int _bmap(struct m_inode * inode,int block,int create)
{
struct buffer_head * bh;
int i;
//判断文件数据块号block是否超出范围
if (block<0)
panic("_bmap: block<0");
if (block >= 7+512+512*512)//文件逻辑块的范围
panic("_bmap: block>big");
//使用直接块
if (block<7) {
if (create && !inode->i_zone[block])//创建标志置位,i节点对应的逻辑块字段为0
if (inode->i_zone[block]=new_block(inode->i_dev)) {//申请一个新磁盘逻辑块,返回逻辑号
inode->i_ctime=CURRENT_TIME;
inode->i_dirt=1;
}
return inode->i_zone[block];//返回设备上的逻辑块号
}
//使用一次间接块
block -= 7;
if (block<512) {
if (create && !inode->i_zone[7])//表明文件是首次使用间接块,则申请一个磁盘块来存放间接块信息
if (inode->i_zone[7]=new_block(inode->i_dev)) {
inode->i_dirt=1;
inode->i_ctime=CURRENT_TIME;
}
if (!inode->i_zone[7])//表示创建间接块磁盘失败,或者create未置1
return 0;
if (!(bh = bread(inode->i_dev,inode->i_zone[7])))//读取间接块的信息
return 0;
i = ((unsigned short *) (bh->b_data))[block];//得到间接块上block所处的位置,判断是否为0
if (create && !i)//如果间接块号上的block位置为0,create置位
if (i=new_block(inode->i_dev)) {//申请一个新的逻辑块给block
((unsigned short *) (bh->b_data))[block]=i;
bh->b_dirt=1;
}
brelse(bh);
return i;
}
//使用二次间接块
block -= 512;
//为二次间接块申请逻辑块
if (create && !inode->i_zone[8])
if (inode->i_zone[8]=new_block(inode->i_dev)) {//映射到二级间接块中的一级逻辑块上
inode->i_dirt=1;
inode->i_ctime=CURRENT_TIME;