Skip to content

Commit

Permalink
NFS: Create a common multiple_pgios() function
Browse files Browse the repository at this point in the history
Once again, these two functions look identical in the read and write
case.  Time to combine them together!

Signed-off-by: Anna Schumaker <[email protected]>
Signed-off-by: Trond Myklebust <[email protected]>
  • Loading branch information
amschuma-ntap authored and trondmypd committed May 29, 2014
1 parent 1ed26f3 commit c376627
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 60 deletions.
1 change: 1 addition & 0 deletions fs/nfs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ void nfs_pgio_data_release(struct nfs_pgio_data *);
int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *,
const struct rpc_call_ops *, int, int);
int nfs_do_multiple_pgios(struct list_head *, const struct rpc_call_ops *, int);

static inline void nfs_iocounter_init(struct nfs_io_counter *c)
{
Expand Down
21 changes: 21 additions & 0 deletions fs/nfs/pagelist.c
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,27 @@ int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_data *data,
}
EXPORT_SYMBOL_GPL(nfs_initiate_pgio);

int nfs_do_multiple_pgios(struct list_head *head,
const struct rpc_call_ops *call_ops,
int how)
{
struct nfs_pgio_data *data;
int ret = 0;

while (!list_empty(head)) {
int ret2;

data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);

ret2 = nfs_initiate_pgio(NFS_CLIENT(data->header->inode),
data, call_ops, how, 0);
if (ret == 0)
ret = ret2;
}
return ret;
}

/**
* nfs_pgio_error - Clean up from a pageio error
* @desc: IO descriptor
Expand Down
32 changes: 2 additions & 30 deletions fs/nfs/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,34 +161,6 @@ static void nfs_initiate_read(struct nfs_pgio_data *data, struct rpc_message *ms
NFS_PROTO(inode)->read_setup(data, msg);
}

static int nfs_do_read(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops)
{
struct inode *inode = data->header->inode;

return nfs_initiate_pgio(NFS_CLIENT(inode), data, call_ops, 0, 0);
}

static int
nfs_do_multiple_reads(struct list_head *head,
const struct rpc_call_ops *call_ops)
{
struct nfs_pgio_data *data;
int ret = 0;

while (!list_empty(head)) {
int ret2;

data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);

ret2 = nfs_do_read(data, call_ops);
if (ret == 0)
ret = ret2;
}
return ret;
}

static void
nfs_async_read_error(struct list_head *head)
{
Expand Down Expand Up @@ -222,8 +194,8 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
atomic_inc(&hdr->refcnt);
ret = nfs_generic_pgio(desc, hdr);
if (ret == 0)
ret = nfs_do_multiple_reads(&hdr->rpc_list,
desc->pg_rpc_callops);
ret = nfs_do_multiple_pgios(&hdr->rpc_list,
desc->pg_rpc_callops, 0);
if (atomic_dec_and_test(&hdr->refcnt))
hdr->completion_ops->completion(hdr);
return ret;
Expand Down
31 changes: 1 addition & 30 deletions fs/nfs/write.c
Original file line number Diff line number Diff line change
Expand Up @@ -945,35 +945,6 @@ static void nfs_initiate_write(struct nfs_pgio_data *data, struct rpc_message *m
&task_setup_data->rpc_client, msg, data);
}

static int nfs_do_write(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops,
int how)
{
struct inode *inode = data->header->inode;

return nfs_initiate_pgio(NFS_CLIENT(inode), data, call_ops, how, 0);
}

static int nfs_do_multiple_writes(struct list_head *head,
const struct rpc_call_ops *call_ops,
int how)
{
struct nfs_pgio_data *data;
int ret = 0;

while (!list_empty(head)) {
int ret2;

data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);

ret2 = nfs_do_write(data, call_ops, how);
if (ret == 0)
ret = ret2;
}
return ret;
}

/* If a nfs_flush_* function fails, it should remove reqs from @head and
* call this on each, which will prepare them to be retried on next
* writeback using standard nfs.
Expand Down Expand Up @@ -1018,7 +989,7 @@ static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
atomic_inc(&hdr->refcnt);
ret = nfs_generic_pgio(desc, hdr);
if (ret == 0)
ret = nfs_do_multiple_writes(&hdr->rpc_list,
ret = nfs_do_multiple_pgios(&hdr->rpc_list,
desc->pg_rpc_callops,
desc->pg_ioflags);
if (atomic_dec_and_test(&hdr->refcnt))
Expand Down

0 comments on commit c376627

Please sign in to comment.