fs: Remove ->readpages address space operation
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 24 Mar 2022 01:29:04 +0000 (21:29 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 1 Apr 2022 17:45:33 +0000 (13:45 -0400)
All filesystems have now been converted to use ->readahead, so
remove the ->readpages operation and fix all the comments that
used to refer to it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Al Viro <viro@zeniv.linux.org.uk>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
15 files changed:
Documentation/filesystems/fsverity.rst
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
fs/btrfs/reflink.c
fs/cifs/cifssmb.c
fs/cifs/inode.c
fs/crypto/crypto.c
fs/ext4/readpage.c
fs/f2fs/data.c
fs/fuse/fuse_i.h
fs/verity/verify.c
include/linux/fs.h
include/linux/fsverity.h
mm/filemap.c
mm/readahead.c

index 1d831e3..8cc536d 100644 (file)
@@ -549,7 +549,7 @@ Pagecache
 ~~~~~~~~~
 
 For filesystems using Linux's pagecache, the ``->readpage()`` and
-``->readpages()`` methods must be modified to verify pages before they
+``->readahead()`` methods must be modified to verify pages before they
 are marked Uptodate.  Merely hooking ``->read_iter()`` would be
 insufficient, since ``->read_iter()`` is not used for memory maps.
 
@@ -611,7 +611,7 @@ workqueue, and then the workqueue work does the decryption or
 verification.  Finally, pages where no decryption or verity error
 occurred are marked Uptodate, and the pages are unlocked.
 
-Files on ext4 and f2fs may contain holes.  Normally, ``->readpages()``
+Files on ext4 and f2fs may contain holes.  Normally, ``->readahead()``
 simply zeroes holes and sets the corresponding pages Uptodate; no bios
 are issued.  To prevent this case from bypassing fs-verity, these
 filesystems use fsverity_verify_page() to verify hole pages.
@@ -778,7 +778,7 @@ weren't already directly answered in other parts of this document.
     - To prevent bypassing verification, pages must not be marked
       Uptodate until they've been verified.  Currently, each
       filesystem is responsible for marking pages Uptodate via
-      ``->readpages()``.  Therefore, currently it's not possible for
+      ``->readahead()``.  Therefore, currently it's not possible for
       the VFS to do the verification on its own.  Changing this would
       require significant changes to the VFS and all filesystems.
 
index 2998cec..c26d854 100644 (file)
@@ -241,8 +241,6 @@ prototypes::
        int (*writepages)(struct address_space *, struct writeback_control *);
        bool (*dirty_folio)(struct address_space *, struct folio *folio);
        void (*readahead)(struct readahead_control *);
-       int (*readpages)(struct file *filp, struct address_space *mapping,
-                       struct list_head *pages, unsigned nr_pages);
        int (*write_begin)(struct file *, struct address_space *mapping,
                                loff_t pos, unsigned len, unsigned flags,
                                struct page **pagep, void **fsdata);
@@ -274,7 +272,6 @@ readpage:           yes, unlocks                            shared
 writepages:
 dirty_folio            maybe
 readahead:             yes, unlocks                            shared
-readpages:             no                                      shared
 write_begin:           locks the page           exclusive
 write_end:             yes, unlocks             exclusive
 bmap:
@@ -300,9 +297,6 @@ completion.
 
 ->readahead() unlocks the pages that I/O is attempted on like ->readpage().
 
-->readpages() populates the pagecache with the passed pages and starts
-I/O against them.  They come unlocked upon I/O completion.
-
 ->writepage() is used for two purposes: for "memory cleansing" and for
 "sync".  These are quite different operations and the behaviour may differ
 depending upon the mode.
index 4f14edf..794bd1a 100644 (file)
@@ -726,8 +726,6 @@ cache in your filesystem.  The following members are defined:
                int (*writepages)(struct address_space *, struct writeback_control *);
                bool (*dirty_folio)(struct address_space *, struct folio *);
                void (*readahead)(struct readahead_control *);
-               int (*readpages)(struct file *filp, struct address_space *mapping,
-                                struct list_head *pages, unsigned nr_pages);
                int (*write_begin)(struct file *, struct address_space *mapping,
                                   loff_t pos, unsigned len, unsigned flags,
                                struct page **pagep, void **fsdata);
@@ -817,15 +815,6 @@ cache in your filesystem.  The following members are defined:
        completes successfully.  Setting PageError on any page will be
        ignored; simply unlock the page if an I/O error occurs.
 
-``readpages``
-       called by the VM to read pages associated with the address_space
-       object.  This is essentially just a vector version of readpage.
-       Instead of just one page, several pages are requested.
-       readpages is only used for read-ahead, so read errors are
-       ignored.  If anything goes wrong, feel free to give up.
-       This interface is deprecated and will be removed by the end of
-       2020; implement readahead instead.
-
 ``write_begin``
        Called by the generic buffered write code to ask the filesystem
        to prepare to write len bytes at the given offset in the file.
index 04a88bf..998e3f1 100644 (file)
@@ -645,7 +645,7 @@ static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 len,
        int ret;
 
        /*
-        * Lock destination range to serialize with concurrent readpages() and
+        * Lock destination range to serialize with concurrent readahead() and
         * source range to serialize with relocation.
         */
        btrfs_double_extent_lock(src, loff, dst, dst_loff, len);
@@ -739,7 +739,7 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
        }
 
        /*
-        * Lock destination range to serialize with concurrent readpages() and
+        * Lock destination range to serialize with concurrent readahead() and
         * source range to serialize with relocation.
         */
        btrfs_double_extent_lock(src, off, inode, destoff, len);
index 071e2f2..bc3ded4 100644 (file)
@@ -597,7 +597,7 @@ CIFSSMBNegotiate(const unsigned int xid,
        set_credits(server, server->maxReq);
        /* probably no need to store and check maxvcs */
        server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize);
-       /* set up max_read for readpages check */
+       /* set up max_read for readahead check */
        server->max_read = server->maxBuf;
        server->max_rw = le32_to_cpu(pSMBr->MaxRawSize);
        cifs_dbg(NOISY, "Max buf = %d\n", ses->server->maxBuf);
index 60d853c..2f9e7d2 100644 (file)
@@ -49,7 +49,7 @@ static void cifs_set_ops(struct inode *inode)
                        inode->i_fop = &cifs_file_ops;
                }
 
-               /* check if server can support readpages */
+               /* check if server can support readahead */
                if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
                                PAGE_SIZE + MAX_CIFS_HDR_SIZE)
                        inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
index 4fcca79..526a4c1 100644 (file)
@@ -248,7 +248,7 @@ EXPORT_SYMBOL(fscrypt_encrypt_block_inplace);
  * which must still be locked and not uptodate.  Normally, blocksize ==
  * PAGE_SIZE and the whole page is decrypted at once.
  *
- * This is for use by the filesystem's ->readpages() method.
+ * This is for use by the filesystem's ->readahead() method.
  *
  * Return: 0 on success; -errno on failure
  */
index 1aa26d6..af491e1 100644 (file)
@@ -109,7 +109,7 @@ static void verity_work(struct work_struct *work)
        struct bio *bio = ctx->bio;
 
        /*
-        * fsverity_verify_bio() may call readpages() again, and although verity
+        * fsverity_verify_bio() may call readahead() again, and although verity
         * will be disabled for that, decryption may still be needed, causing
         * another bio_post_read_ctx to be allocated.  So to guarantee that
         * mempool_alloc() never deadlocks we must free the current ctx first.
index f8fcbe9..c92920c 100644 (file)
@@ -164,7 +164,7 @@ static void f2fs_verify_bio(struct work_struct *work)
        bool may_have_compressed_pages = (ctx->enabled_steps & STEP_DECOMPRESS);
 
        /*
-        * fsverity_verify_bio() may call readpages() again, and while verity
+        * fsverity_verify_bio() may call readahead() again, and while verity
         * will be disabled for this, decryption and/or decompression may still
         * be needed, resulting in another bio_post_read_ctx being allocated.
         * So to prevent deadlocks we need to release the current ctx to the
@@ -2392,7 +2392,7 @@ static void f2fs_readahead(struct readahead_control *rac)
        if (!f2fs_is_compress_backend_ready(inode))
                return;
 
-       /* If the file has inline data, skip readpages */
+       /* If the file has inline data, skip readahead */
        if (f2fs_has_inline_data(inode))
                return;
 
