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