NFS Client in Linux Kernel - Read

1. NFS中文件相關(guān)操作的rountine

const struct nfs_rpc_ops nfs_v4_clientops = {
    .version    = 4,            /* protocol version */
    .dentry_ops = &nfs4_dentry_operations,//dentry操作穆趴,如nfs_dentry_delete
    .dir_inode_ops  = &nfs4_dir_inode_operations,//dir的元數(shù)據(jù)操作仅政,如nfs_create昔馋,nfs_lookup
    .file_inode_ops = &nfs4_file_inode_operations,//file的元數(shù)據(jù)操作,如nfs_getattr区匣,nfs_setattr
    .file_ops   = &nfs4_file_operations,//file非元數(shù)據(jù)操作烦磁,如nfs_file_read岗喉,nfs_file_write

1. 1 Read 準備工作

nfs4_do_open間接調(diào)用nfs_fhget驾孔,在其中設(shè)置

//設(shè)置page cache相關(guān)函數(shù)
inode->i_data.a_ops = &nfs_file_aops; //for regular file
inode->i_data.a_ops = &nfs_dir_aops; //for dir

generic_file_read_iter()會調(diào)用a_ops中的函數(shù)芍秆,如readpage()等

2. Read操作

read() => sys_read() => file->f_op->read_iter(...) => nfs_file_read() => generic_file_read_iter() => nfs_readpages()
下面分析函數(shù)nfs_file_read()

  1. 如果有O_DIRECT參數(shù),不管page cache是否失效翠勉,跳過緩存直接讀妖啥。
  2. 調(diào)用nfs_revalidate_mapping_protected,做了如下事情:
    1. 如果inode信息過期失效眉菱,則更新inode迹栓。
    2. 如果inode的cache_validity被標記NFS_INO_INVALID_DATA,調(diào)用nfs_invalidate_mapping將page cache標記為失效掉分。
  3. 調(diào)用generic_file_read_iter俭缓。如果page cache被標記失效,則調(diào)用readpage相應(yīng)函數(shù)酥郭。對于NFS來說华坦,它是nfs_readpages

3. inode信息包括兩個:

  • nfs_inode上的一些值,如cache_validity等不从。
  • NFS attribte惜姐,具體有哪些由server->attr_bitmask決定。

3.1 如何判斷inode過期失效

static bool nfs_mapping_need_revalidate_inode(struct inode *inode)
{
    if (nfs_have_delegated_attributes(inode))
        return false;
    return (NFS_I(inode)->cache_validity & NFS_INO_REVAL_PAGECACHE)
        || nfs_attribute_timeout(inode)
        || NFS_STALE(inode);
}

3.2 如何更新inode

__nfs_revalidate_inode實現(xiàn)。

  1. 發(fā)送GETATTR給server, 由nfs4_proc_getattr實現(xiàn)歹袁。
  2. 調(diào)用nfs_refresh_inode
    下面是kernel log坷衍,其中2428是inode number
[183914.358438] NFS: nfs_update_inode(0:43/2428 fh_crc=0x104e0ee0 ct=1 info=0x427e7f)

3.3 NFS_INO_INVALID_DATA何時被設(shè)置

  • nfs_zap_caches_locked
  • nfs_zap_mapping
  • nfs_update_inode中,inode->i_version和fattr->change_attr不相等情況下条舔,或者文件大小變化時枫耳。
  • update_changeattr,并強制更新dir->i_version

4. Attribute的Mask

  1. 發(fā)送SERVER_CAPS孟抗,由nfs4_server_capabilities實現(xiàn)迁杨。可以得到bitmask,被存在server->attr_bitmask凄硼。nfs4_server_capabilities是在mount時候被調(diào)用的铅协。
  2. 以后每次發(fā)送GETATTR給server,都會發(fā)送這個mask摊沉。

5. change attribute

NFS的這個attribute狐史,存儲在inode->i_version。如果這個值變化坯钦,NFS協(xié)議認為所有attribute全部失效预皇,同時page cache也失效。

6. NFS數(shù)據(jù)一致性的討論

參看man nfs(5)DATA AND METADATA COHERENCE部分
總結(jié)一下有幾點:

  1. Close-to-open cache consistency:close操作時候確保任何修改寫進服務(wù)器婉刀。
  2. Attribute caching: 60s的timeout吟温。在這之間,GETATTR直接返回突颊,超過這個時間鲁豪,發(fā)起IO獲得所需的attribte÷赏海可以指定noacmount選項爬橡,表示timeout為0。
  3. Active/Active NFS提供的是弱一致性(Weak cache consistency)棒动。對于NFS4來說糙申,每次讀之前發(fā)送GETATTR查詢change屬性。change一般是個時間船惨,如果發(fā)現(xiàn)這次獲得的change和上次不同柜裸,說明文件被修改,Client會發(fā)送READ請求粱锐。否則Client直接從本地cache獲取疙挺。如果打開文件時指定O_DIRECT參數(shù),則每次都向Server發(fā)送READ請求怜浅,不走本地cache铐然。
  4. Delegation分為讀和寫蔬崩。

小實驗:用nfs-ganesha搭建一個nfs server

  1. 先通過nfs read讀取一個文件。
  2. 本地修改這個文件搀暑。
  3. 再發(fā)送nfs read讀取這個文件沥阳,發(fā)現(xiàn)這個文件沒有變化。這是因為change attribute沒有失效自点,page cache也沒有失效沪袭。

7. 其他

7.1 inode => nfs_inode

struct nfs_inode *nfsi = NFS_I(inode);

static inline struct nfs_inode *NFS_I(const struct inode *inode)
{
    return container_of(inode, struct nfs_inode, vfs_inode);
}

inode => nfs_server

struct nfs_server = NFS_SERVER(inode);

static inline struct nfs_server *NFS_SB(const struct super_block *s)
{
    return (struct nfs_server *)(s->s_fs_info);
}

static inline struct nfs_server *NFS_SERVER(const struct inode *inode)
{
    return NFS_SB(inode->i_sb);
}

7.2 對inode進行某項操作

NFS_PROTO(inode)->getattr(...);
static inline const struct nfs_rpc_ops *NFS_PROTO(const struct inode *inode)
{
    return NFS_SERVER(inode)->nfs_client->rpc_ops;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市樟氢,隨后出現(xiàn)的幾起案子冈绊,更是在濱河造成了極大的恐慌,老刑警劉巖埠啃,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件死宣,死亡現(xiàn)場離奇詭異,居然都是意外死亡碴开,警方通過查閱死者的電腦和手機毅该,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潦牛,“玉大人眶掌,你說我怎么就攤上這事“屯耄” “怎么了朴爬?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長橡淆。 經(jīng)常有香客問我召噩,道長,這世上最難降的妖魔是什么逸爵? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任具滴,我火速辦了婚禮,結(jié)果婚禮上师倔,老公的妹妹穿的比我還像新娘构韵。我一直安慰自己,他們只是感情好趋艘,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布疲恢。 她就那樣靜靜地躺著,像睡著了一般致稀。 火紅的嫁衣襯著肌膚如雪冈闭。 梳的紋絲不亂的頭發(fā)上俱尼,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天抖单,我揣著相機與錄音,去河邊找鬼。 笑死矛绘,一個胖子當(dāng)著我的面吹牛耍休,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播货矮,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼羊精,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囚玫?” 一聲冷哼從身側(cè)響起喧锦,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抓督,沒想到半個月后燃少,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铃在,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年阵具,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定铜。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳液,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揣炕,到底是詐尸還是另有隱情帘皿,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布畸陡,位于F島的核電站矮烹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罩锐。R本人自食惡果不足惜奉狈,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涩惑。 院中可真熱鬧仁期,春花似錦、人聲如沸竭恬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊硕。三九已至赊级,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岔绸,已是汗流浹背理逊。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工橡伞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晋被。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓兑徘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡洛。 傳聞我的和親對象是個殘疾皇子挂脑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容