]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
writeback: only update ->writeback_index for range_cyclic writeback
authorChristoph Hellwig <hch@lst.de>
Thu, 15 Feb 2024 06:36:40 +0000 (07:36 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 24 Feb 2024 01:48:36 +0000 (17:48 -0800)
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.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Acked-by: Dave 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: Andrew Morton <akpm@linux-foundation.org>
mm/page-writeback.c

index abbee369405a83f85a0e0c9cef845a3195779529..f02014007b57ccdbb397f254ba1d15b0c73d0519 100644 (file)
@@ -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);
@@ -2518,14 +2515,21 @@ continue_unlock:
        }
 
        /*
-        * 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;
 }