2014-03-19 16:40:04

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 1/2 v2] nfs: remove ->write_pageio_init from rpc ops

We only use one static ops vector or grab it from the layout driver,
so clean up the whole code path to make that more obvious.

Signed-off-by: Christoph Hellwig <[email protected]>
---
fs/nfs/direct.c | 4 ++--
fs/nfs/nfs3proc.c | 1 -
fs/nfs/nfs4proc.c | 1 -
fs/nfs/pnfs.c | 14 --------------
fs/nfs/pnfs.h | 8 --------
fs/nfs/proc.c | 1 -
fs/nfs/write.c | 20 ++++++++++++--------
include/linux/nfs_xdr.h | 2 --
8 files changed, 14 insertions(+), 37 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index b8797ae..bd9d524 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -564,7 +564,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
dreq->count = 0;
get_dreq(dreq);

- NFS_PROTO(dreq->inode)->write_pageio_init(&desc, dreq->inode, FLUSH_STABLE,
+ nfs_pageio_init_write(&desc, dreq->inode, FLUSH_STABLE,
&nfs_direct_write_completion_ops);
desc.pg_dreq = dreq;

@@ -874,7 +874,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
size_t requested_bytes = 0;
unsigned long seg;

- NFS_PROTO(inode)->write_pageio_init(&desc, inode, FLUSH_COND_STABLE,
+ nfs_pageio_init_write(&desc, inode, FLUSH_COND_STABLE,
&nfs_direct_write_completion_ops);
desc.pg_dreq = dreq;
get_dreq(dreq);
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index aa9bc97..5ae9abf 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -986,7 +986,6 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.read_rpc_prepare = nfs3_proc_read_rpc_prepare,
.read_done = nfs3_read_done,
.write_setup = nfs3_proc_write_setup,
- .write_pageio_init = nfs_pageio_init_write,
.write_rpc_prepare = nfs3_proc_write_rpc_prepare,
.write_done = nfs3_write_done,
.commit_setup = nfs3_proc_commit_setup,
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 8672323..7759b5aa 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -8466,7 +8466,6 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.read_rpc_prepare = nfs4_proc_read_rpc_prepare,
.read_done = nfs4_read_done,
.write_setup = nfs4_proc_write_setup,
- .write_pageio_init = pnfs_pageio_init_write,
.write_rpc_prepare = nfs4_proc_write_rpc_prepare,
.write_done = nfs4_write_done,
.commit_setup = nfs4_proc_commit_setup,
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index cb53d45..d8be82d 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1447,20 +1447,6 @@ pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode,
nfs_pageio_init(pgio, inode, ld->pg_read_ops, compl_ops, server->rsize, 0);
}

-void
-pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode,
- int ioflags,
- const struct nfs_pgio_completion_ops *compl_ops)
-{
- struct nfs_server *server = NFS_SERVER(inode);
- struct pnfs_layoutdriver_type *ld = server->pnfs_curr_ld;
-
- if (ld == NULL)
- nfs_pageio_init_write(pgio, inode, ioflags, compl_ops);
- else
- nfs_pageio_init(pgio, inode, ld->pg_write_ops, compl_ops, server->wsize, ioflags);
-}
-
bool
pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
struct nfs_page *req)
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 0237939..e9ac8fb 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -182,8 +182,6 @@ void pnfs_put_lseg(struct pnfs_layout_segment *lseg);

void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *,
const struct nfs_pgio_completion_ops *);
-void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *,
- int, const struct nfs_pgio_completion_ops *);

void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, u32);
void unset_pnfs_layoutdriver(struct nfs_server *);
@@ -467,12 +465,6 @@ static inline void pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, str
nfs_pageio_init_read(pgio, inode, compl_ops);
}

