BDI各个结构体关系
- 每块磁盘对应着一个BDI设备,用struct backing_dev_info表示
- 系统上所有BDI设备通过struct list_head bdi_list;链表串在一起
- 一个BDI设备对应一个struct bdi_writeback结构,存放该设备需要处理的脏页及脏页回写函数
- struct delayed_work定义了一个延迟任务,其处理函数也就是脏页回写函数,bdi_writeback_workfn
- struct list_head b_dirty存放该BDI所有dirty inode,但回写时不是在这个链表上处理
- struct list_head b_io, b_dirty链表上的dirty inode经过dirty_expire_centisecs后,过期才会挂到该链表,进行实际的回写。而且还会对该链表排序,按分区将inode排序,因为同一块磁盘可能有多个分区,每个分区的文件系统可能不同,回写脏页的处理也不尽相同,排序是为了提供效率,避免频繁切换,同时有时候回写任务是针对特定某个分区,这样回写就更快
- struct list_head b_more_io主要是存放b_io链表处理时无法处理的inode,会先放到这里,避免一致等待inode可用,减少竞争
- struct list_head work_list链表挂的是该BDI设备所有的回写任务,比如周期回写或者background回写,以及对某个分区的单独回写。回写函数就是通过执行struct wb_writeback_work这一个一个任务,把struct list_head b_io链表中的dirty inode回写到设备。