aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorAnna Schumaker <Anna.Schumaker@netapp.com>2014-05-06 09:12:39 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-05-29 11:11:41 -0400
commitcf485fcd68bc2dd91258e844ba4649404fff3235 (patch)
treebd96e9d04ca73644770ae95d06c05d1a49fb3c08 /fs/nfs
parentc3766276f26090f4459329839cdcc8506dfbced5 (diff)
NFS: Create a common generic_pg_pgios()
What we have here is two functions that look identical. Let's share some more code! 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.h2
-rw-r--r--fs/nfs/pagelist.c26
-rw-r--r--fs/nfs/read.c25
-rw-r--r--fs/nfs/write.c26
4 files changed, 28 insertions, 51 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 886273a8916b..29e99aac3673 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -243,7 +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); 246int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *);
247 247
248static inline void nfs_iocounter_init(struct nfs_io_counter *c) 248static inline void nfs_iocounter_init(struct nfs_io_counter *c)
249{ 249{
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 2471e0278811..83d4ab46a2e9 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -493,7 +493,7 @@ 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, 496static int nfs_do_multiple_pgios(struct list_head *head,
497 const struct rpc_call_ops *call_ops, 497 const struct rpc_call_ops *call_ops,
498 int how) 498 int how)
499{ 499{
@@ -688,6 +688,30 @@ static int nfs_pgio_one(struct nfs_pageio_descriptor *desc,
688 return 0; 688 return 0;
689} 689}
690 690
691int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
692{
693 struct nfs_rw_header *rw_hdr;
694 struct nfs_pgio_header *hdr;
695 int ret;
696
697 rw_hdr = nfs_rw_header_alloc(desc->pg_rw_ops);
698 if (!rw_hdr) {
699 desc->pg_completion_ops->error_cleanup(&desc->pg_list);
700 return -ENOMEM;
701 }
702 hdr = &rw_hdr->header;
703 nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
704 atomic_inc(&hdr->refcnt);
705 ret = nfs_generic_pgio(desc, hdr);
706 if (ret == 0)
707 ret = nfs_do_multiple_pgios(&hdr->rpc_list,
708 desc->pg_rpc_callops,
709 desc->pg_ioflags);
710 if (atomic_dec_and_test(&hdr->refcnt))
711 hdr->completion_ops->completion(hdr);
712 return ret;
713}
714
691int nfs_generic_pgio(struct nfs_pageio_descriptor *desc, 715int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
692 struct nfs_pgio_header *hdr) 716 struct nfs_pgio_header *hdr)
693{ 717{
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index b834d458a2b6..ebd1666ee13c 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -178,32 +178,9 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
178 .completion = nfs_read_completion, 178 .completion = nfs_read_completion,
179}; 179};
180 180
181static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
182{
183 struct nfs_rw_header *rhdr;
184 struct nfs_pgio_header *hdr;
185 int ret;
186
187 rhdr = nfs_rw_header_alloc(desc->pg_rw_ops);
188 if (!rhdr) {
189 desc->pg_completion_ops->error_cleanup(&desc->pg_list);
190 return -ENOMEM;
191 }
192 hdr = &rhdr->header;
193 nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
194 atomic_inc(&hdr->refcnt);
195 ret = nfs_generic_pgio(desc, hdr);
196 if (ret == 0)
197 ret = nfs_do_multiple_pgios(&hdr->rpc_list,
198 desc->pg_rpc_callops, 0);
199 if (atomic_dec_and_test(&hdr->refcnt))
200 hdr->completion_ops->completion(hdr);
201 return ret;
202}
203
204static const struct nfs_pageio_ops nfs_pageio_read_ops = { 181static const struct nfs_pageio_ops nfs_pageio_read_ops = {
205 .pg_test = nfs_generic_pg_test, 182 .pg_test = nfs_generic_pg_test,
206 .pg_doio = nfs_generic_pg_readpages, 183 .pg_doio = nfs_generic_pg_pgios,
207}; 184};
208 185
209/* 186/*
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index d3fa181053ad..31a8b29e4026 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -973,33 +973,9 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops = {
973 .completion = nfs_write_completion, 973 .completion = nfs_write_completion,
974}; 974};
975 975
976static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
977{
978 struct nfs_rw_header *whdr;
979 struct nfs_pgio_header *hdr;
980 int ret;
981
982 whdr = nfs_rw_header_alloc(desc->pg_rw_ops);
983 if (!whdr) {
984 desc->pg_completion_ops->error_cleanup(&desc->pg_list);
985 return -ENOMEM;
986 }
987 hdr = &whdr->header;
988 nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
989 atomic_inc(&hdr->refcnt);
990 ret = nfs_generic_pgio(desc, hdr);
991 if (ret == 0)
992 ret = nfs_do_multiple_pgios(&hdr->rpc_list,
993 desc->pg_rpc_callops,
994 desc->pg_ioflags);
995 if (atomic_dec_and_test(&hdr->refcnt))
996 hdr->completion_ops->completion(hdr);
997 return ret;
998}
999
1000static const struct nfs_pageio_ops nfs_pageio_write_ops = { 976static const struct nfs_pageio_ops nfs_pageio_write_ops = {
1001 .pg_test = nfs_generic_pg_test, 977 .pg_test = nfs_generic_pg_test,
1002 .pg_doio = nfs_generic_pg_writepages, 978 .pg_doio = nfs_generic_pg_pgios,
1003}; 979};
1004 980
1005void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, 981void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,