- 论坛徽章:
- 0
|
正好前些天也把EXT2文件系统看完了,大神谈不上,不过可以尝试回答你的问题,ext2_group_desc是块组描述符,每个sb中都包含了若干个块组描述符,所以每个sb中都包含有块组描述符的信息,具体请看:
super_block-》ext2_sb-》s_group_desc,其中s_group_desc就是存放在磁盘前几个block中的块组描述符数组,所以通过super block可以找到块组,但是从块组描述符中确实找不到super block的信息,而且也没有这个必要吧。
第二个问题,我以下面的例子来回答,
gdp = (struct ext2_group_desc *) bh->b_data;//找到了inode对应的块组描述符保存在磁盘上的block的buffer,
/*
* Figure out the offset within the block group inode table
*/
offset = ((inode->i_ino - 1) % EXT2_INODES_PER_GROUP(inode->i_sb)) *EXT2_INODE_SIZE(inode->i_sb); //计算该inode在块组内的offset(单位byte)。
block = le32_to_cpu(gdp[desc].bg_inode_table) +(offset >> EXT2_BLOCK_SIZE_BITS(inode->i_sb)); //计算该inode所在块组中的block位置
if (!(bh = bread (inode->i_dev, block, inode->i_sb->s_blocksize))) { //读出该block
ext2_error (inode->i_sb, "ext2_write_inode",
"unable to read inode block - "
"inode=%lu, block=%lu", inode->i_ino, block);
return -EIO;
}
offset &= EXT2_BLOCK_SIZE(inode->i_sb) - 1; //计算出该inode在一个block内的offset。
raw_inode = (struct ext2_inode *) (bh->b_data + offset);//读出该inode在磁盘上的对应物 raw_inode。
从上面的流程,应该可以看出bg_inode_table的作用吧,就是在块组中用来查找raw inode的,bg_inode_table本身的含义是块组中第一个inode所对应的block位置。
也许有些地方用词不是太准确,请见谅。 |
|