Linux 6.9-rc1
[linux-2.6-microblaze.git] / mm / fadvise.c
index c76ee66..6c39d42 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/mm.h>
 #include <linux/pagemap.h>
 #include <linux/backing-dev.h>
-#include <linux/pagevec.h>
 #include <linux/fadvise.h>
 #include <linux/writeback.h>
 #include <linux/syscalls.h>
@@ -72,7 +71,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
         */
        endbyte = (u64)offset + (u64)len;
        if (!len || endbyte < len)
-               endbyte = -1;
+               endbyte = LLONG_MAX;
        else
                endbyte--;              /* inclusive */
 
@@ -80,7 +79,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
        case POSIX_FADV_NORMAL:
                file->f_ra.ra_pages = bdi->ra_pages;
                spin_lock(&file->f_lock);
-               file->f_mode &= ~FMODE_RANDOM;
+               file->f_mode &= ~(FMODE_RANDOM | FMODE_NOREUSE);
                spin_unlock(&file->f_lock);
                break;
        case POSIX_FADV_RANDOM:
@@ -107,6 +106,9 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
                force_page_cache_readahead(mapping, file, start_index, nrpages);
                break;
        case POSIX_FADV_NOREUSE:
+               spin_lock(&file->f_lock);
+               file->f_mode |= FMODE_NOREUSE;
+               spin_unlock(&file->f_lock);
                break;
        case POSIX_FADV_DONTNEED:
                __filemap_fdatawrite_range(mapping, offset, endbyte,
@@ -140,7 +142,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
                }
 
                if (end_index >= start_index) {
-                       unsigned long nr_pagevec = 0;
+                       unsigned long nr_failed = 0;
 
                        /*
                         * It's common to FADV_DONTNEED right after
@@ -153,17 +155,15 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
                         */
                        lru_add_drain();
 
-                       invalidate_mapping_pagevec(mapping,
-                                               start_index, end_index,
-                                               &nr_pagevec);
+                       mapping_try_invalidate(mapping, start_index, end_index,
+                                       &nr_failed);
 
                        /*
-                        * If fewer pages were invalidated than expected then
-                        * it is possible that some of the pages were on
-                        * a per-cpu pagevec for a remote CPU. Drain all
-                        * pagevecs and try again.
+                        * The failures may be due to the folio being
+                        * in the LRU cache of a remote CPU. Drain all
+                        * caches and try again.
                         */
-                       if (nr_pagevec) {
+                       if (nr_failed) {
                                lru_add_drain_all();
                                invalidate_mapping_pages(mapping, start_index,
                                                end_index);