今天看到文件系统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,否则极易出错!