f2fs学习笔记 - 8. f2fs 读文件
1.前言
本文主要介紹f2fs讀取流程
2.調用流程
vfs_readfile->f_op->read(do_sync_read)generic_file_aio_readdo_generic_file_readmapping->a_ops->readpageread系統調用會調用到vfs_read,進而調用到file->f_op->read,這個read回調是在創建文件時初始化為inode->i_fops->read, 對于f2fs就是do_sync_read,它會進一步調用generic_file_aio_read,對于非直讀的情況則會調用mapping->a_ops->readpage回調,它也是在創建文件時通過f2fs_create進行初始化的,mapping->a_ops初始化為f2fs_dblock_aops,因此mapping->a_ops->readpage初始化為f2fs_read_data_page
3.f2fs_read_data_page
f2fs_read_data_pagempage_readpage(page, get_data_block_ro)do_mpage_readpage(bio, page, 1, &last_block_in_bio,&map_bh...)mpage_bio_submit(READ, bio)do_mpage_readpage會執行read page操作,其中的page是在do_generic_file_read時以文件的讀取位置為索引分配的page,它位于file->inode的address_space。bio為要提交給block層的連續邏輯地址的IO, map_bh為buffer_head,用于聯系page和bio。這個函數最終會構造bio來提交給block層,為了構建bio,必須要建立文件邏輯塊與磁盤邏輯塊的關系,因此就要調用到f2fs的get_data_block_ro。
之后通過mpage_bio_submit來提交返回的bio
get_data_block_ro
get_data_block_ro中參數iblock可理解為文件的邏輯偏移,bh_result為映射文件邏輯塊和磁盤塊的buffer_haed, 通過 pgofs = (pgoff_t)(iblock >> (PAGE_CACHE_SHIFT - blkbits));獲取到邏輯塊偏移地址,保存在pgofs 。
以pgofs 偏移地址作為dnode page的索引,調用get_dnode_of_data(&dn, pgofs, RDONLY_NODE),獲取到dnode page中以pgofs為索引的block addr,這個地址將保存在dn.data_blkaddr
通過一個for循環從pgofs索引開始,遍歷臨近的邏輯塊,看是否有連續的磁盤塊與之對應,以實現read ahead操作。
for循環結束后通過map_bh(bh_result, inode->i_sb, dn.data_blkaddr)記錄buffer_result的起始磁盤塊號為dn.data_blkaddr,它就是對應文件邏輯偏移pgofs
bh_result->b_size = (i << blkbits)用以修改bh_result->b_size,包含了read ahead的連續的磁盤塊的大小,單位是字節。
總結
以上是生活随笔為你收集整理的f2fs学习笔记 - 8. f2fs 读文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四阶龙格库塔matlab计算例题,四阶龙
- 下一篇: Norton Ghost V12