f2fs解析(一)f2fs如何解决wandering tree
wandering tree問題是log-structured 文件系統(tǒng)(LFS) 特有的一個問題,因為LFS的臟數(shù)據(jù)是追加更新的,所以如果一個數(shù)據(jù)塊變臟了,那么那個數(shù)據(jù)塊的直接索引塊、間接索引塊都會變臟(因為索引的地址變臟)。F2FS是如何解決這個問題呢?
我們知道F2FS中main area中共有兩種類型的block:NODE和DATA,其中NODE存儲文件的元數(shù)據(jù),DATA存儲文件實際的數(shù)據(jù)。其中NODE類型的block包括三類元數(shù)據(jù):inode,直接dnode,間接dnode。其中直接dnode的每一個表項指向的是一個DATA block的地址,而間接dnode的每一個表項指針指向的NAT表中的一個表項。
這是F2FS解決wandering tree問題的關(guān)鍵F2FS引入了NAT(node address table),其中每個表項的結(jié)構(gòu)是:
struct f2fs_nat_entry {
__u8 version; /* latest version of cached nat entry */
__le32 ino; /* inode number */
__le32 block_addr; /* block address */
} __packed;
NAT表是個大數(shù)組,每個數(shù)組元素就是上面的f2fs_nat_entry。引入NAT表項是F2FS解決wandering tree問題的關(guān)鍵,因為這樣每當(dāng)有數(shù)據(jù)塊更新的之后,只有與其直接相關(guān)的dnode才會變臟,各間接dnode是不會變臟的。怎么實現(xiàn)的?
上面說到,直接dnode的表項指向的是DATA block的地址,所以DATA page變臟了之后,DATA block就要變更了,所以被殃及的直接dnode當(dāng)然也臟嘍。但是注意,此時火勢并不會蔓延到間接dnode上,因為間接dnode表項指針指的并不是直接dnode的block地址,而是NAT表中的一個表項,所以NAT就像防火槍一樣防止了tree任意滋生:你只要把NAT中相應(yīng)的block_addr域給更新掉就可以了,我間接dnode的指針還是指向這個NAT表項,不變!巧妙!
有興趣的同學(xué)可以研究下C++中虛函數(shù)的實現(xiàn),與此處異曲同工。
總結(jié)
以上是生活随笔為你收集整理的f2fs解析(一)f2fs如何解决wandering tree的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: n位数的全排列(需要考虑大数的情况)
- 下一篇: 各银行信用卡年费怎么免除?这些事项要注意