diff options
author | Fred Isaman <iisaman@netapp.com> | 2012-04-20 19:55:31 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-04-27 14:10:38 -0400 |
commit | 1825a0d08f22463e5a8f4b1636473efd057a3479 (patch) | |
tree | b010b2bbb71431802cb1714483b69060ce09ff39 /fs/nfs | |
parent | 9533da2979757258d3fd5429d830a297013d69ed (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.c | 12 | ||||
-rw-r--r-- | fs/nfs/pagelist.c | 4 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 8 |
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), |