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 | |
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>
-rw-r--r-- | fs/nfs/objlayout/objio_osd.c | 3 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 12 |
2 files changed, 10 insertions, 5 deletions
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c index eb4aafa9f521..8ff2ea3f10ef 100644 --- a/fs/nfs/objlayout/objio_osd.c +++ b/fs/nfs/objlayout/objio_osd.c | |||
@@ -1000,6 +1000,9 @@ static bool objio_pg_test(struct nfs_pageio_descriptor *pgio, | |||
1000 | if (!pnfs_generic_pg_test(pgio, prev, req)) | 1000 | if (!pnfs_generic_pg_test(pgio, prev, req)) |
1001 | return false; | 1001 | return false; |
1002 | 1002 | ||
1003 | if (pgio->pg_lseg == NULL) | ||
1004 | return true; | ||
1005 | |||
1003 | return pgio->pg_count + req->wb_bytes <= | 1006 | return pgio->pg_count + req->wb_bytes <= |
1004 | OBJIO_LSEG(pgio->pg_lseg)->max_io_size; | 1007 | OBJIO_LSEG(pgio->pg_lseg)->max_io_size; |
1005 | } | 1008 | } |
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 | ||