- 論壇徽章:
- 0
|
本帖最后由 求linux注釋 于 2014-12-15 13:46 編輯
這函數(shù)真是頭疼死了,又沒有相關(guān)的書籍可以參考,網(wǎng)上關(guān)于這段代碼的資料也少到幾乎沒有。
我把對這段代碼的疑問全寫在注釋里了,所幸的是這段代碼很短,求懂這東西的大牛幫忙。。{: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 數(shù)組初始化 chain 數(shù)組
-
- if (!partial)
- //如果 ext2_get_branch() 返回空,就說明成功
- partial = chain + k-1;
- /* partial在上面應(yīng)該已指向了 chain 數(shù)組內(nèi)最后一個間接塊對應(yīng)的對象,他的 key 應(yīng)該存放著數(shù)據(jù)塊的塊號 */
- write_lock(&EXT2_I(inode)->i_meta_lock);
-
- if (!partial->key && //partial->key保存的應(yīng)該是數(shù)據(jù)塊的塊號,那么這里應(yīng)該就是如果沒有映射的數(shù)據(jù)塊
- *partial->p) { //這里感到很奇怪,*p保存的應(yīng)該也是數(shù)據(jù)塊的塊號,那為什么上面判斷的 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--);
- //這個循環(huán)是什么意思?或者說為什么要找出 b_data ~ p 不全為空的塊?
- if (p == chain + k - 1 && p > chain) {
- //???由于不知道上面那個循環(huán)是什么意思,這里也看不懂
-
- p->p--;
- //遞減?為什么要遞減??
- } else {
- //???
-
- *top = *p->p;
- //取出下一級間接塊的塊號并作為返回值返回給上級函數(shù)
- *p->p = 0;
- }
-
- write_unlock(&EXT2_I(inode)->i_meta_lock);
- while(partial > p)
- //遍歷釋放 partial ~ p 所有塊緩沖區(qū)
- {
- brelse(partial->bh);
- partial--;
- }
- no_top:
- return partial;
- }
復(fù)制代碼 |
|