zoukankan      html  css  js  c++  java
  • 关于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,否则极易出错!

  • 相关阅读:
    宏任务、微任务与Event Loop
    puppteer的使用
    docker的使用 -- windows
    vscode集成eslint
    删除git中无用的大文件
    git 使用
    利用chrome devtool 观察页面占用内存
    JS对象-不可扩展对象、密封对象、冻结对象
    数学
    素数 + 背包
  • 原文地址:https://www.cnblogs.com/findstr/p/2803696.html
Copyright © 2011-2022 走看看