Message ID | 20231218153553.807799-5-hch@lst.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [01/17] writeback: fix done_index when hitting the wbc->nr_to_write | expand |
On Mon 18-12-23 16:35:40, Christoph Hellwig wrote: > 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. > > Signed-off-by: Christoph Hellwig <hch@lst.de> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > mm/page-writeback.c | 24 ++++++++++++++---------- > 1 file changed, 14 insertions(+), 10 deletions(-) > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index 7ed6c2bc8dd51c..c798c0d6d0abb4 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -2403,7 +2403,6 @@ int write_cache_pages(struct address_space *mapping, > pgoff_t index; > pgoff_t end; /* Inclusive */ > pgoff_t done_index; > - int range_whole = 0; > xa_mark_t tag; > > folio_batch_init(&fbatch); > @@ -2413,8 +2412,6 @@ int write_cache_pages(struct address_space *mapping, > } else { > index = wbc->range_start >> 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) { > tag_pages_for_writeback(mapping, index, end); > @@ -2514,14 +2511,21 @@ int write_cache_pages(struct address_space *mapping, > } > > /* > - * If we hit the last page and there is more work to be done: wrap > - * back the index back to the start of the file for the next > - * time we are called. > + * For range cyclic writeback we need to remember where we stopped so > + * that we can continue there next time we are called. If we hit the > + * 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) > - done_index = 0; > - if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) > - mapping->writeback_index = done_index; > + if (wbc->range_cyclic) { > + if (done) > + mapping->writeback_index = done_index; > + else > + mapping->writeback_index = 0; > + } > > return ret; > } > -- > 2.39.2 >
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 7ed6c2bc8dd51c..c798c0d6d0abb4 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2403,7 +2403,6 @@ int write_cache_pages(struct address_space *mapping, pgoff_t index; pgoff_t end; /* Inclusive */ pgoff_t done_index; - int range_whole = 0; xa_mark_t tag; folio_batch_init(&fbatch); @@ -2413,8 +2412,6 @@ int write_cache_pages(struct address_space *mapping, } else { index = wbc->range_start >> 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) { tag_pages_for_writeback(mapping, index, end); @@ -2514,14 +2511,21 @@ int write_cache_pages(struct address_space *mapping, } /* - * If we hit the last page and there is more work to be done: wrap - * back the index back to the start of the file for the next - * time we are called. + * For range cyclic writeback we need to remember where we stopped so + * that we can continue there next time we are called. If we hit the + * 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) - done_index = 0; - if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) - mapping->writeback_index = done_index; + if (wbc->range_cyclic) { + if (done) + mapping->writeback_index = done_index; + else + mapping->writeback_index = 0; + } return ret; }
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. Signed-off-by: Christoph Hellwig <hch@lst.de> --- mm/page-writeback.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)