|
@@ -230,14 +230,24 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
|
|
pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
|
|
pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
|
|
for (i = 0; i < pagevec_count(&pvec); i++) {
|
|
for (i = 0; i < pagevec_count(&pvec); i++) {
|
|
struct page *page = pvec.pages[i];
|
|
struct page *page = pvec.pages[i];
|
|
|
|
+ pgoff_t index;
|
|
|
|
+ int lock_failed;
|
|
|
|
|
|
- if (TestSetPageLocked(page)) {
|
|
|
|
- next++;
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- if (page->index > next)
|
|
|
|
- next = page->index;
|
|
|
|
|
|
+ lock_failed = TestSetPageLocked(page);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We really shouldn't be looking at the ->index of an
|
|
|
|
+ * unlocked page. But we're not allowed to lock these
|
|
|
|
+ * pages. So we rely upon nobody altering the ->index
|
|
|
|
+ * of this (pinned-by-us) page.
|
|
|
|
+ */
|
|
|
|
+ index = page->index;
|
|
|
|
+ if (index > next)
|
|
|
|
+ next = index;
|
|
next++;
|
|
next++;
|
|
|
|
+ if (lock_failed)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
if (PageDirty(page) || PageWriteback(page))
|
|
if (PageDirty(page) || PageWriteback(page))
|
|
goto unlock;
|
|
goto unlock;
|
|
if (page_mapped(page))
|
|
if (page_mapped(page))
|