Commit 70e9db69 authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker

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: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 4fa7a717
...@@ -343,14 +343,12 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, ...@@ -343,14 +343,12 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
struct nfs_page *req; struct nfs_page *req;
unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase); 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? */ /* XXX do we need to do the eof zeroing found in async_filler? */
req = nfs_create_request(dreq->ctx, pagevec[i], req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
pgbase, req_len); pgbase, pos, req_len);
if (IS_ERR(req)) { if (IS_ERR(req)) {
result = PTR_ERR(req); result = PTR_ERR(req);
break; break;
} }
req->wb_index = pos >> PAGE_SHIFT;
req->wb_offset = pos & ~PAGE_MASK;
if (!nfs_pageio_add_request(&desc, req)) { if (!nfs_pageio_add_request(&desc, req)) {
result = desc.pg_error; result = desc.pg_error;
nfs_release_request(req); nfs_release_request(req);
...@@ -802,8 +800,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, ...@@ -802,8 +800,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
struct nfs_page *req; struct nfs_page *req;
unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase); unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase);
req = nfs_create_request(dreq->ctx, pagevec[i], req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
pgbase, req_len); pgbase, pos, req_len);
if (IS_ERR(req)) { if (IS_ERR(req)) {
result = PTR_ERR(req); result = PTR_ERR(req);
break; break;
...@@ -816,8 +814,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, ...@@ -816,8 +814,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
} }
nfs_lock_request(req); nfs_lock_request(req);
req->wb_index = pos >> PAGE_SHIFT;
req->wb_offset = pos & ~PAGE_MASK;
if (!nfs_pageio_add_request(&desc, req)) { if (!nfs_pageio_add_request(&desc, req)) {
result = desc.pg_error; result = desc.pg_error;
nfs_unlock_and_release_request(req); nfs_unlock_and_release_request(req);
......
...@@ -514,26 +514,29 @@ static void nfs_page_assign_page(struct nfs_page *req, struct page *page) ...@@ -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 * @ctx: open context to use
* @page: page to write * @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 * @count: number of bytes to read/write
* *
* The page must be locked by the caller. This makes sure we never * The page must be locked by the caller. This makes sure we never
* create two different requests for the same page. * create two different requests for the same page.
* User should ensure it is safe to sleep in this function. * User should ensure it is safe to sleep in this function.
*/ */
struct nfs_page * struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
nfs_create_request(struct nfs_open_context *ctx, struct page *page, struct page *page,
unsigned int offset, unsigned int count) unsigned int pgbase, loff_t offset,
unsigned int count)
{ {
struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx); struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx);
struct nfs_page *ret; struct nfs_page *ret;
if (IS_ERR(l_ctx)) if (IS_ERR(l_ctx))
return ERR_CAST(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)) { if (!IS_ERR(ret)) {
nfs_page_assign_page(ret, page); nfs_page_assign_page(ret, page);
nfs_page_group_init(ret, NULL); nfs_page_group_init(ret, NULL);
......
...@@ -121,9 +121,10 @@ struct nfs_pageio_descriptor { ...@@ -121,9 +121,10 @@ struct nfs_pageio_descriptor {
#define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags)) #define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags))
extern struct nfs_page *nfs_create_request(struct nfs_open_context *ctx, extern struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
struct page *page, struct page *page,
unsigned int offset, unsigned int pgbase,
loff_t offset,
unsigned int count); unsigned int count);
extern struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx, extern struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx,
struct folio *folio, struct folio *folio,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment