NFS: Fix up nfs_page_group_covers_page()
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 17 Jul 2017 20:58:07 +0000 (16:58 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 15 Aug 2017 15:54:47 +0000 (11:54 -0400)
Fix up the test in nfs_page_group_covers_page(). The simplest implementation
is to check that we have a set of intersecting or contiguous subrequests
that connect page offset 0 to nfs_page_length(req->wb_page).

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/write.c

index 0f418d825185acdfff79fbf609128c92231812fb..759e37d26acf94f9afaf2474b164baed850292d0 100644 (file)
@@ -243,9 +243,6 @@ nfs_page_group_search_locked(struct nfs_page *head, unsigned int page_offset)
 {
        struct nfs_page *req;
 
-       WARN_ON_ONCE(head != head->wb_head);
-       WARN_ON_ONCE(!test_bit(PG_HEADLOCK, &head->wb_head->wb_flags));
-
        req = head;
        do {
                if (page_offset >= req->wb_pgbase &&
@@ -273,18 +270,15 @@ static bool nfs_page_group_covers_page(struct nfs_page *req)
 
        nfs_page_group_lock(req);
 
-       do {
+       for (;;) {
                tmp = nfs_page_group_search_locked(req->wb_head, pos);
-               if (tmp) {
-                       /* no way this should happen */
-                       WARN_ON_ONCE(tmp->wb_pgbase != pos);
-                       pos += tmp->wb_bytes - (pos - tmp->wb_pgbase);
-               }
-       } while (tmp && pos < len);
+               if (!tmp)
+                       break;
+               pos = tmp->wb_pgbase + tmp->wb_bytes;
+       }
 
        nfs_page_group_unlock(req);
-       WARN_ON_ONCE(pos > len);
-       return pos == len;
+       return pos >= len;
 }
 
 /* We can set the PG_uptodate flag if we see that a write request