Skip to content

Commit

Permalink
NFSv4.1: rearrange ->doio args
Browse files Browse the repository at this point in the history
This will make it possible to clear the lseg pointer in the same
function as it is put, instead of in the caller nfs_pageio_doio().

Signed-off-by: Fred Isaman <iisaman@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Fred Isaman authored and Trond Myklebust committed Mar 11, 2011
1 parent a69aef1 commit c76069b
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 39 deletions.
10 changes: 2 additions & 8 deletions fs/nfs/pagelist.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ nfs_wait_on_request(struct nfs_page *req)
*/
void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
struct inode *inode,
int (*doio)(struct inode *, struct list_head *, unsigned int, size_t, int, struct pnfs_layout_segment *),
int (*doio)(struct nfs_pageio_descriptor *),
size_t bsize,
int io_flags)
{
Expand Down Expand Up @@ -311,13 +311,7 @@ static int nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc,
static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc)
{
if (!list_empty(&desc->pg_list)) {
int error = desc->pg_doio(desc->pg_inode,
&desc->pg_list,
nfs_page_array_len(desc->pg_base,
desc->pg_count),
desc->pg_count,
desc->pg_ioflags,
desc->pg_lseg);
int error = desc->pg_doio(desc);
desc->pg_lseg = NULL;
if (error < 0)
desc->pg_error = error;
Expand Down
42 changes: 25 additions & 17 deletions fs/nfs/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@

#define NFSDBG_FACILITY NFSDBG_PAGECACHE

static int nfs_pagein_multi(struct inode *, struct list_head *, unsigned int, size_t, int, struct pnfs_layout_segment *);
static int nfs_pagein_one(struct inode *, struct list_head *, unsigned int, size_t, int, struct pnfs_layout_segment *);
static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc);
static int nfs_pagein_one(struct nfs_pageio_descriptor *desc);
static const struct rpc_call_ops nfs_read_partial_ops;
static const struct rpc_call_ops nfs_read_full_ops;

Expand Down Expand Up @@ -117,9 +117,9 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
struct page *page)
{
LIST_HEAD(one_request);
struct nfs_page *new;
unsigned int len;
struct nfs_pageio_descriptor pgio;

len = nfs_page_length(page);
if (len == 0)
Expand All @@ -132,11 +132,14 @@ int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
if (len < PAGE_CACHE_SIZE)
zero_user_segment(page, len, PAGE_CACHE_SIZE);

nfs_list_add_request(new, &one_request);
nfs_pageio_init(&pgio, inode, NULL, 0, 0);
nfs_list_add_request(new, &pgio.pg_list);
pgio.pg_count = len;

if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE)
nfs_pagein_multi(inode, &one_request, 1, len, 0, NULL);
nfs_pagein_multi(&pgio);
else
nfs_pagein_one(inode, &one_request, 1, len, 0, NULL);
nfs_pagein_one(&pgio);
return 0;
}

