日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

f2fs学习笔记 - 7. f2fs文件打开

發布時間:2023/12/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 f2fs学习笔记 - 7. f2fs文件打开 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

本文主要總結f2fs文件的打開過程,以touch test為例

2.打開文件總體流程

在打開文件時,獲取了file描述符,創建了file, 而file->op_s來源于file所對應的inode->i_fop
而inode是如何被創建的呢?

[<7f003770>] (f2fs_create+0x24/0x1fc [f2fs]) from [<800c1724>] (vfs_create+0x80/0xb4) [<800c1724>] (vfs_create+0x80/0xb4) from [<800c462c>] (do_last.isra.45+0x794/0xb98) [<800c462c>] (do_last.isra.45+0x794/0xb98) from [<800c4ad8>] (path_openat+0xa8/0x47c) [<800c4ad8>] (path_openat+0xa8/0x47c) from [<800c5170>] (do_filp_open+0x2c/0x80) [<800c5170>] (do_filp_open+0x2c/0x80) from [<800b6f40>] (do_sys_open+0xe4/0x170) [<800b6f40>] (do_sys_open+0xe4/0x170) from [<8000e140>] (ret_fast_syscall+0x0/0x30)

打開文件的過程中,會調用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_open

3. 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
    因此將按如下路程執行:

    do_lastfinish_opendo_dentry_openchrdev_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文件打开的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。