今天看到文件系統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,否則極易出錯!