關於linux0.12中的add_entry中bread中的些猜測

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

發佈了43 篇原創文章 · 獲贊 17 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章