Merge tag 'fs_for_v5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack...
[linux-2.6-microblaze.git] / mm / filemap.c
index 9a1eef6..fa0ca67 100644 (file)
@@ -225,12 +225,12 @@ void __filemap_remove_folio(struct folio *folio, void *shadow)
 
 void filemap_free_folio(struct address_space *mapping, struct folio *folio)
 {
-       void (*freepage)(struct page *);
+       void (*free_folio)(struct folio *);
        int refs = 1;
 
-       freepage = mapping->a_ops->freepage;
-       if (freepage)
-               freepage(&folio->page);
+       free_folio = mapping->a_ops->free_folio;
+       if (free_folio)
+               free_folio(folio);
 
        if (folio_test_large(folio) && !folio_test_hugetlb(folio))
                refs = folio_nr_pages(folio);
@@ -807,7 +807,7 @@ void replace_page_cache_page(struct page *old, struct page *new)
        struct folio *fold = page_folio(old);
        struct folio *fnew = page_folio(new);
        struct address_space *mapping = old->mapping;
-       void (*freepage)(struct page *) = mapping->a_ops->freepage;
+       void (*free_folio)(struct folio *) = mapping->a_ops->free_folio;
        pgoff_t offset = old->index;
        XA_STATE(xas, &mapping->i_pages, offset);
 
@@ -835,9 +835,9 @@ void replace_page_cache_page(struct page *old, struct page *new)
        if (PageSwapBacked(new))
                __inc_lruvec_page_state(new, NR_SHMEM);
        xas_unlock_irq(&xas);
-       if (freepage)
-               freepage(old);
-       put_page(old);
+       if (free_folio)
+               free_folio(fold);
+       folio_put(fold);
 }
 EXPORT_SYMBOL_GPL(replace_page_cache_page);
 
