Commit 72f84e65 authored by Eric Sandeen's avatar Eric Sandeen Committed by Theodore Ts'o

ext4: update writeback_index based on last page scanned

As pointed out in a prior patch, updating the mapping's
writeback_index based on pages written isn't quite right;
what the writeback index is really supposed to reflect is
the next page which should be scanned for writeback during
periodic flush.

As in write_cache_pages(), write_cache_pages_da() does
this scanning for us as we assemble the mpd for later
writeout.  If we keep track of the next page after the
current scan, we can easily update writeback_index without
worrying about pages written vs. pages skipped, etc.

Without this, an fsync will reset writeback_index to
0 (its starting index) + however many pages it wrote, which
can mess up the progress of periodic flush.
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 5b41d924
...@@ -2800,12 +2800,13 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode) ...@@ -2800,12 +2800,13 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode)
*/ */
static int write_cache_pages_da(struct address_space *mapping, static int write_cache_pages_da(struct address_space *mapping,
struct writeback_control *wbc, struct writeback_control *wbc,
struct mpage_da_data *mpd) struct mpage_da_data *mpd,
pgoff_t *done_index)
{ {
int ret = 0; int ret = 0;
int done = 0; int done = 0;
struct pagevec pvec; struct pagevec pvec;
int nr_pages; unsigned nr_pages;
pgoff_t index; pgoff_t index;
pgoff_t end; /* Inclusive */ pgoff_t end; /* Inclusive */
long nr_to_write = wbc->nr_to_write; long nr_to_write = wbc->nr_to_write;
...@@ -2820,6 +2821,7 @@ static int write_cache_pages_da(struct address_space *mapping, ...@@ -2820,6 +2821,7 @@ static int write_cache_pages_da(struct address_space *mapping,
else else
tag = PAGECACHE_TAG_DIRTY; tag = PAGECACHE_TAG_DIRTY;
*done_index = index;
while (!done && (index <= end)) { while (!done && (index <= end)) {
int i; int i;
...@@ -2843,6 +2845,8 @@ static int write_cache_pages_da(struct address_space *mapping, ...@@ -2843,6 +2845,8 @@ static int write_cache_pages_da(struct address_space *mapping,
break; break;
} }
*done_index = page->index + 1;
lock_page(page); lock_page(page);
/* /*
...@@ -2928,6 +2932,7 @@ static int ext4_da_writepages(struct address_space *mapping, ...@@ -2928,6 +2932,7 @@ static int ext4_da_writepages(struct address_space *mapping,
long desired_nr_to_write, nr_to_writebump = 0; long desired_nr_to_write, nr_to_writebump = 0;
loff_t range_start = wbc->range_start; loff_t range_start = wbc->range_start;
struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
pgoff_t done_index = 0;
pgoff_t end; pgoff_t end;
trace_ext4_da_writepages(inode, wbc); trace_ext4_da_writepages(inode, wbc);
...@@ -3050,7 +3055,7 @@ static int ext4_da_writepages(struct address_space *mapping, ...@@ -3050,7 +3055,7 @@ static int ext4_da_writepages(struct address_space *mapping,
mpd.io_done = 0; mpd.io_done = 0;
mpd.pages_written = 0; mpd.pages_written = 0;
mpd.retval = 0; mpd.retval = 0;
ret = write_cache_pages_da(mapping, wbc, &mpd); ret = write_cache_pages_da(mapping, wbc, &mpd, &done_index);
/* /*
* If we have a contiguous extent of pages and we * If we have a contiguous extent of pages and we
* haven't done the I/O yet, map the blocks and submit * haven't done the I/O yet, map the blocks and submit
...@@ -3104,14 +3109,13 @@ static int ext4_da_writepages(struct address_space *mapping, ...@@ -3104,14 +3109,13 @@ static int ext4_da_writepages(struct address_space *mapping,
__func__, wbc->nr_to_write, ret); __func__, wbc->nr_to_write, ret);
/* Update index */ /* Update index */
index += pages_written;
wbc->range_cyclic = range_cyclic; wbc->range_cyclic = range_cyclic;
if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
/* /*
* set the writeback_index so that range_cyclic * set the writeback_index so that range_cyclic
* mode will write it back later * mode will write it back later
*/ */
mapping->writeback_index = index; mapping->writeback_index = done_index;
out_writepages: out_writepages:
wbc->nr_to_write -= nr_to_writebump; wbc->nr_to_write -= nr_to_writebump;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment