]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/xfs/xfs_file.c
xfs: Fix missed holes in SEEK_HOLE implementation
[karo-tx-linux.git] / fs / xfs / xfs_file.c
index aefa2134a8cbe01a032eaa77de159f6a21cf75b2..f1517e9928c76bab8fbe6816bfb501f5d5eeb3b5 100644 (file)
@@ -1076,17 +1076,6 @@ xfs_find_get_desired_pgoff(
                        break;
                }
 
-               /*
-                * At lease we found one page.  If this is the first time we
-                * step into the loop, and if the first page index offset is
-                * greater than the given search offset, a hole was found.
-                */
-               if (type == HOLE_OFF && lastoff == startoff &&
-                   lastoff < page_offset(pvec.pages[0])) {
-                       found = true;
-                       break;
-               }
-
                for (i = 0; i < nr_pages; i++) {
                        struct page     *page = pvec.pages[i];
                        loff_t          b_offset;
@@ -1098,18 +1087,18 @@ xfs_find_get_desired_pgoff(
                         * file mapping. However, page->index will not change
                         * because we have a reference on the page.
                         *
-                        * Searching done if the page index is out of range.
-                        * If the current offset is not reaches the end of
-                        * the specified search range, there should be a hole
-                        * between them.
+                        * If current page offset is beyond where we've ended,
+                        * we've found a hole.
                         */
-                       if (page->index > end) {
-                               if (type == HOLE_OFF && lastoff < endoff) {
-                                       *offset = lastoff;
-                                       found = true;
-                               }
+                       if (type == HOLE_OFF && lastoff < endoff &&
+                           lastoff < page_offset(pvec.pages[i])) {
+                               found = true;
+                               *offset = lastoff;
                                goto out;
                        }
+                       /* Searching done if the page index is out of range. */
+                       if (page->index > end)
+                               goto out;
 
                        lock_page(page);
                        /*