免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1642 | 回复: 4
打印 上一主题 下一主题

[文件系统] 求大牛帮忙解释一下 ext2_find_shared() 这个函数。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-15 10:49 |只看该作者 |倒序浏览
本帖最后由 求linux注释 于 2014-12-15 13:46 编辑

这函数真是头疼死了,又没有相关的书籍可以参考,网上关于这段代码的资料也少到几乎没有。
我把对这段代码的疑问全写在注释里了,所幸的是这段代码很短,求懂这东西的大牛帮忙。。{:3_200:}
  1. static Indirect *ext2_find_shared(struct inode *inode,
  2.                                 int depth,
  3.                                 int offsets[4],
  4.                                 Indirect chain[4],
  5.                                 __le32 *top)
  6. {
  7.         Indirect *partial, *p;
  8.         int k, err;
  9.         *top = 0;
  10.    
  11.         for (k = depth; k > 1 && !offsets[k-1]; k--);
  12.         //这里是要重新计算深度?

  13.         partial = ext2_get_branch(inode, k, offsets, chain, &err);
  14.         //使用 offsets 数组初始化 chain 数组
  15.    
  16.         if (!partial)
  17.         //如果 ext2_get_branch() 返回空,就说明成功
  18.                 partial = chain + k-1;

  19.         /* partial在上面应该已指向了 chain 数组内最后一个间接块对应的对象,他的 key 应该存放着数据块的块号 */

  20.         write_lock(&EXT2_I(inode)->i_meta_lock);
  21.    
  22.         if (!partial->key && //partial->key保存的应该是数据块的块号,那么这里应该就是如果没有映射的数据块
  23.         *partial->p) {   //这里感到很奇怪,*p保存的应该也是数据块的块号,那为什么上面判断的 key 是 0 而这里又要判断为真呢?
  24.         
  25.                 write_unlock(&EXT2_I(inode)->i_meta_lock);        
  26.                 goto no_top;
  27.         }
  28.    
  29.         for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--);
  30.         //这个循环是什么意思?或者说为什么要找出 b_data ~ p 不全为空的块?

  31.         if (p == chain + k - 1 && p > chain) {
  32.         //???由于不知道上面那个循环是什么意思,这里也看不懂
  33.         
  34.                 p->p--;
  35.                 //递减?为什么要递减??
  36.         } else {
  37.         //???
  38.         
  39.                 *top = *p->p;
  40.                 //取出下一级间接块的块号并作为返回值返回给上级函数
  41.                 *p->p = 0;
  42.         }
  43.         
  44.         write_unlock(&EXT2_I(inode)->i_meta_lock);

  45.         while(partial > p)
  46.         //遍历释放 partial ~ p 所有块缓冲区
  47.        {
  48.                 brelse(partial->bh);
  49.                 partial--;
  50.        }
  51. no_top:
  52.         return partial;
  53. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-12-16 13:45 |只看该作者
if (!partial->key && //partial->key保存的应该是数据块的块号,那么这里应该就是如果没有映射的数据块
        *partial->p) {   //这里感到很奇怪,*p保存的应该也是数据块的块号,那为什么上面判断的 key 是 0 而这里又要判断为真呢?

我说下关于这个问题的个人观点:
源代码中ext2_get_branch中读取块号到Indirect后,会调用verify_chain来验证这块数据是否改变过:
static inline int verify_chain(Indirect *from, Indirect *to)
{
        while (from <= to && from->key == *from->p) // 这里就是比较key和p是否相等
                from++;
        return (from > to);
}

论坛徽章:
0
3 [报告]
发表于 2014-12-16 17:27 |只看该作者
本帖最后由 求linux注释 于 2014-12-16 17:27 编辑

回复 2# hnwyllmm


verify_chain() 和这个判断条件不同啊。
verify_chain() 只要 key 和 *p 不相等就会立刻退出并返回一个 0 值,而这里是要求 key == 0 且 *p != 0 才会退出。

论坛徽章:
0
4 [报告]
发表于 2014-12-17 13:29 |只看该作者
add_chain(++p, bh, (__le32*)bh->b_data + *++offsets);
partial->p是在这个函数里面赋值的,就是partial->p指向了buffer_head的内容,buffer_header可以由程序改写的
如果partial->key是0,表示没有有效的block,partial->p是磁盘数据在内存中的缓存,程序修改时先修改这个缓存,如果说key是0,*p是有效值,应该是在操作的过程中有程序修改了这个文件的block
描述的比较混乱,也没有百分百把握,楼主权当参考吧,如果有更好的解释,希望可以共享一下,共同学习

论坛徽章:
0
5 [报告]
发表于 2014-12-17 21:43 |只看该作者
回复 4# hnwyllmm

很有道理,我现在也觉得他是之后又被某个进程修改了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP