Merge tag 'block-6.6-2023-09-08' of git://git.kernel.dk/linux
[linux-2.6-microblaze.git] / mm / truncate.c
index 86de31e..8e3aa9e 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/highmem.h>
 #include <linux/pagevec.h>
 #include <linux/task_io_accounting_ops.h>
-#include <linux/buffer_head.h> /* grr. try_to_release_page */
 #include <linux/shmem_fs.h>
 #include <linux/rmap.h>
 #include "internal.h"
@@ -276,7 +275,7 @@ static long mapping_evict_folio(struct address_space *mapping,
        if (folio_ref_count(folio) >
                        folio_nr_pages(folio) + folio_has_private(folio) + 1)
                return 0;
-       if (folio_has_private(folio) && !filemap_release_folio(folio, 0))
+       if (!filemap_release_folio(folio, 0))
                return 0;
 
        return remove_mapping(mapping, folio);
@@ -378,7 +377,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
        if (!IS_ERR(folio)) {
                same_folio = lend < folio_pos(folio) + folio_size(folio);
                if (!truncate_inode_partial_folio(folio, lstart, lend)) {
-                       start = folio->index + folio_nr_pages(folio);
+                       start = folio_next_index(folio);
                        if (same_folio)
                                end = folio->index;
                }
@@ -486,18 +485,17 @@ void truncate_inode_pages_final(struct address_space *mapping)
 EXPORT_SYMBOL(truncate_inode_pages_final);
 
 /**
- * invalidate_mapping_pagevec - Invalidate all the unlocked pages of one inode
- * @mapping: the address_space which holds the pages to invalidate
+ * mapping_try_invalidate - Invalidate all the evictable folios of one inode
+ * @mapping: the address_space which holds the folios to invalidate
  * @start: the offset 'from' which to invalidate
  * @end: the offset 'to' which to invalidate (inclusive)
- * @nr_pagevec: invalidate failed page number for caller
+ * @nr_failed: How many folio invalidations failed
  *
- * This helper is similar to invalidate_mapping_pages(), except that it accounts
- * for pages that are likely on a pagevec and counts them in @nr_pagevec, which
- * will be used by the caller.
+ * This function is similar to invalidate_mapping_pages(), except that it
+ * returns the number of folios which could not be evicted in @nr_failed.
  */
-unsigned long invalidate_mapping_pagevec(struct address_space *mapping,
-               pgoff_t start, pgoff_t end, unsigned long *nr_pagevec)
+unsigned long mapping_try_invalidate(struct address_space *mapping,
+               pgoff_t start, pgoff_t end, unsigned long *nr_failed)
 {
        pgoff_t indices[PAGEVEC_SIZE];
        struct folio_batch fbatch;
@@ -527,9 +525,9 @@ unsigned long invalidate_mapping_pagevec(struct address_space *mapping,
                         */
                        if (!ret) {
                                deactivate_file_folio(folio);
-                               /* It is likely on the pagevec of a remote CPU */
-                               if (nr_pagevec)
-                                       (*nr_pagevec)++;
+                               /* Likely in the lru cache of a remote CPU */
+                               if (nr_failed)
+                                       (*nr_failed)++;
                        }
                        count += ret;
                }
@@ -552,12 +550,12 @@ unsigned long invalidate_mapping_pagevec(struct address_space *mapping,
  * If you want to remove all the pages of one inode, regardless of
  * their use and writeback state, use truncate_inode_pages().
  *
- * Return: the number of the cache entries that were invalidated
+ * Return: The number of indices that had their contents invalidated
  */
 unsigned long invalidate_mapping_pages(struct address_space *mapping,
                pgoff_t start, pgoff_t end)
 {
-       return invalidate_mapping_pagevec(mapping, start, end, NULL);
+       return mapping_try_invalidate(mapping, start, end, NULL);
 }
 EXPORT_SYMBOL(invalidate_mapping_pages);
 
@@ -566,7 +564,7 @@ EXPORT_SYMBOL(invalidate_mapping_pages);
  * refcount.  We do this because invalidate_inode_pages2() needs stronger
  * invalidation guarantees, and cannot afford to leave pages behind because
  * shrink_page_list() has a temp ref on them, or because they're transiently
- * sitting in the folio_add_lru() pagevecs.
+ * sitting in the folio_add_lru() caches.
  */
 static int invalidate_complete_folio2(struct address_space *mapping,
                                        struct folio *folio)
@@ -574,8 +572,7 @@ static int invalidate_complete_folio2(struct address_space *mapping,
        if (folio->mapping != mapping)
                return 0;
 
-       if (folio_has_private(folio) &&
-           !filemap_release_folio(folio, GFP_KERNEL))
+       if (!filemap_release_folio(folio, GFP_KERNEL))
                return 0;
 
        spin_lock(&mapping->host->i_lock);
@@ -658,11 +655,11 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
                        }
 
                        folio_lock(folio);
-                       VM_BUG_ON_FOLIO(!folio_contains(folio, indices[i]), folio);
-                       if (folio->mapping != mapping) {
+                       if (unlikely(folio->mapping != mapping)) {
                                folio_unlock(folio);
                                continue;
                        }
+                       VM_BUG_ON_FOLIO(!folio_contains(folio, indices[i]), folio);
                        folio_wait_writeback(folio);
 
                        if (folio_mapped(folio))