NFS: prepare coalesce testing for directio
The coalesce code made assumptions that will no longer be true once non-page aligned io occurs. This introduces no change in current behavior, but allows for more general situations to come. Signed-off-by: Fred Isaman <iisaman@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
9533da2979
commit
1825a0d08f
@ -796,6 +796,16 @@ filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
|||||||
{
|
{
|
||||||
BUG_ON(pgio->pg_lseg != NULL);
|
BUG_ON(pgio->pg_lseg != NULL);
|
||||||
|
|
||||||
|
if (req->wb_offset != req->wb_pgbase) {
|
||||||
|
/*
|
||||||
|
* Handling unaligned pages is difficult, because have to
|
||||||
|
* somehow split a req in two in certain cases in the
|
||||||
|
* pg.test code. Avoid this by just not using pnfs
|
||||||
|
* in this case.
|
||||||
|
*/
|
||||||
|
nfs_pageio_reset_read_mds(pgio);
|
||||||
|
return;
|
||||||
|
}
|
||||||
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
||||||
req->wb_context,
|
req->wb_context,
|
||||||
0,
|
0,
|
||||||
@ -815,6 +825,8 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
|||||||
|
|
||||||
BUG_ON(pgio->pg_lseg != NULL);
|
BUG_ON(pgio->pg_lseg != NULL);
|
||||||
|
|
||||||
|
if (req->wb_offset != req->wb_pgbase)
|
||||||
|
goto out_mds;
|
||||||
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
||||||
req->wb_context,
|
req->wb_context,
|
||||||
0,
|
0,
|
||||||
|
@ -280,12 +280,12 @@ static bool nfs_can_coalesce_requests(struct nfs_page *prev,
|
|||||||
return false;
|
return false;
|
||||||
if (req->wb_context->state != prev->wb_context->state)
|
if (req->wb_context->state != prev->wb_context->state)
|
||||||
return false;
|
return false;
|
||||||
if (req->wb_index != (prev->wb_index + 1))
|
|
||||||
return false;
|
|
||||||
if (req->wb_pgbase != 0)
|
if (req->wb_pgbase != 0)
|
||||||
return false;
|
return false;
|
||||||
if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE)
|
if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE)
|
||||||
return false;
|
return false;
|
||||||
|
if (req_offset(req) != req_offset(prev) + prev->wb_bytes)
|
||||||
|
return false;
|
||||||
return pgio->pg_ops->pg_test(pgio, prev, req);
|
return pgio->pg_ops->pg_test(pgio, prev, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1082,6 +1082,10 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
|
|||||||
{
|
{
|
||||||
BUG_ON(pgio->pg_lseg != NULL);
|
BUG_ON(pgio->pg_lseg != NULL);
|
||||||
|
|
||||||
|
if (req->wb_offset != req->wb_pgbase) {
|
||||||
|
nfs_pageio_reset_read_mds(pgio);
|
||||||
|
return;
|
||||||
|
}
|
||||||
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
||||||
req->wb_context,
|
req->wb_context,
|
||||||
req_offset(req),
|
req_offset(req),
|
||||||
@ -1100,6 +1104,10 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *
|
|||||||
{
|
{
|
||||||
BUG_ON(pgio->pg_lseg != NULL);
|
BUG_ON(pgio->pg_lseg != NULL);
|
||||||
|
|
||||||
|
if (req->wb_offset != req->wb_pgbase) {
|
||||||
|
nfs_pageio_reset_write_mds(pgio);
|
||||||
|
return;
|
||||||
|
}
|
||||||
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
||||||
req->wb_context,
|
req->wb_context,
|
||||||
req_offset(req),
|
req_offset(req),
|
||||||
|
Loading…
Reference in New Issue
Block a user