aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorAnna Schumaker <Anna.Schumaker@netapp.com>2014-05-06 09:12:38 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-05-29 11:11:40 -0400
commitc3766276f26090f4459329839cdcc8506dfbced5 (patch)
tree3ab2e9fbafd8241995a0bf16302373db947ee9b3 /fs/nfs
parent1ed26f33008e954a8e91d26f97d4380dea8145db (diff)
NFS: Create a common multiple_pgios() function
Once again, these two functions look identical in the read and write case. Time to combine them together! Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/internal.h1
-rw-r--r--fs/nfs/pagelist.c21
-rw-r--r--fs/nfs/read.c32
-rw-r--r--fs/nfs/write.c31
4 files changed, 25 insertions, 60 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index be4f2a7e9178..886273a8916b 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -243,6 +243,7 @@ void nfs_pgio_data_release(struct nfs_pgio_data *);
243int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *); 243int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
244int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *, 244int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *,
245 const struct rpc_call_ops *, int, int); 245 const struct rpc_call_ops *, int, int);
246int nfs_do_multiple_pgios(struct list_head *, const struct rpc_call_ops *, int);
246 247
247static inline void nfs_iocounter_init(struct nfs_io_counter *c) 248static inline void nfs_iocounter_init(struct nfs_io_counter *c)
248{ 249{
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index ab5b1850ca4f..2471e0278811 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -493,6 +493,27 @@ out:
493} 493}
494EXPORT_SYMBOL_GPL(nfs_initiate_pgio); 494EXPORT_SYMBOL_GPL(nfs_initiate_pgio);
495 495
496int nfs_do_multiple_pgios(struct list_head *head,
497 const struct rpc_call_ops *call_ops,
498 int how)
499{
500 struct nfs_pgio_data *data;
501 int ret = 0;
502
503 while (!list_empty(head)) {
504 int ret2;
505
506 data = list_first_entry(head, struct nfs_pgio_data, list);
507 list_del_init(&data->list);
508
509 ret2 = nfs_initiate_pgio(NFS_CLIENT(data->header->inode),
510 data, call_ops, how, 0);
511 if (ret == 0)
512 ret = ret2;
513 }
514 return ret;
515}
516
496/** 517/**
497 * nfs_pgio_error - Clean up from a pageio error 518 * nfs_pgio_error - Clean up from a pageio error
498 * @desc: IO descriptor 519 * @desc: IO descriptor
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 0359b0d76ef6..b834d458a2b6 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -161,34 +161,6 @@ static void nfs_initiate_read(struct nfs_pgio_data *data, struct rpc_message *ms
161 NFS_PROTO(inode)->read_setup(data, msg); 161 NFS_PROTO(inode)->read_setup(data, msg);
162} 162}
163 163
164static int nfs_do_read(struct nfs_pgio_data *data,
165 const struct rpc_call_ops *call_ops)
166{
167 struct inode *inode = data->header->inode;
168
169 return nfs_initiate_pgio(NFS_CLIENT(inode), data, call_ops, 0, 0);
170}
171
172static int
173nfs_do_multiple_reads(struct list_head *head,
174 const struct rpc_call_ops *call_ops)
175{
176 struct nfs_pgio_data *data;
177 int ret = 0;
178
179 while (!list_empty(head)) {
180 int ret2;
181
182 data = list_first_entry(head, struct nfs_pgio_data, list);
183 list_del_init(&data->list);
184
185 ret2 = nfs_do_read(data, call_ops);
186 if (ret == 0)
187 ret = ret2;
188 }
189 return ret;
190}
191
192static void 164static void
193nfs_async_read_error(struct list_head *head) 165nfs_async_read_error(struct list_head *head)
194{ 166{
@@ -222,8 +194,8 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
222 atomic_inc(&hdr->refcnt); 194 atomic_inc(&hdr->refcnt);
223 ret = nfs_generic_pgio(desc, hdr); 195 ret = nfs_generic_pgio(desc, hdr);
224 if (ret == 0) 196 if (ret == 0)
225 ret = nfs_do_multiple_reads(&hdr->rpc_list, 197 ret = nfs_do_multiple_pgios(&hdr->rpc_list,
226 desc->pg_rpc_callops); 198 desc->pg_rpc_callops, 0);
227 if (atomic_dec_and_test(&hdr->refcnt)) 199 if (atomic_dec_and_test(&hdr->refcnt))
228 hdr->completion_ops->completion(hdr); 200 hdr->completion_ops->completion(hdr);
229 return ret; 201 return ret;
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index e46a1fc6c1fe..d3fa181053ad 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -945,35 +945,6 @@ static void nfs_initiate_write(struct nfs_pgio_data *data, struct rpc_message *m
945 &task_setup_data->rpc_client, msg, data); 945 &task_setup_data->rpc_client, msg, data);
946} 946}
947 947
948static int nfs_do_write(struct nfs_pgio_data *data,
949 const struct rpc_call_ops *call_ops,
950 int how)
951{
952 struct inode *inode = data->header->inode;
953
954 return nfs_initiate_pgio(NFS_CLIENT(inode), data, call_ops, how, 0);
955}
956
957static int nfs_do_multiple_writes(struct list_head *head,
958 const struct rpc_call_ops *call_ops,
959 int how)
960{
961 struct nfs_pgio_data *data;
962 int ret = 0;
963
964 while (!list_empty(head)) {
965 int ret2;
966
967 data = list_first_entry(head, struct nfs_pgio_data, list);
968 list_del_init(&data->list);
969
970 ret2 = nfs_do_write(data, call_ops, how);
971 if (ret == 0)
972 ret = ret2;
973 }
974 return ret;
975}
976
977/* If a nfs_flush_* function fails, it should remove reqs from @head and 948/* If a nfs_flush_* function fails, it should remove reqs from @head and
978 * call this on each, which will prepare them to be retried on next 949 * call this on each, which will prepare them to be retried on next
979 * writeback using standard nfs. 950 * writeback using standard nfs.
@@ -1018,7 +989,7 @@ static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
1018 atomic_inc(&hdr->refcnt); 989 atomic_inc(&hdr->refcnt);
1019 ret = nfs_generic_pgio(desc, hdr); 990 ret = nfs_generic_pgio(desc, hdr);
1020 if (ret == 0) 991 if (ret == 0)
1021 ret = nfs_do_multiple_writes(&hdr->rpc_list, 992 ret = nfs_do_multiple_pgios(&hdr->rpc_list,
1022 desc->pg_rpc_callops, 993 desc->pg_rpc_callops,
1023 desc->pg_ioflags); 994 desc->pg_ioflags);
1024 if (atomic_dec_and_test(&hdr->refcnt)) 995 if (atomic_dec_and_test(&hdr->refcnt))