由于page cache的存在,用户write时只是将数据缓存到了page cache,并标记为dirty,而没有真正写到块设备(如硬盘)上 。内核在某个时刻会将page cache里的dirty数据wirteback到块设备上,这就是内核的writeback机制。
writeback是通过delayed_work来实现的,在wb_init()函数里初始化了这个delayed_work;
INIT_DELAYED_WORK(&wb->dwork, wb_workfn);
在wb_workfn()会wakeup这个delayed_work,来实现周期性的writeback:
周期为dirty_writeback_interval,可以通过 /proc/sys/vm/dirty_writeback_centisecs来设置,默认是 5秒。
writeback的主体是在wb_do_writeback():
writeback分以下两种方式:
1. periodic writeback
对应wb_check_old_data_flush():
对expired dirty inode进行w