layout driver 需要的是一个逻辑位置连续的page list,nfs需要把从radix tree 获取的脏页进行合并,合并的判断函数如下所示。
当发现不能连续时候,则进入layout driver层,完成下刷。
static int nfs_can_coalesce_requests(struct nfs_page *prev,
struct nfs_page *req,struct nfs_pageio_descriptor *pgio)
{
if (req->wb_context->cred != prev->wb_context->cred)
return 0;
if (req->wb_context->lockowner != prev->wb_context->lockowner)
return 0;
if (req->wb_context->state != prev->wb_context->state)
return 0;
if (req->wb_index != (prev->wb_index + 1))
return 0;
if (req->wb_pgbase != 0)
return 0;
if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE)
return 0;
#ifdef CONFIG_PNFS
if (pgio->pg_test && !pgio->pg_test(pgio, prev, req))
return 0;
#endif /* CONFIG_PNFS */
return 1;
}