|
@@ -2439,6 +2439,7 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
int no_nrwrite_index_update;
|
|
|
int pages_written = 0;
|
|
|
long pages_skipped;
|
|
|
+ int range_cyclic, cycled = 1, io_done = 0;
|
|
|
int needed_blocks, ret = 0, nr_to_writebump = 0;
|
|
|
struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
|
|
|
|
|
@@ -2490,9 +2491,15 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
|
|
|
range_whole = 1;
|
|
|
|
|
|
- if (wbc->range_cyclic)
|
|
|
+ range_cyclic = wbc->range_cyclic;
|
|
|
+ if (wbc->range_cyclic) {
|
|
|
index = mapping->writeback_index;
|
|
|
- else
|
|
|
+ if (index)
|
|
|
+ cycled = 0;
|
|
|
+ wbc->range_start = index << PAGE_CACHE_SHIFT;
|
|
|
+ wbc->range_end = LLONG_MAX;
|
|
|
+ wbc->range_cyclic = 0;
|
|
|
+ } else
|
|
|
index = wbc->range_start >> PAGE_CACHE_SHIFT;
|
|
|
|
|
|
mpd.wbc = wbc;
|
|
@@ -2506,6 +2513,7 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
wbc->no_nrwrite_index_update = 1;
|
|
|
pages_skipped = wbc->pages_skipped;
|
|
|
|
|
|
+retry:
|
|
|
while (!ret && wbc->nr_to_write > 0) {
|
|
|
|
|
|
/*
|
|
@@ -2548,6 +2556,7 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
pages_written += mpd.pages_written;
|
|
|
wbc->pages_skipped = pages_skipped;
|
|
|
ret = 0;
|
|
|
+ io_done = 1;
|
|
|
} else if (wbc->nr_to_write)
|
|
|
/*
|
|
|
* There is no more writeout needed
|
|
@@ -2556,6 +2565,13 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
*/
|
|
|
break;
|
|
|
}
|
|
|
+ if (!io_done && !cycled) {
|
|
|
+ cycled = 1;
|
|
|
+ index = 0;
|
|
|
+ wbc->range_start = index << PAGE_CACHE_SHIFT;
|
|
|
+ wbc->range_end = mapping->writeback_index - 1;
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
if (pages_skipped != wbc->pages_skipped)
|
|
|
printk(KERN_EMERG "This should not happen leaving %s "
|
|
|
"with nr_to_write = %ld ret = %d\n",
|
|
@@ -2563,6 +2579,7 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
|
|
|
/* Update index */
|
|
|
index += pages_written;
|
|
|
+ wbc->range_cyclic = range_cyclic;
|
|
|
if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
|
|
|
/*
|
|
|
* set the writeback_index so that range_cyclic
|