-static inline void pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode, int ioflags,
- const struct nfs_pgio_completion_ops *compl_ops)
-{
- nfs_pageio_init_write(pgio, inode, ioflags, compl_ops);
-}
-
static inline int
pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
struct nfs_commit_info *cinfo)
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index fddbba2..6ea2bed 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -764,7 +764,6 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.read_rpc_prepare = nfs_proc_read_rpc_prepare,
.read_done = nfs_read_done,
.write_setup = nfs_proc_write_setup,
- .write_pageio_init = nfs_pageio_init_write,
.write_rpc_prepare = nfs_proc_write_rpc_prepare,
.write_done = nfs_write_done,
.commit_setup = nfs_proc_commit_setup,
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 9a3b6a4..2081ed1 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -354,10 +354,8 @@ static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc
struct nfs_pageio_descriptor pgio;
int err;

- NFS_PROTO(page_file_mapping(page)->host)->write_pageio_init(&pgio,
- page->mapping->host,
- wb_priority(wbc),
- &nfs_async_write_completion_ops);
+ nfs_pageio_init_write(&pgio, page->mapping->host, wb_priority(wbc),
+ &nfs_async_write_completion_ops);
err = nfs_do_writepage(page, wbc, &pgio);
nfs_pageio_complete(&pgio);
if (err < 0)
@@ -400,7 +398,8 @@ int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)

nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGES);

- NFS_PROTO(inode)->write_pageio_init(&pgio, inode, wb_priority(wbc), &nfs_async_write_completion_ops);
+ nfs_pageio_init_write(&pgio, inode, wb_priority(wbc),
+ &nfs_async_write_completion_ops);
err = write_cache_pages(mapping, wbc, nfs_writepages_callback, &pgio);
nfs_pageio_complete(&pgio);

@@ -1285,10 +1284,15 @@ void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags,
const struct nfs_pgio_completion_ops *compl_ops)
{
- nfs_pageio_init(pgio, inode, &nfs_pageio_write_ops, compl_ops,
- NFS_SERVER(inode)->wsize, ioflags);
+ struct nfs_server *server = NFS_SERVER(inode);
+ const struct nfs_pageio_ops *pg_ops = &nfs_pageio_write_ops;
+
+#ifdef CONFIG_NFS_V4_1
+ if (server->pnfs_curr_ld)
+ pg_ops = server->pnfs_curr_ld->pg_write_ops;
+#endif
+ nfs_pageio_init(pgio, inode, pg_ops, compl_ops, server->wsize, ioflags);
}
-EXPORT_SYMBOL_GPL(nfs_pageio_init_write);

void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio)
{
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index b2fb167..ed12f03 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1467,8 +1467,6 @@ struct nfs_rpc_ops {
int (*read_rpc_prepare)(struct rpc_task *, struct nfs_read_data *);
int (*read_done) (struct rpc_task *, struct nfs_read_data *);
void (*write_setup) (struct nfs_write_data *, struct rpc_message *);
- void (*write_pageio_init)(struct nfs_pageio_descriptor *, struct inode *, int,
- const struct nfs_pgio_completion_ops *);
int (*write_rpc_prepare)(struct rpc_task *, struct nfs_write_data *);
int (*write_done) (struct rpc_task *, struct nfs_write_data *);
void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *);
--
1.7.10.4



2014-03-19 16:40:17

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 2/2 v2] nfs: remove ->read_pageio_init from rpc ops

We only use one static ops vector or grab it from the layout driver,
so clean up the whole code path to make that more obvious.

Signed-off-by: Christoph Hellwig <[email protected]>
---
fs/nfs/direct.c | 3 +--
fs/nfs/nfs3proc.c | 1 -
fs/nfs/nfs4proc.c | 1 -
fs/nfs/pnfs.c | 13 -------------
fs/nfs/pnfs.h | 9 ---------
fs/nfs/proc.c | 1 -
fs/nfs/read.c | 16 +++++++++++-----
include/linux/nfs_xdr.h | 2 --
8 files changed, 12 insertions(+), 34 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index bd9d524..bb6fcb8 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -424,8 +424,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
size_t requested_bytes = 0;
unsigned long seg;

