|
@@ -868,9 +868,10 @@ int write_cache_pages(struct address_space *mapping,
|
|
|
int done = 0;
|
|
|
struct pagevec pvec;
|
|
|
int nr_pages;
|
|
|
+ pgoff_t uninitialized_var(writeback_index);
|
|
|
pgoff_t index;
|
|
|
pgoff_t end; /* Inclusive */
|
|
|
- int scanned = 0;
|
|
|
+ int cycled;
|
|
|
int range_whole = 0;
|
|
|
long nr_to_write = wbc->nr_to_write;
|
|
|
|
|
@@ -881,14 +882,19 @@ int write_cache_pages(struct address_space *mapping,
|
|
|
|
|
|
pagevec_init(&pvec, 0);
|
|
|
if (wbc->range_cyclic) {
|
|
|
- index = mapping->writeback_index; /* Start from prev offset */
|
|
|
+ writeback_index = mapping->writeback_index; /* prev offset */
|
|
|
+ index = writeback_index;
|
|
|
+ if (index == 0)
|
|
|
+ cycled = 1;
|
|
|
+ else
|
|
|
+ cycled = 0;
|
|
|
end = -1;
|
|
|
} else {
|
|
|
index = wbc->range_start >> PAGE_CACHE_SHIFT;
|
|
|
end = wbc->range_end >> PAGE_CACHE_SHIFT;
|
|
|
if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
|
|
|
range_whole = 1;
|
|
|
- scanned = 1;
|
|
|
+ cycled = 1; /* ignore range_cyclic tests */
|
|
|
}
|
|
|
retry:
|
|
|
while (!done && (index <= end) &&
|
|
@@ -897,7 +903,6 @@ retry:
|
|
|
min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
|
|
|
unsigned i;
|
|
|
|
|
|
- scanned = 1;
|
|
|
for (i = 0; i < nr_pages; i++) {
|
|
|
struct page *page = pvec.pages[i];
|
|
|
|
|
@@ -915,7 +920,11 @@ retry:
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (!wbc->range_cyclic && page->index > end) {
|
|
|
+ if (page->index > end) {
|
|
|
+ /*
|
|
|
+ * can't be range_cyclic (1st pass) because
|
|
|
+ * end == -1 in that case.
|
|
|
+ */
|
|
|
done = 1;
|
|
|
unlock_page(page);
|
|
|
continue;
|
|
@@ -946,13 +955,15 @@ retry:
|
|
|
pagevec_release(&pvec);
|
|
|
cond_resched();
|
|
|
}
|
|
|
- if (!scanned && !done) {
|
|
|
+ if (!cycled) {
|
|
|
/*
|
|
|
+ * range_cyclic:
|
|
|
* We hit the last page and there is more work to be done: wrap
|
|
|
* back to the start of the file
|
|
|
*/
|
|
|
- scanned = 1;
|
|
|
+ cycled = 1;
|
|
|
index = 0;
|
|
|
+ end = writeback_index - 1;
|
|
|
goto retry;
|
|
|
}
|
|
|
if (!wbc->no_nrwrite_index_update) {
|