亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1789 | 回復(fù): 4
打印 上一主題 下一主題

[文件系統(tǒng)] 求大牛幫忙解釋一下 ext2_find_shared() 這個函數(shù)。。 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-12-15 10:49 |只看該作者 |倒序瀏覽
本帖最后由 求linux注釋 于 2014-12-15 13:46 編輯

這函數(shù)真是頭疼死了,又沒有相關(guān)的書籍可以參考,網(wǎng)上關(guān)于這段代碼的資料也少到幾乎沒有。
我把對這段代碼的疑問全寫在注釋里了,所幸的是這段代碼很短,求懂這東西的大牛幫忙。。{: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 數(shù)組初始化 chain 數(shù)組
  15.    
  16.         if (!partial)
  17.         //如果 ext2_get_branch() 返回空,就說明成功
  18.                 partial = chain + k-1;

  19.         /* partial在上面應(yīng)該已指向了 chain 數(shù)組內(nèi)最后一個間接塊對應(yīng)的對象,他的 key 應(yīng)該存放著數(shù)據(jù)塊的塊號 */

  20.         write_lock(&EXT2_I(inode)->i_meta_lock);
  21.    
  22.         if (!partial->key && //partial->key保存的應(yīng)該是數(shù)據(jù)塊的塊號,那么這里應(yīng)該就是如果沒有映射的數(shù)據(jù)塊
  23.         *partial->p) {   //這里感到很奇怪,*p保存的應(yīng)該也是數(shù)據(jù)塊的塊號,那為什么上面判斷的 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.         //這個循環(huán)是什么意思?或者說為什么要找出 b_data ~ p 不全為空的塊?

  31.         if (p == chain + k - 1 && p > chain) {
  32.         //???由于不知道上面那個循環(huán)是什么意思,這里也看不懂
  33.         
  34.                 p->p--;
  35.                 //遞減?為什么要遞減??
  36.         } else {
  37.         //???
  38.         
  39.                 *top = *p->p;
  40.                 //取出下一級間接塊的塊號并作為返回值返回給上級函數(shù)
  41.                 *p->p = 0;
  42.         }
  43.         
  44.         write_unlock(&EXT2_I(inode)->i_meta_lock);

  45.         while(partial > p)
  46.         //遍歷釋放 partial ~ p 所有塊緩沖區(qū)
  47.        {
  48.                 brelse(partial->bh);
  49.                 partial--;
  50.        }
  51. no_top:
  52.         return partial;
  53. }
復(fù)制代碼

論壇徽章:
0
2 [報告]
發(fā)表于 2014-12-16 13:45 |只看該作者
if (!partial->key && //partial->key保存的應(yīng)該是數(shù)據(jù)塊的塊號,那么這里應(yīng)該就是如果沒有映射的數(shù)據(jù)塊
        *partial->p) {   //這里感到很奇怪,*p保存的應(yīng)該也是數(shù)據(jù)塊的塊號,那為什么上面判斷的 key 是 0 而這里又要判斷為真呢?

我說下關(guān)于這個問題的個人觀點:
源代碼中ext2_get_branch中讀取塊號到Indirect后,會調(diào)用verify_chain來驗證這塊數(shù)據(jù)是否改變過:
static inline int verify_chain(Indirect *from, Indirect *to)
{
        while (from <= to && from->key == *from->p) // 這里就是比較key和p是否相等
                from++;
        return (from > to);
}

論壇徽章:
0
3 [報告]
發(fā)表于 2014-12-16 17:27 |只看該作者
本帖最后由 求linux注釋 于 2014-12-16 17:27 編輯

回復(fù) 2# hnwyllmm


verify_chain() 和這個判斷條件不同啊。
verify_chain() 只要 key 和 *p 不相等就會立刻退出并返回一個 0 值,而這里是要求 key == 0 且 *p != 0 才會退出。

論壇徽章:
0
4 [報告]
發(fā)表于 2014-12-17 13:29 |只看該作者
add_chain(++p, bh, (__le32*)bh->b_data + *++offsets);
partial->p是在這個函數(shù)里面賦值的,就是partial->p指向了buffer_head的內(nèi)容,buffer_header可以由程序改寫的
如果partial->key是0,表示沒有有效的block,partial->p是磁盤數(shù)據(jù)在內(nèi)存中的緩存,程序修改時先修改這個緩存,如果說key是0,*p是有效值,應(yīng)該是在操作的過程中有程序修改了這個文件的block
描述的比較混亂,也沒有百分百把握,樓主權(quán)當(dāng)參考吧,如果有更好的解釋,希望可以共享一下,共同學(xué)習(xí)

論壇徽章:
0
5 [報告]
發(fā)表于 2014-12-17 21:43 |只看該作者
回復(fù) 4# hnwyllmm

很有道理,我現(xiàn)在也覺得他是之后又被某個進(jìn)程修改了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP