nfs: split nfs_read_folio
authorChristoph Hellwig <hch@lst.de>
Thu, 11 Jul 2024 07:17:03 +0000 (09:17 +0200)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 17 Jul 2024 17:15:56 +0000 (13:15 -0400)
nfs_read_folio is a bit hard to follow because it mixes highlevel logic
with the actual data read.  Split the latter into a helper and update
the comments to be more accurate.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/read.c

index 6fee86a2eb420b9e4911a556b3ab8ad26a0f4a73..77fa5458b4bd0ccab9fcaa4e005584ddddba4d4c 100644 (file)
@@ -325,18 +325,52 @@ out:
 }
 
 /*
- * Read a page over NFS.
- * We read the page synchronously in the following case:
- *  -  The error flag is set for this page. This happens only when a
- *     previous async read operation failed.
+ * Actually read a folio over the wire.
+ */
+static int nfs_do_read_folio(struct file *file, struct folio *folio)
+{
+       struct inode *inode = file_inode(file);
+       struct nfs_pageio_descriptor pgio;
+       struct nfs_open_context *ctx;
+       int ret;
+
+       ctx = get_nfs_open_context(nfs_file_open_context(file));
+
+       xchg(&ctx->error, 0);
+       nfs_pageio_init_read(&pgio, inode, false,
+                            &nfs_async_read_completion_ops);
+
+       ret = nfs_read_add_folio(&pgio, ctx, folio);
+       if (ret)
+               goto out_put;
+
+       nfs_pageio_complete_read(&pgio);
+       nfs_update_delegated_atime(inode);
+       if (pgio.pg_error < 0) {
+               ret = pgio.pg_error;
+               goto out_put;
+       }
+
+       ret = folio_wait_locked_killable(folio);
+       if (!folio_test_uptodate(folio) && !ret)
+               ret = xchg(&ctx->error, 0);
+
+out_put:
+       put_nfs_open_context(ctx);
+       return ret;
+}
+
+/*
+ * Synchronously read a folio.
+ *
+ * This is not heavily used as most users to try an asynchronous
+ * large read through ->readahead first.
  */
 int nfs_read_folio(struct file *file, struct folio *folio)
 {
        struct inode *inode = file_inode(file);
        loff_t pos = folio_pos(folio);
        size_t len = folio_size(folio);
-       struct nfs_pageio_descriptor pgio;
-       struct nfs_open_context *ctx;
        int ret;
 
        trace_nfs_aop_readpage(inode, pos, len);
@@ -361,29 +395,8 @@ int nfs_read_folio(struct file *file, struct folio *folio)
                goto out_unlock;
 
        ret = nfs_netfs_read_folio(file, folio);
-       if (!ret)
-               goto out;
-
-       ctx = get_nfs_open_context(nfs_file_open_context(file));
-
-       xchg(&ctx->error, 0);
-       nfs_pageio_init_read(&pgio, inode, false,
-                            &nfs_async_read_completion_ops);
-
-       ret = nfs_read_add_folio(&pgio, ctx, folio);
        if (ret)
-               goto out_put;
-
-       nfs_pageio_complete_read(&pgio);
-       nfs_update_delegated_atime(inode);
-       ret = pgio.pg_error < 0 ? pgio.pg_error : 0;
-       if (!ret) {
-               ret = folio_wait_locked_killable(folio);
-               if (!folio_test_uptodate(folio) && !ret)
-                       ret = xchg(&ctx->error, 0);
-       }
-out_put:
-       put_nfs_open_context(ctx);
+               ret = nfs_do_read_folio(file, folio);
 out:
        trace_nfs_aop_readpage_done(inode, pos, len, ret);
        return ret;