将資料寫到page cache
寫檔案的時候其實是通過檔案系統寫到page cache中,然後再由相應的線程在适當的時機将page cache中的資料寫到磁盤中。
//fs/fat/file.c
const struct file_operations fat_file_operations = {
...
.aio_write = generic_file_aio_write,
...
};
//mm/filemap.c
generic_file_aio_write
__generic_file_aio_write
generic_file_buffered_write
generic_perform_write
a_ops->write_begin
iov_iter_copy_from_user_atomic(page, i, offset, bytes)
a_ops->write_end
回寫page cache到磁盤
通過sync系統調用将page cache寫到磁盤中
//fs/fat/file.c
const struct file_operations fat_file_operations = {
...
.fsync = fat_file_fsync,
...
};
fat_file_fsync
generic_file_fsync
sync_inode_metadata
sync_inode
writeback_single_inode
__writeback_single_inode
do_writepages
mapping->a_ops->writepages
write_inode
通過回寫工作隊列bdi_writeback将page cache寫到磁盤中
//mm/backing_dev.c
bdi_init
bdi_wb_init
INIT_DELAYED_WORK(&wb->dwork, bdi_writeback_workfn);
//fs/fs-writeback.c
bdi_writeback_workfn
wb_do_writeback
wb_writeback
writeback_sb_inodes
__writeback_single_inode
do_writepages
mapping->a_ops->writepages
write_inode
blk_init_queue
blk_init_queue_node
blk_alloc_queue_node
bdi_init(&q->backing_dev_info);
setup_timer(&q->backing_dev_info.laptop_mode_wb_timer, laptop_mode_timer_fn, ...
//mm/page-writeback.c
laptop_mode_timer_fn
bdi_start_writeback //fs/fs-writeback.c
__bdi_start_writeback
bdi_queue_work
mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);