diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-06-10 13:30:22 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-06-21 11:54:05 -0400 |
commit | 8f7d5efbef8718a774ac5e347b4ec069f17fd9b4 (patch) | |
tree | aa95020eb43fe3cdb45ce96c9ec024b92f5c7621 /fs/nfs/pnfs.c | |
parent | 19345cb299e8234006c5125151ab723e851a1d24 (diff) |
NFSv4.1: Fix some issues with pnfs_generic_pg_test
1. If the intention is to coalesce requests 'prev' and 'req' then we
have to ensure at least that we have a layout starting at
req_offset(prev).
2. If we're only requesting a minimal layout of length desc->pg_count,
we need to test the length actually returned by the server before
we allow the coalescing to occur.
3. We need to deal correctly with (pgio->lseg == NULL)
4. Fixup the test guarding the pnfs_update_layout.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r-- | fs/nfs/pnfs.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 539b94cb6c0f..0f42e02436ee 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -1064,19 +1064,21 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | |||
1064 | gfp_flags = GFP_NOFS; | 1064 | gfp_flags = GFP_NOFS; |
1065 | } | 1065 | } |
1066 | 1066 | ||
1067 | if (pgio->pg_count == prev->wb_bytes) { | 1067 | if (pgio->pg_lseg == NULL) { |
1068 | if (pgio->pg_count != prev->wb_bytes) | ||
1069 | return true; | ||
1068 | /* This is first coelesce call for a series of nfs_pages */ | 1070 | /* This is first coelesce call for a series of nfs_pages */ |
1069 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, | 1071 | pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, |
1070 | prev->wb_context, | 1072 | prev->wb_context, |
1071 | req_offset(req), | 1073 | req_offset(prev), |
1072 | pgio->pg_count, | 1074 | pgio->pg_count, |
1073 | access_type, | 1075 | access_type, |
1074 | gfp_flags); | 1076 | gfp_flags); |
1075 | return true; | 1077 | if (pgio->pg_lseg == NULL) |
1078 | return true; | ||
1076 | } | 1079 | } |
1077 | 1080 | ||
1078 | if (pgio->pg_lseg && | 1081 | if (req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset, |
1079 | req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset, | ||
1080 | pgio->pg_lseg->pls_range.length)) | 1082 | pgio->pg_lseg->pls_range.length)) |
1081 | return false; | 1083 | return false; |
1082 | 1084 | ||