- NFS_PROTO(dreq->inode)->read_pageio_init(&desc, dreq->inode,
- &nfs_direct_read_completion_ops);
+ nfs_pageio_init_read(&desc, dreq->inode, &nfs_direct_read_completion_ops);
get_dreq(dreq);
desc.pg_dreq = dreq;
atomic_inc(&inode->i_dio_count);
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index 5ae9abf..feb2049 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -982,7 +982,6 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.pathconf = nfs3_proc_pathconf,
.decode_dirent = nfs3_decode_dirent,
.read_setup = nfs3_proc_read_setup,
- .read_pageio_init = nfs_pageio_init_read,
.read_rpc_prepare = nfs3_proc_read_rpc_prepare,
.read_done = nfs3_read_done,
.write_setup = nfs3_proc_write_setup,
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 7759b5aa..9a8eb6a 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -8462,7 +8462,6 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.set_capabilities = nfs4_server_capabilities,
.decode_dirent = nfs4_decode_dirent,
.read_setup = nfs4_proc_read_setup,
- .read_pageio_init = pnfs_pageio_init_read,
.read_rpc_prepare = nfs4_proc_read_rpc_prepare,
.read_done = nfs4_read_done,
.write_setup = nfs4_proc_write_setup,
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index d8be82d..c965f7d 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1434,19 +1434,6 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
}
EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write);

-void
-pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode,
- const struct nfs_pgio_completion_ops *compl_ops)
-{
- struct nfs_server *server = NFS_SERVER(inode);
- struct pnfs_layoutdriver_type *ld = server->pnfs_curr_ld;
-
- if (ld == NULL)
- nfs_pageio_init_read(pgio, inode, compl_ops);
- else
- nfs_pageio_init(pgio, inode, ld->pg_read_ops, compl_ops, server->rsize, 0);
-}
-
bool
pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
struct nfs_page *req)
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index e9ac8fb..94a9a18 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -180,9 +180,6 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp);
void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);
void pnfs_put_lseg(struct pnfs_layout_segment *lseg);

-void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *,
- const struct nfs_pgio_completion_ops *);
-
void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, u32);
void unset_pnfs_layoutdriver(struct nfs_server *);
void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *);
@@ -459,12 +456,6 @@ static inline void unset_pnfs_layoutdriver(struct nfs_server *s)
{
}

-static inline void pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode,
- const struct nfs_pgio_completion_ops *compl_ops)
-{
- nfs_pageio_init_read(pgio, inode, compl_ops);
-}
-
static inline int
pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
struct nfs_commit_info *cinfo)
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index 6ea2bed..7676973 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -760,7 +760,6 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.pathconf = nfs_proc_pathconf,
.decode_dirent = nfs2_decode_dirent,
.read_setup = nfs_proc_read_setup,
- .read_pageio_init = nfs_pageio_init_read,
.read_rpc_prepare = nfs_proc_read_rpc_prepare,
.read_done = nfs_read_done,
.write_setup = nfs_proc_write_setup,
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 411aedd..6fb4b8e 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -24,6 +24,7 @@
#include "internal.h"
#include "iostat.h"
#include "fscache.h"
+#include "pnfs.h"

#define NFSDBG_FACILITY NFSDBG_PAGECACHE

@@ -117,10 +118,15 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
struct inode *inode,
const struct nfs_pgio_completion_ops *compl_ops)
{
- nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops, compl_ops,
- NFS_SERVER(inode)->rsize, 0);
+ struct nfs_server *server = NFS_SERVER(inode);
+ const struct nfs_pageio_ops *pg_ops = &nfs_pageio_read_ops;
+
+#ifdef CONFIG_NFS_V4_1
+ if (server->pnfs_curr_ld)
+ pg_ops = server->pnfs_curr_ld->pg_read_ops;
+#endif
+ nfs_pageio_init(pgio, inode, pg_ops, compl_ops, server->rsize, 0);
}
-EXPORT_SYMBOL_GPL(nfs_pageio_init_read);