@@ -2414,12 +2414,12 @@ static int filemap_read_folio(struct file *file, struct address_space *mapping,
 
        /*
         * A previous I/O error may have been due to temporary failures,
-        * eg. multipath errors.  PG_error will be set again if readpage
+        * eg. multipath errors.  PG_error will be set again if read_folio
         * fails.
         */
        folio_clear_error(folio);
        /* Start the actual read. The read will unlock the page. */
-       error = mapping->a_ops->readpage(file, &folio->page);
+       error = mapping->a_ops->read_folio(file, folio);
        if (error)
                return error;
 
@@ -2636,7 +2636,7 @@ err:
  * @already_read: Number of bytes already read by the caller.
  *
  * Copies data from the page cache.  If the data is not currently present,
- * uses the readahead and readpage address_space operations to fetch it.
+ * uses the readahead and read_folio address_space operations to fetch it.
  *
  * Return: Total number of bytes copied, including those already read by
  * the caller.  If an error happens before any bytes are copied, returns
@@ -3447,7 +3447,7 @@ int generic_file_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct address_space *mapping = file->f_mapping;
 
-       if (!mapping->a_ops->readpage)
+       if (!mapping->a_ops->read_folio)
                return -ENOEXEC;
        file_accessed(file);
        vma->vm_ops = &generic_file_vm_ops;
@@ -3483,10 +3483,13 @@ EXPORT_SYMBOL(generic_file_mmap);
 EXPORT_SYMBOL(generic_file_readonly_mmap);
 
 static struct folio *do_read_cache_folio(struct address_space *mapping,
-               pgoff_t index, filler_t filler, void *data, gfp_t gfp)
+               pgoff_t index, filler_t filler, struct file *file, gfp_t gfp)
 {
        struct folio *folio;
        int err;
+
+       if (!filler)
+               filler = mapping->a_ops->read_folio;
 repeat:
        folio = filemap_get_folio(mapping, index);
        if (!folio) {
@@ -3503,11 +3506,7 @@ repeat:
                }
 
 filler:
-               if (filler)
-                       err = filler(data, &folio->page);
-               else
-                       err = mapping->a_ops->readpage(data, &folio->page);
-
+               err = filler(file, folio);
                if (err < 0) {
                        folio_put(folio);
                        return ERR_PTR(err);
@@ -3557,44 +3556,44 @@ out:
 }
 
 /**
- * read_cache_folio - read into page cache, fill it if needed
- * @mapping:   the page's address_space
- * @index:     the page index
- * @filler:    function to perform the read
- * @data:      first arg to filler(data, page) function, often left as NULL
+ * read_cache_folio - Read into page cache, fill it if needed.
+ * @mapping: The address_space to read from.
+ * @index: The index to read.
+ * @filler: Function to perform the read, or NULL to use aops->read_folio().
+ * @file: Passed to filler function, may be NULL if not required.
  *
- * Read into the page cache. If a page already exists, and PageUptodate() is
- * not set, try to fill the page and wait for it to become unlocked.
+ * Read one page into the page cache.  If it succeeds, the folio returned
+ * will contain @index, but it may not be the first page of the folio.
  *
- * If the page does not get brought uptodate, return -EIO.
- *
- * The function expects mapping->invalidate_lock to be already held.
+ * If the filler function returns an error, it will be returned to the
+ * caller.
  *
- * Return: up to date page on success, ERR_PTR() on failure.
+ * Context: May sleep.  Expects mapping->invalidate_lock to be held.
+ * Return: An uptodate folio on success, ERR_PTR() on failure.
  */
 struct folio *read_cache_folio(struct address_space *mapping, pgoff_t index,
-               filler_t filler, void *data)
+               filler_t filler, struct file *file)
 {
-       return do_read_cache_folio(mapping, index, filler, data,
+       return do_read_cache_folio(mapping, index, filler, file,
                        mapping_gfp_mask(mapping));
 }
 EXPORT_SYMBOL(read_cache_folio);
 
 static struct page *do_read_cache_page(struct address_space *mapping,
-               pgoff_t index, filler_t *filler, void *data, gfp_t gfp)
+               pgoff_t index, filler_t *filler, struct file *file, gfp_t gfp)
 {
        struct folio *folio;
 
-       folio = do_read_cache_folio(mapping, index, filler, data, gfp);
+       folio = do_read_cache_folio(mapping, index, filler, file, gfp);
        if (IS_ERR(folio))
                return &folio->page;
        return folio_file_page(folio, index);
 }
 
 struct page *read_cache_page(struct address_space *mapping,
-                               pgoff_t index, filler_t *filler, void *data)
+                       pgoff_t index, filler_t *filler, struct file *file)
 {
-       return do_read_cache_page(mapping, index, filler, data,
+       return do_read_cache_page(mapping, index, filler, file,
                        mapping_gfp_mask(mapping));
 }
 EXPORT_SYMBOL(read_cache_page);
@@ -3622,27 +3621,6 @@ struct page *read_cache_page_gfp(struct address_space *mapping,
 }
 EXPORT_SYMBOL(read_cache_page_gfp);
 
-int pagecache_write_begin(struct file *file, struct address_space *mapping,
-                               loff_t pos, unsigned len, unsigned flags,
-                               struct page **pagep, void **fsdata)
-{
-       const struct address_space_operations *aops = mapping->a_ops;
-
-       return aops->write_begin(file, mapping, pos, len, flags,
-                                                       pagep, fsdata);
-}
-EXPORT_SYMBOL(pagecache_write_begin);
-
-int pagecache_write_end(struct file *file, struct address_space *mapping,
-                               loff_t pos, unsigned len, unsigned copied,
-                               struct page *page, void *fsdata)
-{
-       const struct address_space_operations *aops = mapping->a_ops;
-
-       return aops->write_end(file, mapping, pos, len, copied, page, fsdata);
-}
-EXPORT_SYMBOL(pagecache_write_end);
-
 /*
  * Warn about a page cache invalidation failure during a direct I/O write.
  */
@@ -3754,7 +3732,6 @@ ssize_t generic_perform_write(struct kiocb *iocb, struct iov_iter *i)
        const struct address_space_operations *a_ops = mapping->a_ops;
        long status = 0;
        ssize_t written = 0;
-       unsigned int flags = 0;
 
        do {
                struct page *page;
@@ -3784,7 +3761,7 @@ again:
                        break;
                }
 
-               status = a_ops->write_begin(file, mapping, pos, bytes, flags,
+               status = a_ops->write_begin(file, mapping, pos, bytes,
                                                &page, &fsdata);
                if (unlikely(status < 0))
                        break;
@@ -3978,8 +3955,8 @@ bool filemap_release_folio(struct folio *folio, gfp_t gfp)
        if (folio_test_writeback(folio))
                return false;
 
-       if (mapping && mapping->a_ops->releasepage)
-               return mapping->a_ops->releasepage(&folio->page, gfp);
-       return try_to_free_buffers(&folio->page);
+       if (mapping && mapping->a_ops->release_folio)
+               return mapping->a_ops->release_folio(folio, gfp);
+       return try_to_free_buffers(folio);
 }
 EXPORT_SYMBOL(filemap_release_folio);