Skip to content

Commit 1825a0d

Browse files
Fred IsamanTrond Myklebust
authored andcommitted
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>
1 parent 9533da2 commit 1825a0d

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

fs/nfs/nfs4filelayout.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,16 @@ filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio,
796796
{
797797
BUG_ON(pgio->pg_lseg != NULL);
798798

799+
if (req->wb_offset != req->wb_pgbase) {
800+
/*
801+
* Handling unaligned pages is difficult, because have to
802+
* somehow split a req in two in certain cases in the
803+
* pg.test code. Avoid this by just not using pnfs
804+
* in this case.
805+
*/
806+
nfs_pageio_reset_read_mds(pgio);
807+
return;
808+
}
799809
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
800810
req->wb_context,
801811
0,
@@ -815,6 +825,8 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
815825

816826
BUG_ON(pgio->pg_lseg != NULL);
817827

828+
if (req->wb_offset != req->wb_pgbase)
829+
goto out_mds;
818830
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
819831
req->wb_context,
820832
0,

fs/nfs/pagelist.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,12 +280,12 @@ static bool nfs_can_coalesce_requests(struct nfs_page *prev,
280280
return false;
281281
if (req->wb_context->state != prev->wb_context->state)
282282
return false;
283-
if (req->wb_index != (prev->wb_index + 1))
284-
return false;
285283
if (req->wb_pgbase != 0)
286284
return false;
287285
if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE)
288286
return false;
287+
if (req_offset(req) != req_offset(prev) + prev->wb_bytes)
288+
return false;
289289
return pgio->pg_ops->pg_test(pgio, prev, req);
290290
}
291291

fs/nfs/pnfs.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,10 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
10821082
{
10831083
BUG_ON(pgio->pg_lseg != NULL);
10841084

1085+
if (req->wb_offset != req->wb_pgbase) {
1086+
nfs_pageio_reset_read_mds(pgio);
1087+
return;
1088+
}
10851089
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
10861090
req->wb_context,
10871091
req_offset(req),
@@ -1100,6 +1104,10 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *
11001104
{
11011105
BUG_ON(pgio->pg_lseg != NULL);
11021106

1107+
if (req->wb_offset != req->wb_pgbase) {
1108+
nfs_pageio_reset_write_mds(pgio);
1109+
return;
1110+
}
11031111
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
11041112
req->wb_context,
11051113
req_offset(req),

0 commit comments

Comments
 (0)