天天看點

linux檔案系統(三) - 核心回寫機制

将資料寫到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);