Expand Down Expand Up @@ -258,20 +261,21 @@ nfs_async_read_error(struct list_head *head)
* won't see the new data until our attribute cache is updated. This is more
* or less conventional NFS client behavior.
*/
static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags, struct pnfs_layout_segment *lseg)
static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc)
{
struct nfs_page *req = nfs_list_entry(head->next);
struct nfs_page *req = nfs_list_entry(desc->pg_list.next);
struct page *page = req->wb_page;
struct nfs_read_data *data;
size_t rsize = NFS_SERVER(inode)->rsize, nbytes;
size_t rsize = NFS_SERVER(desc->pg_inode)->rsize, nbytes;
unsigned int offset;
int requests = 0;
int ret = 0;
struct pnfs_layout_segment *lseg;
LIST_HEAD(list);

nfs_list_remove_request(req);

nbytes = count;
nbytes = desc->pg_count;
do {
size_t len = min(nbytes,rsize);

Expand All @@ -284,11 +288,11 @@ static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigne
} while(nbytes != 0);
atomic_set(&req->wb_complete, requests);

/* We know lseg==NULL */
lseg = pnfs_update_layout(inode, req->wb_context, IOMODE_READ);
BUG_ON(desc->pg_lseg != NULL);
lseg = pnfs_update_layout(desc->pg_inode, req->wb_context, IOMODE_READ);
ClearPageError(page);
offset = 0;
nbytes = count;
nbytes = desc->pg_count;
do {
int ret2;

Expand Down Expand Up @@ -321,14 +325,17 @@ static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigne
return -ENOMEM;
}

static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags, struct pnfs_layout_segment *lseg)
static int nfs_pagein_one(struct nfs_pageio_descriptor *desc)
{
struct nfs_page *req;
struct page **pages;
struct nfs_read_data *data;
struct list_head *head = &desc->pg_list;
struct pnfs_layout_segment *lseg = desc->pg_lseg;
int ret = -ENOMEM;

data = nfs_readdata_alloc(npages);
data = nfs_readdata_alloc(nfs_page_array_len(desc->pg_base,
desc->pg_count));
if (!data) {
nfs_async_read_error(head);
goto out;
Expand All @@ -344,9 +351,10 @@ static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned
}
req = nfs_list_entry(data->pages.next);
if ((!lseg) && list_is_singular(&data->pages))
lseg = pnfs_update_layout(inode, req->wb_context, IOMODE_READ);
lseg = pnfs_update_layout(desc->pg_inode, req->wb_context, IOMODE_READ);

ret = nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0, lseg);
ret = nfs_read_rpcsetup(req, data, &nfs_read_full_ops, desc->pg_count,
0, lseg);
out:
put_lseg(lseg);
return ret;
Expand Down
28 changes: 16 additions & 12 deletions fs/nfs/write.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,20 +898,21 @@ static void nfs_redirty_request(struct nfs_page *req)
* Generate multiple small requests to write out a single
* contiguous dirty area on one page.
*/
static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int how, struct pnfs_layout_segment *lseg)
static int nfs_flush_multi(struct nfs_pageio_descriptor *desc)
{
struct nfs_page *req = nfs_list_entry(head->next);
struct nfs_page *req = nfs_list_entry(desc->pg_list.next);
struct page *page = req->wb_page;
struct nfs_write_data *data;
size_t wsize = NFS_SERVER(inode)->wsize, nbytes;
size_t wsize = NFS_SERVER(desc->pg_inode)->wsize, nbytes;
unsigned int offset;
int requests = 0;
int ret = 0;
struct pnfs_layout_segment *lseg;
LIST_HEAD(list);

nfs_list_remove_request(req);

nbytes = count;
nbytes = desc->pg_count;
do {
size_t len = min(nbytes, wsize);

Expand All @@ -924,11 +925,11 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned
} while (nbytes != 0);
atomic_set(&req->wb_complete, requests);

BUG_ON(lseg);
lseg = pnfs_update_layout(inode, req->wb_context, IOMODE_RW);
BUG_ON(desc->pg_lseg);
lseg = pnfs_update_layout(desc->pg_inode, req->wb_context, IOMODE_RW);
ClearPageError(page);
offset = 0;
nbytes = count;
nbytes = desc->pg_count;
do {
int ret2;

Expand All @@ -940,7 +941,7 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned
if (nbytes < wsize)
wsize = nbytes;
ret2 = nfs_write_rpcsetup(req, data, &nfs_write_partial_ops,
wsize, offset, lseg, how);
wsize, offset, lseg, desc->pg_ioflags);
if (ret == 0)
ret = ret2;
offset += wsize;
Expand Down Expand Up @@ -968,14 +969,17 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned
* This is the case if nfs_updatepage detects a conflicting request
* that has been written but not committed.
*/
static int nfs_flush_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int how, struct pnfs_layout_segment *lseg)
static int nfs_flush_one(struct nfs_pageio_descriptor *desc)
{
struct nfs_page *req;
struct page **pages;
struct nfs_write_data *data;
struct list_head *head = &desc->pg_list;
struct pnfs_layout_segment *lseg = desc->pg_lseg;
int ret;

data = nfs_writedata_alloc(npages);
data = nfs_writedata_alloc(nfs_page_array_len(desc->pg_base,
desc->pg_count));
if (!data) {
while (!list_empty(head)) {
req = nfs_list_entry(head->next);
Expand All @@ -995,10 +999,10 @@ static int nfs_flush_one(struct inode *inode, struct list_head *head, unsigned i
}
req = nfs_list_entry(data->pages.next);
if ((!lseg) && list_is_singular(&data->pages))
lseg = pnfs_update_layout(inode, req->wb_context, IOMODE_RW);
lseg = pnfs_update_layout(desc->pg_inode, req->wb_context, IOMODE_RW);

/* Set up the argument struct */
ret = nfs_write_rpcsetup(req, data, &nfs_write_full_ops, count, 0, lseg, how);
ret = nfs_write_rpcsetup(req, data, &nfs_write_full_ops, desc->pg_count, 0, lseg, desc->pg_ioflags);
out:
put_lseg(lseg); /* Cleans any gotten in ->pg_test */
return ret;
Expand Down
4 changes: 2 additions & 2 deletions include/linux/nfs_page.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ struct nfs_pageio_descriptor {
unsigned int pg_base;

struct inode *pg_inode;
int (*pg_doio)(struct inode *, struct list_head *, unsigned int, size_t, int, struct pnfs_layout_segment *);
int (*pg_doio)(struct nfs_pageio_descriptor *);
int pg_ioflags;
int pg_error;
struct pnfs_layout_segment *pg_lseg;
Expand All @@ -81,7 +81,7 @@ extern int nfs_scan_list(struct nfs_inode *nfsi, struct list_head *dst,
pgoff_t idx_start, unsigned int npages, int tag);
extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
struct inode *inode,
int (*doio)(struct inode *, struct list_head *, unsigned int, size_t, int, struct pnfs_layout_segment *),
int (*doio)(struct nfs_pageio_descriptor *desc),
size_t bsize,
int how);
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
Expand Down

0 comments on commit c76069b

Please sign in to comment.