|
@@ -911,15 +911,24 @@ retry:
|
|
|
for (i = 0; i < nr_pages; i++) {
|
|
|
struct page *page = pvec.pages[i];
|
|
|
|
|
|
- done_index = page->index + 1;
|
|
|
-
|
|
|
/*
|
|
|
- * At this point we hold neither mapping->tree_lock nor
|
|
|
- * lock on the page itself: the page may be truncated or
|
|
|
- * invalidated (changing page->mapping to NULL), or even
|
|
|
- * swizzled back from swapper_space to tmpfs file
|
|
|
- * mapping
|
|
|
+ * At this point, the page may be truncated or
|
|
|
+ * invalidated (changing page->mapping to NULL), or
|
|
|
+ * even swizzled back from swapper_space to tmpfs file
|
|
|
+ * mapping. However, page->index will not change
|
|
|
+ * because we have a reference on the page.
|
|
|
*/
|
|
|
+ if (page->index > end) {
|
|
|
+ /*
|
|
|
+ * can't be range_cyclic (1st pass) because
|
|
|
+ * end == -1 in that case.
|
|
|
+ */
|
|
|
+ done = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ done_index = page->index + 1;
|
|
|
+
|
|
|
lock_page(page);
|
|
|
|
|
|
/*
|
|
@@ -936,15 +945,6 @@ continue_unlock:
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (page->index > end) {
|
|
|
- /*
|
|
|
- * can't be range_cyclic (1st pass) because
|
|
|
- * end == -1 in that case.
|
|
|
- */
|
|
|
- done = 1;
|
|
|
- goto continue_unlock;
|
|
|
- }
|
|
|
-
|
|
|
if (!PageDirty(page)) {
|
|
|
/* someone wrote it for us */
|
|
|
goto continue_unlock;
|