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,否则极易出错!

  • 相关阅读:
    面向对象一
    模块二:os模块、sys模块、json模块、pickle模块,包
    模块一:时间模块、random模块、hashlib模块、日志模块
    异常处理、迭代器、推导式、生成器
    有参装饰器
    匿名函数、高阶函数
    装饰器
    函数对象、函数嵌套、闭包函数
    名称空间与作用域
    day17 django 相关
  • 原文地址:https://www.cnblogs.com/findstr/p/2803696.html
Copyright © 2011-2022 走看看