Skip to content

Commit 70e9db6

Browse files
Trond Myklebustamschuma-ntap
authored andcommitted
NFS: Clean up O_DIRECT request allocation
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>
1 parent 4fa7a71 commit 70e9db6

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

fs/nfs/direct.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -343,14 +343,12 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
343343
struct nfs_page *req;
344344
unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase);
345345
/* XXX do we need to do the eof zeroing found in async_filler? */
346-
req = nfs_create_request(dreq->ctx, pagevec[i],
347-
pgbase, req_len);
346+
req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
347+
pgbase, pos, req_len);
348348
if (IS_ERR(req)) {
349349
result = PTR_ERR(req);
350350
break;
351351
}
352-
req->wb_index = pos >> PAGE_SHIFT;
353-
req->wb_offset = pos & ~PAGE_MASK;
354352
if (!nfs_pageio_add_request(&desc, req)) {
355353
result = desc.pg_error;
356354
nfs_release_request(req);
@@ -802,8 +800,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
802800
struct nfs_page *req;
803801
unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase);
804802

805-
req = nfs_create_request(dreq->ctx, pagevec[i],
806-
pgbase, req_len);
803+
req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
804+
pgbase, pos, req_len);
807805
if (IS_ERR(req)) {
808806
result = PTR_ERR(req);
809807
break;
@@ -816,8 +814,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
816814
}
817815

818816
nfs_lock_request(req);
819-
req->wb_index = pos >> PAGE_SHIFT;
820-
req->wb_offset = pos & ~PAGE_MASK;
821817
if (!nfs_pageio_add_request(&desc, req)) {
822818
result = desc.pg_error;
823819
nfs_unlock_and_release_request(req);

fs/nfs/pagelist.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -514,26 +514,29 @@ static void nfs_page_assign_page(struct nfs_page *req, struct page *page)
514514
}
515515

516516
/**
517-
* nfs_create_request - Create an NFS read/write request.
517+
* nfs_page_create_from_page - Create an NFS read/write request.
518518
* @ctx: open context to use
519519
* @page: page to write
520-
* @offset: starting offset within the page for the write
520+
* @pgbase: starting offset within the page for the write
521+
* @offset: file offset for the write
521522
* @count: number of bytes to read/write
522523
*
523524
* The page must be locked by the caller. This makes sure we never
524525
* create two different requests for the same page.
525526
* User should ensure it is safe to sleep in this function.
526527
*/
527-
struct nfs_page *
528-
nfs_create_request(struct nfs_open_context *ctx, struct page *page,
529-
unsigned int offset, unsigned int count)
528+
struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
529+
struct page *page,
530+
unsigned int pgbase, loff_t offset,
531+
unsigned int count)
530532
{
531533
struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx);
532534
struct nfs_page *ret;
533535

534536
if (IS_ERR(l_ctx))
535537
return ERR_CAST(l_ctx);
536-
ret = nfs_page_create(l_ctx, offset, page_index(page), offset, count);
538+
ret = nfs_page_create(l_ctx, pgbase, offset >> PAGE_SHIFT,
539+
offset_in_page(offset), count);
537540
if (!IS_ERR(ret)) {
538541
nfs_page_assign_page(ret, page);
539542
nfs_page_group_init(ret, NULL);

include/linux/nfs_page.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ struct nfs_pageio_descriptor {
121121

122122
#define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags))
123123

124-
extern struct nfs_page *nfs_create_request(struct nfs_open_context *ctx,
125-
struct page *page,
126-
unsigned int offset,
127-
unsigned int count);
124+
extern struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
125+
struct page *page,
126+
unsigned int pgbase,
127+
loff_t offset,
128+
unsigned int count);
128129
extern struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx,
129130
struct folio *folio,
130131
unsigned int offset,

0 commit comments

Comments
 (0)