aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@primarydata.com>2015-01-30 11:01:02 -0500
committerTom Haynes <loghyr@primarydata.com>2015-02-03 14:06:54 -0500
commit7c13789e3e6c66dbcaade1760087429240eb3d27 (patch)
tree3d546df6c9feb8e79fc9e9575343d47e879ee507
parentcb5d04bc39e914124e811ea55f3034d2379a5f6c (diff)
pnfs: lookup new lseg at lseg boundary
Before mirroring support was added, the pageio descriptor's pg_lseg was set to null when an RPC was sent. Because of this, pg_init was called at lseg boundaries with pg_lseg = NULL, and it could be set to the new lseg. Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
-rw-r--r--fs/nfs/pnfs.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index c7be9b997f5e..9304984bde80 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1788,10 +1788,16 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio,
1788 seg_end = end_offset(pgio->pg_lseg->pls_range.offset, 1788 seg_end = end_offset(pgio->pg_lseg->pls_range.offset,
1789 pgio->pg_lseg->pls_range.length); 1789 pgio->pg_lseg->pls_range.length);
1790 req_start = req_offset(req); 1790 req_start = req_offset(req);
1791 WARN_ON_ONCE(req_start > seg_end); 1791 WARN_ON_ONCE(req_start >= seg_end);
1792 /* start of request is past the last byte of this segment */ 1792 /* start of request is past the last byte of this segment */
1793 if (req_start >= seg_end) 1793 if (req_start >= seg_end) {
1794 /* reference the new lseg */
1795 if (pgio->pg_ops->pg_cleanup)
1796 pgio->pg_ops->pg_cleanup(pgio);
1797 if (pgio->pg_ops->pg_init)
1798 pgio->pg_ops->pg_init(pgio, req);
1794 return 0; 1799 return 0;
1800 }
1795 1801
1796 /* adjust 'size' iff there are fewer bytes left in the 1802 /* adjust 'size' iff there are fewer bytes left in the
1797 * segment than what nfs_generic_pg_test returned */ 1803 * segment than what nfs_generic_pg_test returned */