diff options
author | Anna Schumaker <Anna.Schumaker@netapp.com> | 2014-05-06 09:12:39 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-05-29 11:11:41 -0400 |
commit | cf485fcd68bc2dd91258e844ba4649404fff3235 (patch) | |
tree | bd96e9d04ca73644770ae95d06c05d1a49fb3c08 /fs/nfs | |
parent | c3766276f26090f4459329839cdcc8506dfbced5 (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.h | 2 | ||||
-rw-r--r-- | fs/nfs/pagelist.c | 26 | ||||
-rw-r--r-- | fs/nfs/read.c | 25 | ||||
-rw-r--r-- | fs/nfs/write.c | 26 |
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 *); | |||
243 | int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *); | 243 | int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *); |
244 | int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *, | 244 | int 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); |
246 | int nfs_do_multiple_pgios(struct list_head *, const struct rpc_call_ops *, int); | 246 | int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *); |
247 | 247 | ||
248 | static inline void nfs_iocounter_init(struct nfs_io_counter *c) | 248 | static 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 | } |
494 | EXPORT_SYMBOL_GPL(nfs_initiate_pgio); | 494 | EXPORT_SYMBOL_GPL(nfs_initiate_pgio); |
495 | 495 | ||
496 | int nfs_do_multiple_pgios(struct list_head *head, | 496 | static 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 | ||
691 | int 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 | |||
691 | int nfs_generic_pgio(struct nfs_pageio_descriptor *desc, | 715 | int 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 | ||
181 | static 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 | |||
204 | static const struct nfs_pageio_ops nfs_pageio_read_ops = { | 181 | static 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 | ||
976 | static 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 | |||
1000 | static const struct nfs_pageio_ops nfs_pageio_write_ops = { | 976 | static 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 | ||
1005 | void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, | 981 | void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, |