NFSv4.1: Fix an off-by-one error in pnfs_generic_pg_test
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 10 Jun 2011 17:30:23 +0000 (13:30 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 21 Jun 2011 15:54:06 +0000 (11:54 -0400)
And document what is going on there...

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/pnfs.c

index 0f42e02436ee9cae44e7f1f4374525d6a2a6ba12..29c0ca7fc347cdf8cebf6bd83960de18942ca4e4 100644 (file)
@@ -1078,11 +1078,22 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
                        return true;
        }
 
-       if (req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset,
-                                        pgio->pg_lseg->pls_range.length))
-               return false;
-
-       return true;
+       /*
+        * Test if a nfs_page is fully contained in the pnfs_layout_range.
+        * Note that this test makes several assumptions:
+        * - that the previous nfs_page in the struct nfs_pageio_descriptor
+        *   is known to lie within the range.
+        *   - that the nfs_page being tested is known to be contiguous with the
+        *   previous nfs_page.
+        *   - Layout ranges are page aligned, so we only have to test the
+        *   start offset of the request.
+        *
+        * Please also note that 'end_offset' is actually the offset of the
+        * first byte that lies outside the pnfs_layout_range. FIXME?
+        *
+        */
+       return req_offset(req) < end_offset(pgio->pg_lseg->pls_range.offset,
+                                        pgio->pg_lseg->pls_range.length);
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);