NFS: Clean up O_DIRECT request allocation
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 19 Jan 2023 21:33:47 +0000 (16:33 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 14 Feb 2023 19:22:33 +0000 (14:22 -0500)
Rather than adjusting the index+offset after the call to
nfs_create_request(), add a function nfs_page_create_from_page() that
takes an offset.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/direct.c
fs/nfs/pagelist.c
include/linux/nfs_page.h

index 1707f46b1335ccf5d0669332f2d446dff09016ac..9a18c5a69ace63f6b970b698a16a804cf4dc2745 100644 (file)
@@ -343,14 +343,12 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
                        struct nfs_page *req;
                        unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase);
                        /* XXX do we need to do the eof zeroing found in async_filler? */
-                       req = nfs_create_request(dreq->ctx, pagevec[i],
-                                                pgbase, req_len);
+                       req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
+                                                       pgbase, pos, req_len);
                        if (IS_ERR(req)) {
                                result = PTR_ERR(req);
                                break;
                        }
-                       req->wb_index = pos >> PAGE_SHIFT;
-                       req->wb_offset = pos & ~PAGE_MASK;
                        if (!nfs_pageio_add_request(&desc, req)) {
                                result = desc.pg_error;
                                nfs_release_request(req);
@@ -802,8 +800,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
                        struct nfs_page *req;
                        unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase);
 
-                       req = nfs_create_request(dreq->ctx, pagevec[i],
-                                                pgbase, req_len);
+                       req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
+                                                       pgbase, pos, req_len);
                        if (IS_ERR(req)) {
                                result = PTR_ERR(req);
                                break;
@@ -816,8 +814,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
                        }
 
                        nfs_lock_request(req);
-                       req->wb_index = pos >> PAGE_SHIFT;
-                       req->wb_offset = pos & ~PAGE_MASK;
                        if (!nfs_pageio_add_request(&desc, req)) {
                                result = desc.pg_error;
                                nfs_unlock_and_release_request(req);
index 7a622263a9fc71e5e06a31c15436fba649438d77..0b4c07c93a5234193c612b6aca44145b0ee5e6fe 100644 (file)
@@ -514,26 +514,29 @@ static void nfs_page_assign_page(struct nfs_page *req, struct page *page)
 }
 
 /**
- * nfs_create_request - Create an NFS read/write request.
+ * nfs_page_create_from_page - Create an NFS read/write request.
  * @ctx: open context to use
  * @page: page to write
- * @offset: starting offset within the page for the write
+ * @pgbase: starting offset within the page for the write
+ * @offset: file offset for the write
  * @count: number of bytes to read/write
  *
  * The page must be locked by the caller. This makes sure we never
  * create two different requests for the same page.
  * User should ensure it is safe to sleep in this function.
  */
-struct nfs_page *
-nfs_create_request(struct nfs_open_context *ctx, struct page *page,
-                  unsigned int offset, unsigned int count)
+struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
+                                          struct page *page,
+                                          unsigned int pgbase, loff_t offset,
+                                          unsigned int count)
 {
        struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx);
        struct nfs_page *ret;
 
        if (IS_ERR(l_ctx))
                return ERR_CAST(l_ctx);
-       ret = nfs_page_create(l_ctx, offset, page_index(page), offset, count);
+       ret = nfs_page_create(l_ctx, pgbase, offset >> PAGE_SHIFT,
+                             offset_in_page(offset), count);
        if (!IS_ERR(ret)) {
                nfs_page_assign_page(ret, page);
                nfs_page_group_init(ret, NULL);
index 3c71493d5cc3d69ef6443463a07fcf0b77265500..a2f1ca6576237038be7cf2479c8c05f3105ddb3b 100644 (file)
@@ -121,10 +121,11 @@ struct nfs_pageio_descriptor {
 
 #define NFS_WBACK_BUSY(req)    (test_bit(PG_BUSY,&(req)->wb_flags))
 
-extern struct nfs_page *nfs_create_request(struct nfs_open_context *ctx,
-                                           struct page *page,
-                                           unsigned int offset,
-                                           unsigned int count);
+extern struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
+                                                 struct page *page,
+                                                 unsigned int pgbase,
+                                                 loff_t offset,
+                                                 unsigned int count);
 extern struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx,
                                                   struct folio *folio,
                                                   unsigned int offset,