void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio)
{
@@ -147,7 +153,7 @@ 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_PROTO(inode)->read_pageio_init(&pgio, inode, &nfs_async_read_completion_ops);
+ nfs_pageio_init_read(&pgio, inode, &nfs_async_read_completion_ops);
nfs_pageio_add_request(&pgio, new);
nfs_pageio_complete(&pgio);
NFS_I(inode)->read_io += pgio.pg_bytes_written;
@@ -654,7 +660,7 @@ int nfs_readpages(struct file *filp, struct address_space *mapping,
if (ret == 0)
goto read_complete; /* all pages were read */

- NFS_PROTO(inode)->read_pageio_init(&pgio, inode, &nfs_async_read_completion_ops);
+ nfs_pageio_init_read(&pgio, inode, &nfs_async_read_completion_ops);

ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);

diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index ed12f03..0146485 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1462,8 +1462,6 @@ struct nfs_rpc_ops {
int (*set_capabilities)(struct nfs_server *, struct nfs_fh *);
int (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, int);
void (*read_setup) (struct nfs_read_data *, struct rpc_message *);
- void (*read_pageio_init)(struct nfs_pageio_descriptor *, struct inode *,
- const struct nfs_pgio_completion_ops *);
int (*read_rpc_prepare)(struct rpc_task *, struct nfs_read_data *);
int (*read_done) (struct rpc_task *, struct nfs_read_data *);
void (*write_setup) (struct nfs_write_data *, struct rpc_message *);
--
1.7.10.4


2014-03-19 17:47:25

by Anna Schumaker

[permalink] [raw]
Subject: Re: [PATCH 1/2 v2] nfs: remove ->write_pageio_init from rpc ops

On 03/19/2014 12:40 PM, Christoph Hellwig wrote:
> We only use one static ops vector or grab it from the layout driver,
> so clean up the whole code path to make that more obvious.
>
> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> fs/nfs/direct.c | 4 ++--
> fs/nfs/nfs3proc.c | 1 -
> fs/nfs/nfs4proc.c | 1 -
> fs/nfs/pnfs.c | 14 --------------
> fs/nfs/pnfs.h | 8 --------
> fs/nfs/proc.c | 1 -
> fs/nfs/write.c | 20 ++++++++++++--------
> include/linux/nfs_xdr.h | 2 --
> 8 files changed, 14 insertions(+), 37 deletions(-)
>
> diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
> index b8797ae..bd9d524 100644
> --- a/fs/nfs/direct.c
> +++ b/fs/nfs/direct.c
> @@ -564,7 +564,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
> dreq->count = 0;
> get_dreq(dreq);
>
> - NFS_PROTO(dreq->inode)->write_pageio_init(&desc, dreq->inode, FLUSH_STABLE,
> + nfs_pageio_init_write(&desc, dreq->inode, FLUSH_STABLE,
> &nfs_direct_write_completion_ops);
> desc.pg_dreq = dreq;
>
> @@ -874,7 +874,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
> size_t requested_bytes = 0;
> unsigned long seg;
>
> - NFS_PROTO(inode)->write_pageio_init(&desc, inode, FLUSH_COND_STABLE,
> + nfs_pageio_init_write(&desc, inode, FLUSH_COND_STABLE,
> &nfs_direct_write_completion_ops);
> desc.pg_dreq = dreq;
> get_dreq(dreq);
> diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
> index aa9bc97..5ae9abf 100644
> --- a/fs/nfs/nfs3proc.c
> +++ b/fs/nfs/nfs3proc.c
> @@ -986,7 +986,6 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
> .read_rpc_prepare = nfs3_proc_read_rpc_prepare,
> .read_done = nfs3_read_done,
> .write_setup = nfs3_proc_write_setup,
> - .write_pageio_init = nfs_pageio_init_write,
> .write_rpc_prepare = nfs3_proc_write_rpc_prepare,
> .write_done = nfs3_write_done,
> .commit_setup = nfs3_proc_commit_setup,
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 8672323..7759b5aa 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -8466,7 +8466,6 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
> .read_rpc_prepare = nfs4_proc_read_rpc_prepare,
> .read_done = nfs4_read_done,
> .write_setup = nfs4_proc_write_setup,
> - .write_pageio_init = pnfs_pageio_init_write,
> .write_rpc_prepare = nfs4_proc_write_rpc_prepare,
> .write_done = nfs4_write_done,
> .commit_setup = nfs4_proc_commit_setup,
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index cb53d45..d8be82d 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1447,20 +1447,6 @@ pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode,
> nfs_pageio_init(pgio, inode, ld->pg_read_ops, compl_ops, server->rsize, 0);
> }
>
> -void
> -pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode,
> - int ioflags,
> - const struct nfs_pgio_completion_ops *compl_ops)
> -{
> - struct nfs_server *server = NFS_SERVER(inode);
> - struct pnfs_layoutdriver_type *ld = server->pnfs_curr_ld;
> -
> - if (ld == NULL)
> - nfs_pageio_init_write(pgio, inode, ioflags, compl_ops);
> - else
> - nfs_pageio_init(pgio, inode, ld->pg_write_ops, compl_ops, server->wsize, ioflags);
> -}
> -
> bool
> pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
> struct nfs_page *req)
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index 0237939..e9ac8fb 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -182,8 +182,6 @@ void pnfs_put_lseg(struct pnfs_layout_segment *lseg);
>
> void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *,
> const struct nfs_pgio_completion_ops *);
> -void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *,
> - int, const struct nfs_pgio_completion_ops *);
>
> void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, u32);
> void unset_pnfs_layoutdriver(struct nfs_server *);
> @@ -467,12 +465,6 @@ static inline void pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, str
> nfs_pageio_init_read(pgio, inode, compl_ops);
> }
>
> -static inline void pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode, int ioflags,
> - const struct nfs_pgio_completion_ops *compl_ops)
> -{
> - nfs_pageio_init_write(pgio, inode, ioflags, compl_ops);
> -}
> -
> static inline int
> pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
> struct nfs_commit_info *cinfo)
> diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
> index fddbba2..6ea2bed 100644
> --- a/fs/nfs/proc.c
> +++ b/fs/nfs/proc.c
> @@ -764,7 +764,6 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
> .read_rpc_prepare = nfs_proc_read_rpc_prepare,
> .read_done = nfs_read_done,
> .write_setup = nfs_proc_write_setup,
> - .write_pageio_init = nfs_pageio_init_write,
> .write_rpc_prepare = nfs_proc_write_rpc_prepare,
> .write_done = nfs_write_done,
> .commit_setup = nfs_proc_commit_setup,
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index 9a3b6a4..2081ed1 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -354,10 +354,8 @@ static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc
> struct nfs_pageio_descriptor pgio;
> int err;
>
> - NFS_PROTO(page_file_mapping(page)->host)->write_pageio_init(&pgio,
> - page->mapping->host,
> - wb_priority(wbc),
> - &nfs_async_write_completion_ops);
> + nfs_pageio_init_write(&pgio, page->mapping->host, wb_priority(wbc),
> + &nfs_async_write_completion_ops);
> err = nfs_do_writepage(page, wbc, &pgio);
> nfs_pageio_complete(&pgio);
> if (err < 0)
> @@ -400,7 +398,8 @@ int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
>
> nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGES);
>
> - NFS_PROTO(inode)->write_pageio_init(&pgio, inode, wb_priority(wbc), &nfs_async_write_completion_ops);
> + nfs_pageio_init_write(&pgio, inode, wb_priority(wbc),
> + &nfs_async_write_completion_ops);
> err = write_cache_pages(mapping, wbc, nfs_writepages_callback, &pgio);
> nfs_pageio_complete(&pgio);
>
> @@ -1285,10 +1284,15 @@ void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
> struct inode *inode, int ioflags,
> const struct nfs_pgio_completion_ops *compl_ops)
> {
> - nfs_pageio_init(pgio, inode, &nfs_pageio_write_ops, compl_ops,
> - NFS_SERVER(inode)->wsize, ioflags);
> + struct nfs_server *server = NFS_SERVER(inode);
> + const struct nfs_pageio_ops *pg_ops = &nfs_pageio_write_ops;
> +
> +#ifdef CONFIG_NFS_V4_1
> + if (server->pnfs_curr_ld)
> + pg_ops = server->pnfs_curr_ld->pg_write_ops;
> +#endif
> + nfs_pageio_init(pgio, inode, pg_ops, compl_ops, server->wsize, ioflags);
> }
> -EXPORT_SYMBOL_GPL(nfs_pageio_init_write);

