【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

浙公网安备 33010602011771号