pnfs: lookup new lseg at lseg boundary
authorWeston Andros Adamson <dros@primarydata.com>
Fri, 30 Jan 2015 16:01:02 +0000 (11:01 -0500)
committerTom Haynes <loghyr@primarydata.com>
Tue, 3 Feb 2015 19:06:54 +0000 (11:06 -0800)
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>
fs/nfs/pnfs.c

index c7be9b997f5e800428f81d8223bb6f084ad53884..9304984bde80af05eeea42c1b4637e8719fe17c6 100644 (file)
@@ -1788,10 +1788,16 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio,
                seg_end = end_offset(pgio->pg_lseg->pls_range.offset,
                                     pgio->pg_lseg->pls_range.length);
                req_start = req_offset(req);
-               WARN_ON_ONCE(req_start > seg_end);
+               WARN_ON_ONCE(req_start >= seg_end);
                /* start of request is past the last byte of this segment */
-               if (req_start >= seg_end)
+               if (req_start >= seg_end) {
+                       /* reference the new lseg */
+                       if (pgio->pg_ops->pg_cleanup)
+                               pgio->pg_ops->pg_cleanup(pgio);
+                       if (pgio->pg_ops->pg_init)
+                               pgio->pg_ops->pg_init(pgio, req);
                        return 0;
+               }
 
                /* adjust 'size' iff there are fewer bytes left in the
                 * segment than what nfs_generic_pg_test returned */