Commit 5d899d43 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Andrew Morton

writeback: only update ->writeback_index for range_cyclic writeback

mapping->writeback_index is only [1] used as the starting point for
range_cyclic writeback, so there is no point in updating it for other
types of writeback.

[1] except for btrfs_defrag_file which does really odd things with
mapping->writeback_index.  But btrfs doesn't use write_cache_pages at all,
so this isn't relevant here.

Link: https://lkml.kernel.org/r/20240215063649.2164017-6-hch@lst.deSigned-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Acked-by: default avatarDave Chinner <dchinner@redhat.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: David Howells <dhowells@redhat.com>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 98103258
...@@ -2403,7 +2403,6 @@ int write_cache_pages(struct address_space *mapping, ...@@ -2403,7 +2403,6 @@ int write_cache_pages(struct address_space *mapping,
pgoff_t index; pgoff_t index;
pgoff_t end; /* Inclusive */ pgoff_t end; /* Inclusive */
pgoff_t done_index; pgoff_t done_index;
int range_whole = 0;
xa_mark_t tag; xa_mark_t tag;
folio_batch_init(&fbatch); folio_batch_init(&fbatch);
...@@ -2413,8 +2412,6 @@ int write_cache_pages(struct address_space *mapping, ...@@ -2413,8 +2412,6 @@ int write_cache_pages(struct address_space *mapping,
} else { } else {
index = wbc->range_start >> PAGE_SHIFT; index = wbc->range_start >> PAGE_SHIFT;
end = wbc->range_end >> PAGE_SHIFT; end = wbc->range_end >> PAGE_SHIFT;
if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
range_whole = 1;
} }
if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages) { if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages) {
tag_pages_for_writeback(mapping, index, end); tag_pages_for_writeback(mapping, index, end);
...@@ -2518,14 +2515,21 @@ int write_cache_pages(struct address_space *mapping, ...@@ -2518,14 +2515,21 @@ int write_cache_pages(struct address_space *mapping,
} }
/* /*
* If we hit the last page and there is more work to be done: wrap * For range cyclic writeback we need to remember where we stopped so
* back the index back to the start of the file for the next * that we can continue there next time we are called. If we hit the
* time we are called. * last page and there is more work to be done, wrap back to the start
* of the file.
*
* For non-cyclic writeback we always start looking up at the beginning
* of the file if we are called again, which can only happen due to
* -ENOMEM from the file system.
*/ */
if (wbc->range_cyclic && !done) if (wbc->range_cyclic) {
done_index = 0; if (done)
if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) mapping->writeback_index = done_index;
mapping->writeback_index = done_index; else
mapping->writeback_index = 0;
}
return ret; return ret;
} }
......
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