关于linux0.12中的add_entry中bread中的些猜测

来源:互联网 发布:java核心技术卷一 编辑:程序博客网 时间:2024/05/21 15:03

今天看到文件系统namei.c中的add_entry部分了,发现一个问题

                        block = create_block(dir,i/DIR_ENTRIES_PER_BLOCK);if (!block)return NULL;if (!(bh = bread(dir->i_dev,block))) {i += DIR_ENTRIES_PER_BLOCK;continue;}de = (struct dir_entry *) bh->b_data;
可以看到,create_block也是就是当目录的i结点不存在时便会创建一个,而在create_block调用的_bamp(inode.c)函数,而bitmap函数中又调用了new_block(bitmap.c)早对磁盘块做了些测试如下:

for (i=0 ; i<8 ; i++)if (bh=sb->s_zmap[i])if ((j=find_first_zero(bh->b_data))<8192)break;if (i>=8 || !bh || j>=8192)return 0;if (set_bit(j,bh->b_data))panic("new_block: bit already set");bh->b_dirt = 1;j += i*8192 + sb->s_firstdatazone-1;if (j >= sb->s_nzones)return 0;

这也就是说,不可能会出现非法block号,那么bread失败也就无从谈起了!

退一步说:如果真的失败了那

if ((char *)de >= BLOCK_SIZE+bh->b_data)
这代码又会产生什么后果呢?

所以,我认为赵博士上面的注释有点小失误,下面的注释才是最合理的解释。

这应该是从find_entry函数中拷过来的,但是由于修改时没有注意到,所以留下的一点冗余代码,

注意!!!是冗余代码不是Bug!这也告诉我们,写代码一般不要copy,否则极易出错!