文件系统写入磁盘的实锤
文件系统的载体是一些代码,这些代码向上对接虚拟文件系统,向下对接block I/O层,对于文件系统来说,向block I/O层发送的请求就是写入磁盘的实锤,这个请求函数就是submit_bio,在分析文件系统问题时,如果传入这个函数的东西是正确的,问题就得向下找了。
写回的实锤
在浅尝辄止71-后备设备中有提到,bdi_writeback_workfn会定时被调用来执行写回,现在就具体看看它的实锤。
bdi_writeback_workfn
==>wb_do_writeback
==>wb_writeback
[kernel/fs/fs-writeback.c]
==>writeback_sb_inodes
==>__writeback_single_inode
==>do_writepages
[kernel/mm/page-writeback.c]
==>mapping->a_ops->writepages
现在出现了一个函数指针,不难猜,指针指向的函数肯定在kernel/fs/fat目录下某处定义了。在kernel/fs/fat/inode.c可以找到这么一句
.writepages = fat_writepages,
我们可以继续走下去
mapping->a_ops->writepages
==>fat_writepages
[kernel/fs/fat/inode.c]
==>mpage_writepages
[kernel/fs/mpage.c]
==>mpage_bio_submit
==>submit_bio
[kernel/block/blk-core.c]
一般套路
至此可以大致看出文件系统的一些套路了
- 你需要定义一个
struct file_operations
类型的变量,来确定数据如何在磁盘中排布 - 你需要定义一个
struct address_space_operations
类型的变量,来管理page如何写回磁盘
把它们定义好之后,kernel/fs/fat目录以外的那些不区分文件系统的代码就会自动在合适的时候调用它们。
网友评论