f2fs創建一個文件的具體過程

假設需要創建一個文件/dir/file:

f2fs_sb_info保存了根目錄的inode number,假設是0,此時NAT佈局如下:


由於inode number就是node number,查找第0個node的塊地址,得到4,然後f2fs讀SSD上第4個塊的數據,得到了根目錄的inode:


解析inode的信息,他的數據依次存在了120,200,300,400的塊上,讀入相關的塊後,在邏輯上,我們可以得到根目錄下數據塊的多級哈希的拓撲結構,它一共有3層,第一層1個bucket,第2層2個bucket,第3層3個bucket。


假設"dir"的hash爲19,f2fs先查找第一層,19 % 1 = 0,查找第0個bucket,線性遍歷bucket0的bitmap,發現有置位1的entry,比較hash值,看看是否爲19,若是,在比較文件名,若爲dir,則返回inode number,結果找了一圈沒找到;找第二層,19 % 2 = 1,按上個方法查找第二個bucket,第三層查找第三個bucket。得到dir的inode後,根據inode number查詢NAT,得到dir inode的實際塊地址,並讀入該inode。

f2fs爲file文件分配了一個inode,inode number爲29,在當前的node segment追加寫入新的inode,物理地址爲100,


由於在node segment分配了新的塊,需要修改這個segment的對應的sit_entry,包括bitmap,valiad blocks等信息;需要修改第29個nat entry,將它指向塊地址100。此外,需要向父目錄dir添加一個dentry,


由於修改了dir的數據塊,f2fs向數據segment追加寫了被修改的block,並修改SSA上該block對應的summary entry,使得summary entry的inode指向19,offset設置爲3,把原來的segment 的sit項也做修改,假設追加的數據塊地址爲44,由於這個塊是dir的第三個直接數據塊,則把相關的指針做一下修改,data[3]=44,並追加寫到node segment。


由於追加寫了inode,還要修改nat表,使得nat[19]=104,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章