- 论坛徽章:
- 0
|
本帖最后由 求linux注释 于 2014-12-15 13:46 编辑
这函数真是头疼死了,又没有相关的书籍可以参考,网上关于这段代码的资料也少到几乎没有。
我把对这段代码的疑问全写在注释里了,所幸的是这段代码很短,求懂这东西的大牛帮忙。。{:3_200:}- static Indirect *ext2_find_shared(struct inode *inode,
- int depth,
- int offsets[4],
- Indirect chain[4],
- __le32 *top)
- {
- Indirect *partial, *p;
- int k, err;
- *top = 0;
-
- for (k = depth; k > 1 && !offsets[k-1]; k--);
- //这里是要重新计算深度?
- partial = ext2_get_branch(inode, k, offsets, chain, &err);
- //使用 offsets 数组初始化 chain 数组
-
- if (!partial)
- //如果 ext2_get_branch() 返回空,就说明成功
- partial = chain + k-1;
- /* partial在上面应该已指向了 chain 数组内最后一个间接块对应的对象,他的 key 应该存放着数据块的块号 */
- write_lock(&EXT2_I(inode)->i_meta_lock);
-
- if (!partial->key && //partial->key保存的应该是数据块的块号,那么这里应该就是如果没有映射的数据块
- *partial->p) { //这里感到很奇怪,*p保存的应该也是数据块的块号,那为什么上面判断的 key 是 0 而这里又要判断为真呢?
-
- write_unlock(&EXT2_I(inode)->i_meta_lock);
- goto no_top;
- }
-
- for (p=partial; p>chain && all_zeroes((__le32*)p->bh->b_data,p->p); p--);
- //这个循环是什么意思?或者说为什么要找出 b_data ~ p 不全为空的块?
- if (p == chain + k - 1 && p > chain) {
- //???由于不知道上面那个循环是什么意思,这里也看不懂
-
- p->p--;
- //递减?为什么要递减??
- } else {
- //???
-
- *top = *p->p;
- //取出下一级间接块的块号并作为返回值返回给上级函数
- *p->p = 0;
- }
-
- write_unlock(&EXT2_I(inode)->i_meta_lock);
- while(partial > p)
- //遍历释放 partial ~ p 所有块缓冲区
- {
- brelse(partial->bh);
- partial--;
- }
- no_top:
- return partial;
- }
复制代码 |
|