index eac4984..488b460 100644 (file)
@@ -627,7 +627,7 @@ struct fuse_conn {
        /** Connection successful.  Only set in INIT */
        unsigned conn_init:1;
 
-       /** Do readpages asynchronously?  Only set in INIT */
+       /** Do readahead asynchronously?  Only set in INIT */
        unsigned async_read:1;
 
        /** Return an unique read error after abort.  Only set in INIT */
index 0adb970..14e2fb4 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Data verification functions, i.e. hooks for ->readpages()
+ * Data verification functions, i.e. hooks for ->readahead()
  *
  * Copyright 2019 Google LLC
  */
@@ -214,7 +214,7 @@ EXPORT_SYMBOL_GPL(fsverity_verify_page);
  * that fail verification are set to the Error state.  Verification is skipped
  * for pages already in the Error state, e.g. due to fscrypt decryption failure.
  *
- * This is a helper function for use by the ->readpages() method of filesystems
+ * This is a helper function for use by the ->readahead() method of filesystems
  * that issue bios to read data directly into the page cache.  Filesystems that
  * populate the page cache without issuing bios (e.g. non block-based
  * filesystems) must instead call fsverity_verify_page() directly on each page.
index 1831608..7c81887 100644 (file)
@@ -370,12 +370,6 @@ struct address_space_operations {
        /* Mark a folio dirty.  Return true if this dirtied it */
        bool (*dirty_folio)(struct address_space *, struct folio *);
 
-       /*
-        * Reads in the requested pages. Unlike ->readpage(), this is
-        * PURELY used for read-ahead!.
-        */
-       int (*readpages)(struct file *filp, struct address_space *mapping,
-                       struct list_head *pages, unsigned nr_pages);
        void (*readahead)(struct readahead_control *);
 
        int (*write_begin)(struct file *, struct address_space *mapping,
index b568b3c..a7afc80 100644 (file)
@@ -221,7 +221,7 @@ static inline void fsverity_enqueue_verify_work(struct work_struct *work)
  *
  * This checks whether ->i_verity_info has been set.
  *
- * Filesystems call this from ->readpages() to check whether the pages need to
+ * Filesystems call this from ->readahead() to check whether the pages need to
  * be verified or not.  Don't use IS_VERITY() for this purpose; it's subject to
  * a race condition where the file is being read concurrently with
  * FS_IOC_ENABLE_VERITY completing.  (S_VERITY is set before ->i_verity_info.)
index 647d72b..d904cd7 100644 (file)
@@ -2538,7 +2538,7 @@ static int filemap_create_folio(struct file *file,
         * the page cache as the locked folio would then be enough to
         * synchronize with hole punching. But there are code paths
         * such as filemap_update_page() filling in partially uptodate
-        * pages or ->readpages() that need to hold invalidate_lock
+        * pages or ->readahead() that need to hold invalidate_lock
         * while mapping blocks for IO so let's hold the lock here as
         * well to keep locking rules simple.
         */
index 9097af6..297bd07 100644 (file)
@@ -170,13 +170,6 @@ static void read_pages(struct readahead_control *rac, struct list_head *pages,
                        unlock_page(page);
                        put_page(page);
                }
-       } else if (aops->readpages) {
-               aops->readpages(rac->file, rac->mapping, pages,
-                               readahead_count(rac));
-               /* Clean up the remaining pages */
-               put_pages_list(pages);
-               rac->_index += rac->_nr_pages;
-               rac->_nr_pages = 0;
        } else {
                while ((page = readahead_page(rac))) {
                        aops->readpage(rac->file, page);
@@ -253,10 +246,7 @@ void page_cache_ra_unbounded(struct readahead_control *ractl,
                folio = filemap_alloc_folio(gfp_mask, 0);
                if (!folio)
                        break;
-               if (mapping->a_ops->readpages) {
-                       folio->index = index + i;
-                       list_add(&folio->lru, &page_pool);
-               } else if (filemap_add_folio(mapping, folio, index + i,
+               if (filemap_add_folio(mapping, folio, index + i,
                                        gfp_mask) < 0) {
                        folio_put(folio);
                        read_pages(ractl, &page_pool, true);
@@ -318,8 +308,7 @@ void force_page_cache_ra(struct readahead_control *ractl,
        struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
        unsigned long max_pages, index;
 
-       if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages &&
-                       !mapping->a_ops->readahead))
+       if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readahead))
                return;
 
        /*