I think we still need the EXPORT_SYMBOL_GPL() here. Compiling gives me:

ERROR: "nfs_pageio_init_read" [fs/nfs/nfsv4.ko] undefined!
ERROR: "nfs_pageio_init_write" [fs/nfs/nfsv4.ko] undefined!

Anna

>
> void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio)
> {
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index b2fb167..ed12f03 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -1467,8 +1467,6 @@ struct nfs_rpc_ops {
> int (*read_rpc_prepare)(struct rpc_task *, struct nfs_read_data *);
> int (*read_done) (struct rpc_task *, struct nfs_read_data *);
> void (*write_setup) (struct nfs_write_data *, struct rpc_message *);
> - void (*write_pageio_init)(struct nfs_pageio_descriptor *, struct inode *, int,
> - const struct nfs_pgio_completion_ops *);
> int (*write_rpc_prepare)(struct rpc_task *, struct nfs_write_data *);
> int (*write_done) (struct rpc_task *, struct nfs_write_data *);
> void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *);


2014-03-20 12:50:23

by Anna Schumaker

[permalink] [raw]
Subject: Re: [PATCH 1/2 v2] nfs: remove ->write_pageio_init from rpc ops

On 03/20/2014 06:04 AM, Christoph Hellwig wrote:
> On Wed, Mar 19, 2014 at 01:47:22PM -0400, Anna Schumaker wrote:
>>> }
>>> -EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
>> I think we still need the EXPORT_SYMBOL_GPL() here. Compiling gives me:
>>
>> ERROR: "nfs_pageio_init_read" [fs/nfs/nfsv4.ko] undefined!
>> ERROR: "nfs_pageio_init_write" [fs/nfs/nfsv4.ko] undefined!
> Oh right - I only tested built-in nfs. I have to say the amount of
> fairly low-level interfaces exported from the various nfs modules make a
> bit of a mess..
>
I'm open to suggestions about how to clean it all up! Fewer EXPORT_SYMBOLS wouldn't be a bad thing (along with fewer ifdefs and fewer rpc ops ...)

2014-03-20 10:04:21

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH 1/2 v2] nfs: remove ->write_pageio_init from rpc ops

On Wed, Mar 19, 2014 at 01:47:22PM -0400, Anna Schumaker wrote:
> > }
> > -EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
>
> I think we still need the EXPORT_SYMBOL_GPL() here. Compiling gives me:
>
> ERROR: "nfs_pageio_init_read" [fs/nfs/nfsv4.ko] undefined!
> ERROR: "nfs_pageio_init_write" [fs/nfs/nfsv4.ko] undefined!

Oh right - I only tested built-in nfs. I have to say the amount of
fairly low-level interfaces exported from the various nfs modules make a
bit of a mess..