【linux内核】nfs客户端回写

nfs客户端回写

 

const struct address_space_operations nfs_file_aops = {
	.readpage = nfs_readpage,
	.readpages = nfs_readpages,
	.set_page_dirty = __set_page_dirty_nobuffers,
	.writepage = nfs_writepage,
	.writepages = nfs_writepages,
	.write_begin = nfs_write_begin,
	.write_end = nfs_write_end,
	.invalidatepage = nfs_invalidate_page,
	.releasepage = nfs_release_page,
	.direct_IO = nfs_direct_IO,
#ifdef CONFIG_MIGRATION
	.migratepage = nfs_migrate_page,
#endif
	.launder_page = nfs_launder_page,
	.is_dirty_writeback = nfs_check_dirty_writeback,
	.error_remove_page = generic_error_remove_page,
	.swap_activate = nfs_swap_activate,
	.swap_deactivate = nfs_swap_deactivate,
};

后台回写线程:

① 后台回写线程(最典型)

wb_workfn()
 └─ wb_do_writeback()
    └─ wb_writeback()
       └─ writeback_sb_inodes()
          └─ writeback_inode()
             └─ do_writepages()

② fsync / fdatasync

sys_fsync()
 └─ vfs_fsync()
    └─ filemap_write_and_wait_range()
       └─ do_writepages()

③ 内存压力 / balance_dirty_pages

路径最终也会汇聚到 do_writepages()

 

NFS writepages 主路径(核心)

do_writepages
 └─ nfs_writepages()
    └─ nfs_pageio_init_write()
    └─ write_cache_pages()
       └─ nfs_writepage()
          └─ nfs_do_writepage()
             └─ nfs_page_async_flush()

这里开始从 page cache 转为 NFS 私有结构

 

page → nfs_page(回写聚合的关键)

nfs_page_async_flush()
 └─ nfs_pageio_add_request()
    ├─ nfs_generic_pg_test()   ← 是否可聚合
    ├─ nfs_pageio_do_add_request()
    └─ nfs_pageio_complete()

关键点

struct page
↓ 封装成

struct nfs_page(包含 offset、len、inode、锁状态)

 

六、回写聚合与提交(你之前关注的点)
聚合判断

nfs_generic_pg_test()

判断条件包括:

  • 是否同一个 inode
  • 文件偏移是否连续
  • RPC 大小是否超限
  • 是否需要强制 flush(sync / unstable)

 

真正提交 RPC(写到 server):

nfs_pageio_complete()
 └─ nfs_pageio_complete_write()
    └─ nfs_do_multiple_writes()
       └─ nfs_write_rpcsetup()
          └─ rpc_run_task()

RPC 层(发往 NFS Server)

nfs_pageio_complete()
 └─ nfs_pageio_complete_write()
    └─ nfs_do_multiple_writes()
       └─ nfs_write_rpcsetup()
          └─ rpc_run_task()

RPC 完成回调 → 标记 page clean

nfs_write_done()
 └─ nfs_writeback_done()
    ├─ end_page_writeback()
    ├─ ClearPageDirty()
    └─ unlock_page()

十、完整调用栈(浓缩版)

wb_workfn
 └─ wb_do_writeback
    └─ writeback_sb_inodes
       └─ writeback_inode
          └─ do_writepages
             └─ nfs_writepages
                └─ write_cache_pages
                   └─ nfs_writepage
                      └─ nfs_page_async_flush
                         └─ nfs_pageio_add_request
                            ├─ nfs_generic_pg_test
                            └─ nfs_pageio_complete
                               └─ nfs_do_multiple_writes
                                  └─ nfs_write_rpcsetup
                                     └─ rpc_run_task

 

posted @ 2025-12-17 11:38  苏格拉底的落泪  阅读(4)  评论(0)    收藏  举报