aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorFred Isaman <iisaman@netapp.com>2012-04-20 19:55:31 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-04-27 14:10:38 -0400
commit1825a0d08f22463e5a8f4b1636473efd057a3479 (patch)
treeb010b2bbb71431802cb1714483b69060ce09ff39 /fs/nfs
parent9533da2979757258d3fd5429d830a297013d69ed (diff)
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>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4filelayout.c12
-rw-r--r--fs/nfs/pagelist.c4
-rw-r--r--fs/nfs/pnfs.c8
3 files changed, 22 insertions, 2 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 02d8170ce0f3..e40523f2fe26 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -796,6 +796,16 @@ filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio,
796{ 796{
797 BUG_ON(pgio->pg_lseg != NULL); 797 BUG_ON(pgio->pg_lseg != NULL);
798 798
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 }
799 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, 809 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
800 req->wb_context, 810 req->wb_context,
801 0, 811 0,
@@ -815,6 +825,8 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,
815 825
816 BUG_ON(pgio->pg_lseg != NULL); 826 BUG_ON(pgio->pg_lseg != NULL);
817 827
828 if (req->wb_offset != req->wb_pgbase)
829 goto out_mds;
818 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, 830 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
819 req->wb_context, 831 req->wb_context,
820 0, 832 0,
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 5d01a1651084..638ca7f5a1e4 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -280,12 +280,12 @@ static bool nfs_can_coalesce_requests(struct nfs_page *prev,
280 return false; 280 return false;
281 if (req->wb_context->state != prev->wb_context->state) 281 if (req->wb_context->state != prev->wb_context->state)
282 return false; 282 return false;
283 if (req->wb_index != (prev->wb_index + 1))
284 return false;
285 if (req->wb_pgbase != 0) 283 if (req->wb_pgbase != 0)
286 return false; 284 return false;
287 if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE) 285 if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE)
288 return false; 286 return false;
287 if (req_offset(req) != req_offset(prev) + prev->wb_bytes)
288 return false;
289 return pgio->pg_ops->pg_test(pgio, prev, req); 289 return pgio->pg_ops->pg_test(pgio, prev, req);
290} 290}
291 291
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index b3a0c01718af..4da05e469be5 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1082,6 +1082,10 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
1082{ 1082{
1083 BUG_ON(pgio->pg_lseg != NULL); 1083 BUG_ON(pgio->pg_lseg != NULL);
1084 1084
1085 if (req->wb_offset != req->wb_pgbase) {
1086 nfs_pageio_reset_read_mds(pgio);
1087 return;
1088 }
1085 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, 1089 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
1086 req->wb_context, 1090 req->wb_context,
1087 req_offset(req), 1091 req_offset(req),
@@ -1100,6 +1104,10 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *
1100{ 1104{
1101 BUG_ON(pgio->pg_lseg != NULL); 1105 BUG_ON(pgio->pg_lseg != NULL);
1102 1106
1107 if (req->wb_offset != req->wb_pgbase) {
1108 nfs_pageio_reset_write_mds(pgio);
1109 return;
1110 }
1103 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, 1111 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
1104 req->wb_context, 1112 req->wb_context,
1105 req_offset(req), 1113 req_offset(req),