f2fs学习笔记 - 7. f2fs文件打开
1. 前言
本文主要總結f2fs文件的打開過程,以touch test為例
2.打開文件總體流程
在打開文件時,獲取了file描述符,創建了file, 而file->op_s來源于file所對應的inode->i_fop
而inode是如何被創建的呢?
打開文件的過程中,會調用vfs_create,vfs_create會調用具體文件系統的create回調,對于f2fs文件系統就是通過f2fs_create來創建了inode, 并對inode進行初始化,其中:
inode->i_fop = &f2fs_file_operations; f2fs_file_operations定義在f2fs/file.c中
之后將通過如下的調用來將inode->i_fop賦值給file->f_op,如果file->f_op->open不為空,則將得到執行
do_lastfinish_opendo_dentry_open3. f2fs_create
通過f2fs_create創建了inode,同時初始化如下的操作函數集:
138 inode->i_op = &f2fs_file_inode_operations; 139 inode->i_fop = &f2fs_file_operations; 140 inode->i_mapping->a_ops = &f2fs_dblock_aops;f2fs_file_operations將用來初始化file->f_op
f2fs_dblock_aops主要用于與page cache的交互相關
3. mknod
字符設備文件的創建
mknod系統調用->vfs_mknod->dir->i_op->mknod(dir, dentry, mode, dev)->f2fs_mknod (struct inode * dir, struct dentry *dentry,int mode, dev_t rdev)->f2fs_new_inodeinit_special_inode字符設備文件與塊設備文件創建的流程基本是一致的,都是通過mknod系統調用。以f2fs為例它通過調用f2fs_mknod。首先通過f2fs_new_inode來創建inode
f2fs_new_inode:創建新的inode
init_special_inode
為新創建的inode進行初始化,其中針對字符設備會指定inode->i_fop為def_chr_fops,它會在文件打開的時候賦值給新創建的file->f_ops,并調用其中的chrdev_open
4. 字符設備文件的打開
參考打開文件的流程,對于字符設備file->fops為def_chr_fops,它的open函數為chrdev_open
因此將按如下路程執行:
5. 塊設備文件的創建
mknod系統調用->vfs_mknod->dir->i_op->mknod(dir, dentry, mode, dev)->f2fs_mknod (struct inode * dir, struct dentry *dentry,int mode, dev_t rdev)->f2fs_new_inodeinit_special_inode塊設備文件創建與字符設備文件創建的流程基本是一致的,都是通過mknod系統調用。以f2fs為例它通過調用f2fs_mknod。首先通過f2fs_new_inode來創建次inode,這其中也包含了f2fs自己的inode,之后對次inode執行初始化,其中初始化次inode->f_ops為def_blk_fops
f2fs_new_inode:創建新的inode,這個就是次inode,次inode的內容就是設備號,并沒有占用額外的磁盤空間,將來次inode就是通過設備號建立了與block_inode的關聯;
init_special_inode:為新創建的次inode進行初始化,其中針對塊設備會指定inode->i_fop為def_blk_fops
5. 塊設備文件的打開
參考打開文件的流程,對于塊設備file->fops為def_blk_fops,它的open函數為blkdev_open,它的執行流程為:
do_lastfinish_opendo_dentry_openblkdev_open->bd_acquire(inode)//次inodebdgetblkdev_get(bdev, filp->f_mode, filp)blkdev_open
在文件打開的時候將次inode->i_fop賦值給新創建的file->f_ops,并調用其中的blkdev_open,blkdev_open來源于創建塊設備文件時,它被初始化為次inode的i_fop即def_blk_fops,blkdev_open調用bd_acquire
bd_acquire
獲取主inode的block_device, 會通過bdget首先來查找是否已經創建了與傳入設備號相同的inode,如果已經創建則直接返回,否則調用blockdev_superblock的ops來創建bdev文件系統下的塊設備文件的bdev_inode,它包含了主inode和block_device,并建立起了與次inode的關系,注意到address_space是內嵌在inode中,因此address_space也準備好了。
bdget也會對新創建的主inode進行初始化,其中會初始化inode內嵌的address_space->a_ops為def_blk_aops,它會在讀寫塊設備文件時被調用
blkdev_get
建立起block_device與底層塊設備的關系,這樣就可以通過通過讀寫塊設備文件來達到操作塊設備的目的。上一步bdget獲取了block_device,通過block_device可以獲取到gendisk,進一步獲取各個分區hd_struct,從而可以實現對磁盤的操作
總結
以上是生活随笔為你收集整理的f2fs学习笔记 - 7. f2fs文件打开的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FCPX插件:分屏转场插件Stupid
- 下一篇: 小程序分享功能怎么做_微信电影小程序怎么