* [PATCH v2 01/17] NFS: Create a common argument structure for reads and writes
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-05-02 13:20 ` Jeff Layton
2014-04-25 20:55 ` [PATCH v2 02/17] NFS: Create a common results " Anna Schumaker
` (16 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
Reads and writes have very similar arguments. This patch combines them
together and documents the few fields used only by write.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
v2:
- Move the write-only variables to the end of the struct
---
fs/nfs/nfs2xdr.c | 8 ++++----
fs/nfs/nfs3xdr.c | 8 ++++----
fs/nfs/nfs4proc.c | 4 ++--
fs/nfs/nfs4xdr.c | 10 ++++++----
fs/nfs/read.c | 2 +-
fs/nfs/write.c | 2 +-
include/linux/nfs_xdr.h | 47 +++++++++++++++++++----------------------------
7 files changed, 37 insertions(+), 44 deletions(-)
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
index 62db136..461cd8b 100644
--- a/fs/nfs/nfs2xdr.c
+++ b/fs/nfs/nfs2xdr.c
@@ -613,7 +613,7 @@ static void nfs2_xdr_enc_readlinkargs(struct rpc_rqst *req,
* };
*/
static void encode_readargs(struct xdr_stream *xdr,
- const struct nfs_readargs *args)
+ const struct nfs_pgio_args *args)
{
u32 offset = args->offset;
u32 count = args->count;
@@ -629,7 +629,7 @@ static void encode_readargs(struct xdr_stream *xdr,
static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
struct xdr_stream *xdr,
- const struct nfs_readargs *args)
+ const struct nfs_pgio_args *args)
{
encode_readargs(xdr, args);
prepare_reply_buffer(req, args->pages, args->pgbase,
@@ -649,7 +649,7 @@ static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
* };
*/
static void encode_writeargs(struct xdr_stream *xdr,
- const struct nfs_writeargs *args)
+ const struct nfs_pgio_args *args)
{
u32 offset = args->offset;
u32 count = args->count;
@@ -669,7 +669,7 @@ static void encode_writeargs(struct xdr_stream *xdr,
static void nfs2_xdr_enc_writeargs(struct rpc_rqst *req,
struct xdr_stream *xdr,
- const struct nfs_writeargs *args)
+ const struct nfs_pgio_args *args)
{
encode_writeargs(xdr, args);
xdr->buf->flags |= XDRBUF_WRITE;
diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
index fa6d721..02f16c2 100644
--- a/fs/nfs/nfs3xdr.c
+++ b/fs/nfs/nfs3xdr.c
@@ -953,7 +953,7 @@ static void nfs3_xdr_enc_readlink3args(struct rpc_rqst *req,
* };
*/
static void encode_read3args(struct xdr_stream *xdr,
- const struct nfs_readargs *args)
+ const struct nfs_pgio_args *args)
{
__be32 *p;
@@ -966,7 +966,7 @@ static void encode_read3args(struct xdr_stream *xdr,
static void nfs3_xdr_enc_read3args(struct rpc_rqst *req,
struct xdr_stream *xdr,
- const struct nfs_readargs *args)
+ const struct nfs_pgio_args *args)
{
encode_read3args(xdr, args);
prepare_reply_buffer(req, args->pages, args->pgbase,
@@ -992,7 +992,7 @@ static void nfs3_xdr_enc_read3args(struct rpc_rqst *req,
* };
*/
static void encode_write3args(struct xdr_stream *xdr,
- const struct nfs_writeargs *args)
+ const struct nfs_pgio_args *args)
{
__be32 *p;
@@ -1008,7 +1008,7 @@ static void encode_write3args(struct xdr_stream *xdr,
static void nfs3_xdr_enc_write3args(struct rpc_rqst *req,
struct xdr_stream *xdr,
- const struct nfs_writeargs *args)
+ const struct nfs_pgio_args *args)
{
encode_write3args(xdr, args);
xdr->buf->flags |= XDRBUF_WRITE;
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 21cd1f2..4794ca6 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4055,7 +4055,7 @@ static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_read_data *data)
}
static bool nfs4_read_stateid_changed(struct rpc_task *task,
- struct nfs_readargs *args)
+ struct nfs_pgio_args *args)
{
if (!nfs4_error_stateid_expired(task->tk_status) ||
@@ -4121,7 +4121,7 @@ static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_write_data *data
}
static bool nfs4_write_stateid_changed(struct rpc_task *task,
- struct nfs_writeargs *args)
+ struct nfs_pgio_args *args)
{
if (!nfs4_error_stateid_expired(task->tk_status) ||
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 73ce8d4..032159c 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -1556,7 +1556,8 @@ static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr)
encode_op_hdr(xdr, OP_PUTROOTFH, decode_putrootfh_maxsz, hdr);
}
-static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args, struct compound_hdr *hdr)
+static void encode_read(struct xdr_stream *xdr, const struct nfs_pgio_args *args,
+ struct compound_hdr *hdr)
{
__be32 *p;
@@ -1701,7 +1702,8 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs4
encode_nfs4_verifier(xdr, &arg->confirm);
}
-static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args, struct compound_hdr *hdr)
+static void encode_write(struct xdr_stream *xdr, const struct nfs_pgio_args *args,
+ struct compound_hdr *hdr)
{
__be32 *p;
@@ -2451,7 +2453,7 @@ static void nfs4_xdr_enc_readdir(struct rpc_rqst *req, struct xdr_stream *xdr,
* Encode a READ request
*/
static void nfs4_xdr_enc_read(struct rpc_rqst *req, struct xdr_stream *xdr,
- struct nfs_readargs *args)
+ struct nfs_pgio_args *args)
{
struct compound_hdr hdr = {
.minorversion = nfs4_xdr_minorversion(&args->seq_args),
@@ -2513,7 +2515,7 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
* Encode a WRITE request
*/
static void nfs4_xdr_enc_write(struct rpc_rqst *req, struct xdr_stream *xdr,
- struct nfs_writeargs *args)
+ struct nfs_pgio_args *args)
{
struct compound_hdr hdr = {
.minorversion = nfs4_xdr_minorversion(&args->seq_args),
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 7f87461..46d5552 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -470,7 +470,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
{
- struct nfs_readargs *argp = &data->args;
+ struct nfs_pgio_args *argp = &data->args;
struct nfs_readres *resp = &data->res;
/* This is a short read! */
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index ee6d46f..25ba383 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1388,7 +1388,7 @@ static int nfs_should_remove_suid(const struct inode *inode)
*/
void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
{
- struct nfs_writeargs *argp = &data->args;
+ struct nfs_pgio_args *argp = &data->args;
struct nfs_writeres *resp = &data->res;
struct inode *inode = data->header->inode;
int status;
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 3e8fc1f..5875001 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -491,18 +491,6 @@ struct nfs4_delegreturnres {
/*
* Arguments to the read call.
*/
-struct nfs_readargs {
- struct nfs4_sequence_args seq_args;
- struct nfs_fh * fh;
- struct nfs_open_context *context;
- struct nfs_lock_context *lock_context;
- nfs4_stateid stateid;
- __u64 offset;
- __u32 count;
- unsigned int pgbase;
- struct page ** pages;
-};
-
struct nfs_readres {
struct nfs4_sequence_res seq_res;
struct nfs_fattr * fattr;
@@ -513,20 +501,6 @@ struct nfs_readres {
/*
* Arguments to the write call.
*/
-struct nfs_writeargs {
- struct nfs4_sequence_args seq_args;
- struct nfs_fh * fh;
- struct nfs_open_context *context;
- struct nfs_lock_context *lock_context;
- nfs4_stateid stateid;
- __u64 offset;
- __u32 count;
- enum nfs3_stable_how stable;
- unsigned int pgbase;
- struct page ** pages;
- const u32 * bitmask;
-};
-
struct nfs_write_verifier {
char data[8];
};
@@ -545,6 +519,23 @@ struct nfs_writeres {
};
/*
+ * Arguments shared by the read and write call.
+ */
+struct nfs_pgio_args {
+ struct nfs4_sequence_args seq_args;
+ struct nfs_fh * fh;
+ struct nfs_open_context *context;
+ struct nfs_lock_context *lock_context;
+ nfs4_stateid stateid;
+ __u64 offset;
+ __u32 count;
+ unsigned int pgbase;
+ struct page ** pages;
+ const u32 * bitmask; /* used by write */
+ enum nfs3_stable_how stable; /* used by write */
+};
+
+/*
* Arguments to the commit call.
*/
struct nfs_commitargs {
@@ -1269,7 +1260,7 @@ struct nfs_read_data {
struct list_head list;
struct rpc_task task;
struct nfs_fattr fattr; /* fattr storage */
- struct nfs_readargs args;
+ struct nfs_pgio_args args;
struct nfs_readres res;
unsigned long timestamp; /* For lease renewal */
int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
@@ -1321,7 +1312,7 @@ struct nfs_write_data {
struct rpc_task task;
struct nfs_fattr fattr;
struct nfs_writeverf verf;
- struct nfs_writeargs args; /* argument struct */
+ struct nfs_pgio_args args; /* argument struct */
struct nfs_writeres res; /* result struct */
unsigned long timestamp; /* For lease renewal */
int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 01/17] NFS: Create a common argument structure for reads and writes
2014-04-25 20:55 ` [PATCH v2 01/17] NFS: Create a common argument structure for " Anna Schumaker
@ 2014-05-02 13:20 ` Jeff Layton
0 siblings, 0 replies; 29+ messages in thread
From: Jeff Layton @ 2014-05-02 13:20 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On Fri, 25 Apr 2014 16:55:44 -0400
Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> Reads and writes have very similar arguments. This patch combines them
> together and documents the few fields used only by write.
>
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
>
> v2:
> - Move the write-only variables to the end of the struct
> ---
> fs/nfs/nfs2xdr.c | 8 ++++----
> fs/nfs/nfs3xdr.c | 8 ++++----
> fs/nfs/nfs4proc.c | 4 ++--
> fs/nfs/nfs4xdr.c | 10 ++++++----
> fs/nfs/read.c | 2 +-
> fs/nfs/write.c | 2 +-
> include/linux/nfs_xdr.h | 47 +++++++++++++++++++----------------------------
> 7 files changed, 37 insertions(+), 44 deletions(-)
>
> diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
> index 62db136..461cd8b 100644
> --- a/fs/nfs/nfs2xdr.c
> +++ b/fs/nfs/nfs2xdr.c
> @@ -613,7 +613,7 @@ static void nfs2_xdr_enc_readlinkargs(struct rpc_rqst *req,
> * };
> */
> static void encode_readargs(struct xdr_stream *xdr,
> - const struct nfs_readargs *args)
> + const struct nfs_pgio_args *args)
> {
> u32 offset = args->offset;
> u32 count = args->count;
> @@ -629,7 +629,7 @@ static void encode_readargs(struct xdr_stream *xdr,
>
> static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
> struct xdr_stream *xdr,
> - const struct nfs_readargs *args)
> + const struct nfs_pgio_args *args)
> {
> encode_readargs(xdr, args);
> prepare_reply_buffer(req, args->pages, args->pgbase,
> @@ -649,7 +649,7 @@ static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
> * };
> */
> static void encode_writeargs(struct xdr_stream *xdr,
> - const struct nfs_writeargs *args)
> + const struct nfs_pgio_args *args)
> {
> u32 offset = args->offset;
> u32 count = args->count;
> @@ -669,7 +669,7 @@ static void encode_writeargs(struct xdr_stream *xdr,
>
> static void nfs2_xdr_enc_writeargs(struct rpc_rqst *req,
> struct xdr_stream *xdr,
> - const struct nfs_writeargs *args)
> + const struct nfs_pgio_args *args)
> {
> encode_writeargs(xdr, args);
> xdr->buf->flags |= XDRBUF_WRITE;
> diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
> index fa6d721..02f16c2 100644
> --- a/fs/nfs/nfs3xdr.c
> +++ b/fs/nfs/nfs3xdr.c
> @@ -953,7 +953,7 @@ static void nfs3_xdr_enc_readlink3args(struct rpc_rqst *req,
> * };
> */
> static void encode_read3args(struct xdr_stream *xdr,
> - const struct nfs_readargs *args)
> + const struct nfs_pgio_args *args)
> {
> __be32 *p;
>
> @@ -966,7 +966,7 @@ static void encode_read3args(struct xdr_stream *xdr,
>
> static void nfs3_xdr_enc_read3args(struct rpc_rqst *req,
> struct xdr_stream *xdr,
> - const struct nfs_readargs *args)
> + const struct nfs_pgio_args *args)
> {
> encode_read3args(xdr, args);
> prepare_reply_buffer(req, args->pages, args->pgbase,
> @@ -992,7 +992,7 @@ static void nfs3_xdr_enc_read3args(struct rpc_rqst *req,
> * };
> */
> static void encode_write3args(struct xdr_stream *xdr,
> - const struct nfs_writeargs *args)
> + const struct nfs_pgio_args *args)
> {
> __be32 *p;
>
> @@ -1008,7 +1008,7 @@ static void encode_write3args(struct xdr_stream *xdr,
>
> static void nfs3_xdr_enc_write3args(struct rpc_rqst *req,
> struct xdr_stream *xdr,
> - const struct nfs_writeargs *args)
> + const struct nfs_pgio_args *args)
> {
> encode_write3args(xdr, args);
> xdr->buf->flags |= XDRBUF_WRITE;
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 21cd1f2..4794ca6 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -4055,7 +4055,7 @@ static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_read_data *data)
> }
>
> static bool nfs4_read_stateid_changed(struct rpc_task *task,
> - struct nfs_readargs *args)
> + struct nfs_pgio_args *args)
> {
>
> if (!nfs4_error_stateid_expired(task->tk_status) ||
> @@ -4121,7 +4121,7 @@ static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_write_data *data
> }
>
> static bool nfs4_write_stateid_changed(struct rpc_task *task,
> - struct nfs_writeargs *args)
> + struct nfs_pgio_args *args)
> {
>
> if (!nfs4_error_stateid_expired(task->tk_status) ||
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index 73ce8d4..032159c 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -1556,7 +1556,8 @@ static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr)
> encode_op_hdr(xdr, OP_PUTROOTFH, decode_putrootfh_maxsz, hdr);
> }
>
> -static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args, struct compound_hdr *hdr)
> +static void encode_read(struct xdr_stream *xdr, const struct nfs_pgio_args *args,
> + struct compound_hdr *hdr)
> {
> __be32 *p;
>
> @@ -1701,7 +1702,8 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs4
> encode_nfs4_verifier(xdr, &arg->confirm);
> }
>
> -static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args, struct compound_hdr *hdr)
> +static void encode_write(struct xdr_stream *xdr, const struct nfs_pgio_args *args,
> + struct compound_hdr *hdr)
> {
> __be32 *p;
>
> @@ -2451,7 +2453,7 @@ static void nfs4_xdr_enc_readdir(struct rpc_rqst *req, struct xdr_stream *xdr,
> * Encode a READ request
> */
> static void nfs4_xdr_enc_read(struct rpc_rqst *req, struct xdr_stream *xdr,
> - struct nfs_readargs *args)
> + struct nfs_pgio_args *args)
> {
> struct compound_hdr hdr = {
> .minorversion = nfs4_xdr_minorversion(&args->seq_args),
> @@ -2513,7 +2515,7 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
> * Encode a WRITE request
> */
> static void nfs4_xdr_enc_write(struct rpc_rqst *req, struct xdr_stream *xdr,
> - struct nfs_writeargs *args)
> + struct nfs_pgio_args *args)
> {
> struct compound_hdr hdr = {
> .minorversion = nfs4_xdr_minorversion(&args->seq_args),
> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
> index 7f87461..46d5552 100644
> --- a/fs/nfs/read.c
> +++ b/fs/nfs/read.c
> @@ -470,7 +470,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
>
> static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
> {
> - struct nfs_readargs *argp = &data->args;
> + struct nfs_pgio_args *argp = &data->args;
> struct nfs_readres *resp = &data->res;
>
> /* This is a short read! */
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index ee6d46f..25ba383 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -1388,7 +1388,7 @@ static int nfs_should_remove_suid(const struct inode *inode)
> */
> void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
> {
> - struct nfs_writeargs *argp = &data->args;
> + struct nfs_pgio_args *argp = &data->args;
> struct nfs_writeres *resp = &data->res;
> struct inode *inode = data->header->inode;
> int status;
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 3e8fc1f..5875001 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -491,18 +491,6 @@ struct nfs4_delegreturnres {
> /*
> * Arguments to the read call.
> */
> -struct nfs_readargs {
> - struct nfs4_sequence_args seq_args;
> - struct nfs_fh * fh;
> - struct nfs_open_context *context;
> - struct nfs_lock_context *lock_context;
> - nfs4_stateid stateid;
> - __u64 offset;
> - __u32 count;
> - unsigned int pgbase;
> - struct page ** pages;
> -};
> -
> struct nfs_readres {
> struct nfs4_sequence_res seq_res;
> struct nfs_fattr * fattr;
> @@ -513,20 +501,6 @@ struct nfs_readres {
> /*
> * Arguments to the write call.
> */
> -struct nfs_writeargs {
> - struct nfs4_sequence_args seq_args;
> - struct nfs_fh * fh;
> - struct nfs_open_context *context;
> - struct nfs_lock_context *lock_context;
> - nfs4_stateid stateid;
> - __u64 offset;
> - __u32 count;
> - enum nfs3_stable_how stable;
> - unsigned int pgbase;
> - struct page ** pages;
> - const u32 * bitmask;
> -};
> -
> struct nfs_write_verifier {
> char data[8];
> };
> @@ -545,6 +519,23 @@ struct nfs_writeres {
> };
>
> /*
> + * Arguments shared by the read and write call.
> + */
> +struct nfs_pgio_args {
> + struct nfs4_sequence_args seq_args;
> + struct nfs_fh * fh;
> + struct nfs_open_context *context;
> + struct nfs_lock_context *lock_context;
> + nfs4_stateid stateid;
> + __u64 offset;
> + __u32 count;
> + unsigned int pgbase;
> + struct page ** pages;
> + const u32 * bitmask; /* used by write */
> + enum nfs3_stable_how stable; /* used by write */
> +};
> +
> +/*
> * Arguments to the commit call.
> */
> struct nfs_commitargs {
> @@ -1269,7 +1260,7 @@ struct nfs_read_data {
> struct list_head list;
> struct rpc_task task;
> struct nfs_fattr fattr; /* fattr storage */
> - struct nfs_readargs args;
> + struct nfs_pgio_args args;
> struct nfs_readres res;
> unsigned long timestamp; /* For lease renewal */
> int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
> @@ -1321,7 +1312,7 @@ struct nfs_write_data {
> struct rpc_task task;
> struct nfs_fattr fattr;
> struct nfs_writeverf verf;
> - struct nfs_writeargs args; /* argument struct */
> + struct nfs_pgio_args args; /* argument struct */
> struct nfs_writeres res; /* result struct */
> unsigned long timestamp; /* For lease renewal */
> int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
I like it.
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 02/17] NFS: Create a common results structure for reads and writes
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 01/17] NFS: Create a common argument structure for " Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-05-02 13:22 ` Jeff Layton
2014-04-25 20:55 ` [PATCH v2 03/17] NFS: Create a common read and write data struct Anna Schumaker
` (15 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
Reads and writes have very similar results. This patch combines the two
structs together with comments to show where the differing fields are
used.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
v2:
- Move the write-only variables to the end of the struct
TODO:
- Consider making a union for read and write variables
---
fs/nfs/nfs2xdr.c | 6 +++---
fs/nfs/nfs3xdr.c | 8 ++++----
fs/nfs/nfs4xdr.c | 9 +++++----
fs/nfs/read.c | 2 +-
fs/nfs/write.c | 2 +-
include/linux/nfs_xdr.h | 32 ++++++++++++--------------------
6 files changed, 26 insertions(+), 33 deletions(-)
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
index 461cd8b..5f61b83 100644
--- a/fs/nfs/nfs2xdr.c
+++ b/fs/nfs/nfs2xdr.c
@@ -103,7 +103,7 @@ static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
/*
* typedef opaque nfsdata<>;
*/
-static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_readres *result)
+static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_pgio_res *result)
{
u32 recvd, count;
__be32 *p;
@@ -857,7 +857,7 @@ out_default:
* };
*/
static int nfs2_xdr_dec_readres(struct rpc_rqst *req, struct xdr_stream *xdr,
- struct nfs_readres *result)
+ struct nfs_pgio_res *result)
{
enum nfs_stat status;
int error;
@@ -878,7 +878,7 @@ out_default:
}
static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, struct xdr_stream *xdr,
- struct nfs_writeres *result)
+ struct nfs_pgio_res *result)
{
/* All NFSv2 writes are "file sync" writes */
result->verf->committed = NFS_FILE_SYNC;
diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
index 02f16c2..8f4cbe7 100644
--- a/fs/nfs/nfs3xdr.c
+++ b/fs/nfs/nfs3xdr.c
@@ -1589,7 +1589,7 @@ out_default:
* };
*/
static int decode_read3resok(struct xdr_stream *xdr,
- struct nfs_readres *result)
+ struct nfs_pgio_res *result)
{
u32 eof, count, ocount, recvd;
__be32 *p;
@@ -1625,7 +1625,7 @@ out_overflow:
}
static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr,
- struct nfs_readres *result)
+ struct nfs_pgio_res *result)
{
enum nfs_stat status;
int error;
@@ -1673,7 +1673,7 @@ out_status:
* };
*/
static int decode_write3resok(struct xdr_stream *xdr,
- struct nfs_writeres *result)
+ struct nfs_pgio_res *result)
{
__be32 *p;
@@ -1697,7 +1697,7 @@ out_eio:
}
static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr,
- struct nfs_writeres *result)
+ struct nfs_pgio_res *result)
{
enum nfs_stat status;
int error;
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 032159c..939ae60 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -5087,7 +5087,8 @@ static int decode_putrootfh(struct xdr_stream *xdr)
return decode_op_hdr(xdr, OP_PUTROOTFH);
}
-static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_readres *res)
+static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req,
+ struct nfs_pgio_res *res)
{
__be32 *p;
uint32_t count, eof, recvd;
@@ -5341,7 +5342,7 @@ static int decode_setclientid_confirm(struct xdr_stream *xdr)
return decode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM);
}
-static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)
+static int decode_write(struct xdr_stream *xdr, struct nfs_pgio_res *res)
{
__be32 *p;
int status;
@@ -6638,7 +6639,7 @@ out:
* Decode Read response
*/
static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
- struct nfs_readres *res)
+ struct nfs_pgio_res *res)
{
struct compound_hdr hdr;
int status;
@@ -6663,7 +6664,7 @@ out:
* Decode WRITE response
*/
static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
- struct nfs_writeres *res)
+ struct nfs_pgio_res *res)
{
struct compound_hdr hdr;
int status;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 46d5552..473bba3 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -471,7 +471,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
{
struct nfs_pgio_args *argp = &data->args;
- struct nfs_readres *resp = &data->res;
+ struct nfs_pgio_res *resp = &data->res;
/* This is a short read! */
nfs_inc_stats(data->header->inode, NFSIOS_SHORTREAD);
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 25ba383..d392a70 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1389,7 +1389,7 @@ static int nfs_should_remove_suid(const struct inode *inode)
void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
{
struct nfs_pgio_args *argp = &data->args;
- struct nfs_writeres *resp = &data->res;
+ struct nfs_pgio_res *resp = &data->res;
struct inode *inode = data->header->inode;
int status;
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 5875001..381f832 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -489,16 +489,6 @@ struct nfs4_delegreturnres {
};
/*
- * Arguments to the read call.
- */
-struct nfs_readres {
- struct nfs4_sequence_res seq_res;
- struct nfs_fattr * fattr;
- __u32 count;
- int eof;
-};
-
-/*
* Arguments to the write call.
*/
struct nfs_write_verifier {
@@ -510,14 +500,6 @@ struct nfs_writeverf {
enum nfs3_stable_how committed;
};
-struct nfs_writeres {
- struct nfs4_sequence_res seq_res;
- struct nfs_fattr * fattr;
- struct nfs_writeverf * verf;
- __u32 count;
- const struct nfs_server *server;
-};
-
/*
* Arguments shared by the read and write call.
*/
@@ -535,6 +517,16 @@ struct nfs_pgio_args {
enum nfs3_stable_how stable; /* used by write */
};
+struct nfs_pgio_res {
+ struct nfs4_sequence_res seq_res;
+ struct nfs_fattr * fattr;
+ __u32 count;
+ int eof; /* used by read */
+ struct nfs_writeverf * verf; /* used by write */
+ const struct nfs_server *server; /* used by write */
+
+};
+
/*
* Arguments to the commit call.
*/
@@ -1261,7 +1253,7 @@ struct nfs_read_data {
struct rpc_task task;
struct nfs_fattr fattr; /* fattr storage */
struct nfs_pgio_args args;
- struct nfs_readres res;
+ struct nfs_pgio_res res;
unsigned long timestamp; /* For lease renewal */
int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
__u64 mds_offset;
@@ -1313,7 +1305,7 @@ struct nfs_write_data {
struct nfs_fattr fattr;
struct nfs_writeverf verf;
struct nfs_pgio_args args; /* argument struct */
- struct nfs_writeres res; /* result struct */
+ struct nfs_pgio_res res; /* result struct */
unsigned long timestamp; /* For lease renewal */
int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
__u64 mds_offset; /* Filelayout dense stripe */
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 02/17] NFS: Create a common results structure for reads and writes
2014-04-25 20:55 ` [PATCH v2 02/17] NFS: Create a common results " Anna Schumaker
@ 2014-05-02 13:22 ` Jeff Layton
0 siblings, 0 replies; 29+ messages in thread
From: Jeff Layton @ 2014-05-02 13:22 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On Fri, 25 Apr 2014 16:55:45 -0400
Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> Reads and writes have very similar results. This patch combines the two
> structs together with comments to show where the differing fields are
> used.
>
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
>
> v2:
> - Move the write-only variables to the end of the struct
>
> TODO:
> - Consider making a union for read and write variables
ACK. That would reduce the size a little, but that cleanup could be done later.
> ---
> fs/nfs/nfs2xdr.c | 6 +++---
> fs/nfs/nfs3xdr.c | 8 ++++----
> fs/nfs/nfs4xdr.c | 9 +++++----
> fs/nfs/read.c | 2 +-
> fs/nfs/write.c | 2 +-
> include/linux/nfs_xdr.h | 32 ++++++++++++--------------------
> 6 files changed, 26 insertions(+), 33 deletions(-)
>
> diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
> index 461cd8b..5f61b83 100644
> --- a/fs/nfs/nfs2xdr.c
> +++ b/fs/nfs/nfs2xdr.c
> @@ -103,7 +103,7 @@ static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
> /*
> * typedef opaque nfsdata<>;
> */
> -static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_readres *result)
> +static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_pgio_res *result)
> {
> u32 recvd, count;
> __be32 *p;
> @@ -857,7 +857,7 @@ out_default:
> * };
> */
> static int nfs2_xdr_dec_readres(struct rpc_rqst *req, struct xdr_stream *xdr,
> - struct nfs_readres *result)
> + struct nfs_pgio_res *result)
> {
> enum nfs_stat status;
> int error;
> @@ -878,7 +878,7 @@ out_default:
> }
>
> static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, struct xdr_stream *xdr,
> - struct nfs_writeres *result)
> + struct nfs_pgio_res *result)
> {
> /* All NFSv2 writes are "file sync" writes */
> result->verf->committed = NFS_FILE_SYNC;
> diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
> index 02f16c2..8f4cbe7 100644
> --- a/fs/nfs/nfs3xdr.c
> +++ b/fs/nfs/nfs3xdr.c
> @@ -1589,7 +1589,7 @@ out_default:
> * };
> */
> static int decode_read3resok(struct xdr_stream *xdr,
> - struct nfs_readres *result)
> + struct nfs_pgio_res *result)
> {
> u32 eof, count, ocount, recvd;
> __be32 *p;
> @@ -1625,7 +1625,7 @@ out_overflow:
> }
>
> static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr,
> - struct nfs_readres *result)
> + struct nfs_pgio_res *result)
> {
> enum nfs_stat status;
> int error;
> @@ -1673,7 +1673,7 @@ out_status:
> * };
> */
> static int decode_write3resok(struct xdr_stream *xdr,
> - struct nfs_writeres *result)
> + struct nfs_pgio_res *result)
> {
> __be32 *p;
>
> @@ -1697,7 +1697,7 @@ out_eio:
> }
>
> static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr,
> - struct nfs_writeres *result)
> + struct nfs_pgio_res *result)
> {
> enum nfs_stat status;
> int error;
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index 032159c..939ae60 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -5087,7 +5087,8 @@ static int decode_putrootfh(struct xdr_stream *xdr)
> return decode_op_hdr(xdr, OP_PUTROOTFH);
> }
>
> -static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_readres *res)
> +static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req,
> + struct nfs_pgio_res *res)
> {
> __be32 *p;
> uint32_t count, eof, recvd;
> @@ -5341,7 +5342,7 @@ static int decode_setclientid_confirm(struct xdr_stream *xdr)
> return decode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM);
> }
>
> -static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)
> +static int decode_write(struct xdr_stream *xdr, struct nfs_pgio_res *res)
> {
> __be32 *p;
> int status;
> @@ -6638,7 +6639,7 @@ out:
> * Decode Read response
> */
> static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
> - struct nfs_readres *res)
> + struct nfs_pgio_res *res)
> {
> struct compound_hdr hdr;
> int status;
> @@ -6663,7 +6664,7 @@ out:
> * Decode WRITE response
> */
> static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
> - struct nfs_writeres *res)
> + struct nfs_pgio_res *res)
> {
> struct compound_hdr hdr;
> int status;
> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
> index 46d5552..473bba3 100644
> --- a/fs/nfs/read.c
> +++ b/fs/nfs/read.c
> @@ -471,7 +471,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
> static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
> {
> struct nfs_pgio_args *argp = &data->args;
> - struct nfs_readres *resp = &data->res;
> + struct nfs_pgio_res *resp = &data->res;
>
> /* This is a short read! */
> nfs_inc_stats(data->header->inode, NFSIOS_SHORTREAD);
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index 25ba383..d392a70 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -1389,7 +1389,7 @@ static int nfs_should_remove_suid(const struct inode *inode)
> void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
> {
> struct nfs_pgio_args *argp = &data->args;
> - struct nfs_writeres *resp = &data->res;
> + struct nfs_pgio_res *resp = &data->res;
> struct inode *inode = data->header->inode;
> int status;
>
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 5875001..381f832 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -489,16 +489,6 @@ struct nfs4_delegreturnres {
> };
>
> /*
> - * Arguments to the read call.
> - */
> -struct nfs_readres {
> - struct nfs4_sequence_res seq_res;
> - struct nfs_fattr * fattr;
> - __u32 count;
> - int eof;
> -};
> -
> -/*
> * Arguments to the write call.
> */
> struct nfs_write_verifier {
> @@ -510,14 +500,6 @@ struct nfs_writeverf {
> enum nfs3_stable_how committed;
> };
>
> -struct nfs_writeres {
> - struct nfs4_sequence_res seq_res;
> - struct nfs_fattr * fattr;
> - struct nfs_writeverf * verf;
> - __u32 count;
> - const struct nfs_server *server;
> -};
> -
> /*
> * Arguments shared by the read and write call.
> */
> @@ -535,6 +517,16 @@ struct nfs_pgio_args {
> enum nfs3_stable_how stable; /* used by write */
> };
>
> +struct nfs_pgio_res {
> + struct nfs4_sequence_res seq_res;
> + struct nfs_fattr * fattr;
> + __u32 count;
> + int eof; /* used by read */
> + struct nfs_writeverf * verf; /* used by write */
> + const struct nfs_server *server; /* used by write */
> +
> +};
> +
> /*
> * Arguments to the commit call.
> */
> @@ -1261,7 +1253,7 @@ struct nfs_read_data {
> struct rpc_task task;
> struct nfs_fattr fattr; /* fattr storage */
> struct nfs_pgio_args args;
> - struct nfs_readres res;
> + struct nfs_pgio_res res;
> unsigned long timestamp; /* For lease renewal */
> int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
> __u64 mds_offset;
> @@ -1313,7 +1305,7 @@ struct nfs_write_data {
> struct nfs_fattr fattr;
> struct nfs_writeverf verf;
> struct nfs_pgio_args args; /* argument struct */
> - struct nfs_writeres res; /* result struct */
> + struct nfs_pgio_res res; /* result struct */
> unsigned long timestamp; /* For lease renewal */
> int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
> __u64 mds_offset; /* Filelayout dense stripe */
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 03/17] NFS: Create a common read and write data struct
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 01/17] NFS: Create a common argument structure for " Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 02/17] NFS: Create a common results " Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-05-02 18:59 ` Jeff Layton
2014-04-25 20:55 ` [PATCH v2 04/17] NFS: Create a common read and write header struct Anna Schumaker
` (14 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
At this point, the only difference between nfs_read_data and
nfs_write_data is the write verifier.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/blocklayout/blocklayout.c | 22 ++++++++++----------
fs/nfs/internal.h | 10 ++++-----
fs/nfs/nfs3proc.c | 12 +++++------
fs/nfs/nfs4_fs.h | 4 ++--
fs/nfs/nfs4filelayout.c | 34 +++++++++++++++----------------
fs/nfs/nfs4proc.c | 30 +++++++++++++--------------
fs/nfs/nfs4trace.h | 8 ++++----
fs/nfs/objlayout/objio_osd.c | 6 +++---
fs/nfs/objlayout/objlayout.c | 16 +++++++--------
fs/nfs/objlayout/objlayout.h | 8 ++++----
fs/nfs/pnfs.c | 26 ++++++++++++------------
fs/nfs/pnfs.h | 10 ++++-----
fs/nfs/proc.c | 12 +++++------
fs/nfs/read.c | 32 ++++++++++++++---------------
fs/nfs/write.c | 36 ++++++++++++++++----------------
include/linux/nfs_fs.h | 4 ++--
include/linux/nfs_xdr.h | 44 ++++++++++++++--------------------------
17 files changed, 150 insertions(+), 164 deletions(-)
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 65d849b..206cc68 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -210,7 +210,7 @@ static void bl_end_io_read(struct bio *bio, int err)
SetPageUptodate(bvec->bv_page);
if (err) {
- struct nfs_read_data *rdata = par->data;
+ struct nfs_pgio_data *rdata = par->data;
struct nfs_pgio_header *header = rdata->header;
if (!header->pnfs_error)
@@ -224,17 +224,17 @@ static void bl_end_io_read(struct bio *bio, int err)
static void bl_read_cleanup(struct work_struct *work)
{
struct rpc_task *task;
- struct nfs_read_data *rdata;
+ struct nfs_pgio_data *rdata;
dprintk("%s enter\n", __func__);
task = container_of(work, struct rpc_task, u.tk_work);
- rdata = container_of(task, struct nfs_read_data, task);
+ rdata = container_of(task, struct nfs_pgio_data, task);
pnfs_ld_read_done(rdata);
}
static void
bl_end_par_io_read(void *data, int unused)
{
- struct nfs_read_data *rdata = data;
+ struct nfs_pgio_data *rdata = data;
rdata->task.tk_status = rdata->header->pnfs_error;
INIT_WORK(&rdata->task.u.tk_work, bl_read_cleanup);
@@ -242,7 +242,7 @@ bl_end_par_io_read(void *data, int unused)
}
static enum pnfs_try_status
-bl_read_pagelist(struct nfs_read_data *rdata)
+bl_read_pagelist(struct nfs_pgio_data *rdata)
{
struct nfs_pgio_header *header = rdata->header;
int i, hole;
@@ -390,7 +390,7 @@ static void bl_end_io_write_zero(struct bio *bio, int err)
}
if (unlikely(err)) {
- struct nfs_write_data *data = par->data;
+ struct nfs_pgio_data *data = par->data;
struct nfs_pgio_header *header = data->header;
if (!header->pnfs_error)
@@ -405,7 +405,7 @@ static void bl_end_io_write(struct bio *bio, int err)
{
struct parallel_io *par = bio->bi_private;
const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
- struct nfs_write_data *data = par->data;
+ struct nfs_pgio_data *data = par->data;
struct nfs_pgio_header *header = data->header;
if (!uptodate) {
@@ -423,10 +423,10 @@ static void bl_end_io_write(struct bio *bio, int err)
static void bl_write_cleanup(struct work_struct *work)
{
struct rpc_task *task;
- struct nfs_write_data *wdata;
+ struct nfs_pgio_data *wdata;
dprintk("%s enter\n", __func__);
task = container_of(work, struct rpc_task, u.tk_work);
- wdata = container_of(task, struct nfs_write_data, task);
+ wdata = container_of(task, struct nfs_pgio_data, task);
if (likely(!wdata->header->pnfs_error)) {
/* Marks for LAYOUTCOMMIT */
mark_extents_written(BLK_LSEG2EXT(wdata->header->lseg),
@@ -438,7 +438,7 @@ static void bl_write_cleanup(struct work_struct *work)
/* Called when last of bios associated with a bl_write_pagelist call finishes */
static void bl_end_par_io_write(void *data, int num_se)
{
- struct nfs_write_data *wdata = data;
+ struct nfs_pgio_data *wdata = data;
if (unlikely(wdata->header->pnfs_error)) {
bl_free_short_extents(&BLK_LSEG2EXT(wdata->header->lseg)->bl_inval,
@@ -673,7 +673,7 @@ check_page:
}
static enum pnfs_try_status
-bl_write_pagelist(struct nfs_write_data *wdata, int sync)
+bl_write_pagelist(struct nfs_pgio_data *wdata, int sync)
{
struct nfs_pgio_header *header = wdata->header;
int i, ret, npg_zero, pg_index, last = 0;
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 98fe618..af01b80 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -401,13 +401,13 @@ extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
struct inode *inode, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops);
extern int nfs_initiate_read(struct rpc_clnt *clnt,
- struct nfs_read_data *data,
+ struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops, int flags);
extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
-extern void nfs_readdata_release(struct nfs_read_data *rdata);
+extern void nfs_readdata_release(struct nfs_pgio_data *rdata);
/* super.c */
void nfs_clone_super(struct super_block *, struct nfs_mount_info *);
@@ -429,10 +429,10 @@ extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
-extern void nfs_writedata_release(struct nfs_write_data *wdata);
+extern void nfs_writedata_release(struct nfs_pgio_data *wdata);
extern void nfs_commit_free(struct nfs_commit_data *p);
extern int nfs_initiate_write(struct rpc_clnt *clnt,
- struct nfs_write_data *data,
+ struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops,
int how, int flags);
extern void nfs_write_prepare(struct rpc_task *task, void *calldata);
@@ -492,7 +492,7 @@ static inline void nfs_inode_dio_wait(struct inode *inode)
extern ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq);
/* nfs4proc.c */
-extern void __nfs4_read_done_cb(struct nfs_read_data *);
+extern void __nfs4_read_done_cb(struct nfs_pgio_data *);
extern struct nfs_client *nfs4_init_client(struct nfs_client *clp,
const struct rpc_timeout *timeparms,
const char *ip_addr);
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index d873241..d235369 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -795,7 +795,7 @@ nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
return status;
}
-static int nfs3_read_done(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs3_read_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct inode *inode = data->header->inode;
@@ -807,18 +807,18 @@ static int nfs3_read_done(struct rpc_task *task, struct nfs_read_data *data)
return 0;
}
-static void nfs3_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
+static void nfs3_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ];
}
-static int nfs3_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs3_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
rpc_call_start(task);
return 0;
}
-static int nfs3_write_done(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs3_write_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct inode *inode = data->header->inode;
@@ -829,12 +829,12 @@ static int nfs3_write_done(struct rpc_task *task, struct nfs_write_data *data)
return 0;
}
-static void nfs3_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
+static void nfs3_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_WRITE];
}
-static int nfs3_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs3_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
rpc_call_start(task);
return 0;
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index e1d1bad..f63cb87 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -337,7 +337,7 @@ nfs4_state_protect(struct nfs_client *clp, unsigned long sp4_mode,
*/
static inline void
nfs4_state_protect_write(struct nfs_client *clp, struct rpc_clnt **clntp,
- struct rpc_message *msg, struct nfs_write_data *wdata)
+ struct rpc_message *msg, struct nfs_pgio_data *wdata)
{
if (_nfs4_state_protect(clp, NFS_SP4_MACH_CRED_WRITE, clntp, msg) &&
!test_bit(NFS_SP4_MACH_CRED_COMMIT, &clp->cl_sp4_flags))
@@ -369,7 +369,7 @@ nfs4_state_protect(struct nfs_client *clp, unsigned long sp4_flags,
static inline void
nfs4_state_protect_write(struct nfs_client *clp, struct rpc_clnt **clntp,
- struct rpc_message *msg, struct nfs_write_data *wdata)
+ struct rpc_message *msg, struct nfs_pgio_data *wdata)
{
}
#endif /* CONFIG_NFS_V4_1 */
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index b9a35c0..e693614 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -84,7 +84,7 @@ filelayout_get_dserver_offset(struct pnfs_layout_segment *lseg, loff_t offset)
BUG();
}
-static void filelayout_reset_write(struct nfs_write_data *data)
+static void filelayout_reset_write(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
struct rpc_task *task = &data->task;
@@ -105,7 +105,7 @@ static void filelayout_reset_write(struct nfs_write_data *data)
}
}
-static void filelayout_reset_read(struct nfs_read_data *data)
+static void filelayout_reset_read(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
struct rpc_task *task = &data->task;
@@ -243,7 +243,7 @@ wait_on_recovery:
/* NFS_PROTO call done callback routines */
static int filelayout_read_done_cb(struct rpc_task *task,
- struct nfs_read_data *data)
+ struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
int err;
@@ -270,7 +270,7 @@ static int filelayout_read_done_cb(struct rpc_task *task,
* rfc5661 is not clear about which credential should be used.
*/
static void
-filelayout_set_layoutcommit(struct nfs_write_data *wdata)
+filelayout_set_layoutcommit(struct nfs_pgio_data *wdata)
{
struct nfs_pgio_header *hdr = wdata->header;
@@ -305,7 +305,7 @@ filelayout_reset_to_mds(struct pnfs_layout_segment *lseg)
*/
static void filelayout_read_prepare(struct rpc_task *task, void *data)
{
- struct nfs_read_data *rdata = data;
+ struct nfs_pgio_data *rdata = data;
if (unlikely(test_bit(NFS_CONTEXT_BAD, &rdata->args.context->flags))) {
rpc_exit(task, -EIO);
@@ -317,7 +317,7 @@ static void filelayout_read_prepare(struct rpc_task *task, void *data)
rpc_exit(task, 0);
return;
}
- rdata->read_done_cb = filelayout_read_done_cb;
+ rdata->pgio_done_cb = filelayout_read_done_cb;
if (nfs41_setup_sequence(rdata->ds_clp->cl_session,
&rdata->args.seq_args,
@@ -331,7 +331,7 @@ static void filelayout_read_prepare(struct rpc_task *task, void *data)
static void filelayout_read_call_done(struct rpc_task *task, void *data)
{
- struct nfs_read_data *rdata = data;
+ struct nfs_pgio_data *rdata = data;
dprintk("--> %s task->tk_status %d\n", __func__, task->tk_status);
@@ -347,14 +347,14 @@ static void filelayout_read_call_done(struct rpc_task *task, void *data)
static void filelayout_read_count_stats(struct rpc_task *task, void *data)
{
- struct nfs_read_data *rdata = data;
+ struct nfs_pgio_data *rdata = data;
rpc_count_iostats(task, NFS_SERVER(rdata->header->inode)->client->cl_metrics);
}
static void filelayout_read_release(void *data)
{
- struct nfs_read_data *rdata = data;
+ struct nfs_pgio_data *rdata = data;
struct pnfs_layout_hdr *lo = rdata->header->lseg->pls_layout;
filelayout_fenceme(lo->plh_inode, lo);
@@ -363,7 +363,7 @@ static void filelayout_read_release(void *data)
}
static int filelayout_write_done_cb(struct rpc_task *task,
- struct nfs_write_data *data)
+ struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
int err;
@@ -419,7 +419,7 @@ static int filelayout_commit_done_cb(struct rpc_task *task,
static void filelayout_write_prepare(struct rpc_task *task, void *data)
{
- struct nfs_write_data *wdata = data;
+ struct nfs_pgio_data *wdata = data;
if (unlikely(test_bit(NFS_CONTEXT_BAD, &wdata->args.context->flags))) {
rpc_exit(task, -EIO);
@@ -443,7 +443,7 @@ static void filelayout_write_prepare(struct rpc_task *task, void *data)
static void filelayout_write_call_done(struct rpc_task *task, void *data)
{
- struct nfs_write_data *wdata = data;
+ struct nfs_pgio_data *wdata = data;
if (test_bit(NFS_IOHDR_REDO, &wdata->header->flags) &&
task->tk_status == 0) {
@@ -457,14 +457,14 @@ static void filelayout_write_call_done(struct rpc_task *task, void *data)
static void filelayout_write_count_stats(struct rpc_task *task, void *data)
{
- struct nfs_write_data *wdata = data;
+ struct nfs_pgio_data *wdata = data;
rpc_count_iostats(task, NFS_SERVER(wdata->header->inode)->client->cl_metrics);
}
static void filelayout_write_release(void *data)
{
- struct nfs_write_data *wdata = data;
+ struct nfs_pgio_data *wdata = data;
struct pnfs_layout_hdr *lo = wdata->header->lseg->pls_layout;
filelayout_fenceme(lo->plh_inode, lo);
@@ -529,7 +529,7 @@ static const struct rpc_call_ops filelayout_commit_call_ops = {
};
static enum pnfs_try_status
-filelayout_read_pagelist(struct nfs_read_data *data)
+filelayout_read_pagelist(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
struct pnfs_layout_segment *lseg = hdr->lseg;
@@ -575,7 +575,7 @@ filelayout_read_pagelist(struct nfs_read_data *data)
/* Perform async writes. */
static enum pnfs_try_status
-filelayout_write_pagelist(struct nfs_write_data *data, int sync)
+filelayout_write_pagelist(struct nfs_pgio_data *data, int sync)
{
struct nfs_pgio_header *hdr = data->header;
struct pnfs_layout_segment *lseg = hdr->lseg;
@@ -600,7 +600,7 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync)
__func__, hdr->inode->i_ino, sync, (size_t) data->args.count,
offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count));
- data->write_done_cb = filelayout_write_done_cb;
+ data->pgio_done_cb = filelayout_write_done_cb;
atomic_inc(&ds->ds_clp->cl_count);
data->ds_clp = ds->ds_clp;
fh = nfs4_fl_select_ds_fh(lseg, j);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 4794ca6..e793aa9 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4033,12 +4033,12 @@ static bool nfs4_error_stateid_expired(int err)
return false;
}
-void __nfs4_read_done_cb(struct nfs_read_data *data)
+void __nfs4_read_done_cb(struct nfs_pgio_data *data)
{
nfs_invalidate_atime(data->header->inode);
}
-static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct nfs_server *server = NFS_SERVER(data->header->inode);
@@ -4068,7 +4068,7 @@ static bool nfs4_read_stateid_changed(struct rpc_task *task,
return true;
}
-static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
dprintk("--> %s\n", __func__);
@@ -4077,19 +4077,19 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
return -EAGAIN;
if (nfs4_read_stateid_changed(task, &data->args))
return -EAGAIN;
- return data->read_done_cb ? data->read_done_cb(task, data) :
+ return data->pgio_done_cb ? data->pgio_done_cb(task, data) :
nfs4_read_done_cb(task, data);
}
-static void nfs4_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
+static void nfs4_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
{
data->timestamp = jiffies;
- data->read_done_cb = nfs4_read_done_cb;
+ data->pgio_done_cb = nfs4_read_done_cb;
msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0);
}
-static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
if (nfs4_setup_sequence(NFS_SERVER(data->header->inode),
&data->args.seq_args,
@@ -4104,7 +4104,7 @@ static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_dat
return 0;
}
-static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct inode *inode = data->header->inode;
@@ -4134,18 +4134,18 @@ static bool nfs4_write_stateid_changed(struct rpc_task *task,
return true;
}
-static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs4_write_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
if (!nfs4_sequence_done(task, &data->res.seq_res))
return -EAGAIN;
if (nfs4_write_stateid_changed(task, &data->args))
return -EAGAIN;
- return data->write_done_cb ? data->write_done_cb(task, data) :
+ return data->pgio_done_cb ? data->pgio_done_cb(task, data) :
nfs4_write_done_cb(task, data);
}
static
-bool nfs4_write_need_cache_consistency_data(const struct nfs_write_data *data)
+bool nfs4_write_need_cache_consistency_data(const struct nfs_pgio_data *data)
{
const struct nfs_pgio_header *hdr = data->header;
@@ -4158,7 +4158,7 @@ bool nfs4_write_need_cache_consistency_data(const struct nfs_write_data *data)
return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0;
}
-static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
+static void nfs4_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
{
struct nfs_server *server = NFS_SERVER(data->header->inode);
@@ -4168,8 +4168,8 @@ static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_messag
} else
data->args.bitmask = server->cache_consistency_bitmask;
- if (!data->write_done_cb)
- data->write_done_cb = nfs4_write_done_cb;
+ if (!data->pgio_done_cb)
+ data->pgio_done_cb = nfs4_write_done_cb;
data->res.server = server;
data->timestamp = jiffies;
@@ -4177,7 +4177,7 @@ static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_messag
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
}
-static int nfs4_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs4_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
if (nfs4_setup_sequence(NFS_SERVER(data->header->inode),
&data->args.seq_args,
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h
index 849cf14..0a744f3 100644
--- a/fs/nfs/nfs4trace.h
+++ b/fs/nfs/nfs4trace.h
@@ -932,7 +932,7 @@ DEFINE_NFS4_IDMAP_EVENT(nfs4_map_gid_to_group);
DECLARE_EVENT_CLASS(nfs4_read_event,
TP_PROTO(
- const struct nfs_read_data *data,
+ const struct nfs_pgio_data *data,
int error
),
@@ -972,7 +972,7 @@ DECLARE_EVENT_CLASS(nfs4_read_event,
#define DEFINE_NFS4_READ_EVENT(name) \
DEFINE_EVENT(nfs4_read_event, name, \
TP_PROTO( \
- const struct nfs_read_data *data, \
+ const struct nfs_pgio_data *data, \
int error \
), \
TP_ARGS(data, error))
@@ -983,7 +983,7 @@ DEFINE_NFS4_READ_EVENT(nfs4_pnfs_read);
DECLARE_EVENT_CLASS(nfs4_write_event,
TP_PROTO(
- const struct nfs_write_data *data,
+ const struct nfs_pgio_data *data,
int error
),
@@ -1024,7 +1024,7 @@ DECLARE_EVENT_CLASS(nfs4_write_event,
#define DEFINE_NFS4_WRITE_EVENT(name) \
DEFINE_EVENT(nfs4_write_event, name, \
TP_PROTO( \
- const struct nfs_write_data *data, \
+ const struct nfs_pgio_data *data, \
int error \
), \
TP_ARGS(data, error))
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
index 5457745..426b366 100644
--- a/fs/nfs/objlayout/objio_osd.c
+++ b/fs/nfs/objlayout/objio_osd.c
@@ -439,7 +439,7 @@ static void _read_done(struct ore_io_state *ios, void *private)
objlayout_read_done(&objios->oir, status, objios->sync);
}
-int objio_read_pagelist(struct nfs_read_data *rdata)
+int objio_read_pagelist(struct nfs_pgio_data *rdata)
{
struct nfs_pgio_header *hdr = rdata->header;
struct objio_state *objios;
@@ -487,7 +487,7 @@ static void _write_done(struct ore_io_state *ios, void *private)
static struct page *__r4w_get_page(void *priv, u64 offset, bool *uptodate)
{
struct objio_state *objios = priv;
- struct nfs_write_data *wdata = objios->oir.rpcdata;
+ struct nfs_pgio_data *wdata = objios->oir.rpcdata;
struct address_space *mapping = wdata->header->inode->i_mapping;
pgoff_t index = offset / PAGE_SIZE;
struct page *page;
@@ -531,7 +531,7 @@ static const struct _ore_r4w_op _r4w_op = {
.put_page = &__r4w_put_page,
};
-int objio_write_pagelist(struct nfs_write_data *wdata, int how)
+int objio_write_pagelist(struct nfs_pgio_data *wdata, int how)
{
struct nfs_pgio_header *hdr = wdata->header;
struct objio_state *objios;
diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c
index e4f9cbf..2f955f6 100644
--- a/fs/nfs/objlayout/objlayout.c
+++ b/fs/nfs/objlayout/objlayout.c
@@ -229,11 +229,11 @@ objlayout_io_set_result(struct objlayout_io_res *oir, unsigned index,
static void _rpc_read_complete(struct work_struct *work)
{
struct rpc_task *task;
- struct nfs_read_data *rdata;
+ struct nfs_pgio_data *rdata;
dprintk("%s enter\n", __func__);
task = container_of(work, struct rpc_task, u.tk_work);
- rdata = container_of(task, struct nfs_read_data, task);
+ rdata = container_of(task, struct nfs_pgio_data, task);
pnfs_ld_read_done(rdata);
}
@@ -241,7 +241,7 @@ static void _rpc_read_complete(struct work_struct *work)
void
objlayout_read_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
{
- struct nfs_read_data *rdata = oir->rpcdata;
+ struct nfs_pgio_data *rdata = oir->rpcdata;
oir->status = rdata->task.tk_status = status;
if (status >= 0)
@@ -266,7 +266,7 @@ objlayout_read_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
* Perform sync or async reads.
*/
enum pnfs_try_status
-objlayout_read_pagelist(struct nfs_read_data *rdata)
+objlayout_read_pagelist(struct nfs_pgio_data *rdata)
{
struct nfs_pgio_header *hdr = rdata->header;
struct inode *inode = hdr->inode;
@@ -312,11 +312,11 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)
static void _rpc_write_complete(struct work_struct *work)
{
struct rpc_task *task;
- struct nfs_write_data *wdata;
+ struct nfs_pgio_data *wdata;
dprintk("%s enter\n", __func__);
task = container_of(work, struct rpc_task, u.tk_work);
- wdata = container_of(task, struct nfs_write_data, task);
+ wdata = container_of(task, struct nfs_pgio_data, task);
pnfs_ld_write_done(wdata);
}
@@ -324,7 +324,7 @@ static void _rpc_write_complete(struct work_struct *work)
void
objlayout_write_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
{
- struct nfs_write_data *wdata = oir->rpcdata;
+ struct nfs_pgio_data *wdata = oir->rpcdata;
oir->status = wdata->task.tk_status = status;
if (status >= 0) {
@@ -351,7 +351,7 @@ objlayout_write_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
* Perform sync or async writes.
*/
enum pnfs_try_status
-objlayout_write_pagelist(struct nfs_write_data *wdata,
+objlayout_write_pagelist(struct nfs_pgio_data *wdata,
int how)
{
struct nfs_pgio_header *hdr = wdata->header;
diff --git a/fs/nfs/objlayout/objlayout.h b/fs/nfs/objlayout/objlayout.h
index 87aa1de..01e0410 100644
--- a/fs/nfs/objlayout/objlayout.h
+++ b/fs/nfs/objlayout/objlayout.h
@@ -119,8 +119,8 @@ extern void objio_free_lseg(struct pnfs_layout_segment *lseg);
*/
extern void objio_free_result(struct objlayout_io_res *oir);
-extern int objio_read_pagelist(struct nfs_read_data *rdata);
-extern int objio_write_pagelist(struct nfs_write_data *wdata, int how);
+extern int objio_read_pagelist(struct nfs_pgio_data *rdata);
+extern int objio_write_pagelist(struct nfs_pgio_data *wdata, int how);
/*
* callback API
@@ -168,10 +168,10 @@ extern struct pnfs_layout_segment *objlayout_alloc_lseg(
extern void objlayout_free_lseg(struct pnfs_layout_segment *);
extern enum pnfs_try_status objlayout_read_pagelist(
- struct nfs_read_data *);
+ struct nfs_pgio_data *);
extern enum pnfs_try_status objlayout_write_pagelist(
- struct nfs_write_data *,
+ struct nfs_pgio_data *,
int how);
extern void objlayout_encode_layoutcommit(
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 3d5bc2b..e9cea3a 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1492,7 +1492,7 @@ int pnfs_write_done_resend_to_mds(struct inode *inode,
}
EXPORT_SYMBOL_GPL(pnfs_write_done_resend_to_mds);
-static void pnfs_ld_handle_write_error(struct nfs_write_data *data)
+static void pnfs_ld_handle_write_error(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1511,7 +1511,7 @@ static void pnfs_ld_handle_write_error(struct nfs_write_data *data)
/*
* Called by non rpc-based layout drivers
*/
-void pnfs_ld_write_done(struct nfs_write_data *data)
+void pnfs_ld_write_done(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1527,7 +1527,7 @@ EXPORT_SYMBOL_GPL(pnfs_ld_write_done);
static void
pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
- struct nfs_write_data *data)
+ struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1540,7 +1540,7 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
}
static enum pnfs_try_status
-pnfs_try_to_write_data(struct nfs_write_data *wdata,
+pnfs_try_to_write_data(struct nfs_pgio_data *wdata,
const struct rpc_call_ops *call_ops,
struct pnfs_layout_segment *lseg,
int how)
@@ -1564,7 +1564,7 @@ pnfs_try_to_write_data(struct nfs_write_data *wdata,
static void
pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *head, int how)
{
- struct nfs_write_data *data;
+ struct nfs_pgio_data *data;
const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
struct pnfs_layout_segment *lseg = desc->pg_lseg;
@@ -1572,7 +1572,7 @@ pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *he
while (!list_empty(head)) {
enum pnfs_try_status trypnfs;
- data = list_first_entry(head, struct nfs_write_data, list);
+ data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);
trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how);
@@ -1647,7 +1647,7 @@ int pnfs_read_done_resend_to_mds(struct inode *inode,
}
EXPORT_SYMBOL_GPL(pnfs_read_done_resend_to_mds);
-static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
+static void pnfs_ld_handle_read_error(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1666,7 +1666,7 @@ static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
/*
* Called by non rpc-based layout drivers
*/
-void pnfs_ld_read_done(struct nfs_read_data *data)
+void pnfs_ld_read_done(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1682,7 +1682,7 @@ EXPORT_SYMBOL_GPL(pnfs_ld_read_done);
static void
pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
- struct nfs_read_data *data)
+ struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1698,7 +1698,7 @@ pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
* Call the appropriate parallel I/O subsystem read function.
*/
static enum pnfs_try_status
-pnfs_try_to_read_data(struct nfs_read_data *rdata,
+pnfs_try_to_read_data(struct nfs_pgio_data *rdata,
const struct rpc_call_ops *call_ops,
struct pnfs_layout_segment *lseg)
{
@@ -1722,7 +1722,7 @@ pnfs_try_to_read_data(struct nfs_read_data *rdata,
static void
pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *head)
{
- struct nfs_read_data *data;
+ struct nfs_pgio_data *data;
const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
struct pnfs_layout_segment *lseg = desc->pg_lseg;
@@ -1730,7 +1730,7 @@ pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *hea
while (!list_empty(head)) {
enum pnfs_try_status trypnfs;
- data = list_first_entry(head, struct nfs_read_data, list);
+ data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);
trypnfs = pnfs_try_to_read_data(data, call_ops, lseg);
@@ -1821,7 +1821,7 @@ void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg)
EXPORT_SYMBOL_GPL(pnfs_set_lo_fail);
void
-pnfs_set_layoutcommit(struct nfs_write_data *wdata)
+pnfs_set_layoutcommit(struct nfs_pgio_data *wdata)
{
struct nfs_pgio_header *hdr = wdata->header;
struct inode *inode = hdr->inode;
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 94a9a18..0031267 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -113,8 +113,8 @@ struct pnfs_layoutdriver_type {
* Return PNFS_ATTEMPTED to indicate the layout code has attempted
* I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS
*/
- enum pnfs_try_status (*read_pagelist) (struct nfs_read_data *nfs_data);
- enum pnfs_try_status (*write_pagelist) (struct nfs_write_data *nfs_data, int how);
+ enum pnfs_try_status (*read_pagelist) (struct nfs_pgio_data *nfs_data);
+ enum pnfs_try_status (*write_pagelist) (struct nfs_pgio_data *nfs_data, int how);
void (*free_deviceid_node) (struct nfs4_deviceid_node *);
@@ -212,13 +212,13 @@ bool pnfs_roc(struct inode *ino);
void pnfs_roc_release(struct inode *ino);
void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);
bool pnfs_roc_drain(struct inode *ino, u32 *barrier, struct rpc_task *task);
-void pnfs_set_layoutcommit(struct nfs_write_data *wdata);
+void pnfs_set_layoutcommit(struct nfs_pgio_data *wdata);
void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data);
int pnfs_layoutcommit_inode(struct inode *inode, bool sync);
int _pnfs_return_layout(struct inode *);
int pnfs_commit_and_return_layout(struct inode *);
-void pnfs_ld_write_done(struct nfs_write_data *);
-void pnfs_ld_read_done(struct nfs_read_data *);
+void pnfs_ld_write_done(struct nfs_pgio_data *);
+void pnfs_ld_read_done(struct nfs_pgio_data *);
struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino,
struct nfs_open_context *ctx,
loff_t pos,
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index 8cc227f..c54829e 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -578,7 +578,7 @@ nfs_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
return 0;
}
-static int nfs_read_done(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs_read_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct inode *inode = data->header->inode;
@@ -594,18 +594,18 @@ static int nfs_read_done(struct rpc_task *task, struct nfs_read_data *data)
return 0;
}
-static void nfs_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
+static void nfs_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
{
msg->rpc_proc = &nfs_procedures[NFSPROC_READ];
}
-static int nfs_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_data *data)
+static int nfs_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
rpc_call_start(task);
return 0;
}
-static int nfs_write_done(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs_write_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct inode *inode = data->header->inode;
@@ -614,14 +614,14 @@ static int nfs_write_done(struct rpc_task *task, struct nfs_write_data *data)
return 0;
}
-static void nfs_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
+static void nfs_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
{
/* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */
data->args.stable = NFS_FILE_SYNC;
msg->rpc_proc = &nfs_procedures[NFSPROC_WRITE];
}
-static int nfs_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_write_data *data)
+static int nfs_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
rpc_call_start(task);
return 0;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 473bba3..9e426cc 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -51,10 +51,10 @@ struct nfs_read_header *nfs_readhdr_alloc(void)
}
EXPORT_SYMBOL_GPL(nfs_readhdr_alloc);
-static struct nfs_read_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
+static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
unsigned int pagecount)
{
- struct nfs_read_data *data, *prealloc;
+ struct nfs_pgio_data *data, *prealloc;
prealloc = &container_of(hdr, struct nfs_read_header, header)->rpc_data;
if (prealloc->header == NULL)
@@ -84,7 +84,7 @@ void nfs_readhdr_free(struct nfs_pgio_header *hdr)
}
EXPORT_SYMBOL_GPL(nfs_readhdr_free);
-void nfs_readdata_release(struct nfs_read_data *rdata)
+void nfs_readdata_release(struct nfs_pgio_data *rdata)
{
struct nfs_pgio_header *hdr = rdata->header;
struct nfs_read_header *read_header = container_of(hdr, struct nfs_read_header, header);
@@ -212,7 +212,7 @@ out:
}
int nfs_initiate_read(struct rpc_clnt *clnt,
- struct nfs_read_data *data,
+ struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops, int flags)
{
struct inode *inode = data->header->inode;
@@ -255,7 +255,7 @@ EXPORT_SYMBOL_GPL(nfs_initiate_read);
/*
* Set up the NFS read request struct
*/
-static void nfs_read_rpcsetup(struct nfs_read_data *data,
+static void nfs_read_rpcsetup(struct nfs_pgio_data *data,
unsigned int count, unsigned int offset)
{
struct nfs_page *req = data->header->req;
@@ -274,7 +274,7 @@ static void nfs_read_rpcsetup(struct nfs_read_data *data,
nfs_fattr_init(&data->fattr);
}
-static int nfs_do_read(struct nfs_read_data *data,
+static int nfs_do_read(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops)
{
struct inode *inode = data->header->inode;
@@ -286,13 +286,13 @@ static int
nfs_do_multiple_reads(struct list_head *head,
const struct rpc_call_ops *call_ops)
{
- struct nfs_read_data *data;
+ struct nfs_pgio_data *data;
int ret = 0;
while (!list_empty(head)) {
int ret2;
- data = list_first_entry(head, struct nfs_read_data, list);
+ data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);
ret2 = nfs_do_read(data, call_ops);
@@ -324,8 +324,8 @@ static void nfs_pagein_error(struct nfs_pageio_descriptor *desc,
{
set_bit(NFS_IOHDR_REDO, &hdr->flags);
while (!list_empty(&hdr->rpc_list)) {
- struct nfs_read_data *data = list_first_entry(&hdr->rpc_list,
- struct nfs_read_data, list);
+ struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
+ struct nfs_pgio_data, list);
list_del(&data->list);
nfs_readdata_release(data);
}
@@ -350,7 +350,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
{
struct nfs_page *req = hdr->req;
struct page *page = req->wb_page;
- struct nfs_read_data *data;
+ struct nfs_pgio_data *data;
size_t rsize = desc->pg_bsize, nbytes;
unsigned int offset;
@@ -382,7 +382,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
{
struct nfs_page *req;
struct page **pages;
- struct nfs_read_data *data;
+ struct nfs_pgio_data *data;
struct list_head *head = &desc->pg_list;
data = nfs_readdata_alloc(hdr, nfs_page_array_len(desc->pg_base,
@@ -447,7 +447,7 @@ static const struct nfs_pageio_ops nfs_pageio_read_ops = {
* This is the callback from RPC telling us whether a reply was
* received or some error occurred (timeout or socket shutdown).
*/
-int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
+int nfs_readpage_result(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct inode *inode = data->header->inode;
int status;
@@ -468,7 +468,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
return 0;
}
-static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
+static void nfs_readpage_retry(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct nfs_pgio_args *argp = &data->args;
struct nfs_pgio_res *resp = &data->res;
@@ -490,7 +490,7 @@ static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data
static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
{
- struct nfs_read_data *data = calldata;
+ struct nfs_pgio_data *data = calldata;
struct nfs_pgio_header *hdr = data->header;
/* Note the only returns of nfs_readpage_result are 0 and -EAGAIN */
@@ -520,7 +520,7 @@ static void nfs_readpage_release_common(void *calldata)
void nfs_read_prepare(struct rpc_task *task, void *calldata)
{
- struct nfs_read_data *data = calldata;
+ struct nfs_pgio_data *data = calldata;
int err;
err = NFS_PROTO(data->header->inode)->read_rpc_prepare(task, data);
if (err)
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index d392a70..3a2fc5c 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -88,10 +88,10 @@ struct nfs_write_header *nfs_writehdr_alloc(void)
}
EXPORT_SYMBOL_GPL(nfs_writehdr_alloc);
-static struct nfs_write_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
+static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
unsigned int pagecount)
{
- struct nfs_write_data *data, *prealloc;
+ struct nfs_pgio_data *data, *prealloc;
prealloc = &container_of(hdr, struct nfs_write_header, header)->rpc_data;
if (prealloc->header == NULL)
@@ -120,7 +120,7 @@ void nfs_writehdr_free(struct nfs_pgio_header *hdr)
}
EXPORT_SYMBOL_GPL(nfs_writehdr_free);
-void nfs_writedata_release(struct nfs_write_data *wdata)
+void nfs_writedata_release(struct nfs_pgio_data *wdata)
{
struct nfs_pgio_header *hdr = wdata->header;
struct nfs_write_header *write_header = container_of(hdr, struct nfs_write_header, header);
@@ -582,7 +582,7 @@ nfs_clear_request_commit(struct nfs_page *req)
}
static inline
-int nfs_write_need_commit(struct nfs_write_data *data)
+int nfs_write_need_commit(struct nfs_pgio_data *data)
{
if (data->verf.committed == NFS_DATA_SYNC)
return data->header->lseg == NULL;
@@ -613,7 +613,7 @@ nfs_clear_request_commit(struct nfs_page *req)
}
static inline
-int nfs_write_need_commit(struct nfs_write_data *data)
+int nfs_write_need_commit(struct nfs_pgio_data *data)
{
return 0;
}
@@ -990,7 +990,7 @@ static int flush_task_priority(int how)
}
int nfs_initiate_write(struct rpc_clnt *clnt,
- struct nfs_write_data *data,
+ struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops,
int how, int flags)
{
@@ -1047,7 +1047,7 @@ EXPORT_SYMBOL_GPL(nfs_initiate_write);
/*
* Set up the argument/result storage required for the RPC call.
*/
-static void nfs_write_rpcsetup(struct nfs_write_data *data,
+static void nfs_write_rpcsetup(struct nfs_pgio_data *data,
unsigned int count, unsigned int offset,
int how, struct nfs_commit_info *cinfo)
{
@@ -1082,7 +1082,7 @@ static void nfs_write_rpcsetup(struct nfs_write_data *data,
nfs_fattr_init(&data->fattr);
}
-static int nfs_do_write(struct nfs_write_data *data,
+static int nfs_do_write(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops,
int how)
{
@@ -1095,13 +1095,13 @@ static int nfs_do_multiple_writes(struct list_head *head,
const struct rpc_call_ops *call_ops,
int how)
{
- struct nfs_write_data *data;
+ struct nfs_pgio_data *data;
int ret = 0;
while (!list_empty(head)) {
int ret2;
- data = list_first_entry(head, struct nfs_write_data, list);
+ data = list_first_entry(head, struct nfs_pgio_data, list);
list_del_init(&data->list);
ret2 = nfs_do_write(data, call_ops, how);
@@ -1144,8 +1144,8 @@ static void nfs_flush_error(struct nfs_pageio_descriptor *desc,
{
set_bit(NFS_IOHDR_REDO, &hdr->flags);
while (!list_empty(&hdr->rpc_list)) {
- struct nfs_write_data *data = list_first_entry(&hdr->rpc_list,
- struct nfs_write_data, list);
+ struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
+ struct nfs_pgio_data, list);
list_del(&data->list);
nfs_writedata_release(data);
}
@@ -1161,7 +1161,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
{
struct nfs_page *req = hdr->req;
struct page *page = req->wb_page;
- struct nfs_write_data *data;
+ struct nfs_pgio_data *data;
size_t wsize = desc->pg_bsize, nbytes;
unsigned int offset;
int requests = 0;
@@ -1211,7 +1211,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
{
struct nfs_page *req;
struct page **pages;
- struct nfs_write_data *data;
+ struct nfs_pgio_data *data;
struct list_head *head = &desc->pg_list;
struct nfs_commit_info cinfo;
@@ -1305,7 +1305,7 @@ EXPORT_SYMBOL_GPL(nfs_pageio_reset_write_mds);
void nfs_write_prepare(struct rpc_task *task, void *calldata)
{
- struct nfs_write_data *data = calldata;
+ struct nfs_pgio_data *data = calldata;
int err;
err = NFS_PROTO(data->header->inode)->write_rpc_prepare(task, data);
if (err)
@@ -1328,14 +1328,14 @@ void nfs_commit_prepare(struct rpc_task *task, void *calldata)
*/
static void nfs_writeback_done_common(struct rpc_task *task, void *calldata)
{
- struct nfs_write_data *data = calldata;
+ struct nfs_pgio_data *data = calldata;
nfs_writeback_done(task, data);
}
static void nfs_writeback_release_common(void *calldata)
{
- struct nfs_write_data *data = calldata;
+ struct nfs_pgio_data *data = calldata;
struct nfs_pgio_header *hdr = data->header;
int status = data->task.tk_status;
@@ -1386,7 +1386,7 @@ static int nfs_should_remove_suid(const struct inode *inode)
/*
* This function is called when the WRITE call is complete.
*/
-void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
+void nfs_writeback_done(struct rpc_task *task, struct nfs_pgio_data *data)
{
struct nfs_pgio_args *argp = &data->args;
struct nfs_pgio_res *resp = &data->res;
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index fa6918b..7e0db56 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -520,7 +520,7 @@ extern int nfs_writepage(struct page *page, struct writeback_control *wbc);
extern int nfs_writepages(struct address_space *, struct writeback_control *);
extern int nfs_flush_incompatible(struct file *file, struct page *page);
extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
-extern void nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
+extern void nfs_writeback_done(struct rpc_task *, struct nfs_pgio_data *);
/*
* Try to write back everything synchronously (but check the
@@ -553,7 +553,7 @@ nfs_have_writebacks(struct inode *inode)
extern int nfs_readpage(struct file *, struct page *);
extern int nfs_readpages(struct file *, struct address_space *,
struct list_head *, unsigned);
-extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
+extern int nfs_readpage_result(struct rpc_task *, struct nfs_pgio_data *);
extern int nfs_readpage_async(struct nfs_open_context *, struct inode *,
struct page *);
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 381f832..64f6f14 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1247,20 +1247,6 @@ struct nfs_page_array {
struct page *page_array[NFS_PAGEVEC_SIZE];
};
-struct nfs_read_data {
- struct nfs_pgio_header *header;
- struct list_head list;
- struct rpc_task task;
- struct nfs_fattr fattr; /* fattr storage */
- struct nfs_pgio_args args;
- struct nfs_pgio_res res;
- unsigned long timestamp; /* For lease renewal */
- int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
- __u64 mds_offset;
- struct nfs_page_array pages;
- struct nfs_client *ds_clp; /* pNFS data server */
-};
-
/* used as flag bits in nfs_pgio_header */
enum {
NFS_IOHDR_ERROR = 0,
@@ -1293,29 +1279,29 @@ struct nfs_pgio_header {
unsigned long flags;
};
-struct nfs_read_header {
- struct nfs_pgio_header header;
- struct nfs_read_data rpc_data;
-};
-
-struct nfs_write_data {
+struct nfs_pgio_data {
struct nfs_pgio_header *header;
struct list_head list;
struct rpc_task task;
struct nfs_fattr fattr;
- struct nfs_writeverf verf;
+ struct nfs_writeverf verf; /* Used for writes */
struct nfs_pgio_args args; /* argument struct */
struct nfs_pgio_res res; /* result struct */
unsigned long timestamp; /* For lease renewal */
- int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
+ int (*pgio_done_cb) (struct rpc_task *task, struct nfs_pgio_data *data);
__u64 mds_offset; /* Filelayout dense stripe */
struct nfs_page_array pages;
struct nfs_client *ds_clp; /* pNFS data server */
};
+struct nfs_read_header {
+ struct nfs_pgio_header header;
+ struct nfs_pgio_data rpc_data;
+};
+
struct nfs_write_header {
struct nfs_pgio_header header;
- struct nfs_write_data rpc_data;
+ struct nfs_pgio_data rpc_data;
struct nfs_writeverf verf;
};
@@ -1448,12 +1434,12 @@ struct nfs_rpc_ops {
struct nfs_pathconf *);
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 *);
- 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 *);
- int (*write_rpc_prepare)(struct rpc_task *, struct nfs_write_data *);
- int (*write_done) (struct rpc_task *, struct nfs_write_data *);
+ void (*read_setup) (struct nfs_pgio_data *, struct rpc_message *);
+ int (*read_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
+ int (*read_done) (struct rpc_task *, struct nfs_pgio_data *);
+ void (*write_setup) (struct nfs_pgio_data *, struct rpc_message *);
+ int (*write_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
+ int (*write_done) (struct rpc_task *, struct nfs_pgio_data *);
void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *);
void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *);
int (*commit_done) (struct rpc_task *, struct nfs_commit_data *);
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 03/17] NFS: Create a common read and write data struct
2014-04-25 20:55 ` [PATCH v2 03/17] NFS: Create a common read and write data struct Anna Schumaker
@ 2014-05-02 18:59 ` Jeff Layton
0 siblings, 0 replies; 29+ messages in thread
From: Jeff Layton @ 2014-05-02 18:59 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On Fri, 25 Apr 2014 16:55:46 -0400
Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> At this point, the only difference between nfs_read_data and
> nfs_write_data is the write verifier.
>
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
> ---
> fs/nfs/blocklayout/blocklayout.c | 22 ++++++++++----------
> fs/nfs/internal.h | 10 ++++-----
> fs/nfs/nfs3proc.c | 12 +++++------
> fs/nfs/nfs4_fs.h | 4 ++--
> fs/nfs/nfs4filelayout.c | 34 +++++++++++++++----------------
> fs/nfs/nfs4proc.c | 30 +++++++++++++--------------
> fs/nfs/nfs4trace.h | 8 ++++----
> fs/nfs/objlayout/objio_osd.c | 6 +++---
> fs/nfs/objlayout/objlayout.c | 16 +++++++--------
> fs/nfs/objlayout/objlayout.h | 8 ++++----
> fs/nfs/pnfs.c | 26 ++++++++++++------------
> fs/nfs/pnfs.h | 10 ++++-----
> fs/nfs/proc.c | 12 +++++------
> fs/nfs/read.c | 32 ++++++++++++++---------------
> fs/nfs/write.c | 36 ++++++++++++++++----------------
> include/linux/nfs_fs.h | 4 ++--
> include/linux/nfs_xdr.h | 44 ++++++++++++++--------------------------
> 17 files changed, 150 insertions(+), 164 deletions(-)
>
> diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
> index 65d849b..206cc68 100644
> --- a/fs/nfs/blocklayout/blocklayout.c
> +++ b/fs/nfs/blocklayout/blocklayout.c
> @@ -210,7 +210,7 @@ static void bl_end_io_read(struct bio *bio, int err)
> SetPageUptodate(bvec->bv_page);
>
> if (err) {
> - struct nfs_read_data *rdata = par->data;
> + struct nfs_pgio_data *rdata = par->data;
> struct nfs_pgio_header *header = rdata->header;
>
> if (!header->pnfs_error)
> @@ -224,17 +224,17 @@ static void bl_end_io_read(struct bio *bio, int err)
> static void bl_read_cleanup(struct work_struct *work)
> {
> struct rpc_task *task;
> - struct nfs_read_data *rdata;
> + struct nfs_pgio_data *rdata;
> dprintk("%s enter\n", __func__);
> task = container_of(work, struct rpc_task, u.tk_work);
> - rdata = container_of(task, struct nfs_read_data, task);
> + rdata = container_of(task, struct nfs_pgio_data, task);
> pnfs_ld_read_done(rdata);
> }
>
> static void
> bl_end_par_io_read(void *data, int unused)
> {
> - struct nfs_read_data *rdata = data;
> + struct nfs_pgio_data *rdata = data;
>
> rdata->task.tk_status = rdata->header->pnfs_error;
> INIT_WORK(&rdata->task.u.tk_work, bl_read_cleanup);
> @@ -242,7 +242,7 @@ bl_end_par_io_read(void *data, int unused)
> }
>
> static enum pnfs_try_status
> -bl_read_pagelist(struct nfs_read_data *rdata)
> +bl_read_pagelist(struct nfs_pgio_data *rdata)
> {
> struct nfs_pgio_header *header = rdata->header;
> int i, hole;
> @@ -390,7 +390,7 @@ static void bl_end_io_write_zero(struct bio *bio, int err)
> }
>
> if (unlikely(err)) {
> - struct nfs_write_data *data = par->data;
> + struct nfs_pgio_data *data = par->data;
> struct nfs_pgio_header *header = data->header;
>
> if (!header->pnfs_error)
> @@ -405,7 +405,7 @@ static void bl_end_io_write(struct bio *bio, int err)
> {
> struct parallel_io *par = bio->bi_private;
> const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
> - struct nfs_write_data *data = par->data;
> + struct nfs_pgio_data *data = par->data;
> struct nfs_pgio_header *header = data->header;
>
> if (!uptodate) {
> @@ -423,10 +423,10 @@ static void bl_end_io_write(struct bio *bio, int err)
> static void bl_write_cleanup(struct work_struct *work)
> {
> struct rpc_task *task;
> - struct nfs_write_data *wdata;
> + struct nfs_pgio_data *wdata;
> dprintk("%s enter\n", __func__);
> task = container_of(work, struct rpc_task, u.tk_work);
> - wdata = container_of(task, struct nfs_write_data, task);
> + wdata = container_of(task, struct nfs_pgio_data, task);
> if (likely(!wdata->header->pnfs_error)) {
> /* Marks for LAYOUTCOMMIT */
> mark_extents_written(BLK_LSEG2EXT(wdata->header->lseg),
> @@ -438,7 +438,7 @@ static void bl_write_cleanup(struct work_struct *work)
> /* Called when last of bios associated with a bl_write_pagelist call finishes */
> static void bl_end_par_io_write(void *data, int num_se)
> {
> - struct nfs_write_data *wdata = data;
> + struct nfs_pgio_data *wdata = data;
>
> if (unlikely(wdata->header->pnfs_error)) {
> bl_free_short_extents(&BLK_LSEG2EXT(wdata->header->lseg)->bl_inval,
> @@ -673,7 +673,7 @@ check_page:
> }
>
> static enum pnfs_try_status
> -bl_write_pagelist(struct nfs_write_data *wdata, int sync)
> +bl_write_pagelist(struct nfs_pgio_data *wdata, int sync)
> {
> struct nfs_pgio_header *header = wdata->header;
> int i, ret, npg_zero, pg_index, last = 0;
> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
> index 98fe618..af01b80 100644
> --- a/fs/nfs/internal.h
> +++ b/fs/nfs/internal.h
> @@ -401,13 +401,13 @@ extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
> struct inode *inode, bool force_mds,
> const struct nfs_pgio_completion_ops *compl_ops);
> extern int nfs_initiate_read(struct rpc_clnt *clnt,
> - struct nfs_read_data *data,
> + struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops, int flags);
> extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
> extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_header *hdr);
> extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
> -extern void nfs_readdata_release(struct nfs_read_data *rdata);
> +extern void nfs_readdata_release(struct nfs_pgio_data *rdata);
>
> /* super.c */
> void nfs_clone_super(struct super_block *, struct nfs_mount_info *);
> @@ -429,10 +429,10 @@ extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
> extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_header *hdr);
> extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
> -extern void nfs_writedata_release(struct nfs_write_data *wdata);
> +extern void nfs_writedata_release(struct nfs_pgio_data *wdata);
> extern void nfs_commit_free(struct nfs_commit_data *p);
> extern int nfs_initiate_write(struct rpc_clnt *clnt,
> - struct nfs_write_data *data,
> + struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops,
> int how, int flags);
> extern void nfs_write_prepare(struct rpc_task *task, void *calldata);
> @@ -492,7 +492,7 @@ static inline void nfs_inode_dio_wait(struct inode *inode)
> extern ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq);
>
> /* nfs4proc.c */
> -extern void __nfs4_read_done_cb(struct nfs_read_data *);
> +extern void __nfs4_read_done_cb(struct nfs_pgio_data *);
> extern struct nfs_client *nfs4_init_client(struct nfs_client *clp,
> const struct rpc_timeout *timeparms,
> const char *ip_addr);
> diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
> index d873241..d235369 100644
> --- a/fs/nfs/nfs3proc.c
> +++ b/fs/nfs/nfs3proc.c
> @@ -795,7 +795,7 @@ nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
> return status;
> }
>
> -static int nfs3_read_done(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs3_read_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct inode *inode = data->header->inode;
>
> @@ -807,18 +807,18 @@ static int nfs3_read_done(struct rpc_task *task, struct nfs_read_data *data)
> return 0;
> }
>
> -static void nfs3_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
> +static void nfs3_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
> {
> msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ];
> }
>
> -static int nfs3_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs3_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> rpc_call_start(task);
> return 0;
> }
>
> -static int nfs3_write_done(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs3_write_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct inode *inode = data->header->inode;
>
> @@ -829,12 +829,12 @@ static int nfs3_write_done(struct rpc_task *task, struct nfs_write_data *data)
> return 0;
> }
>
> -static void nfs3_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
> +static void nfs3_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
> {
> msg->rpc_proc = &nfs3_procedures[NFS3PROC_WRITE];
> }
>
> -static int nfs3_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs3_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> rpc_call_start(task);
> return 0;
> diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
> index e1d1bad..f63cb87 100644
> --- a/fs/nfs/nfs4_fs.h
> +++ b/fs/nfs/nfs4_fs.h
> @@ -337,7 +337,7 @@ nfs4_state_protect(struct nfs_client *clp, unsigned long sp4_mode,
> */
> static inline void
> nfs4_state_protect_write(struct nfs_client *clp, struct rpc_clnt **clntp,
> - struct rpc_message *msg, struct nfs_write_data *wdata)
> + struct rpc_message *msg, struct nfs_pgio_data *wdata)
> {
> if (_nfs4_state_protect(clp, NFS_SP4_MACH_CRED_WRITE, clntp, msg) &&
> !test_bit(NFS_SP4_MACH_CRED_COMMIT, &clp->cl_sp4_flags))
> @@ -369,7 +369,7 @@ nfs4_state_protect(struct nfs_client *clp, unsigned long sp4_flags,
>
> static inline void
> nfs4_state_protect_write(struct nfs_client *clp, struct rpc_clnt **clntp,
> - struct rpc_message *msg, struct nfs_write_data *wdata)
> + struct rpc_message *msg, struct nfs_pgio_data *wdata)
> {
> }
> #endif /* CONFIG_NFS_V4_1 */
> diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
> index b9a35c0..e693614 100644
> --- a/fs/nfs/nfs4filelayout.c
> +++ b/fs/nfs/nfs4filelayout.c
> @@ -84,7 +84,7 @@ filelayout_get_dserver_offset(struct pnfs_layout_segment *lseg, loff_t offset)
> BUG();
> }
>
> -static void filelayout_reset_write(struct nfs_write_data *data)
> +static void filelayout_reset_write(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
> struct rpc_task *task = &data->task;
> @@ -105,7 +105,7 @@ static void filelayout_reset_write(struct nfs_write_data *data)
> }
> }
>
> -static void filelayout_reset_read(struct nfs_read_data *data)
> +static void filelayout_reset_read(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
> struct rpc_task *task = &data->task;
> @@ -243,7 +243,7 @@ wait_on_recovery:
> /* NFS_PROTO call done callback routines */
>
> static int filelayout_read_done_cb(struct rpc_task *task,
> - struct nfs_read_data *data)
> + struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
> int err;
> @@ -270,7 +270,7 @@ static int filelayout_read_done_cb(struct rpc_task *task,
> * rfc5661 is not clear about which credential should be used.
> */
> static void
> -filelayout_set_layoutcommit(struct nfs_write_data *wdata)
> +filelayout_set_layoutcommit(struct nfs_pgio_data *wdata)
> {
> struct nfs_pgio_header *hdr = wdata->header;
>
> @@ -305,7 +305,7 @@ filelayout_reset_to_mds(struct pnfs_layout_segment *lseg)
> */
> static void filelayout_read_prepare(struct rpc_task *task, void *data)
> {
> - struct nfs_read_data *rdata = data;
> + struct nfs_pgio_data *rdata = data;
>
> if (unlikely(test_bit(NFS_CONTEXT_BAD, &rdata->args.context->flags))) {
> rpc_exit(task, -EIO);
> @@ -317,7 +317,7 @@ static void filelayout_read_prepare(struct rpc_task *task, void *data)
> rpc_exit(task, 0);
> return;
> }
> - rdata->read_done_cb = filelayout_read_done_cb;
> + rdata->pgio_done_cb = filelayout_read_done_cb;
>
> if (nfs41_setup_sequence(rdata->ds_clp->cl_session,
> &rdata->args.seq_args,
> @@ -331,7 +331,7 @@ static void filelayout_read_prepare(struct rpc_task *task, void *data)
>
> static void filelayout_read_call_done(struct rpc_task *task, void *data)
> {
> - struct nfs_read_data *rdata = data;
> + struct nfs_pgio_data *rdata = data;
>
> dprintk("--> %s task->tk_status %d\n", __func__, task->tk_status);
>
> @@ -347,14 +347,14 @@ static void filelayout_read_call_done(struct rpc_task *task, void *data)
>
> static void filelayout_read_count_stats(struct rpc_task *task, void *data)
> {
> - struct nfs_read_data *rdata = data;
> + struct nfs_pgio_data *rdata = data;
>
> rpc_count_iostats(task, NFS_SERVER(rdata->header->inode)->client->cl_metrics);
> }
>
> static void filelayout_read_release(void *data)
> {
> - struct nfs_read_data *rdata = data;
> + struct nfs_pgio_data *rdata = data;
> struct pnfs_layout_hdr *lo = rdata->header->lseg->pls_layout;
>
> filelayout_fenceme(lo->plh_inode, lo);
> @@ -363,7 +363,7 @@ static void filelayout_read_release(void *data)
> }
>
> static int filelayout_write_done_cb(struct rpc_task *task,
> - struct nfs_write_data *data)
> + struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
> int err;
> @@ -419,7 +419,7 @@ static int filelayout_commit_done_cb(struct rpc_task *task,
>
> static void filelayout_write_prepare(struct rpc_task *task, void *data)
> {
> - struct nfs_write_data *wdata = data;
> + struct nfs_pgio_data *wdata = data;
>
> if (unlikely(test_bit(NFS_CONTEXT_BAD, &wdata->args.context->flags))) {
> rpc_exit(task, -EIO);
> @@ -443,7 +443,7 @@ static void filelayout_write_prepare(struct rpc_task *task, void *data)
>
> static void filelayout_write_call_done(struct rpc_task *task, void *data)
> {
> - struct nfs_write_data *wdata = data;
> + struct nfs_pgio_data *wdata = data;
>
> if (test_bit(NFS_IOHDR_REDO, &wdata->header->flags) &&
> task->tk_status == 0) {
> @@ -457,14 +457,14 @@ static void filelayout_write_call_done(struct rpc_task *task, void *data)
>
> static void filelayout_write_count_stats(struct rpc_task *task, void *data)
> {
> - struct nfs_write_data *wdata = data;
> + struct nfs_pgio_data *wdata = data;
>
> rpc_count_iostats(task, NFS_SERVER(wdata->header->inode)->client->cl_metrics);
> }
>
> static void filelayout_write_release(void *data)
> {
> - struct nfs_write_data *wdata = data;
> + struct nfs_pgio_data *wdata = data;
> struct pnfs_layout_hdr *lo = wdata->header->lseg->pls_layout;
>
> filelayout_fenceme(lo->plh_inode, lo);
> @@ -529,7 +529,7 @@ static const struct rpc_call_ops filelayout_commit_call_ops = {
> };
>
> static enum pnfs_try_status
> -filelayout_read_pagelist(struct nfs_read_data *data)
> +filelayout_read_pagelist(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
> struct pnfs_layout_segment *lseg = hdr->lseg;
> @@ -575,7 +575,7 @@ filelayout_read_pagelist(struct nfs_read_data *data)
>
> /* Perform async writes. */
> static enum pnfs_try_status
> -filelayout_write_pagelist(struct nfs_write_data *data, int sync)
> +filelayout_write_pagelist(struct nfs_pgio_data *data, int sync)
> {
> struct nfs_pgio_header *hdr = data->header;
> struct pnfs_layout_segment *lseg = hdr->lseg;
> @@ -600,7 +600,7 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync)
> __func__, hdr->inode->i_ino, sync, (size_t) data->args.count,
> offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count));
>
> - data->write_done_cb = filelayout_write_done_cb;
> + data->pgio_done_cb = filelayout_write_done_cb;
> atomic_inc(&ds->ds_clp->cl_count);
> data->ds_clp = ds->ds_clp;
> fh = nfs4_fl_select_ds_fh(lseg, j);
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 4794ca6..e793aa9 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -4033,12 +4033,12 @@ static bool nfs4_error_stateid_expired(int err)
> return false;
> }
>
> -void __nfs4_read_done_cb(struct nfs_read_data *data)
> +void __nfs4_read_done_cb(struct nfs_pgio_data *data)
> {
> nfs_invalidate_atime(data->header->inode);
> }
>
> -static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct nfs_server *server = NFS_SERVER(data->header->inode);
>
> @@ -4068,7 +4068,7 @@ static bool nfs4_read_stateid_changed(struct rpc_task *task,
> return true;
> }
>
> -static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
>
> dprintk("--> %s\n", __func__);
> @@ -4077,19 +4077,19 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
> return -EAGAIN;
> if (nfs4_read_stateid_changed(task, &data->args))
> return -EAGAIN;
> - return data->read_done_cb ? data->read_done_cb(task, data) :
> + return data->pgio_done_cb ? data->pgio_done_cb(task, data) :
> nfs4_read_done_cb(task, data);
> }
>
> -static void nfs4_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
> +static void nfs4_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
> {
> data->timestamp = jiffies;
> - data->read_done_cb = nfs4_read_done_cb;
> + data->pgio_done_cb = nfs4_read_done_cb;
> msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
> nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0);
> }
>
> -static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> if (nfs4_setup_sequence(NFS_SERVER(data->header->inode),
> &data->args.seq_args,
> @@ -4104,7 +4104,7 @@ static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_dat
> return 0;
> }
>
> -static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct inode *inode = data->header->inode;
>
> @@ -4134,18 +4134,18 @@ static bool nfs4_write_stateid_changed(struct rpc_task *task,
> return true;
> }
>
> -static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs4_write_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> if (!nfs4_sequence_done(task, &data->res.seq_res))
> return -EAGAIN;
> if (nfs4_write_stateid_changed(task, &data->args))
> return -EAGAIN;
> - return data->write_done_cb ? data->write_done_cb(task, data) :
> + return data->pgio_done_cb ? data->pgio_done_cb(task, data) :
> nfs4_write_done_cb(task, data);
> }
>
> static
> -bool nfs4_write_need_cache_consistency_data(const struct nfs_write_data *data)
> +bool nfs4_write_need_cache_consistency_data(const struct nfs_pgio_data *data)
> {
> const struct nfs_pgio_header *hdr = data->header;
>
> @@ -4158,7 +4158,7 @@ bool nfs4_write_need_cache_consistency_data(const struct nfs_write_data *data)
> return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0;
> }
>
> -static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
> +static void nfs4_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
> {
> struct nfs_server *server = NFS_SERVER(data->header->inode);
>
> @@ -4168,8 +4168,8 @@ static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_messag
> } else
> data->args.bitmask = server->cache_consistency_bitmask;
>
> - if (!data->write_done_cb)
> - data->write_done_cb = nfs4_write_done_cb;
> + if (!data->pgio_done_cb)
> + data->pgio_done_cb = nfs4_write_done_cb;
> data->res.server = server;
> data->timestamp = jiffies;
>
> @@ -4177,7 +4177,7 @@ static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_messag
> nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
> }
>
> -static int nfs4_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs4_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> if (nfs4_setup_sequence(NFS_SERVER(data->header->inode),
> &data->args.seq_args,
> diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h
> index 849cf14..0a744f3 100644
> --- a/fs/nfs/nfs4trace.h
> +++ b/fs/nfs/nfs4trace.h
> @@ -932,7 +932,7 @@ DEFINE_NFS4_IDMAP_EVENT(nfs4_map_gid_to_group);
>
> DECLARE_EVENT_CLASS(nfs4_read_event,
> TP_PROTO(
> - const struct nfs_read_data *data,
> + const struct nfs_pgio_data *data,
> int error
> ),
>
> @@ -972,7 +972,7 @@ DECLARE_EVENT_CLASS(nfs4_read_event,
> #define DEFINE_NFS4_READ_EVENT(name) \
> DEFINE_EVENT(nfs4_read_event, name, \
> TP_PROTO( \
> - const struct nfs_read_data *data, \
> + const struct nfs_pgio_data *data, \
> int error \
> ), \
> TP_ARGS(data, error))
> @@ -983,7 +983,7 @@ DEFINE_NFS4_READ_EVENT(nfs4_pnfs_read);
>
> DECLARE_EVENT_CLASS(nfs4_write_event,
> TP_PROTO(
> - const struct nfs_write_data *data,
> + const struct nfs_pgio_data *data,
> int error
> ),
>
> @@ -1024,7 +1024,7 @@ DECLARE_EVENT_CLASS(nfs4_write_event,
> #define DEFINE_NFS4_WRITE_EVENT(name) \
> DEFINE_EVENT(nfs4_write_event, name, \
> TP_PROTO( \
> - const struct nfs_write_data *data, \
> + const struct nfs_pgio_data *data, \
> int error \
> ), \
> TP_ARGS(data, error))
> diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
> index 5457745..426b366 100644
> --- a/fs/nfs/objlayout/objio_osd.c
> +++ b/fs/nfs/objlayout/objio_osd.c
> @@ -439,7 +439,7 @@ static void _read_done(struct ore_io_state *ios, void *private)
> objlayout_read_done(&objios->oir, status, objios->sync);
> }
>
> -int objio_read_pagelist(struct nfs_read_data *rdata)
> +int objio_read_pagelist(struct nfs_pgio_data *rdata)
> {
> struct nfs_pgio_header *hdr = rdata->header;
> struct objio_state *objios;
> @@ -487,7 +487,7 @@ static void _write_done(struct ore_io_state *ios, void *private)
> static struct page *__r4w_get_page(void *priv, u64 offset, bool *uptodate)
> {
> struct objio_state *objios = priv;
> - struct nfs_write_data *wdata = objios->oir.rpcdata;
> + struct nfs_pgio_data *wdata = objios->oir.rpcdata;
> struct address_space *mapping = wdata->header->inode->i_mapping;
> pgoff_t index = offset / PAGE_SIZE;
> struct page *page;
> @@ -531,7 +531,7 @@ static const struct _ore_r4w_op _r4w_op = {
> .put_page = &__r4w_put_page,
> };
>
> -int objio_write_pagelist(struct nfs_write_data *wdata, int how)
> +int objio_write_pagelist(struct nfs_pgio_data *wdata, int how)
> {
> struct nfs_pgio_header *hdr = wdata->header;
> struct objio_state *objios;
> diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c
> index e4f9cbf..2f955f6 100644
> --- a/fs/nfs/objlayout/objlayout.c
> +++ b/fs/nfs/objlayout/objlayout.c
> @@ -229,11 +229,11 @@ objlayout_io_set_result(struct objlayout_io_res *oir, unsigned index,
> static void _rpc_read_complete(struct work_struct *work)
> {
> struct rpc_task *task;
> - struct nfs_read_data *rdata;
> + struct nfs_pgio_data *rdata;
>
> dprintk("%s enter\n", __func__);
> task = container_of(work, struct rpc_task, u.tk_work);
> - rdata = container_of(task, struct nfs_read_data, task);
> + rdata = container_of(task, struct nfs_pgio_data, task);
>
> pnfs_ld_read_done(rdata);
> }
> @@ -241,7 +241,7 @@ static void _rpc_read_complete(struct work_struct *work)
> void
> objlayout_read_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
> {
> - struct nfs_read_data *rdata = oir->rpcdata;
> + struct nfs_pgio_data *rdata = oir->rpcdata;
>
> oir->status = rdata->task.tk_status = status;
> if (status >= 0)
> @@ -266,7 +266,7 @@ objlayout_read_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
> * Perform sync or async reads.
> */
> enum pnfs_try_status
> -objlayout_read_pagelist(struct nfs_read_data *rdata)
> +objlayout_read_pagelist(struct nfs_pgio_data *rdata)
> {
> struct nfs_pgio_header *hdr = rdata->header;
> struct inode *inode = hdr->inode;
> @@ -312,11 +312,11 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)
> static void _rpc_write_complete(struct work_struct *work)
> {
> struct rpc_task *task;
> - struct nfs_write_data *wdata;
> + struct nfs_pgio_data *wdata;
>
> dprintk("%s enter\n", __func__);
> task = container_of(work, struct rpc_task, u.tk_work);
> - wdata = container_of(task, struct nfs_write_data, task);
> + wdata = container_of(task, struct nfs_pgio_data, task);
>
> pnfs_ld_write_done(wdata);
> }
> @@ -324,7 +324,7 @@ static void _rpc_write_complete(struct work_struct *work)
> void
> objlayout_write_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
> {
> - struct nfs_write_data *wdata = oir->rpcdata;
> + struct nfs_pgio_data *wdata = oir->rpcdata;
>
> oir->status = wdata->task.tk_status = status;
> if (status >= 0) {
> @@ -351,7 +351,7 @@ objlayout_write_done(struct objlayout_io_res *oir, ssize_t status, bool sync)
> * Perform sync or async writes.
> */
> enum pnfs_try_status
> -objlayout_write_pagelist(struct nfs_write_data *wdata,
> +objlayout_write_pagelist(struct nfs_pgio_data *wdata,
> int how)
> {
> struct nfs_pgio_header *hdr = wdata->header;
> diff --git a/fs/nfs/objlayout/objlayout.h b/fs/nfs/objlayout/objlayout.h
> index 87aa1de..01e0410 100644
> --- a/fs/nfs/objlayout/objlayout.h
> +++ b/fs/nfs/objlayout/objlayout.h
> @@ -119,8 +119,8 @@ extern void objio_free_lseg(struct pnfs_layout_segment *lseg);
> */
> extern void objio_free_result(struct objlayout_io_res *oir);
>
> -extern int objio_read_pagelist(struct nfs_read_data *rdata);
> -extern int objio_write_pagelist(struct nfs_write_data *wdata, int how);
> +extern int objio_read_pagelist(struct nfs_pgio_data *rdata);
> +extern int objio_write_pagelist(struct nfs_pgio_data *wdata, int how);
>
> /*
> * callback API
> @@ -168,10 +168,10 @@ extern struct pnfs_layout_segment *objlayout_alloc_lseg(
> extern void objlayout_free_lseg(struct pnfs_layout_segment *);
>
> extern enum pnfs_try_status objlayout_read_pagelist(
> - struct nfs_read_data *);
> + struct nfs_pgio_data *);
>
> extern enum pnfs_try_status objlayout_write_pagelist(
> - struct nfs_write_data *,
> + struct nfs_pgio_data *,
> int how);
>
> extern void objlayout_encode_layoutcommit(
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 3d5bc2b..e9cea3a 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1492,7 +1492,7 @@ int pnfs_write_done_resend_to_mds(struct inode *inode,
> }
> EXPORT_SYMBOL_GPL(pnfs_write_done_resend_to_mds);
>
> -static void pnfs_ld_handle_write_error(struct nfs_write_data *data)
> +static void pnfs_ld_handle_write_error(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
>
> @@ -1511,7 +1511,7 @@ static void pnfs_ld_handle_write_error(struct nfs_write_data *data)
> /*
> * Called by non rpc-based layout drivers
> */
> -void pnfs_ld_write_done(struct nfs_write_data *data)
> +void pnfs_ld_write_done(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
>
> @@ -1527,7 +1527,7 @@ EXPORT_SYMBOL_GPL(pnfs_ld_write_done);
>
> static void
> pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
> - struct nfs_write_data *data)
> + struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
>
> @@ -1540,7 +1540,7 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
> }
>
> static enum pnfs_try_status
> -pnfs_try_to_write_data(struct nfs_write_data *wdata,
> +pnfs_try_to_write_data(struct nfs_pgio_data *wdata,
> const struct rpc_call_ops *call_ops,
> struct pnfs_layout_segment *lseg,
> int how)
> @@ -1564,7 +1564,7 @@ pnfs_try_to_write_data(struct nfs_write_data *wdata,
> static void
> pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *head, int how)
> {
> - struct nfs_write_data *data;
> + struct nfs_pgio_data *data;
> const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
> struct pnfs_layout_segment *lseg = desc->pg_lseg;
>
> @@ -1572,7 +1572,7 @@ pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *he
> while (!list_empty(head)) {
> enum pnfs_try_status trypnfs;
>
> - data = list_first_entry(head, struct nfs_write_data, list);
> + data = list_first_entry(head, struct nfs_pgio_data, list);
> list_del_init(&data->list);
>
> trypnfs = pnfs_try_to_write_data(data, call_ops, lseg, how);
> @@ -1647,7 +1647,7 @@ int pnfs_read_done_resend_to_mds(struct inode *inode,
> }
> EXPORT_SYMBOL_GPL(pnfs_read_done_resend_to_mds);
>
> -static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
> +static void pnfs_ld_handle_read_error(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
>
> @@ -1666,7 +1666,7 @@ static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
> /*
> * Called by non rpc-based layout drivers
> */
> -void pnfs_ld_read_done(struct nfs_read_data *data)
> +void pnfs_ld_read_done(struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
>
> @@ -1682,7 +1682,7 @@ EXPORT_SYMBOL_GPL(pnfs_ld_read_done);
>
> static void
> pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
> - struct nfs_read_data *data)
> + struct nfs_pgio_data *data)
> {
> struct nfs_pgio_header *hdr = data->header;
>
> @@ -1698,7 +1698,7 @@ pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
> * Call the appropriate parallel I/O subsystem read function.
> */
> static enum pnfs_try_status
> -pnfs_try_to_read_data(struct nfs_read_data *rdata,
> +pnfs_try_to_read_data(struct nfs_pgio_data *rdata,
> const struct rpc_call_ops *call_ops,
> struct pnfs_layout_segment *lseg)
> {
> @@ -1722,7 +1722,7 @@ pnfs_try_to_read_data(struct nfs_read_data *rdata,
> static void
> pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *head)
> {
> - struct nfs_read_data *data;
> + struct nfs_pgio_data *data;
> const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
> struct pnfs_layout_segment *lseg = desc->pg_lseg;
>
> @@ -1730,7 +1730,7 @@ pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *hea
> while (!list_empty(head)) {
> enum pnfs_try_status trypnfs;
>
> - data = list_first_entry(head, struct nfs_read_data, list);
> + data = list_first_entry(head, struct nfs_pgio_data, list);
> list_del_init(&data->list);
>
> trypnfs = pnfs_try_to_read_data(data, call_ops, lseg);
> @@ -1821,7 +1821,7 @@ void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg)
> EXPORT_SYMBOL_GPL(pnfs_set_lo_fail);
>
> void
> -pnfs_set_layoutcommit(struct nfs_write_data *wdata)
> +pnfs_set_layoutcommit(struct nfs_pgio_data *wdata)
> {
> struct nfs_pgio_header *hdr = wdata->header;
> struct inode *inode = hdr->inode;
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index 94a9a18..0031267 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -113,8 +113,8 @@ struct pnfs_layoutdriver_type {
> * Return PNFS_ATTEMPTED to indicate the layout code has attempted
> * I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS
> */
> - enum pnfs_try_status (*read_pagelist) (struct nfs_read_data *nfs_data);
> - enum pnfs_try_status (*write_pagelist) (struct nfs_write_data *nfs_data, int how);
> + enum pnfs_try_status (*read_pagelist) (struct nfs_pgio_data *nfs_data);
> + enum pnfs_try_status (*write_pagelist) (struct nfs_pgio_data *nfs_data, int how);
>
> void (*free_deviceid_node) (struct nfs4_deviceid_node *);
>
> @@ -212,13 +212,13 @@ bool pnfs_roc(struct inode *ino);
> void pnfs_roc_release(struct inode *ino);
> void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);
> bool pnfs_roc_drain(struct inode *ino, u32 *barrier, struct rpc_task *task);
> -void pnfs_set_layoutcommit(struct nfs_write_data *wdata);
> +void pnfs_set_layoutcommit(struct nfs_pgio_data *wdata);
> void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data);
> int pnfs_layoutcommit_inode(struct inode *inode, bool sync);
> int _pnfs_return_layout(struct inode *);
> int pnfs_commit_and_return_layout(struct inode *);
> -void pnfs_ld_write_done(struct nfs_write_data *);
> -void pnfs_ld_read_done(struct nfs_read_data *);
> +void pnfs_ld_write_done(struct nfs_pgio_data *);
> +void pnfs_ld_read_done(struct nfs_pgio_data *);
> struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino,
> struct nfs_open_context *ctx,
> loff_t pos,
> diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
> index 8cc227f..c54829e 100644
> --- a/fs/nfs/proc.c
> +++ b/fs/nfs/proc.c
> @@ -578,7 +578,7 @@ nfs_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
> return 0;
> }
>
> -static int nfs_read_done(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs_read_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct inode *inode = data->header->inode;
>
> @@ -594,18 +594,18 @@ static int nfs_read_done(struct rpc_task *task, struct nfs_read_data *data)
> return 0;
> }
>
> -static void nfs_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
> +static void nfs_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
> {
> msg->rpc_proc = &nfs_procedures[NFSPROC_READ];
> }
>
> -static int nfs_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_read_data *data)
> +static int nfs_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> rpc_call_start(task);
> return 0;
> }
>
> -static int nfs_write_done(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs_write_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct inode *inode = data->header->inode;
>
> @@ -614,14 +614,14 @@ static int nfs_write_done(struct rpc_task *task, struct nfs_write_data *data)
> return 0;
> }
>
> -static void nfs_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
> +static void nfs_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message *msg)
> {
> /* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */
> data->args.stable = NFS_FILE_SYNC;
> msg->rpc_proc = &nfs_procedures[NFSPROC_WRITE];
> }
>
> -static int nfs_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_write_data *data)
> +static int nfs_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> rpc_call_start(task);
> return 0;
> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
> index 473bba3..9e426cc 100644
> --- a/fs/nfs/read.c
> +++ b/fs/nfs/read.c
> @@ -51,10 +51,10 @@ struct nfs_read_header *nfs_readhdr_alloc(void)
> }
> EXPORT_SYMBOL_GPL(nfs_readhdr_alloc);
>
> -static struct nfs_read_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
> +static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
> unsigned int pagecount)
> {
> - struct nfs_read_data *data, *prealloc;
> + struct nfs_pgio_data *data, *prealloc;
>
> prealloc = &container_of(hdr, struct nfs_read_header, header)->rpc_data;
> if (prealloc->header == NULL)
> @@ -84,7 +84,7 @@ void nfs_readhdr_free(struct nfs_pgio_header *hdr)
> }
> EXPORT_SYMBOL_GPL(nfs_readhdr_free);
>
> -void nfs_readdata_release(struct nfs_read_data *rdata)
> +void nfs_readdata_release(struct nfs_pgio_data *rdata)
> {
> struct nfs_pgio_header *hdr = rdata->header;
> struct nfs_read_header *read_header = container_of(hdr, struct nfs_read_header, header);
> @@ -212,7 +212,7 @@ out:
> }
>
> int nfs_initiate_read(struct rpc_clnt *clnt,
> - struct nfs_read_data *data,
> + struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops, int flags)
> {
> struct inode *inode = data->header->inode;
> @@ -255,7 +255,7 @@ EXPORT_SYMBOL_GPL(nfs_initiate_read);
> /*
> * Set up the NFS read request struct
> */
> -static void nfs_read_rpcsetup(struct nfs_read_data *data,
> +static void nfs_read_rpcsetup(struct nfs_pgio_data *data,
> unsigned int count, unsigned int offset)
> {
> struct nfs_page *req = data->header->req;
> @@ -274,7 +274,7 @@ static void nfs_read_rpcsetup(struct nfs_read_data *data,
> nfs_fattr_init(&data->fattr);
> }
>
> -static int nfs_do_read(struct nfs_read_data *data,
> +static int nfs_do_read(struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops)
> {
> struct inode *inode = data->header->inode;
> @@ -286,13 +286,13 @@ static int
> nfs_do_multiple_reads(struct list_head *head,
> const struct rpc_call_ops *call_ops)
> {
> - struct nfs_read_data *data;
> + struct nfs_pgio_data *data;
> int ret = 0;
>
> while (!list_empty(head)) {
> int ret2;
>
> - data = list_first_entry(head, struct nfs_read_data, list);
> + data = list_first_entry(head, struct nfs_pgio_data, list);
> list_del_init(&data->list);
>
> ret2 = nfs_do_read(data, call_ops);
> @@ -324,8 +324,8 @@ static void nfs_pagein_error(struct nfs_pageio_descriptor *desc,
> {
> set_bit(NFS_IOHDR_REDO, &hdr->flags);
> while (!list_empty(&hdr->rpc_list)) {
> - struct nfs_read_data *data = list_first_entry(&hdr->rpc_list,
> - struct nfs_read_data, list);
> + struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
> + struct nfs_pgio_data, list);
> list_del(&data->list);
> nfs_readdata_release(data);
> }
> @@ -350,7 +350,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
> {
> struct nfs_page *req = hdr->req;
> struct page *page = req->wb_page;
> - struct nfs_read_data *data;
> + struct nfs_pgio_data *data;
> size_t rsize = desc->pg_bsize, nbytes;
> unsigned int offset;
>
> @@ -382,7 +382,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
> {
> struct nfs_page *req;
> struct page **pages;
> - struct nfs_read_data *data;
> + struct nfs_pgio_data *data;
> struct list_head *head = &desc->pg_list;
>
> data = nfs_readdata_alloc(hdr, nfs_page_array_len(desc->pg_base,
> @@ -447,7 +447,7 @@ static const struct nfs_pageio_ops nfs_pageio_read_ops = {
> * This is the callback from RPC telling us whether a reply was
> * received or some error occurred (timeout or socket shutdown).
> */
> -int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
> +int nfs_readpage_result(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct inode *inode = data->header->inode;
> int status;
> @@ -468,7 +468,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
> return 0;
> }
>
> -static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
> +static void nfs_readpage_retry(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct nfs_pgio_args *argp = &data->args;
> struct nfs_pgio_res *resp = &data->res;
> @@ -490,7 +490,7 @@ static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data
>
> static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
> {
> - struct nfs_read_data *data = calldata;
> + struct nfs_pgio_data *data = calldata;
> struct nfs_pgio_header *hdr = data->header;
>
> /* Note the only returns of nfs_readpage_result are 0 and -EAGAIN */
> @@ -520,7 +520,7 @@ static void nfs_readpage_release_common(void *calldata)
>
> void nfs_read_prepare(struct rpc_task *task, void *calldata)
> {
> - struct nfs_read_data *data = calldata;
> + struct nfs_pgio_data *data = calldata;
> int err;
> err = NFS_PROTO(data->header->inode)->read_rpc_prepare(task, data);
> if (err)
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index d392a70..3a2fc5c 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -88,10 +88,10 @@ struct nfs_write_header *nfs_writehdr_alloc(void)
> }
> EXPORT_SYMBOL_GPL(nfs_writehdr_alloc);
>
> -static struct nfs_write_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
> +static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
> unsigned int pagecount)
> {
> - struct nfs_write_data *data, *prealloc;
> + struct nfs_pgio_data *data, *prealloc;
>
> prealloc = &container_of(hdr, struct nfs_write_header, header)->rpc_data;
> if (prealloc->header == NULL)
> @@ -120,7 +120,7 @@ void nfs_writehdr_free(struct nfs_pgio_header *hdr)
> }
> EXPORT_SYMBOL_GPL(nfs_writehdr_free);
>
> -void nfs_writedata_release(struct nfs_write_data *wdata)
> +void nfs_writedata_release(struct nfs_pgio_data *wdata)
> {
> struct nfs_pgio_header *hdr = wdata->header;
> struct nfs_write_header *write_header = container_of(hdr, struct nfs_write_header, header);
> @@ -582,7 +582,7 @@ nfs_clear_request_commit(struct nfs_page *req)
> }
>
> static inline
> -int nfs_write_need_commit(struct nfs_write_data *data)
> +int nfs_write_need_commit(struct nfs_pgio_data *data)
> {
> if (data->verf.committed == NFS_DATA_SYNC)
> return data->header->lseg == NULL;
> @@ -613,7 +613,7 @@ nfs_clear_request_commit(struct nfs_page *req)
> }
>
> static inline
> -int nfs_write_need_commit(struct nfs_write_data *data)
> +int nfs_write_need_commit(struct nfs_pgio_data *data)
> {
> return 0;
> }
> @@ -990,7 +990,7 @@ static int flush_task_priority(int how)
> }
>
> int nfs_initiate_write(struct rpc_clnt *clnt,
> - struct nfs_write_data *data,
> + struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops,
> int how, int flags)
> {
> @@ -1047,7 +1047,7 @@ EXPORT_SYMBOL_GPL(nfs_initiate_write);
> /*
> * Set up the argument/result storage required for the RPC call.
> */
> -static void nfs_write_rpcsetup(struct nfs_write_data *data,
> +static void nfs_write_rpcsetup(struct nfs_pgio_data *data,
> unsigned int count, unsigned int offset,
> int how, struct nfs_commit_info *cinfo)
> {
> @@ -1082,7 +1082,7 @@ static void nfs_write_rpcsetup(struct nfs_write_data *data,
> nfs_fattr_init(&data->fattr);
> }
>
> -static int nfs_do_write(struct nfs_write_data *data,
> +static int nfs_do_write(struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops,
> int how)
> {
> @@ -1095,13 +1095,13 @@ static int nfs_do_multiple_writes(struct list_head *head,
> const struct rpc_call_ops *call_ops,
> int how)
> {
> - struct nfs_write_data *data;
> + struct nfs_pgio_data *data;
> int ret = 0;
>
> while (!list_empty(head)) {
> int ret2;
>
> - data = list_first_entry(head, struct nfs_write_data, list);
> + data = list_first_entry(head, struct nfs_pgio_data, list);
> list_del_init(&data->list);
>
> ret2 = nfs_do_write(data, call_ops, how);
> @@ -1144,8 +1144,8 @@ static void nfs_flush_error(struct nfs_pageio_descriptor *desc,
> {
> set_bit(NFS_IOHDR_REDO, &hdr->flags);
> while (!list_empty(&hdr->rpc_list)) {
> - struct nfs_write_data *data = list_first_entry(&hdr->rpc_list,
> - struct nfs_write_data, list);
> + struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
> + struct nfs_pgio_data, list);
> list_del(&data->list);
> nfs_writedata_release(data);
> }
> @@ -1161,7 +1161,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
> {
> struct nfs_page *req = hdr->req;
> struct page *page = req->wb_page;
> - struct nfs_write_data *data;
> + struct nfs_pgio_data *data;
> size_t wsize = desc->pg_bsize, nbytes;
> unsigned int offset;
> int requests = 0;
> @@ -1211,7 +1211,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
> {
> struct nfs_page *req;
> struct page **pages;
> - struct nfs_write_data *data;
> + struct nfs_pgio_data *data;
> struct list_head *head = &desc->pg_list;
> struct nfs_commit_info cinfo;
>
> @@ -1305,7 +1305,7 @@ EXPORT_SYMBOL_GPL(nfs_pageio_reset_write_mds);
>
> void nfs_write_prepare(struct rpc_task *task, void *calldata)
> {
> - struct nfs_write_data *data = calldata;
> + struct nfs_pgio_data *data = calldata;
> int err;
> err = NFS_PROTO(data->header->inode)->write_rpc_prepare(task, data);
> if (err)
> @@ -1328,14 +1328,14 @@ void nfs_commit_prepare(struct rpc_task *task, void *calldata)
> */
> static void nfs_writeback_done_common(struct rpc_task *task, void *calldata)
> {
> - struct nfs_write_data *data = calldata;
> + struct nfs_pgio_data *data = calldata;
>
> nfs_writeback_done(task, data);
> }
>
> static void nfs_writeback_release_common(void *calldata)
> {
> - struct nfs_write_data *data = calldata;
> + struct nfs_pgio_data *data = calldata;
> struct nfs_pgio_header *hdr = data->header;
> int status = data->task.tk_status;
>
> @@ -1386,7 +1386,7 @@ static int nfs_should_remove_suid(const struct inode *inode)
> /*
> * This function is called when the WRITE call is complete.
> */
> -void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
> +void nfs_writeback_done(struct rpc_task *task, struct nfs_pgio_data *data)
> {
> struct nfs_pgio_args *argp = &data->args;
> struct nfs_pgio_res *resp = &data->res;
> diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
> index fa6918b..7e0db56 100644
> --- a/include/linux/nfs_fs.h
> +++ b/include/linux/nfs_fs.h
> @@ -520,7 +520,7 @@ extern int nfs_writepage(struct page *page, struct writeback_control *wbc);
> extern int nfs_writepages(struct address_space *, struct writeback_control *);
> extern int nfs_flush_incompatible(struct file *file, struct page *page);
> extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
> -extern void nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
> +extern void nfs_writeback_done(struct rpc_task *, struct nfs_pgio_data *);
>
> /*
> * Try to write back everything synchronously (but check the
> @@ -553,7 +553,7 @@ nfs_have_writebacks(struct inode *inode)
> extern int nfs_readpage(struct file *, struct page *);
> extern int nfs_readpages(struct file *, struct address_space *,
> struct list_head *, unsigned);
> -extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
> +extern int nfs_readpage_result(struct rpc_task *, struct nfs_pgio_data *);
> extern int nfs_readpage_async(struct nfs_open_context *, struct inode *,
> struct page *);
>
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 381f832..64f6f14 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -1247,20 +1247,6 @@ struct nfs_page_array {
> struct page *page_array[NFS_PAGEVEC_SIZE];
> };
>
> -struct nfs_read_data {
> - struct nfs_pgio_header *header;
> - struct list_head list;
> - struct rpc_task task;
> - struct nfs_fattr fattr; /* fattr storage */
> - struct nfs_pgio_args args;
> - struct nfs_pgio_res res;
> - unsigned long timestamp; /* For lease renewal */
> - int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data);
> - __u64 mds_offset;
> - struct nfs_page_array pages;
> - struct nfs_client *ds_clp; /* pNFS data server */
> -};
> -
> /* used as flag bits in nfs_pgio_header */
> enum {
> NFS_IOHDR_ERROR = 0,
> @@ -1293,29 +1279,29 @@ struct nfs_pgio_header {
> unsigned long flags;
> };
>
> -struct nfs_read_header {
> - struct nfs_pgio_header header;
> - struct nfs_read_data rpc_data;
> -};
> -
> -struct nfs_write_data {
> +struct nfs_pgio_data {
> struct nfs_pgio_header *header;
> struct list_head list;
> struct rpc_task task;
> struct nfs_fattr fattr;
> - struct nfs_writeverf verf;
> + struct nfs_writeverf verf; /* Used for writes */
> struct nfs_pgio_args args; /* argument struct */
> struct nfs_pgio_res res; /* result struct */
> unsigned long timestamp; /* For lease renewal */
> - int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
> + int (*pgio_done_cb) (struct rpc_task *task, struct nfs_pgio_data *data);
> __u64 mds_offset; /* Filelayout dense stripe */
> struct nfs_page_array pages;
> struct nfs_client *ds_clp; /* pNFS data server */
> };
>
> +struct nfs_read_header {
> + struct nfs_pgio_header header;
> + struct nfs_pgio_data rpc_data;
> +};
> +
> struct nfs_write_header {
> struct nfs_pgio_header header;
> - struct nfs_write_data rpc_data;
> + struct nfs_pgio_data rpc_data;
> struct nfs_writeverf verf;
> };
>
> @@ -1448,12 +1434,12 @@ struct nfs_rpc_ops {
> struct nfs_pathconf *);
> 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 *);
> - 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 *);
> - int (*write_rpc_prepare)(struct rpc_task *, struct nfs_write_data *);
> - int (*write_done) (struct rpc_task *, struct nfs_write_data *);
> + void (*read_setup) (struct nfs_pgio_data *, struct rpc_message *);
> + int (*read_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
> + int (*read_done) (struct rpc_task *, struct nfs_pgio_data *);
> + void (*write_setup) (struct nfs_pgio_data *, struct rpc_message *);
> + int (*write_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
> + int (*write_done) (struct rpc_task *, struct nfs_pgio_data *);
> void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *);
> void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *);
> int (*commit_done) (struct rpc_task *, struct nfs_commit_data *);
Nice cleanup
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 04/17] NFS: Create a common read and write header struct
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (2 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 03/17] NFS: Create a common read and write data struct Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-05-02 18:59 ` Jeff Layton
2014-04-25 20:55 ` [PATCH v2 05/17] NFS: Move the write verifier into the nfs_pgio_header Anna Schumaker
` (13 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
The only difference is the write verifier field, so I leave a comment
saying that it's not used for reads.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 4 ++--
fs/nfs/pnfs.c | 4 ++--
fs/nfs/read.c | 14 +++++++-------
fs/nfs/write.c | 14 +++++++-------
include/linux/nfs_xdr.h | 7 +------
5 files changed, 19 insertions(+), 24 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index af01b80..b0e7a41 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -395,7 +395,7 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
struct nfs_pgio_completion_ops;
/* read.c */
-extern struct nfs_read_header *nfs_readhdr_alloc(void);
+extern struct nfs_rw_header *nfs_readhdr_alloc(void);
extern void nfs_readhdr_free(struct nfs_pgio_header *hdr);
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
struct inode *inode, bool force_mds,
@@ -424,7 +424,7 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops);
-extern struct nfs_write_header *nfs_writehdr_alloc(void);
+extern struct nfs_rw_header *nfs_writehdr_alloc(void);
extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr);
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index e9cea3a..43cfe11 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1592,7 +1592,7 @@ EXPORT_SYMBOL_GPL(pnfs_writehdr_free);
int
pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
{
- struct nfs_write_header *whdr;
+ struct nfs_rw_header *whdr;
struct nfs_pgio_header *hdr;
int ret;
@@ -1750,7 +1750,7 @@ EXPORT_SYMBOL_GPL(pnfs_readhdr_free);
int
pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
{
- struct nfs_read_header *rhdr;
+ struct nfs_rw_header *rhdr;
struct nfs_pgio_header *hdr;
int ret;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 9e426cc..d29ca36 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -34,9 +34,9 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
static struct kmem_cache *nfs_rdata_cachep;
-struct nfs_read_header *nfs_readhdr_alloc(void)
+struct nfs_rw_header *nfs_readhdr_alloc(void)
{
- struct nfs_read_header *rhdr;
+ struct nfs_rw_header *rhdr;
rhdr = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
if (rhdr) {
@@ -56,7 +56,7 @@ static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
{
struct nfs_pgio_data *data, *prealloc;
- prealloc = &container_of(hdr, struct nfs_read_header, header)->rpc_data;
+ prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
if (prealloc->header == NULL)
data = prealloc;
else
@@ -78,7 +78,7 @@ out:
void nfs_readhdr_free(struct nfs_pgio_header *hdr)
{
- struct nfs_read_header *rhdr = container_of(hdr, struct nfs_read_header, header);
+ struct nfs_rw_header *rhdr = container_of(hdr, struct nfs_rw_header, header);
kmem_cache_free(nfs_rdata_cachep, rhdr);
}
@@ -87,7 +87,7 @@ EXPORT_SYMBOL_GPL(nfs_readhdr_free);
void nfs_readdata_release(struct nfs_pgio_data *rdata)
{
struct nfs_pgio_header *hdr = rdata->header;
- struct nfs_read_header *read_header = container_of(hdr, struct nfs_read_header, header);
+ struct nfs_rw_header *read_header = container_of(hdr, struct nfs_rw_header, header);
put_nfs_open_context(rdata->args.context);
if (rdata->pages.pagevec != rdata->pages.page_array)
@@ -417,7 +417,7 @@ EXPORT_SYMBOL_GPL(nfs_generic_pagein);
static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
{
- struct nfs_read_header *rhdr;
+ struct nfs_rw_header *rhdr;
struct nfs_pgio_header *hdr;
int ret;
@@ -680,7 +680,7 @@ out:
int __init nfs_init_readpagecache(void)
{
nfs_rdata_cachep = kmem_cache_create("nfs_read_data",
- sizeof(struct nfs_read_header),
+ sizeof(struct nfs_rw_header),
0, SLAB_HWCACHE_ALIGN,
NULL);
if (nfs_rdata_cachep == NULL)
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 3a2fc5c..37c4c98 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -70,9 +70,9 @@ void nfs_commit_free(struct nfs_commit_data *p)
}
EXPORT_SYMBOL_GPL(nfs_commit_free);
-struct nfs_write_header *nfs_writehdr_alloc(void)
+struct nfs_rw_header *nfs_writehdr_alloc(void)
{
- struct nfs_write_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
+ struct nfs_rw_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
if (p) {
struct nfs_pgio_header *hdr = &p->header;
@@ -93,7 +93,7 @@ static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
{
struct nfs_pgio_data *data, *prealloc;
- prealloc = &container_of(hdr, struct nfs_write_header, header)->rpc_data;
+ prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
if (prealloc->header == NULL)
data = prealloc;
else
@@ -115,7 +115,7 @@ out:
void nfs_writehdr_free(struct nfs_pgio_header *hdr)
{
- struct nfs_write_header *whdr = container_of(hdr, struct nfs_write_header, header);
+ struct nfs_rw_header *whdr = container_of(hdr, struct nfs_rw_header, header);
mempool_free(whdr, nfs_wdata_mempool);
}
EXPORT_SYMBOL_GPL(nfs_writehdr_free);
@@ -123,7 +123,7 @@ EXPORT_SYMBOL_GPL(nfs_writehdr_free);
void nfs_writedata_release(struct nfs_pgio_data *wdata)
{
struct nfs_pgio_header *hdr = wdata->header;
- struct nfs_write_header *write_header = container_of(hdr, struct nfs_write_header, header);
+ struct nfs_rw_header *write_header = container_of(hdr, struct nfs_rw_header, header);
put_nfs_open_context(wdata->args.context);
if (wdata->pages.pagevec != wdata->pages.page_array)
@@ -1253,7 +1253,7 @@ EXPORT_SYMBOL_GPL(nfs_generic_flush);
static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
{
- struct nfs_write_header *whdr;
+ struct nfs_rw_header *whdr;
struct nfs_pgio_header *hdr;
int ret;
@@ -1910,7 +1910,7 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
int __init nfs_init_writepagecache(void)
{
nfs_wdata_cachep = kmem_cache_create("nfs_write_data",
- sizeof(struct nfs_write_header),
+ sizeof(struct nfs_rw_header),
0, SLAB_HWCACHE_ALIGN,
NULL);
if (nfs_wdata_cachep == NULL)
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 64f6f14..2d34e0d 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1294,12 +1294,7 @@ struct nfs_pgio_data {
struct nfs_client *ds_clp; /* pNFS data server */
};
-struct nfs_read_header {
- struct nfs_pgio_header header;
- struct nfs_pgio_data rpc_data;
-};
-
-struct nfs_write_header {
+struct nfs_rw_header {
struct nfs_pgio_header header;
struct nfs_pgio_data rpc_data;
struct nfs_writeverf verf;
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 04/17] NFS: Create a common read and write header struct
2014-04-25 20:55 ` [PATCH v2 04/17] NFS: Create a common read and write header struct Anna Schumaker
@ 2014-05-02 18:59 ` Jeff Layton
2014-05-02 19:03 ` Anna Schumaker
0 siblings, 1 reply; 29+ messages in thread
From: Jeff Layton @ 2014-05-02 18:59 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On Fri, 25 Apr 2014 16:55:47 -0400
Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> The only difference is the write verifier field, so I leave a comment
> saying that it's not used for reads.
>
nit: that comment doesn't seem to exist...
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
> ---
> fs/nfs/internal.h | 4 ++--
> fs/nfs/pnfs.c | 4 ++--
> fs/nfs/read.c | 14 +++++++-------
> fs/nfs/write.c | 14 +++++++-------
> include/linux/nfs_xdr.h | 7 +------
> 5 files changed, 19 insertions(+), 24 deletions(-)
>
> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
> index af01b80..b0e7a41 100644
> --- a/fs/nfs/internal.h
> +++ b/fs/nfs/internal.h
> @@ -395,7 +395,7 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
>
> struct nfs_pgio_completion_ops;
> /* read.c */
> -extern struct nfs_read_header *nfs_readhdr_alloc(void);
> +extern struct nfs_rw_header *nfs_readhdr_alloc(void);
> extern void nfs_readhdr_free(struct nfs_pgio_header *hdr);
> extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
> struct inode *inode, bool force_mds,
> @@ -424,7 +424,7 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
> extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
> struct inode *inode, int ioflags, bool force_mds,
> const struct nfs_pgio_completion_ops *compl_ops);
> -extern struct nfs_write_header *nfs_writehdr_alloc(void);
> +extern struct nfs_rw_header *nfs_writehdr_alloc(void);
> extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
> extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_header *hdr);
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index e9cea3a..43cfe11 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1592,7 +1592,7 @@ EXPORT_SYMBOL_GPL(pnfs_writehdr_free);
> int
> pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
> {
> - struct nfs_write_header *whdr;
> + struct nfs_rw_header *whdr;
> struct nfs_pgio_header *hdr;
> int ret;
>
> @@ -1750,7 +1750,7 @@ EXPORT_SYMBOL_GPL(pnfs_readhdr_free);
> int
> pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
> {
> - struct nfs_read_header *rhdr;
> + struct nfs_rw_header *rhdr;
> struct nfs_pgio_header *hdr;
> int ret;
>
> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
> index 9e426cc..d29ca36 100644
> --- a/fs/nfs/read.c
> +++ b/fs/nfs/read.c
> @@ -34,9 +34,9 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
>
> static struct kmem_cache *nfs_rdata_cachep;
>
> -struct nfs_read_header *nfs_readhdr_alloc(void)
> +struct nfs_rw_header *nfs_readhdr_alloc(void)
> {
> - struct nfs_read_header *rhdr;
> + struct nfs_rw_header *rhdr;
>
> rhdr = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
> if (rhdr) {
> @@ -56,7 +56,7 @@ static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
> {
> struct nfs_pgio_data *data, *prealloc;
>
> - prealloc = &container_of(hdr, struct nfs_read_header, header)->rpc_data;
> + prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
> if (prealloc->header == NULL)
> data = prealloc;
> else
> @@ -78,7 +78,7 @@ out:
>
> void nfs_readhdr_free(struct nfs_pgio_header *hdr)
> {
> - struct nfs_read_header *rhdr = container_of(hdr, struct nfs_read_header, header);
> + struct nfs_rw_header *rhdr = container_of(hdr, struct nfs_rw_header, header);
>
> kmem_cache_free(nfs_rdata_cachep, rhdr);
> }
> @@ -87,7 +87,7 @@ EXPORT_SYMBOL_GPL(nfs_readhdr_free);
> void nfs_readdata_release(struct nfs_pgio_data *rdata)
> {
> struct nfs_pgio_header *hdr = rdata->header;
> - struct nfs_read_header *read_header = container_of(hdr, struct nfs_read_header, header);
> + struct nfs_rw_header *read_header = container_of(hdr, struct nfs_rw_header, header);
>
> put_nfs_open_context(rdata->args.context);
> if (rdata->pages.pagevec != rdata->pages.page_array)
> @@ -417,7 +417,7 @@ EXPORT_SYMBOL_GPL(nfs_generic_pagein);
>
> static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
> {
> - struct nfs_read_header *rhdr;
> + struct nfs_rw_header *rhdr;
> struct nfs_pgio_header *hdr;
> int ret;
>
> @@ -680,7 +680,7 @@ out:
> int __init nfs_init_readpagecache(void)
> {
> nfs_rdata_cachep = kmem_cache_create("nfs_read_data",
> - sizeof(struct nfs_read_header),
> + sizeof(struct nfs_rw_header),
> 0, SLAB_HWCACHE_ALIGN,
> NULL);
> if (nfs_rdata_cachep == NULL)
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index 3a2fc5c..37c4c98 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -70,9 +70,9 @@ void nfs_commit_free(struct nfs_commit_data *p)
> }
> EXPORT_SYMBOL_GPL(nfs_commit_free);
>
> -struct nfs_write_header *nfs_writehdr_alloc(void)
> +struct nfs_rw_header *nfs_writehdr_alloc(void)
> {
> - struct nfs_write_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
> + struct nfs_rw_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
>
> if (p) {
> struct nfs_pgio_header *hdr = &p->header;
> @@ -93,7 +93,7 @@ static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
> {
> struct nfs_pgio_data *data, *prealloc;
>
> - prealloc = &container_of(hdr, struct nfs_write_header, header)->rpc_data;
> + prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
> if (prealloc->header == NULL)
> data = prealloc;
> else
> @@ -115,7 +115,7 @@ out:
>
> void nfs_writehdr_free(struct nfs_pgio_header *hdr)
> {
> - struct nfs_write_header *whdr = container_of(hdr, struct nfs_write_header, header);
> + struct nfs_rw_header *whdr = container_of(hdr, struct nfs_rw_header, header);
> mempool_free(whdr, nfs_wdata_mempool);
> }
> EXPORT_SYMBOL_GPL(nfs_writehdr_free);
> @@ -123,7 +123,7 @@ EXPORT_SYMBOL_GPL(nfs_writehdr_free);
> void nfs_writedata_release(struct nfs_pgio_data *wdata)
> {
> struct nfs_pgio_header *hdr = wdata->header;
> - struct nfs_write_header *write_header = container_of(hdr, struct nfs_write_header, header);
> + struct nfs_rw_header *write_header = container_of(hdr, struct nfs_rw_header, header);
>
> put_nfs_open_context(wdata->args.context);
> if (wdata->pages.pagevec != wdata->pages.page_array)
> @@ -1253,7 +1253,7 @@ EXPORT_SYMBOL_GPL(nfs_generic_flush);
>
> static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
> {
> - struct nfs_write_header *whdr;
> + struct nfs_rw_header *whdr;
> struct nfs_pgio_header *hdr;
> int ret;
>
> @@ -1910,7 +1910,7 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
> int __init nfs_init_writepagecache(void)
> {
> nfs_wdata_cachep = kmem_cache_create("nfs_write_data",
> - sizeof(struct nfs_write_header),
> + sizeof(struct nfs_rw_header),
> 0, SLAB_HWCACHE_ALIGN,
> NULL);
> if (nfs_wdata_cachep == NULL)
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 64f6f14..2d34e0d 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -1294,12 +1294,7 @@ struct nfs_pgio_data {
> struct nfs_client *ds_clp; /* pNFS data server */
> };
>
> -struct nfs_read_header {
> - struct nfs_pgio_header header;
> - struct nfs_pgio_data rpc_data;
> -};
> -
> -struct nfs_write_header {
> +struct nfs_rw_header {
> struct nfs_pgio_header header;
> struct nfs_pgio_data rpc_data;
> struct nfs_writeverf verf;
Looks good otherwise:
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
^ permalink raw reply [flat|nested] 29+ messages in thread* Re: [PATCH v2 04/17] NFS: Create a common read and write header struct
2014-05-02 18:59 ` Jeff Layton
@ 2014-05-02 19:03 ` Anna Schumaker
0 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-05-02 19:03 UTC (permalink / raw)
To: Jeff Layton; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On 05/02/2014 02:59 PM, Jeff Layton wrote:
> On Fri, 25 Apr 2014 16:55:47 -0400
> Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
>
>> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>>
>> The only difference is the write verifier field, so I leave a comment
>> saying that it's not used for reads.
>>
>
> nit: that comment doesn't seem to exist...
Interesting. I wonder where it went? I'll fix that up, thanks!
Anna
>
>> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
>> ---
>> fs/nfs/internal.h | 4 ++--
>> fs/nfs/pnfs.c | 4 ++--
>> fs/nfs/read.c | 14 +++++++-------
>> fs/nfs/write.c | 14 +++++++-------
>> include/linux/nfs_xdr.h | 7 +------
>> 5 files changed, 19 insertions(+), 24 deletions(-)
>>
>> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
>> index af01b80..b0e7a41 100644
>> --- a/fs/nfs/internal.h
>> +++ b/fs/nfs/internal.h
>> @@ -395,7 +395,7 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
>>
>> struct nfs_pgio_completion_ops;
>> /* read.c */
>> -extern struct nfs_read_header *nfs_readhdr_alloc(void);
>> +extern struct nfs_rw_header *nfs_readhdr_alloc(void);
>> extern void nfs_readhdr_free(struct nfs_pgio_header *hdr);
>> extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
>> struct inode *inode, bool force_mds,
>> @@ -424,7 +424,7 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
>> extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
>> struct inode *inode, int ioflags, bool force_mds,
>> const struct nfs_pgio_completion_ops *compl_ops);
>> -extern struct nfs_write_header *nfs_writehdr_alloc(void);
>> +extern struct nfs_rw_header *nfs_writehdr_alloc(void);
>> extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
>> extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
>> struct nfs_pgio_header *hdr);
>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>> index e9cea3a..43cfe11 100644
>> --- a/fs/nfs/pnfs.c
>> +++ b/fs/nfs/pnfs.c
>> @@ -1592,7 +1592,7 @@ EXPORT_SYMBOL_GPL(pnfs_writehdr_free);
>> int
>> pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
>> {
>> - struct nfs_write_header *whdr;
>> + struct nfs_rw_header *whdr;
>> struct nfs_pgio_header *hdr;
>> int ret;
>>
>> @@ -1750,7 +1750,7 @@ EXPORT_SYMBOL_GPL(pnfs_readhdr_free);
>> int
>> pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
>> {
>> - struct nfs_read_header *rhdr;
>> + struct nfs_rw_header *rhdr;
>> struct nfs_pgio_header *hdr;
>> int ret;
>>
>> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
>> index 9e426cc..d29ca36 100644
>> --- a/fs/nfs/read.c
>> +++ b/fs/nfs/read.c
>> @@ -34,9 +34,9 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
>>
>> static struct kmem_cache *nfs_rdata_cachep;
>>
>> -struct nfs_read_header *nfs_readhdr_alloc(void)
>> +struct nfs_rw_header *nfs_readhdr_alloc(void)
>> {
>> - struct nfs_read_header *rhdr;
>> + struct nfs_rw_header *rhdr;
>>
>> rhdr = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
>> if (rhdr) {
>> @@ -56,7 +56,7 @@ static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
>> {
>> struct nfs_pgio_data *data, *prealloc;
>>
>> - prealloc = &container_of(hdr, struct nfs_read_header, header)->rpc_data;
>> + prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
>> if (prealloc->header == NULL)
>> data = prealloc;
>> else
>> @@ -78,7 +78,7 @@ out:
>>
>> void nfs_readhdr_free(struct nfs_pgio_header *hdr)
>> {
>> - struct nfs_read_header *rhdr = container_of(hdr, struct nfs_read_header, header);
>> + struct nfs_rw_header *rhdr = container_of(hdr, struct nfs_rw_header, header);
>>
>> kmem_cache_free(nfs_rdata_cachep, rhdr);
>> }
>> @@ -87,7 +87,7 @@ EXPORT_SYMBOL_GPL(nfs_readhdr_free);
>> void nfs_readdata_release(struct nfs_pgio_data *rdata)
>> {
>> struct nfs_pgio_header *hdr = rdata->header;
>> - struct nfs_read_header *read_header = container_of(hdr, struct nfs_read_header, header);
>> + struct nfs_rw_header *read_header = container_of(hdr, struct nfs_rw_header, header);
>>
>> put_nfs_open_context(rdata->args.context);
>> if (rdata->pages.pagevec != rdata->pages.page_array)
>> @@ -417,7 +417,7 @@ EXPORT_SYMBOL_GPL(nfs_generic_pagein);
>>
>> static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
>> {
>> - struct nfs_read_header *rhdr;
>> + struct nfs_rw_header *rhdr;
>> struct nfs_pgio_header *hdr;
>> int ret;
>>
>> @@ -680,7 +680,7 @@ out:
>> int __init nfs_init_readpagecache(void)
>> {
>> nfs_rdata_cachep = kmem_cache_create("nfs_read_data",
>> - sizeof(struct nfs_read_header),
>> + sizeof(struct nfs_rw_header),
>> 0, SLAB_HWCACHE_ALIGN,
>> NULL);
>> if (nfs_rdata_cachep == NULL)
>> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
>> index 3a2fc5c..37c4c98 100644
>> --- a/fs/nfs/write.c
>> +++ b/fs/nfs/write.c
>> @@ -70,9 +70,9 @@ void nfs_commit_free(struct nfs_commit_data *p)
>> }
>> EXPORT_SYMBOL_GPL(nfs_commit_free);
>>
>> -struct nfs_write_header *nfs_writehdr_alloc(void)
>> +struct nfs_rw_header *nfs_writehdr_alloc(void)
>> {
>> - struct nfs_write_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
>> + struct nfs_rw_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
>>
>> if (p) {
>> struct nfs_pgio_header *hdr = &p->header;
>> @@ -93,7 +93,7 @@ static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
>> {
>> struct nfs_pgio_data *data, *prealloc;
>>
>> - prealloc = &container_of(hdr, struct nfs_write_header, header)->rpc_data;
>> + prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
>> if (prealloc->header == NULL)
>> data = prealloc;
>> else
>> @@ -115,7 +115,7 @@ out:
>>
>> void nfs_writehdr_free(struct nfs_pgio_header *hdr)
>> {
>> - struct nfs_write_header *whdr = container_of(hdr, struct nfs_write_header, header);
>> + struct nfs_rw_header *whdr = container_of(hdr, struct nfs_rw_header, header);
>> mempool_free(whdr, nfs_wdata_mempool);
>> }
>> EXPORT_SYMBOL_GPL(nfs_writehdr_free);
>> @@ -123,7 +123,7 @@ EXPORT_SYMBOL_GPL(nfs_writehdr_free);
>> void nfs_writedata_release(struct nfs_pgio_data *wdata)
>> {
>> struct nfs_pgio_header *hdr = wdata->header;
>> - struct nfs_write_header *write_header = container_of(hdr, struct nfs_write_header, header);
>> + struct nfs_rw_header *write_header = container_of(hdr, struct nfs_rw_header, header);
>>
>> put_nfs_open_context(wdata->args.context);
>> if (wdata->pages.pagevec != wdata->pages.page_array)
>> @@ -1253,7 +1253,7 @@ EXPORT_SYMBOL_GPL(nfs_generic_flush);
>>
>> static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
>> {
>> - struct nfs_write_header *whdr;
>> + struct nfs_rw_header *whdr;
>> struct nfs_pgio_header *hdr;
>> int ret;
>>
>> @@ -1910,7 +1910,7 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
>> int __init nfs_init_writepagecache(void)
>> {
>> nfs_wdata_cachep = kmem_cache_create("nfs_write_data",
>> - sizeof(struct nfs_write_header),
>> + sizeof(struct nfs_rw_header),
>> 0, SLAB_HWCACHE_ALIGN,
>> NULL);
>> if (nfs_wdata_cachep == NULL)
>> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
>> index 64f6f14..2d34e0d 100644
>> --- a/include/linux/nfs_xdr.h
>> +++ b/include/linux/nfs_xdr.h
>> @@ -1294,12 +1294,7 @@ struct nfs_pgio_data {
>> struct nfs_client *ds_clp; /* pNFS data server */
>> };
>>
>> -struct nfs_read_header {
>> - struct nfs_pgio_header header;
>> - struct nfs_pgio_data rpc_data;
>> -};
>> -
>> -struct nfs_write_header {
>> +struct nfs_rw_header {
>> struct nfs_pgio_header header;
>> struct nfs_pgio_data rpc_data;
>> struct nfs_writeverf verf;
>
> Looks good otherwise:
>
> Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 05/17] NFS: Move the write verifier into the nfs_pgio_header
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (3 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 04/17] NFS: Create a common read and write header struct Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-05-02 19:01 ` Jeff Layton
2014-04-25 20:55 ` [PATCH v2 06/17] NFS: Create a common pgio_alloc and pgio_release function Anna Schumaker
` (12 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
The header had a pointer to the verifier that was set from the old write
data struct. We don't need to keep the pointer around now that we have
shared structures.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/direct.c | 4 ++--
fs/nfs/write.c | 7 +++----
include/linux/nfs_xdr.h | 3 +--
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index bbe688e..164b016 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -813,12 +813,12 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES)
bit = NFS_IOHDR_NEED_RESCHED;
else if (dreq->flags == 0) {
- memcpy(&dreq->verf, hdr->verf,
+ memcpy(&dreq->verf, &hdr->verf,
sizeof(dreq->verf));
bit = NFS_IOHDR_NEED_COMMIT;
dreq->flags = NFS_ODIRECT_DO_COMMIT;
} else if (dreq->flags == NFS_ODIRECT_DO_COMMIT) {
- if (memcmp(&dreq->verf, hdr->verf, sizeof(dreq->verf))) {
+ if (memcmp(&dreq->verf, &hdr->verf, sizeof(dreq->verf))) {
dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
bit = NFS_IOHDR_NEED_RESCHED;
} else
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 37c4c98..321a791 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -82,7 +82,6 @@ struct nfs_rw_header *nfs_writehdr_alloc(void)
INIT_LIST_HEAD(&hdr->rpc_list);
spin_lock_init(&hdr->lock);
atomic_set(&hdr->refcnt, 0);
- hdr->verf = &p->verf;
}
return p;
}
@@ -644,7 +643,7 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr)
goto next;
}
if (test_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags)) {
- memcpy(&req->wb_verf, &hdr->verf->verifier, sizeof(req->wb_verf));
+ memcpy(&req->wb_verf, &hdr->verf.verifier, sizeof(req->wb_verf));
nfs_mark_request_commit(req, hdr->lseg, &cinfo);
goto next;
}
@@ -1344,8 +1343,8 @@ static void nfs_writeback_release_common(void *calldata)
if (test_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags))
; /* Do nothing */
else if (!test_and_set_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags))
- memcpy(hdr->verf, &data->verf, sizeof(*hdr->verf));
- else if (memcmp(hdr->verf, &data->verf, sizeof(*hdr->verf)))
+ memcpy(&hdr->verf, &data->verf, sizeof(hdr->verf));
+ else if (memcmp(&hdr->verf, &data->verf, sizeof(hdr->verf)))
set_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags);
spin_unlock(&hdr->lock);
}
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 2d34e0d..965c2aa 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1263,7 +1263,7 @@ struct nfs_pgio_header {
struct list_head rpc_list;
atomic_t refcnt;
struct nfs_page *req;
- struct nfs_writeverf *verf;
+ struct nfs_writeverf verf; /* Used for writes */
struct pnfs_layout_segment *lseg;
loff_t io_start;
const struct rpc_call_ops *mds_ops;
@@ -1297,7 +1297,6 @@ struct nfs_pgio_data {
struct nfs_rw_header {
struct nfs_pgio_header header;
struct nfs_pgio_data rpc_data;
- struct nfs_writeverf verf;
};
struct nfs_mds_commit_info {
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 05/17] NFS: Move the write verifier into the nfs_pgio_header
2014-04-25 20:55 ` [PATCH v2 05/17] NFS: Move the write verifier into the nfs_pgio_header Anna Schumaker
@ 2014-05-02 19:01 ` Jeff Layton
0 siblings, 0 replies; 29+ messages in thread
From: Jeff Layton @ 2014-05-02 19:01 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On Fri, 25 Apr 2014 16:55:48 -0400
Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> The header had a pointer to the verifier that was set from the old write
> data struct. We don't need to keep the pointer around now that we have
> shared structures.
>
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
> ---
> fs/nfs/direct.c | 4 ++--
> fs/nfs/write.c | 7 +++----
> include/linux/nfs_xdr.h | 3 +--
> 3 files changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
> index bbe688e..164b016 100644
> --- a/fs/nfs/direct.c
> +++ b/fs/nfs/direct.c
> @@ -813,12 +813,12 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
> if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES)
> bit = NFS_IOHDR_NEED_RESCHED;
> else if (dreq->flags == 0) {
> - memcpy(&dreq->verf, hdr->verf,
> + memcpy(&dreq->verf, &hdr->verf,
> sizeof(dreq->verf));
> bit = NFS_IOHDR_NEED_COMMIT;
> dreq->flags = NFS_ODIRECT_DO_COMMIT;
> } else if (dreq->flags == NFS_ODIRECT_DO_COMMIT) {
> - if (memcmp(&dreq->verf, hdr->verf, sizeof(dreq->verf))) {
> + if (memcmp(&dreq->verf, &hdr->verf, sizeof(dreq->verf))) {
> dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
> bit = NFS_IOHDR_NEED_RESCHED;
> } else
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index 37c4c98..321a791 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -82,7 +82,6 @@ struct nfs_rw_header *nfs_writehdr_alloc(void)
> INIT_LIST_HEAD(&hdr->rpc_list);
> spin_lock_init(&hdr->lock);
> atomic_set(&hdr->refcnt, 0);
> - hdr->verf = &p->verf;
> }
> return p;
> }
> @@ -644,7 +643,7 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr)
> goto next;
> }
> if (test_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags)) {
> - memcpy(&req->wb_verf, &hdr->verf->verifier, sizeof(req->wb_verf));
> + memcpy(&req->wb_verf, &hdr->verf.verifier, sizeof(req->wb_verf));
> nfs_mark_request_commit(req, hdr->lseg, &cinfo);
> goto next;
> }
> @@ -1344,8 +1343,8 @@ static void nfs_writeback_release_common(void *calldata)
> if (test_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags))
> ; /* Do nothing */
> else if (!test_and_set_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags))
> - memcpy(hdr->verf, &data->verf, sizeof(*hdr->verf));
> - else if (memcmp(hdr->verf, &data->verf, sizeof(*hdr->verf)))
> + memcpy(&hdr->verf, &data->verf, sizeof(hdr->verf));
> + else if (memcmp(&hdr->verf, &data->verf, sizeof(hdr->verf)))
> set_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags);
> spin_unlock(&hdr->lock);
> }
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 2d34e0d..965c2aa 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -1263,7 +1263,7 @@ struct nfs_pgio_header {
> struct list_head rpc_list;
> atomic_t refcnt;
> struct nfs_page *req;
> - struct nfs_writeverf *verf;
> + struct nfs_writeverf verf; /* Used for writes */
> struct pnfs_layout_segment *lseg;
> loff_t io_start;
> const struct rpc_call_ops *mds_ops;
> @@ -1297,7 +1297,6 @@ struct nfs_pgio_data {
> struct nfs_rw_header {
> struct nfs_pgio_header header;
> struct nfs_pgio_data rpc_data;
> - struct nfs_writeverf verf;
> };
>
> struct nfs_mds_commit_info {
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 06/17] NFS: Create a common pgio_alloc and pgio_release function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (4 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 05/17] NFS: Move the write verifier into the nfs_pgio_header Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-05-02 19:06 ` Jeff Layton
2014-04-25 20:55 ` [PATCH v2 07/17] NFS: Create a common rw_header_alloc and rw_header_free function Anna Schumaker
` (11 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
These functions are identical for the read and write paths, so combine
them in a shared file.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/Makefile | 2 +-
fs/nfs/internal.h | 7 +++++--
fs/nfs/pageio.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
fs/nfs/pnfs.c | 4 ++--
fs/nfs/read.c | 54 ++++-------------------------------------------
fs/nfs/write.c | 54 ++++-------------------------------------------
6 files changed, 79 insertions(+), 105 deletions(-)
create mode 100644 fs/nfs/pageio.c
diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
index 03192a6..551d82a 100644
--- a/fs/nfs/Makefile
+++ b/fs/nfs/Makefile
@@ -7,7 +7,7 @@ obj-$(CONFIG_NFS_FS) += nfs.o
CFLAGS_nfstrace.o += -I$(src)
nfs-y := client.o dir.o file.o getroot.o inode.o super.o \
direct.o pagelist.o read.o symlink.o unlink.o \
- write.o namespace.o mount_clnt.o nfstrace.o
+ write.o namespace.o mount_clnt.o nfstrace.o pageio.o
nfs-$(CONFIG_ROOT_NFS) += nfsroot.o
nfs-$(CONFIG_SYSCTL) += sysctl.o
nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index b0e7a41..7f9d3c4 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -394,6 +394,11 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
#endif
struct nfs_pgio_completion_ops;
+
+/* pageio.c */
+extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
+extern void nfs_pgio_data_release(struct nfs_pgio_data *);
+
/* read.c */
extern struct nfs_rw_header *nfs_readhdr_alloc(void);
extern void nfs_readhdr_free(struct nfs_pgio_header *hdr);
@@ -407,7 +412,6 @@ extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
-extern void nfs_readdata_release(struct nfs_pgio_data *rdata);
/* super.c */
void nfs_clone_super(struct super_block *, struct nfs_mount_info *);
@@ -429,7 +433,6 @@ extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
-extern void nfs_writedata_release(struct nfs_pgio_data *wdata);
extern void nfs_commit_free(struct nfs_commit_data *p);
extern int nfs_initiate_write(struct rpc_clnt *clnt,
struct nfs_pgio_data *data,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
new file mode 100644
index 0000000..895bb37
--- /dev/null
+++ b/fs/nfs/pageio.c
@@ -0,0 +1,63 @@
+/*
+ * linux/fs/nfs/pageio.c
+ *
+ * Generic pageio functions shared by read and write paths.
+ *
+ * Copyright (c) 2014 Anna Schumaker <anna.schumaker@netapp.com>
+ */
+#include <linux/nfs_fs.h>
+#include <linux/nfs_xdr.h>
+
+#include "internal.h"
+
+
+static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
+{
+ return container_of(hdr, struct nfs_rw_header, header);
+}
+
+struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
+ unsigned int pagecount)
+{
+ struct nfs_pgio_data *data, *prealloc;
+
+ prealloc = &NFS_RW_HEADER(hdr)->rpc_data;
+ if (prealloc->header == NULL)
+ data = prealloc;
+ else
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
+ if (!data)
+ goto out;
+
+ if (nfs_pgarray_set(&data->pages, pagecount)) {
+ data->header = hdr;
+ atomic_inc(&hdr->refcnt);
+ } else {
+ if (data != prealloc)
+ kfree(data);
+ data = NULL;
+ }
+out:
+ return data;
+}
+
+void nfs_pgio_data_release(struct nfs_pgio_data *data)
+{
+ struct nfs_pgio_header *hdr = data->header;
+ struct nfs_rw_header *pageio_header = NFS_RW_HEADER(hdr);
+
+ put_nfs_open_context(data->args.context);
+ if (data->pages.pagevec != data->pages.page_array)
+ kfree(data->pages.pagevec);
+ if (data == &pageio_header->rpc_data) {
+ data->header = NULL;
+ data = NULL;
+ }
+ if (atomic_dec_and_test(&hdr->refcnt))
+ hdr->completion_ops->completion(hdr);
+ /* Note: we only free the rpc_task after callbacks are done.
+ * See the comment in rpc_free_task() for why
+ */
+ kfree(data);
+}
+EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 43cfe11..e192ba6 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1536,7 +1536,7 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
nfs_pageio_reset_write_mds(desc);
desc->pg_recoalesce = 1;
}
- nfs_writedata_release(data);
+ nfs_pgio_data_release(data);
}
static enum pnfs_try_status
@@ -1691,7 +1691,7 @@ pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
nfs_pageio_reset_read_mds(desc);
desc->pg_recoalesce = 1;
}
- nfs_readdata_release(data);
+ nfs_pgio_data_release(data);
}
/*
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index d29ca36..ab4c1a5 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -51,31 +51,6 @@ struct nfs_rw_header *nfs_readhdr_alloc(void)
}
EXPORT_SYMBOL_GPL(nfs_readhdr_alloc);
-static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
- unsigned int pagecount)
-{
- struct nfs_pgio_data *data, *prealloc;
-
- prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
- if (prealloc->header == NULL)
- data = prealloc;
- else
- data = kzalloc(sizeof(*data), GFP_KERNEL);
- if (!data)
- goto out;
-
- if (nfs_pgarray_set(&data->pages, pagecount)) {
- data->header = hdr;
- atomic_inc(&hdr->refcnt);
- } else {
- if (data != prealloc)
- kfree(data);
- data = NULL;
- }
-out:
- return data;
-}
-
void nfs_readhdr_free(struct nfs_pgio_header *hdr)
{
struct nfs_rw_header *rhdr = container_of(hdr, struct nfs_rw_header, header);
@@ -84,27 +59,6 @@ void nfs_readhdr_free(struct nfs_pgio_header *hdr)
}
EXPORT_SYMBOL_GPL(nfs_readhdr_free);
-void nfs_readdata_release(struct nfs_pgio_data *rdata)
-{
- struct nfs_pgio_header *hdr = rdata->header;
- struct nfs_rw_header *read_header = container_of(hdr, struct nfs_rw_header, header);
-
- put_nfs_open_context(rdata->args.context);
- if (rdata->pages.pagevec != rdata->pages.page_array)
- kfree(rdata->pages.pagevec);
- if (rdata == &read_header->rpc_data) {
- rdata->header = NULL;
- rdata = NULL;
- }
- if (atomic_dec_and_test(&hdr->refcnt))
- hdr->completion_ops->completion(hdr);
- /* Note: we only free the rpc_task after callbacks are done.
- * See the comment in rpc_free_task() for why
- */
- kfree(rdata);
-}
-EXPORT_SYMBOL_GPL(nfs_readdata_release);
-
static
int nfs_return_empty_page(struct page *page)
{
@@ -327,7 +281,7 @@ static void nfs_pagein_error(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
struct nfs_pgio_data, list);
list_del(&data->list);
- nfs_readdata_release(data);
+ nfs_pgio_data_release(data);
}
desc->pg_completion_ops->error_cleanup(&desc->pg_list);
}
@@ -359,7 +313,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
do {
size_t len = min(nbytes,rsize);
- data = nfs_readdata_alloc(hdr, 1);
+ data = nfs_pgio_data_alloc(hdr, 1);
if (!data) {
nfs_pagein_error(desc, hdr);
return -ENOMEM;
@@ -385,7 +339,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_data *data;
struct list_head *head = &desc->pg_list;
- data = nfs_readdata_alloc(hdr, nfs_page_array_len(desc->pg_base,
+ data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
desc->pg_count));
if (!data) {
nfs_pagein_error(desc, hdr);
@@ -515,7 +469,7 @@ static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
static void nfs_readpage_release_common(void *calldata)
{
- nfs_readdata_release(calldata);
+ nfs_pgio_data_release(calldata);
}
void nfs_read_prepare(struct rpc_task *task, void *calldata)
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 321a791..0dc4d6a 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -87,31 +87,6 @@ struct nfs_rw_header *nfs_writehdr_alloc(void)
}
EXPORT_SYMBOL_GPL(nfs_writehdr_alloc);
-static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
- unsigned int pagecount)
-{
- struct nfs_pgio_data *data, *prealloc;
-
- prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
- if (prealloc->header == NULL)
- data = prealloc;
- else
- data = kzalloc(sizeof(*data), GFP_KERNEL);
- if (!data)
- goto out;
-
- if (nfs_pgarray_set(&data->pages, pagecount)) {
- data->header = hdr;
- atomic_inc(&hdr->refcnt);
- } else {
- if (data != prealloc)
- kfree(data);
- data = NULL;
- }
-out:
- return data;
-}
-
void nfs_writehdr_free(struct nfs_pgio_header *hdr)
{
struct nfs_rw_header *whdr = container_of(hdr, struct nfs_rw_header, header);
@@ -119,27 +94,6 @@ void nfs_writehdr_free(struct nfs_pgio_header *hdr)
}
EXPORT_SYMBOL_GPL(nfs_writehdr_free);
-void nfs_writedata_release(struct nfs_pgio_data *wdata)
-{
- struct nfs_pgio_header *hdr = wdata->header;
- struct nfs_rw_header *write_header = container_of(hdr, struct nfs_rw_header, header);
-
- put_nfs_open_context(wdata->args.context);
- if (wdata->pages.pagevec != wdata->pages.page_array)
- kfree(wdata->pages.pagevec);
- if (wdata == &write_header->rpc_data) {
- wdata->header = NULL;
- wdata = NULL;
- }
- if (atomic_dec_and_test(&hdr->refcnt))
- hdr->completion_ops->completion(hdr);
- /* Note: we only free the rpc_task after callbacks are done.
- * See the comment in rpc_free_task() for why
- */
- kfree(wdata);
-}
-EXPORT_SYMBOL_GPL(nfs_writedata_release);
-
static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
{
ctx->error = error;
@@ -1146,7 +1100,7 @@ static void nfs_flush_error(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
struct nfs_pgio_data, list);
list_del(&data->list);
- nfs_writedata_release(data);
+ nfs_pgio_data_release(data);
}
desc->pg_completion_ops->error_cleanup(&desc->pg_list);
}
@@ -1179,7 +1133,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
do {
size_t len = min(nbytes, wsize);
- data = nfs_writedata_alloc(hdr, 1);
+ data = nfs_pgio_data_alloc(hdr, 1);
if (!data) {
nfs_flush_error(desc, hdr);
return -ENOMEM;
@@ -1214,7 +1168,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
struct list_head *head = &desc->pg_list;
struct nfs_commit_info cinfo;
- data = nfs_writedata_alloc(hdr, nfs_page_array_len(desc->pg_base,
+ data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
desc->pg_count));
if (!data) {
nfs_flush_error(desc, hdr);
@@ -1348,7 +1302,7 @@ static void nfs_writeback_release_common(void *calldata)
set_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags);
spin_unlock(&hdr->lock);
}
- nfs_writedata_release(data);
+ nfs_pgio_data_release(data);
}
static const struct rpc_call_ops nfs_write_common_ops = {
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 06/17] NFS: Create a common pgio_alloc and pgio_release function
2014-04-25 20:55 ` [PATCH v2 06/17] NFS: Create a common pgio_alloc and pgio_release function Anna Schumaker
@ 2014-05-02 19:06 ` Jeff Layton
0 siblings, 0 replies; 29+ messages in thread
From: Jeff Layton @ 2014-05-02 19:06 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond.Myklebust, linux-nfs, dros, hch
On Fri, 25 Apr 2014 16:55:49 -0400
Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> These functions are identical for the read and write paths, so combine
> them in a shared file.
>
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
> ---
> fs/nfs/Makefile | 2 +-
> fs/nfs/internal.h | 7 +++++--
> fs/nfs/pageio.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> fs/nfs/pnfs.c | 4 ++--
> fs/nfs/read.c | 54 ++++-------------------------------------------
> fs/nfs/write.c | 54 ++++-------------------------------------------
> 6 files changed, 79 insertions(+), 105 deletions(-)
> create mode 100644 fs/nfs/pageio.c
>
> diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
> index 03192a6..551d82a 100644
> --- a/fs/nfs/Makefile
> +++ b/fs/nfs/Makefile
> @@ -7,7 +7,7 @@ obj-$(CONFIG_NFS_FS) += nfs.o
> CFLAGS_nfstrace.o += -I$(src)
> nfs-y := client.o dir.o file.o getroot.o inode.o super.o \
> direct.o pagelist.o read.o symlink.o unlink.o \
> - write.o namespace.o mount_clnt.o nfstrace.o
> + write.o namespace.o mount_clnt.o nfstrace.o pageio.o
> nfs-$(CONFIG_ROOT_NFS) += nfsroot.o
> nfs-$(CONFIG_SYSCTL) += sysctl.o
> nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o
> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
> index b0e7a41..7f9d3c4 100644
> --- a/fs/nfs/internal.h
> +++ b/fs/nfs/internal.h
> @@ -394,6 +394,11 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
> #endif
>
> struct nfs_pgio_completion_ops;
> +
> +/* pageio.c */
> +extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
> +extern void nfs_pgio_data_release(struct nfs_pgio_data *);
> +
> /* read.c */
> extern struct nfs_rw_header *nfs_readhdr_alloc(void);
> extern void nfs_readhdr_free(struct nfs_pgio_header *hdr);
> @@ -407,7 +412,6 @@ extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
> extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_header *hdr);
> extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
> -extern void nfs_readdata_release(struct nfs_pgio_data *rdata);
>
> /* super.c */
> void nfs_clone_super(struct super_block *, struct nfs_mount_info *);
> @@ -429,7 +433,6 @@ extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
> extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_header *hdr);
> extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
> -extern void nfs_writedata_release(struct nfs_pgio_data *wdata);
> extern void nfs_commit_free(struct nfs_commit_data *p);
> extern int nfs_initiate_write(struct rpc_clnt *clnt,
> struct nfs_pgio_data *data,
> diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
> new file mode 100644
> index 0000000..895bb37
> --- /dev/null
> +++ b/fs/nfs/pageio.c
> @@ -0,0 +1,63 @@
> +/*
> + * linux/fs/nfs/pageio.c
> + *
> + * Generic pageio functions shared by read and write paths.
> + *
> + * Copyright (c) 2014 Anna Schumaker <anna.schumaker@netapp.com>
> + */
> +#include <linux/nfs_fs.h>
> +#include <linux/nfs_xdr.h>
> +
> +#include "internal.h"
> +
> +
> +static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
> +{
> + return container_of(hdr, struct nfs_rw_header, header);
> +}
> +
> +struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
> + unsigned int pagecount)
> +{
> + struct nfs_pgio_data *data, *prealloc;
> +
> + prealloc = &NFS_RW_HEADER(hdr)->rpc_data;
> + if (prealloc->header == NULL)
> + data = prealloc;
> + else
> + data = kzalloc(sizeof(*data), GFP_KERNEL);
> + if (!data)
> + goto out;
> +
> + if (nfs_pgarray_set(&data->pages, pagecount)) {
> + data->header = hdr;
> + atomic_inc(&hdr->refcnt);
> + } else {
> + if (data != prealloc)
> + kfree(data);
> + data = NULL;
> + }
> +out:
> + return data;
> +}
> +
> +void nfs_pgio_data_release(struct nfs_pgio_data *data)
> +{
> + struct nfs_pgio_header *hdr = data->header;
> + struct nfs_rw_header *pageio_header = NFS_RW_HEADER(hdr);
> +
> + put_nfs_open_context(data->args.context);
> + if (data->pages.pagevec != data->pages.page_array)
> + kfree(data->pages.pagevec);
> + if (data == &pageio_header->rpc_data) {
> + data->header = NULL;
> + data = NULL;
> + }
> + if (atomic_dec_and_test(&hdr->refcnt))
> + hdr->completion_ops->completion(hdr);
> + /* Note: we only free the rpc_task after callbacks are done.
> + * See the comment in rpc_free_task() for why
> + */
> + kfree(data);
> +}
> +EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 43cfe11..e192ba6 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1536,7 +1536,7 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
> nfs_pageio_reset_write_mds(desc);
> desc->pg_recoalesce = 1;
> }
> - nfs_writedata_release(data);
> + nfs_pgio_data_release(data);
> }
>
> static enum pnfs_try_status
> @@ -1691,7 +1691,7 @@ pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
> nfs_pageio_reset_read_mds(desc);
> desc->pg_recoalesce = 1;
> }
> - nfs_readdata_release(data);
> + nfs_pgio_data_release(data);
> }
>
> /*
> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
> index d29ca36..ab4c1a5 100644
> --- a/fs/nfs/read.c
> +++ b/fs/nfs/read.c
> @@ -51,31 +51,6 @@ struct nfs_rw_header *nfs_readhdr_alloc(void)
> }
> EXPORT_SYMBOL_GPL(nfs_readhdr_alloc);
>
> -static struct nfs_pgio_data *nfs_readdata_alloc(struct nfs_pgio_header *hdr,
> - unsigned int pagecount)
> -{
> - struct nfs_pgio_data *data, *prealloc;
> -
> - prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
> - if (prealloc->header == NULL)
> - data = prealloc;
> - else
> - data = kzalloc(sizeof(*data), GFP_KERNEL);
> - if (!data)
> - goto out;
> -
> - if (nfs_pgarray_set(&data->pages, pagecount)) {
> - data->header = hdr;
> - atomic_inc(&hdr->refcnt);
> - } else {
> - if (data != prealloc)
> - kfree(data);
> - data = NULL;
> - }
> -out:
> - return data;
> -}
> -
> void nfs_readhdr_free(struct nfs_pgio_header *hdr)
> {
> struct nfs_rw_header *rhdr = container_of(hdr, struct nfs_rw_header, header);
> @@ -84,27 +59,6 @@ void nfs_readhdr_free(struct nfs_pgio_header *hdr)
> }
> EXPORT_SYMBOL_GPL(nfs_readhdr_free);
>
> -void nfs_readdata_release(struct nfs_pgio_data *rdata)
> -{
> - struct nfs_pgio_header *hdr = rdata->header;
> - struct nfs_rw_header *read_header = container_of(hdr, struct nfs_rw_header, header);
> -
> - put_nfs_open_context(rdata->args.context);
> - if (rdata->pages.pagevec != rdata->pages.page_array)
> - kfree(rdata->pages.pagevec);
> - if (rdata == &read_header->rpc_data) {
> - rdata->header = NULL;
> - rdata = NULL;
> - }
> - if (atomic_dec_and_test(&hdr->refcnt))
> - hdr->completion_ops->completion(hdr);
> - /* Note: we only free the rpc_task after callbacks are done.
> - * See the comment in rpc_free_task() for why
> - */
> - kfree(rdata);
> -}
> -EXPORT_SYMBOL_GPL(nfs_readdata_release);
> -
> static
> int nfs_return_empty_page(struct page *page)
> {
> @@ -327,7 +281,7 @@ static void nfs_pagein_error(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
> struct nfs_pgio_data, list);
> list_del(&data->list);
> - nfs_readdata_release(data);
> + nfs_pgio_data_release(data);
> }
> desc->pg_completion_ops->error_cleanup(&desc->pg_list);
> }
> @@ -359,7 +313,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
> do {
> size_t len = min(nbytes,rsize);
>
> - data = nfs_readdata_alloc(hdr, 1);
> + data = nfs_pgio_data_alloc(hdr, 1);
> if (!data) {
> nfs_pagein_error(desc, hdr);
> return -ENOMEM;
> @@ -385,7 +339,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_data *data;
> struct list_head *head = &desc->pg_list;
>
> - data = nfs_readdata_alloc(hdr, nfs_page_array_len(desc->pg_base,
> + data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
> desc->pg_count));
> if (!data) {
> nfs_pagein_error(desc, hdr);
> @@ -515,7 +469,7 @@ static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
>
> static void nfs_readpage_release_common(void *calldata)
> {
> - nfs_readdata_release(calldata);
> + nfs_pgio_data_release(calldata);
> }
>
> void nfs_read_prepare(struct rpc_task *task, void *calldata)
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index 321a791..0dc4d6a 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -87,31 +87,6 @@ struct nfs_rw_header *nfs_writehdr_alloc(void)
> }
> EXPORT_SYMBOL_GPL(nfs_writehdr_alloc);
>
> -static struct nfs_pgio_data *nfs_writedata_alloc(struct nfs_pgio_header *hdr,
> - unsigned int pagecount)
> -{
> - struct nfs_pgio_data *data, *prealloc;
> -
> - prealloc = &container_of(hdr, struct nfs_rw_header, header)->rpc_data;
> - if (prealloc->header == NULL)
> - data = prealloc;
> - else
> - data = kzalloc(sizeof(*data), GFP_KERNEL);
> - if (!data)
> - goto out;
> -
> - if (nfs_pgarray_set(&data->pages, pagecount)) {
> - data->header = hdr;
> - atomic_inc(&hdr->refcnt);
> - } else {
> - if (data != prealloc)
> - kfree(data);
> - data = NULL;
> - }
> -out:
> - return data;
> -}
> -
> void nfs_writehdr_free(struct nfs_pgio_header *hdr)
> {
> struct nfs_rw_header *whdr = container_of(hdr, struct nfs_rw_header, header);
> @@ -119,27 +94,6 @@ void nfs_writehdr_free(struct nfs_pgio_header *hdr)
> }
> EXPORT_SYMBOL_GPL(nfs_writehdr_free);
>
> -void nfs_writedata_release(struct nfs_pgio_data *wdata)
> -{
> - struct nfs_pgio_header *hdr = wdata->header;
> - struct nfs_rw_header *write_header = container_of(hdr, struct nfs_rw_header, header);
> -
> - put_nfs_open_context(wdata->args.context);
> - if (wdata->pages.pagevec != wdata->pages.page_array)
> - kfree(wdata->pages.pagevec);
> - if (wdata == &write_header->rpc_data) {
> - wdata->header = NULL;
> - wdata = NULL;
> - }
> - if (atomic_dec_and_test(&hdr->refcnt))
> - hdr->completion_ops->completion(hdr);
> - /* Note: we only free the rpc_task after callbacks are done.
> - * See the comment in rpc_free_task() for why
> - */
> - kfree(wdata);
> -}
> -EXPORT_SYMBOL_GPL(nfs_writedata_release);
> -
> static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
> {
> ctx->error = error;
> @@ -1146,7 +1100,7 @@ static void nfs_flush_error(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
> struct nfs_pgio_data, list);
> list_del(&data->list);
> - nfs_writedata_release(data);
> + nfs_pgio_data_release(data);
> }
> desc->pg_completion_ops->error_cleanup(&desc->pg_list);
> }
> @@ -1179,7 +1133,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
> do {
> size_t len = min(nbytes, wsize);
>
> - data = nfs_writedata_alloc(hdr, 1);
> + data = nfs_pgio_data_alloc(hdr, 1);
> if (!data) {
> nfs_flush_error(desc, hdr);
> return -ENOMEM;
> @@ -1214,7 +1168,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
> struct list_head *head = &desc->pg_list;
> struct nfs_commit_info cinfo;
>
> - data = nfs_writedata_alloc(hdr, nfs_page_array_len(desc->pg_base,
> + data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
> desc->pg_count));
> if (!data) {
> nfs_flush_error(desc, hdr);
> @@ -1348,7 +1302,7 @@ static void nfs_writeback_release_common(void *calldata)
> set_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags);
> spin_unlock(&hdr->lock);
> }
> - nfs_writedata_release(data);
> + nfs_pgio_data_release(data);
> }
>
> static const struct rpc_call_ops nfs_write_common_ops = {
Reviewed-by: Jeff Layton <jlayton@poochiereds.net>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 07/17] NFS: Create a common rw_header_alloc and rw_header_free function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (5 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 06/17] NFS: Create a common pgio_alloc and pgio_release function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 08/17] NFS: Create a common pgio_rpc_prepare function Anna Schumaker
` (10 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
I create a new struct nfs_rw_ops to decide the differences between reads
and writes. This struct will be set when initializing a new
nfs_pgio_descriptor, and then passed on to the nfs_rw_header when a new
header is allocated.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 6 ++----
fs/nfs/pageio.c | 24 ++++++++++++++++++++++++
fs/nfs/pagelist.c | 2 ++
fs/nfs/pnfs.c | 8 ++++----
fs/nfs/read.c | 34 +++++++++++++---------------------
fs/nfs/write.c | 28 ++++++++++++----------------
include/linux/nfs_page.h | 7 +++++++
include/linux/nfs_xdr.h | 1 +
8 files changed, 65 insertions(+), 45 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 7f9d3c4..7e8d311 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -396,12 +396,12 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
struct nfs_pgio_completion_ops;
/* pageio.c */
+extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
+extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
/* read.c */
-extern struct nfs_rw_header *nfs_readhdr_alloc(void);
-extern void nfs_readhdr_free(struct nfs_pgio_header *hdr);
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
struct inode *inode, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops);
@@ -428,8 +428,6 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops);
-extern struct nfs_rw_header *nfs_writehdr_alloc(void);
-extern void nfs_writehdr_free(struct nfs_pgio_header *hdr);
extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index 895bb37..b4d6fe4 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -6,6 +6,7 @@
* Copyright (c) 2014 Anna Schumaker <anna.schumaker@netapp.com>
*/
#include <linux/nfs_fs.h>
+#include <linux/nfs_page.h>
#include <linux/nfs_xdr.h>
#include "internal.h"
@@ -16,6 +17,29 @@ static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
return container_of(hdr, struct nfs_rw_header, header);
}
+struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *ops)
+{
+ struct nfs_rw_header *header = ops->rw_alloc_header();
+
+ if (header) {
+ struct nfs_pgio_header *hdr = &header->header;
+
+ INIT_LIST_HEAD(&hdr->pages);
+ INIT_LIST_HEAD(&hdr->rpc_list);
+ spin_lock_init(&hdr->lock);
+ atomic_set(&hdr->refcnt, 0);
+ hdr->rw_ops = ops;
+ }
+ return header;
+}
+EXPORT_SYMBOL_GPL(nfs_rw_header_alloc);
+
+void nfs_rw_header_free(struct nfs_pgio_header *hdr)
+{
+ hdr->rw_ops->rw_free_header(NFS_RW_HEADER(hdr));
+}
+EXPORT_SYMBOL_GPL(nfs_rw_header_free);
+
struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
unsigned int pagecount)
{
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 2ffebf2..8221706 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -307,6 +307,7 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
struct inode *inode,
const struct nfs_pageio_ops *pg_ops,
const struct nfs_pgio_completion_ops *compl_ops,
+ const struct nfs_rw_ops *rw_ops,
size_t bsize,
int io_flags)
{
@@ -320,6 +321,7 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
desc->pg_inode = inode;
desc->pg_ops = pg_ops;
desc->pg_completion_ops = compl_ops;
+ desc->pg_rw_ops = rw_ops;
desc->pg_ioflags = io_flags;
desc->pg_error = 0;
desc->pg_lseg = NULL;
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index e192ba6..54c84c1 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1585,7 +1585,7 @@ pnfs_do_multiple_writes(struct nfs_pageio_descriptor *desc, struct list_head *he
static void pnfs_writehdr_free(struct nfs_pgio_header *hdr)
{
pnfs_put_lseg(hdr->lseg);
- nfs_writehdr_free(hdr);
+ nfs_rw_header_free(hdr);
}
EXPORT_SYMBOL_GPL(pnfs_writehdr_free);
@@ -1596,7 +1596,7 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
struct nfs_pgio_header *hdr;
int ret;
- whdr = nfs_writehdr_alloc();
+ whdr = nfs_rw_header_alloc(desc->pg_rw_ops);
if (!whdr) {
desc->pg_completion_ops->error_cleanup(&desc->pg_list);
pnfs_put_lseg(desc->pg_lseg);
@@ -1743,7 +1743,7 @@ pnfs_do_multiple_reads(struct nfs_pageio_descriptor *desc, struct list_head *hea
static void pnfs_readhdr_free(struct nfs_pgio_header *hdr)
{
pnfs_put_lseg(hdr->lseg);
- nfs_readhdr_free(hdr);
+ nfs_rw_header_free(hdr);
}
EXPORT_SYMBOL_GPL(pnfs_readhdr_free);
@@ -1754,7 +1754,7 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
struct nfs_pgio_header *hdr;
int ret;
- rhdr = nfs_readhdr_alloc();
+ rhdr = nfs_rw_header_alloc(desc->pg_rw_ops);
if (!rhdr) {
desc->pg_completion_ops->error_cleanup(&desc->pg_list);
ret = -ENOMEM;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index ab4c1a5..4cf3577 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -31,33 +31,19 @@
static const struct nfs_pageio_ops nfs_pageio_read_ops;
static const struct rpc_call_ops nfs_read_common_ops;
static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
+static const struct nfs_rw_ops nfs_rw_read_ops;
static struct kmem_cache *nfs_rdata_cachep;
-struct nfs_rw_header *nfs_readhdr_alloc(void)
+static struct nfs_rw_header *nfs_readhdr_alloc(void)
{
- struct nfs_rw_header *rhdr;
-
- rhdr = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
- if (rhdr) {
- struct nfs_pgio_header *hdr = &rhdr->header;
-
- INIT_LIST_HEAD(&hdr->pages);
- INIT_LIST_HEAD(&hdr->rpc_list);
- spin_lock_init(&hdr->lock);
- atomic_set(&hdr->refcnt, 0);
- }
- return rhdr;
+ return kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
}
-EXPORT_SYMBOL_GPL(nfs_readhdr_alloc);
-void nfs_readhdr_free(struct nfs_pgio_header *hdr)
+static void nfs_readhdr_free(struct nfs_rw_header *rhdr)
{
- struct nfs_rw_header *rhdr = container_of(hdr, struct nfs_rw_header, header);
-
kmem_cache_free(nfs_rdata_cachep, rhdr);
}
-EXPORT_SYMBOL_GPL(nfs_readhdr_free);
static
int nfs_return_empty_page(struct page *page)
@@ -79,7 +65,8 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
if (server->pnfs_curr_ld && !force_mds)
pg_ops = server->pnfs_curr_ld->pg_read_ops;
#endif
- nfs_pageio_init(pgio, inode, pg_ops, compl_ops, server->rsize, 0);
+ nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_read_ops,
+ server->rsize, 0);
}
EXPORT_SYMBOL_GPL(nfs_pageio_init_read);
@@ -375,13 +362,13 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
struct nfs_pgio_header *hdr;
int ret;
- rhdr = nfs_readhdr_alloc();
+ rhdr = nfs_rw_header_alloc(desc->pg_rw_ops);
if (!rhdr) {
desc->pg_completion_ops->error_cleanup(&desc->pg_list);
return -ENOMEM;
}
hdr = &rhdr->header;
- nfs_pgheader_init(desc, hdr, nfs_readhdr_free);
+ nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
atomic_inc(&hdr->refcnt);
ret = nfs_generic_pagein(desc, hdr);
if (ret == 0)
@@ -647,3 +634,8 @@ void nfs_destroy_readpagecache(void)
{
kmem_cache_destroy(nfs_rdata_cachep);
}
+
+static const struct nfs_rw_ops nfs_rw_read_ops = {
+ .rw_alloc_header = nfs_readhdr_alloc,
+ .rw_free_header = nfs_readhdr_free,
+};
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 0dc4d6a..9c5cde3 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -46,6 +46,7 @@ static const struct rpc_call_ops nfs_write_common_ops;
static const struct rpc_call_ops nfs_commit_ops;
static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops;
static const struct nfs_commit_completion_ops nfs_commit_completion_ops;
+static const struct nfs_rw_ops nfs_rw_write_ops;
static struct kmem_cache *nfs_wdata_cachep;
static mempool_t *nfs_wdata_mempool;
@@ -70,29 +71,19 @@ void nfs_commit_free(struct nfs_commit_data *p)
}
EXPORT_SYMBOL_GPL(nfs_commit_free);
-struct nfs_rw_header *nfs_writehdr_alloc(void)
+static struct nfs_rw_header *nfs_writehdr_alloc(void)
{
struct nfs_rw_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
- if (p) {
- struct nfs_pgio_header *hdr = &p->header;
-
+ if (p)
memset(p, 0, sizeof(*p));
- INIT_LIST_HEAD(&hdr->pages);
- INIT_LIST_HEAD(&hdr->rpc_list);
- spin_lock_init(&hdr->lock);
- atomic_set(&hdr->refcnt, 0);
- }
return p;
}
-EXPORT_SYMBOL_GPL(nfs_writehdr_alloc);
-void nfs_writehdr_free(struct nfs_pgio_header *hdr)
+static void nfs_writehdr_free(struct nfs_rw_header *whdr)
{
- struct nfs_rw_header *whdr = container_of(hdr, struct nfs_rw_header, header);
mempool_free(whdr, nfs_wdata_mempool);
}
-EXPORT_SYMBOL_GPL(nfs_writehdr_free);
static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
{
@@ -1210,13 +1201,13 @@ static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
struct nfs_pgio_header *hdr;
int ret;
- whdr = nfs_writehdr_alloc();
+ whdr = nfs_rw_header_alloc(desc->pg_rw_ops);
if (!whdr) {
desc->pg_completion_ops->error_cleanup(&desc->pg_list);
return -ENOMEM;
}
hdr = &whdr->header;
- nfs_pgheader_init(desc, hdr, nfs_writehdr_free);
+ nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
atomic_inc(&hdr->refcnt);
ret = nfs_generic_flush(desc, hdr);
if (ret == 0)
@@ -1244,7 +1235,8 @@ void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
if (server->pnfs_curr_ld && !force_mds)
pg_ops = server->pnfs_curr_ld->pg_write_ops;
#endif
- nfs_pageio_init(pgio, inode, pg_ops, compl_ops, server->wsize, ioflags);
+ nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_write_ops,
+ server->wsize, ioflags);
}
EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
@@ -1925,3 +1917,7 @@ void nfs_destroy_writepagecache(void)
kmem_cache_destroy(nfs_wdata_cachep);
}
+static const struct nfs_rw_ops nfs_rw_write_ops = {
+ .rw_alloc_header = nfs_writehdr_alloc,
+ .rw_free_header = nfs_writehdr_free,
+};
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 92ce578..5948125 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -52,6 +52,11 @@ struct nfs_pageio_ops {
int (*pg_doio)(struct nfs_pageio_descriptor *);
};
+struct nfs_rw_ops {
+ struct nfs_rw_header *(*rw_alloc_header)(void);
+ void (*rw_free_header)(struct nfs_rw_header *);
+};
+
struct nfs_pageio_descriptor {
struct list_head pg_list;
unsigned long pg_bytes_written;
@@ -63,6 +68,7 @@ struct nfs_pageio_descriptor {
struct inode *pg_inode;
const struct nfs_pageio_ops *pg_ops;
+ const struct nfs_rw_ops *pg_rw_ops;
int pg_ioflags;
int pg_error;
const struct rpc_call_ops *pg_rpc_callops;
@@ -86,6 +92,7 @@ extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
struct inode *inode,
const struct nfs_pageio_ops *pg_ops,
const struct nfs_pgio_completion_ops *compl_ops,
+ const struct nfs_rw_ops *rw_ops,
size_t bsize,
int how);
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 965c2aa..a1b91b6 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1269,6 +1269,7 @@ struct nfs_pgio_header {
const struct rpc_call_ops *mds_ops;
void (*release) (struct nfs_pgio_header *hdr);
const struct nfs_pgio_completion_ops *completion_ops;
+ const struct nfs_rw_ops *rw_ops;
struct nfs_direct_req *dreq;
void *layout_private;
spinlock_t lock;
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 08/17] NFS: Create a common pgio_rpc_prepare function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (6 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 07/17] NFS: Create a common rw_header_alloc and rw_header_free function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 09/17] NFS: Create a common nfs_pgio_result_common function Anna Schumaker
` (9 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
The read and write paths do exactly the same thing for the rpc_prepare
rpc_op. This patch combines them together into a single function.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 2 ++
fs/nfs/nfs3proc.c | 11 ++---------
fs/nfs/nfs4proc.c | 22 +++-------------------
fs/nfs/pageio.c | 17 +++++++++++++++++
fs/nfs/proc.c | 11 ++---------
fs/nfs/read.c | 19 +++----------------
fs/nfs/write.c | 19 +++++--------------
include/linux/nfs_page.h | 2 ++
include/linux/nfs_xdr.h | 3 +--
9 files changed, 37 insertions(+), 69 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 7e8d311..105e2b5 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -400,6 +400,8 @@ extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
+extern void nfs_pgio_prepare(struct rpc_task *, void *);
+extern void nfs_pgio_release_common(void *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index d235369..e7daa42 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -812,7 +812,7 @@ static void nfs3_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message
msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ];
}
-static int nfs3_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
+static int nfs3_proc_pgio_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
rpc_call_start(task);
return 0;
@@ -834,12 +834,6 @@ static void nfs3_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message
msg->rpc_proc = &nfs3_procedures[NFS3PROC_WRITE];
}
-static int nfs3_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
-{
- rpc_call_start(task);
- return 0;
-}
-
static void nfs3_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
{
rpc_call_start(task);
@@ -946,11 +940,10 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.fsinfo = nfs3_proc_fsinfo,
.pathconf = nfs3_proc_pathconf,
.decode_dirent = nfs3_decode_dirent,
+ .pgio_rpc_prepare = nfs3_proc_pgio_rpc_prepare,
.read_setup = nfs3_proc_read_setup,
- .read_rpc_prepare = nfs3_proc_read_rpc_prepare,
.read_done = nfs3_read_done,
.write_setup = nfs3_proc_write_setup,
- .write_rpc_prepare = nfs3_proc_write_rpc_prepare,
.write_done = nfs3_write_done,
.commit_setup = nfs3_proc_commit_setup,
.commit_rpc_prepare = nfs3_proc_commit_rpc_prepare,
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index e793aa9..44fb93a 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4089,7 +4089,7 @@ static void nfs4_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0);
}
-static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
+static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
if (nfs4_setup_sequence(NFS_SERVER(data->header->inode),
&data->args.seq_args,
@@ -4097,7 +4097,7 @@ static int nfs4_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_dat
task))
return 0;
if (nfs4_set_rw_stateid(&data->args.stateid, data->args.context,
- data->args.lock_context, FMODE_READ) == -EIO)
+ data->args.lock_context, data->header->rw_ops->rw_mode) == -EIO)
return -EIO;
if (unlikely(test_bit(NFS_CONTEXT_BAD, &data->args.context->flags)))
return -EIO;
@@ -4177,21 +4177,6 @@ static void nfs4_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
}
-static int nfs4_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
-{
- if (nfs4_setup_sequence(NFS_SERVER(data->header->inode),
- &data->args.seq_args,
- &data->res.seq_res,
- task))
- return 0;
- if (nfs4_set_rw_stateid(&data->args.stateid, data->args.context,
- data->args.lock_context, FMODE_WRITE) == -EIO)
- return -EIO;
- if (unlikely(test_bit(NFS_CONTEXT_BAD, &data->args.context->flags)))
- return -EIO;
- return 0;
-}
-
static void nfs4_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
{
nfs4_setup_sequence(NFS_SERVER(data->inode),
@@ -8432,11 +8417,10 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.pathconf = nfs4_proc_pathconf,
.set_capabilities = nfs4_server_capabilities,
.decode_dirent = nfs4_decode_dirent,
+ .pgio_rpc_prepare = nfs4_proc_pgio_rpc_prepare,
.read_setup = nfs4_proc_read_setup,
- .read_rpc_prepare = nfs4_proc_read_rpc_prepare,
.read_done = nfs4_read_done,
.write_setup = nfs4_proc_write_setup,
- .write_rpc_prepare = nfs4_proc_write_rpc_prepare,
.write_done = nfs4_write_done,
.commit_setup = nfs4_proc_commit_setup,
.commit_rpc_prepare = nfs4_proc_commit_rpc_prepare,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index b4d6fe4..97a483e 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -85,3 +85,20 @@ void nfs_pgio_data_release(struct nfs_pgio_data *data)
kfree(data);
}
EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
+
+void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
+{
+ struct nfs_pgio_data *data = calldata;
+ int err;
+ err = NFS_PROTO(data->header->inode)->pgio_rpc_prepare(task, data);
+ if (err)
+ rpc_exit(task, err);
+}
+
+void nfs_pgio_release_common(void *calldata)
+{
+ struct nfs_pgio_data *data = calldata;
+ if (data->header->rw_ops->rw_release)
+ data->header->rw_ops->rw_release(data);
+ nfs_pgio_data_release(data);
+}
diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
index c54829e..c171ce1 100644
--- a/fs/nfs/proc.c
+++ b/fs/nfs/proc.c
@@ -599,7 +599,7 @@ static void nfs_proc_read_setup(struct nfs_pgio_data *data, struct rpc_message *
msg->rpc_proc = &nfs_procedures[NFSPROC_READ];
}
-static int nfs_proc_read_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
+static int nfs_proc_pgio_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
{
rpc_call_start(task);
return 0;
@@ -621,12 +621,6 @@ static void nfs_proc_write_setup(struct nfs_pgio_data *data, struct rpc_message
msg->rpc_proc = &nfs_procedures[NFSPROC_WRITE];
}
-static int nfs_proc_write_rpc_prepare(struct rpc_task *task, struct nfs_pgio_data *data)
-{
- rpc_call_start(task);
- return 0;
-}
-
static void nfs_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
{
BUG();
@@ -734,11 +728,10 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.fsinfo = nfs_proc_fsinfo,
.pathconf = nfs_proc_pathconf,
.decode_dirent = nfs2_decode_dirent,
+ .pgio_rpc_prepare = nfs_proc_pgio_rpc_prepare,
.read_setup = nfs_proc_read_setup,
- .read_rpc_prepare = nfs_proc_read_rpc_prepare,
.read_done = nfs_read_done,
.write_setup = nfs_proc_write_setup,
- .write_rpc_prepare = nfs_proc_write_rpc_prepare,
.write_done = nfs_write_done,
.commit_setup = nfs_proc_commit_setup,
.commit_rpc_prepare = nfs_proc_commit_rpc_prepare,
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 4cf3577..313835b 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -454,24 +454,10 @@ static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
nfs_readpage_retry(task, data);
}
-static void nfs_readpage_release_common(void *calldata)
-{
- nfs_pgio_data_release(calldata);
-}
-
-void nfs_read_prepare(struct rpc_task *task, void *calldata)
-{
- struct nfs_pgio_data *data = calldata;
- int err;
- err = NFS_PROTO(data->header->inode)->read_rpc_prepare(task, data);
- if (err)
- rpc_exit(task, err);
-}
-
static const struct rpc_call_ops nfs_read_common_ops = {
- .rpc_call_prepare = nfs_read_prepare,
+ .rpc_call_prepare = nfs_pgio_prepare,
.rpc_call_done = nfs_readpage_result_common,
- .rpc_release = nfs_readpage_release_common,
+ .rpc_release = nfs_pgio_release_common,
};
/*
@@ -636,6 +622,7 @@ void nfs_destroy_readpagecache(void)
}
static const struct nfs_rw_ops nfs_rw_read_ops = {
+ .rw_mode = FMODE_READ,
.rw_alloc_header = nfs_readhdr_alloc,
.rw_free_header = nfs_readhdr_free,
};
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 9c5cde3..b08fb7d 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1248,15 +1248,6 @@ void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio)
EXPORT_SYMBOL_GPL(nfs_pageio_reset_write_mds);
-void nfs_write_prepare(struct rpc_task *task, void *calldata)
-{
- struct nfs_pgio_data *data = calldata;
- int err;
- err = NFS_PROTO(data->header->inode)->write_rpc_prepare(task, data);
- if (err)
- rpc_exit(task, err);
-}
-
void nfs_commit_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_commit_data *data = calldata;
@@ -1278,9 +1269,8 @@ static void nfs_writeback_done_common(struct rpc_task *task, void *calldata)
nfs_writeback_done(task, data);
}
-static void nfs_writeback_release_common(void *calldata)
+static void nfs_writeback_release_common(struct nfs_pgio_data *data)
{
- struct nfs_pgio_data *data = calldata;
struct nfs_pgio_header *hdr = data->header;
int status = data->task.tk_status;
@@ -1294,13 +1284,12 @@ static void nfs_writeback_release_common(void *calldata)
set_bit(NFS_IOHDR_NEED_RESCHED, &hdr->flags);
spin_unlock(&hdr->lock);
}
- nfs_pgio_data_release(data);
}
static const struct rpc_call_ops nfs_write_common_ops = {
- .rpc_call_prepare = nfs_write_prepare,
+ .rpc_call_prepare = nfs_pgio_prepare,
.rpc_call_done = nfs_writeback_done_common,
- .rpc_release = nfs_writeback_release_common,
+ .rpc_release = nfs_pgio_release_common,
};
/*
@@ -1918,6 +1907,8 @@ void nfs_destroy_writepagecache(void)
}
static const struct nfs_rw_ops nfs_rw_write_ops = {
+ .rw_mode = FMODE_WRITE,
.rw_alloc_header = nfs_writehdr_alloc,
.rw_free_header = nfs_writehdr_free,
+ .rw_release = nfs_writeback_release_common,
};
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 5948125..da00a4d 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -53,8 +53,10 @@ struct nfs_pageio_ops {
};
struct nfs_rw_ops {
+ const fmode_t rw_mode;
struct nfs_rw_header *(*rw_alloc_header)(void);
void (*rw_free_header)(struct nfs_rw_header *);
+ void (*rw_release)(struct nfs_pgio_data *);
};
struct nfs_pageio_descriptor {
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index a1b91b6..adef7bd 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1429,11 +1429,10 @@ struct nfs_rpc_ops {
struct nfs_pathconf *);
int (*set_capabilities)(struct nfs_server *, struct nfs_fh *);
int (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, int);
+ int (*pgio_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
void (*read_setup) (struct nfs_pgio_data *, struct rpc_message *);
- int (*read_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
int (*read_done) (struct rpc_task *, struct nfs_pgio_data *);
void (*write_setup) (struct nfs_pgio_data *, struct rpc_message *);
- int (*write_rpc_prepare)(struct rpc_task *, struct nfs_pgio_data *);
int (*write_done) (struct rpc_task *, struct nfs_pgio_data *);
void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *);
void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *);
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 09/17] NFS: Create a common nfs_pgio_result_common function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (7 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 08/17] NFS: Create a common pgio_rpc_prepare function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 10/17] NFS: Create a common rpc_call_ops struct Anna Schumaker
` (8 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
Combining these functions will let me make a single nfs_rw_common_ops
struct (see the next patch).
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 1 +
fs/nfs/pageio.c | 23 ++++++++++++++++++++++
fs/nfs/read.c | 25 ++++++++----------------
fs/nfs/write.c | 51 +++++++++++++++++++-----------------------------
include/linux/nfs_fs.h | 1 -
include/linux/nfs_page.h | 2 ++
6 files changed, 54 insertions(+), 49 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 105e2b5..b18cca4 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -402,6 +402,7 @@ extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsig
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
extern void nfs_pgio_prepare(struct rpc_task *, void *);
extern void nfs_pgio_release_common(void *);
+extern void nfs_pgio_result_common(struct rpc_task *, void *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index 97a483e..91c49cc 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -11,6 +11,7 @@
#include "internal.h"
+#define NFSDBG_FACILITY NFSDBG_PAGECACHE
static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
{
@@ -102,3 +103,25 @@ void nfs_pgio_release_common(void *calldata)
data->header->rw_ops->rw_release(data);
nfs_pgio_data_release(data);
}
+
+static int nfs_pgio_result(struct rpc_task *task, struct nfs_pgio_data *data)
+{
+ struct inode *inode = data->header->inode;
+
+ dprintk("NFS: %s: %5u, (status %d)\n", __func__, task->tk_pid,
+ task->tk_status);
+
+ return data->header->rw_ops->rw_result(task, data, inode);
+}
+
+void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
+{
+ struct nfs_pgio_data *data = calldata;
+
+ if (nfs_pgio_result(task, data) != 0)
+ return;
+ if (task->tk_status < 0)
+ nfs_set_pgio_error(data->header, task->tk_status, data->args.offset);
+ else
+ data->header->rw_ops->rw_result_common(task, data);
+}
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 313835b..4f49507 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -388,15 +388,10 @@ static const struct nfs_pageio_ops nfs_pageio_read_ops = {
* This is the callback from RPC telling us whether a reply was
* received or some error occurred (timeout or socket shutdown).
*/
-int nfs_readpage_result(struct rpc_task *task, struct nfs_pgio_data *data)
+static int nfs_readpage_result(struct rpc_task *task, struct nfs_pgio_data *data,
+ struct inode *inode)
{
- struct inode *inode = data->header->inode;
- int status;
-
- dprintk("NFS: %s: %5u, (status %d)\n", __func__, task->tk_pid,
- task->tk_status);
-
- status = NFS_PROTO(inode)->read_done(task, data);
+ int status = NFS_PROTO(inode)->read_done(task, data);
if (status != 0)
return status;
@@ -429,17 +424,11 @@ static void nfs_readpage_retry(struct rpc_task *task, struct nfs_pgio_data *data
rpc_restart_call_prepare(task);
}
-static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
+static void nfs_readpage_result_common(struct rpc_task *task, struct nfs_pgio_data *data)
{
- struct nfs_pgio_data *data = calldata;
struct nfs_pgio_header *hdr = data->header;
- /* Note the only returns of nfs_readpage_result are 0 and -EAGAIN */
- if (nfs_readpage_result(task, data) != 0)
- return;
- if (task->tk_status < 0)
- nfs_set_pgio_error(hdr, task->tk_status, data->args.offset);
- else if (data->res.eof) {
+ if (data->res.eof) {
loff_t bound;
bound = data->args.offset + data->res.count;
@@ -456,7 +445,7 @@ static void nfs_readpage_result_common(struct rpc_task *task, void *calldata)
static const struct rpc_call_ops nfs_read_common_ops = {
.rpc_call_prepare = nfs_pgio_prepare,
- .rpc_call_done = nfs_readpage_result_common,
+ .rpc_call_done = nfs_pgio_result_common,
.rpc_release = nfs_pgio_release_common,
};
@@ -625,4 +614,6 @@ static const struct nfs_rw_ops nfs_rw_read_ops = {
.rw_mode = FMODE_READ,
.rw_alloc_header = nfs_readhdr_alloc,
.rw_free_header = nfs_readhdr_free,
+ .rw_result = nfs_readpage_result,
+ .rw_result_common = nfs_readpage_result_common,
};
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index b08fb7d..d2351a1 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1255,20 +1255,6 @@ void nfs_commit_prepare(struct rpc_task *task, void *calldata)
NFS_PROTO(data->inode)->commit_rpc_prepare(task, data);
}
-/*
- * Handle a write reply that flushes a whole page.
- *
- * FIXME: There is an inherent race with invalidate_inode_pages and
- * writebacks since the page->count is kept > 1 for as long
- * as the page has a write request pending.
- */
-static void nfs_writeback_done_common(struct rpc_task *task, void *calldata)
-{
- struct nfs_pgio_data *data = calldata;
-
- nfs_writeback_done(task, data);
-}
-
static void nfs_writeback_release_common(struct nfs_pgio_data *data)
{
struct nfs_pgio_header *hdr = data->header;
@@ -1288,7 +1274,7 @@ static void nfs_writeback_release_common(struct nfs_pgio_data *data)
static const struct rpc_call_ops nfs_write_common_ops = {
.rpc_call_prepare = nfs_pgio_prepare,
- .rpc_call_done = nfs_writeback_done_common,
+ .rpc_call_done = nfs_pgio_result_common,
.rpc_release = nfs_pgio_release_common,
};
@@ -1320,16 +1306,11 @@ static int nfs_should_remove_suid(const struct inode *inode)
/*
* This function is called when the WRITE call is complete.
*/
-void nfs_writeback_done(struct rpc_task *task, struct nfs_pgio_data *data)
+static int nfs_writeback_result(struct rpc_task *task, struct nfs_pgio_data *data,
+ struct inode *inode)
{
- struct nfs_pgio_args *argp = &data->args;
- struct nfs_pgio_res *resp = &data->res;
- struct inode *inode = data->header->inode;
int status;
- dprintk("NFS: %5u nfs_writeback_done (status %d)\n",
- task->tk_pid, task->tk_status);
-
/*
* ->write_done will attempt to use post-op attributes to detect
* conflicting writes by other clients. A strict interpretation
@@ -1339,11 +1320,11 @@ void nfs_writeback_done(struct rpc_task *task, struct nfs_pgio_data *data)
*/
status = NFS_PROTO(inode)->write_done(task, data);
if (status != 0)
- return;
- nfs_add_stats(inode, NFSIOS_SERVERWRITTENBYTES, resp->count);
+ return status;
+ nfs_add_stats(inode, NFSIOS_SERVERWRITTENBYTES, data->res.count);
#if IS_ENABLED(CONFIG_NFS_V3) || IS_ENABLED(CONFIG_NFS_V4)
- if (resp->verf->committed < argp->stable && task->tk_status >= 0) {
+ if (data->res.verf->committed < data->args.stable && task->tk_status >= 0) {
/* We tried a write call, but the server did not
* commit data to stable storage even though we
* requested it.
@@ -1359,25 +1340,31 @@ void nfs_writeback_done(struct rpc_task *task, struct nfs_pgio_data *data)
dprintk("NFS: faulty NFS server %s:"
" (committed = %d) != (stable = %d)\n",
NFS_SERVER(inode)->nfs_client->cl_hostname,
- resp->verf->committed, argp->stable);
+ data->res.verf->committed, data->args.stable);
complain = jiffies + 300 * HZ;
}
}
#endif
- if (task->tk_status < 0) {
- nfs_set_pgio_error(data->header, task->tk_status, argp->offset);
- return;
- }
/* Deal with the suid/sgid bit corner case */
if (nfs_should_remove_suid(inode))
nfs_mark_for_revalidate(inode);
+ return 0;
+}
+
+/*
+ * This function is called when the WRITE call is complete.
+ */
+static void nfs_writeback_result_common(struct rpc_task *task, struct nfs_pgio_data *data)
+{
+ struct nfs_pgio_args *argp = &data->args;
+ struct nfs_pgio_res *resp = &data->res;
if (resp->count < argp->count) {
static unsigned long complain;
/* This a short write! */
- nfs_inc_stats(inode, NFSIOS_SHORTWRITE);
+ nfs_inc_stats(data->header->inode, NFSIOS_SHORTWRITE);
/* Has the server at least made some progress? */
if (resp->count == 0) {
@@ -1911,4 +1898,6 @@ static const struct nfs_rw_ops nfs_rw_write_ops = {
.rw_alloc_header = nfs_writehdr_alloc,
.rw_free_header = nfs_writehdr_free,
.rw_release = nfs_writeback_release_common,
+ .rw_result = nfs_writeback_result,
+ .rw_result_common = nfs_writeback_result_common,
};
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index 7e0db56..e12a1d6 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -553,7 +553,6 @@ nfs_have_writebacks(struct inode *inode)
extern int nfs_readpage(struct file *, struct page *);
extern int nfs_readpages(struct file *, struct address_space *,
struct list_head *, unsigned);
-extern int nfs_readpage_result(struct rpc_task *, struct nfs_pgio_data *);
extern int nfs_readpage_async(struct nfs_open_context *, struct inode *,
struct page *);
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index da00a4d..9477d7a 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -57,6 +57,8 @@ struct nfs_rw_ops {
struct nfs_rw_header *(*rw_alloc_header)(void);
void (*rw_free_header)(struct nfs_rw_header *);
void (*rw_release)(struct nfs_pgio_data *);
+ int (*rw_result)(struct rpc_task *, struct nfs_pgio_data *, struct inode *);
+ void (*rw_result_common)(struct rpc_task *, struct nfs_pgio_data *);
};
struct nfs_pageio_descriptor {
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 10/17] NFS: Create a common rpc_call_ops struct
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (8 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 09/17] NFS: Create a common nfs_pgio_result_common function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 11/17] NFS: Create a common rpcsetup function for reads and writes Anna Schumaker
` (7 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
The read and write paths set up this struct in exactly the same way, so
create a single shared struct.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 4 +---
fs/nfs/pageio.c | 10 ++++++++--
fs/nfs/read.c | 11 ++---------
fs/nfs/write.c | 11 ++---------
4 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index b18cca4..798eb47 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -396,13 +396,11 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
struct nfs_pgio_completion_ops;
/* pageio.c */
+extern const struct rpc_call_ops nfs_pgio_common_ops;
extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
-extern void nfs_pgio_prepare(struct rpc_task *, void *);
-extern void nfs_pgio_release_common(void *);
-extern void nfs_pgio_result_common(struct rpc_task *, void *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index 91c49cc..0ef8079 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -87,7 +87,7 @@ void nfs_pgio_data_release(struct nfs_pgio_data *data)
}
EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
-void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
+static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_pgio_data *data = calldata;
int err;
@@ -114,7 +114,7 @@ static int nfs_pgio_result(struct rpc_task *task, struct nfs_pgio_data *data)
return data->header->rw_ops->rw_result(task, data, inode);
}
-void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
+static void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
{
struct nfs_pgio_data *data = calldata;
@@ -125,3 +125,9 @@ void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
else
data->header->rw_ops->rw_result_common(task, data);
}
+
+const struct rpc_call_ops nfs_pgio_common_ops = {
+ .rpc_call_prepare = nfs_pgio_prepare,
+ .rpc_call_done = nfs_pgio_result_common,
+ .rpc_release = nfs_pgio_release_common,
+};
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 4f49507..98373ba 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -29,7 +29,6 @@
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
static const struct nfs_pageio_ops nfs_pageio_read_ops;
-static const struct rpc_call_ops nfs_read_common_ops;
static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
static const struct nfs_rw_ops nfs_rw_read_ops;
@@ -314,7 +313,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
nfs_list_remove_request(req);
nfs_list_add_request(req, &hdr->pages);
- desc->pg_rpc_callops = &nfs_read_common_ops;
+ desc->pg_rpc_callops = &nfs_pgio_common_ops;
return 0;
}
@@ -343,7 +342,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
nfs_read_rpcsetup(data, desc->pg_count, 0);
list_add(&data->list, &hdr->rpc_list);
- desc->pg_rpc_callops = &nfs_read_common_ops;
+ desc->pg_rpc_callops = &nfs_pgio_common_ops;
return 0;
}
@@ -443,12 +442,6 @@ static void nfs_readpage_result_common(struct rpc_task *task, struct nfs_pgio_da
nfs_readpage_retry(task, data);
}
-static const struct rpc_call_ops nfs_read_common_ops = {
- .rpc_call_prepare = nfs_pgio_prepare,
- .rpc_call_done = nfs_pgio_result_common,
- .rpc_release = nfs_pgio_release_common,
-};
-
/*
* Read a page over NFS.
* We read the page synchronously in the following case:
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index d2351a1..e492537 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -42,7 +42,6 @@
* Local function declarations
*/
static void nfs_redirty_request(struct nfs_page *req);
-static const struct rpc_call_ops nfs_write_common_ops;
static const struct rpc_call_ops nfs_commit_ops;
static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops;
static const struct nfs_commit_completion_ops nfs_commit_completion_ops;
@@ -1138,7 +1137,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
} while (nbytes != 0);
nfs_list_remove_request(req);
nfs_list_add_request(req, &hdr->pages);
- desc->pg_rpc_callops = &nfs_write_common_ops;
+ desc->pg_rpc_callops = &nfs_pgio_common_ops;
return 0;
}
@@ -1182,7 +1181,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
/* Set up the argument struct */
nfs_write_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
list_add(&data->list, &hdr->rpc_list);
- desc->pg_rpc_callops = &nfs_write_common_ops;
+ desc->pg_rpc_callops = &nfs_pgio_common_ops;
return 0;
}
@@ -1272,12 +1271,6 @@ static void nfs_writeback_release_common(struct nfs_pgio_data *data)
}
}
-static const struct rpc_call_ops nfs_write_common_ops = {
- .rpc_call_prepare = nfs_pgio_prepare,
- .rpc_call_done = nfs_pgio_result_common,
- .rpc_release = nfs_pgio_release_common,
-};
-
/*
* Special version of should_remove_suid() that ignores capabilities.
*/
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 11/17] NFS: Create a common rpcsetup function for reads and writes
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (9 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 10/17] NFS: Create a common rpc_call_ops struct Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 12/17] NFS: Create a common pgio_error function Anna Schumaker
` (6 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
Write adds a little bit of code dealing with flush flags, but since
"how" will always be 0 when reading we can share the code.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 3 +++
fs/nfs/pageio.c | 36 ++++++++++++++++++++++++++++++++++++
fs/nfs/read.c | 26 ++------------------------
fs/nfs/write.c | 46 ++++------------------------------------------
4 files changed, 45 insertions(+), 66 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 798eb47..7bc36ee 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -401,6 +401,8 @@ extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
+extern void nfs_pgio_rpcsetup(struct nfs_pgio_data *, unsigned int,
+ unsigned int, int, struct nfs_commit_info *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
@@ -449,6 +451,7 @@ extern void nfs_init_commit(struct nfs_commit_data *data,
struct nfs_commit_info *cinfo);
int nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
struct nfs_commit_info *cinfo, int max);
+unsigned long nfs_reqs_to_commit(struct nfs_commit_info *);
int nfs_scan_commit(struct inode *inode, struct list_head *dst,
struct nfs_commit_info *cinfo);
void nfs_mark_request_commit(struct nfs_page *req,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index 0ef8079..26f558e 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -87,6 +87,42 @@ void nfs_pgio_data_release(struct nfs_pgio_data *data)
}
EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
+void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
+ unsigned int count, unsigned int offset,
+ int how, struct nfs_commit_info *cinfo)
+{
+ struct nfs_page *req = data->header->req;
+
+ /* Set up the RPC argument and reply structs
+ * NB: take care not to mess about with data->commit et al. */
+
+ data->args.fh = NFS_FH(data->header->inode);
+ data->args.offset = req_offset(req) + offset;
+ /* pnfs_set_layoutcommit needs this */
+ data->mds_offset = data->args.offset;
+ data->args.pgbase = req->wb_pgbase + offset;
+ data->args.pages = data->pages.pagevec;
+ data->args.count = count;
+ data->args.context = get_nfs_open_context(req->wb_context);
+ data->args.lock_context = req->wb_lock_context;
+ data->args.stable = NFS_UNSTABLE;
+ switch (how & (FLUSH_STABLE | FLUSH_COND_STABLE)) {
+ case 0:
+ break;
+ case FLUSH_COND_STABLE:
+ if (nfs_reqs_to_commit(cinfo))
+ break;
+ default:
+ data->args.stable = NFS_FILE_SYNC;
+ }
+
+ data->res.fattr = &data->fattr;
+ data->res.count = count;
+ data->res.eof = 0;
+ data->res.verf = &data->verf;
+ nfs_fattr_init(&data->fattr);
+}
+
static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_pgio_data *data = calldata;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 98373ba..2c33fc3 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -192,28 +192,6 @@ int nfs_initiate_read(struct rpc_clnt *clnt,
}
EXPORT_SYMBOL_GPL(nfs_initiate_read);
-/*
- * Set up the NFS read request struct
- */
-static void nfs_read_rpcsetup(struct nfs_pgio_data *data,
- unsigned int count, unsigned int offset)
-{
- struct nfs_page *req = data->header->req;
-
- data->args.fh = NFS_FH(data->header->inode);
- data->args.offset = req_offset(req) + offset;
- data->args.pgbase = req->wb_pgbase + offset;
- data->args.pages = data->pages.pagevec;
- data->args.count = count;
- data->args.context = get_nfs_open_context(req->wb_context);
- data->args.lock_context = req->wb_lock_context;
-
- data->res.fattr = &data->fattr;
- data->res.count = count;
- data->res.eof = 0;
- nfs_fattr_init(&data->fattr);
-}
-
static int nfs_do_read(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops)
{
@@ -305,7 +283,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
return -ENOMEM;
}
data->pages.pagevec[0] = page;
- nfs_read_rpcsetup(data, len, offset);
+ nfs_pgio_rpcsetup(data, len, offset, 0, NULL);
list_add(&data->list, &hdr->rpc_list);
nbytes -= len;
offset += len;
@@ -340,7 +318,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
*pages++ = req->wb_page;
}
- nfs_read_rpcsetup(data, desc->pg_count, 0);
+ nfs_pgio_rpcsetup(data, desc->pg_count, 0, 0, NULL);
list_add(&data->list, &hdr->rpc_list);
desc->pg_rpc_callops = &nfs_pgio_common_ops;
return 0;
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index e492537..15f2ffc 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -603,7 +603,7 @@ out:
}
#if IS_ENABLED(CONFIG_NFS_V3) || IS_ENABLED(CONFIG_NFS_V4)
-static unsigned long
+unsigned long
nfs_reqs_to_commit(struct nfs_commit_info *cinfo)
{
return cinfo->mds->ncommit;
@@ -660,7 +660,7 @@ nfs_scan_commit(struct inode *inode, struct list_head *dst,
}
#else
-static unsigned long nfs_reqs_to_commit(struct nfs_commit_info *cinfo)
+unsigned long nfs_reqs_to_commit(struct nfs_commit_info *cinfo)
{
return 0;
}
@@ -987,44 +987,6 @@ out:
}
EXPORT_SYMBOL_GPL(nfs_initiate_write);
-/*
- * Set up the argument/result storage required for the RPC call.
- */
-static void nfs_write_rpcsetup(struct nfs_pgio_data *data,
- unsigned int count, unsigned int offset,
- int how, struct nfs_commit_info *cinfo)
-{
- struct nfs_page *req = data->header->req;
-
- /* Set up the RPC argument and reply structs
- * NB: take care not to mess about with data->commit et al. */
-
- data->args.fh = NFS_FH(data->header->inode);
- data->args.offset = req_offset(req) + offset;
- /* pnfs_set_layoutcommit needs this */
- data->mds_offset = data->args.offset;
- data->args.pgbase = req->wb_pgbase + offset;
- data->args.pages = data->pages.pagevec;
- data->args.count = count;
- data->args.context = get_nfs_open_context(req->wb_context);
- data->args.lock_context = req->wb_lock_context;
- data->args.stable = NFS_UNSTABLE;
- switch (how & (FLUSH_STABLE | FLUSH_COND_STABLE)) {
- case 0:
- break;
- case FLUSH_COND_STABLE:
- if (nfs_reqs_to_commit(cinfo))
- break;
- default:
- data->args.stable = NFS_FILE_SYNC;
- }
-
- data->res.fattr = &data->fattr;
- data->res.count = count;
- data->res.verf = &data->verf;
- nfs_fattr_init(&data->fattr);
-}
-
static int nfs_do_write(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops,
int how)
@@ -1129,7 +1091,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
return -ENOMEM;
}
data->pages.pagevec[0] = page;
- nfs_write_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
+ nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
list_add(&data->list, &hdr->rpc_list);
requests++;
nbytes -= len;
@@ -1179,7 +1141,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
desc->pg_ioflags &= ~FLUSH_COND_STABLE;
/* Set up the argument struct */
- nfs_write_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
+ nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
list_add(&data->list, &hdr->rpc_list);
desc->pg_rpc_callops = &nfs_pgio_common_ops;
return 0;
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 12/17] NFS: Create a common pgio_error function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (10 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 11/17] NFS: Create a common rpcsetup function for reads and writes Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 13/17] NFS: Create a generic_pgio function Anna Schumaker
` (5 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
At this point, the read and write versions of this function look
identical so both should use the same function.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 1 +
fs/nfs/pageio.c | 15 +++++++++++++++
fs/nfs/read.c | 25 ++++---------------------
fs/nfs/write.c | 25 ++++---------------------
4 files changed, 24 insertions(+), 42 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 7bc36ee..383175e 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -401,6 +401,7 @@ extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
+extern int nfs_pgio_error(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
extern void nfs_pgio_rpcsetup(struct nfs_pgio_data *, unsigned int,
unsigned int, int, struct nfs_commit_info *);
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index 26f558e..ff8a702 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -123,6 +123,21 @@ void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
nfs_fattr_init(&data->fattr);
}
+int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
+ struct nfs_pgio_header *hdr)
+{
+ struct nfs_pgio_data *data;
+
+ set_bit(NFS_IOHDR_REDO, &hdr->flags);
+ while (!list_empty(&hdr->rpc_list)) {
+ data = list_first_entry(&hdr->rpc_list, struct nfs_pgio_data, list);
+ list_del(&data->list);
+ nfs_pgio_data_release(data);
+ }
+ desc->pg_completion_ops->error_cleanup(&desc->pg_list);
+ return -ENOMEM;
+}
+
static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_pgio_data *data = calldata;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 2c33fc3..c623671 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -237,19 +237,6 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
.completion = nfs_read_completion,
};
-static void nfs_pagein_error(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- set_bit(NFS_IOHDR_REDO, &hdr->flags);
- while (!list_empty(&hdr->rpc_list)) {
- struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
- struct nfs_pgio_data, list);
- list_del(&data->list);
- nfs_pgio_data_release(data);
- }
- desc->pg_completion_ops->error_cleanup(&desc->pg_list);
-}
-
/*
* Generate multiple requests to fill a single page.
*
@@ -278,10 +265,8 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
size_t len = min(nbytes,rsize);
data = nfs_pgio_data_alloc(hdr, 1);
- if (!data) {
- nfs_pagein_error(desc, hdr);
- return -ENOMEM;
- }
+ if (!data)
+ return nfs_pgio_error(desc, hdr);
data->pages.pagevec[0] = page;
nfs_pgio_rpcsetup(data, len, offset, 0, NULL);
list_add(&data->list, &hdr->rpc_list);
@@ -305,10 +290,8 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
desc->pg_count));
- if (!data) {
- nfs_pagein_error(desc, hdr);
- return -ENOMEM;
- }
+ if (!data)
+ return nfs_pgio_error(desc, hdr);
pages = data->pages.pagevec;
while (!list_empty(head)) {
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 15f2ffc..1f98f31 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1044,19 +1044,6 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops = {
.completion = nfs_write_completion,
};
-static void nfs_flush_error(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- set_bit(NFS_IOHDR_REDO, &hdr->flags);
- while (!list_empty(&hdr->rpc_list)) {
- struct nfs_pgio_data *data = list_first_entry(&hdr->rpc_list,
- struct nfs_pgio_data, list);
- list_del(&data->list);
- nfs_pgio_data_release(data);
- }
- desc->pg_completion_ops->error_cleanup(&desc->pg_list);
-}
-
/*
* Generate multiple small requests to write out a single
* contiguous dirty area on one page.
@@ -1086,10 +1073,8 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
size_t len = min(nbytes, wsize);
data = nfs_pgio_data_alloc(hdr, 1);
- if (!data) {
- nfs_flush_error(desc, hdr);
- return -ENOMEM;
- }
+ if (!data)
+ return nfs_pgio_error(desc, hdr);
data->pages.pagevec[0] = page;
nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
list_add(&data->list, &hdr->rpc_list);
@@ -1122,10 +1107,8 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
desc->pg_count));
- if (!data) {
- nfs_flush_error(desc, hdr);
- return -ENOMEM;
- }
+ if (!data)
+ return nfs_pgio_error(desc, hdr);
nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
pages = data->pages.pagevec;
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 13/17] NFS: Create a generic_pgio function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (11 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 12/17] NFS: Create a common pgio_error function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-30 16:13 ` Weston Andros Adamson
2014-04-25 20:55 ` [PATCH v2 14/17] NFS: Create a common initiate_pgio() function Anna Schumaker
` (4 subsequent siblings)
17 siblings, 1 reply; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
These functions are almost identical on both the read and write side.
FLUSH_COND_STABLE will never be set for the read path, so leaving it in
the generic code won't hurt anything.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 10 +----
fs/nfs/pageio.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++---
fs/nfs/pnfs.c | 4 +-
fs/nfs/read.c | 81 +---------------------------------------
fs/nfs/write.c | 97 +-----------------------------------------------
5 files changed, 108 insertions(+), 192 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 383175e..6422b9d 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -396,14 +396,10 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
struct nfs_pgio_completion_ops;
/* pageio.c */
-extern const struct rpc_call_ops nfs_pgio_common_ops;
extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
-extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
-extern int nfs_pgio_error(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
-extern void nfs_pgio_rpcsetup(struct nfs_pgio_data *, unsigned int,
- unsigned int, int, struct nfs_commit_info *);
+extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
@@ -413,8 +409,6 @@ extern int nfs_initiate_read(struct rpc_clnt *clnt,
struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops, int flags);
extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
-extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
/* super.c */
@@ -432,8 +426,6 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops);
-extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr);
extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
extern void nfs_commit_free(struct nfs_commit_data *p);
extern int nfs_initiate_write(struct rpc_clnt *clnt,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index ff8a702..70598a7 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -13,6 +13,9 @@
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
+static const struct rpc_call_ops nfs_pgio_common_ops;
+
+
static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
{
return container_of(hdr, struct nfs_rw_header, header);
@@ -41,8 +44,8 @@ void nfs_rw_header_free(struct nfs_pgio_header *hdr)
}
EXPORT_SYMBOL_GPL(nfs_rw_header_free);
-struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
- unsigned int pagecount)
+static struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
+ unsigned int pagecount)
{
struct nfs_pgio_data *data, *prealloc;
@@ -87,7 +90,7 @@ void nfs_pgio_data_release(struct nfs_pgio_data *data)
}
EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
-void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
+static void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
unsigned int count, unsigned int offset,
int how, struct nfs_commit_info *cinfo)
{
@@ -123,7 +126,7 @@ void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
nfs_fattr_init(&data->fattr);
}
-int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
+static int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr)
{
struct nfs_pgio_data *data;
@@ -138,6 +141,101 @@ int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
return -ENOMEM;
}
+/*
+ * Generate multiple small requests to read or write a single
+ * contiguous dirty on one page.
+ */
+static int nfs_pgio_multi(struct nfs_pageio_descriptor *desc,
+ struct nfs_pgio_header *hdr)
+{
+ struct nfs_page *req = hdr->req;
+ struct page *page = req->wb_page;
+ struct nfs_pgio_data *data;
+ size_t wsize = desc->pg_bsize, nbytes;
+ unsigned int offset;
+ int requests = 0;
+ struct nfs_commit_info cinfo;
+
+ nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
+
+ if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
+ (desc->pg_moreio || nfs_reqs_to_commit(&cinfo) ||
+ desc->pg_count > wsize))
+ desc->pg_ioflags &= ~FLUSH_COND_STABLE;
+
+ offset = 0;
+ nbytes = desc->pg_count;
+ do {
+ size_t len = min(nbytes, wsize);
+
+ data = nfs_pgio_data_alloc(hdr, 1);
+ if (!data)
+ return nfs_pgio_error(desc, hdr);
+ data->pages.pagevec[0] = page;
+ nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
+ list_add(&data->list, &hdr->rpc_list);
+ requests++;
+ nbytes -= len;
+ offset += len;
+ } while (nbytes != 0);
+
+ nfs_list_remove_request(req);
+ nfs_list_add_request(req, &hdr->pages);
+ desc->pg_rpc_callops = &nfs_pgio_common_ops;
+ return 0;
+}
+
+/*
+ * Create an RPC task for the given write request and kick it.
+ * The page must have been locked by the caller.
+ *
+ * It may happen that the page we're passed is not marked dirty.
+ * This is the case if nfs_updatepage detects a conflicting request
+ * that has been written but not committed.
+ */
+static int nfs_pgio_one(struct nfs_pageio_descriptor *desc,
+ struct nfs_pgio_header *hdr)
+{
+ struct nfs_page *req;
+ struct page **pages;
+ struct nfs_pgio_data *data;
+ struct list_head *head = &desc->pg_list;
+ struct nfs_commit_info cinfo;
+
+ data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
+ desc->pg_count));
+ if (!data)
+ return nfs_pgio_error(desc, hdr);
+
+ nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
+ pages = data->pages.pagevec;
+ while (!list_empty(head)) {
+ req = nfs_list_entry(head->next);
+ nfs_list_remove_request(req);
+ nfs_list_add_request(req, &hdr->pages);
+ *pages++ = req->wb_page;
+ }
+
+ if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
+ (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
+ desc->pg_ioflags &= ~FLUSH_COND_STABLE;
+
+ /* Set up the argument struct */
+ nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
+ list_add(&data->list, &hdr->rpc_list);
+ desc->pg_rpc_callops = &nfs_pgio_common_ops;
+ return 0;
+}
+
+int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
+ struct nfs_pgio_header *hdr)
+{
+ if (desc->pg_bsize < PAGE_CACHE_SIZE)
+ return nfs_pgio_multi(desc, hdr);
+ return nfs_pgio_one(desc, hdr);
+}
+EXPORT_SYMBOL_GPL(nfs_generic_pgio);
+
static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_pgio_data *data = calldata;
@@ -177,7 +275,7 @@ static void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
data->header->rw_ops->rw_result_common(task, data);
}
-const struct rpc_call_ops nfs_pgio_common_ops = {
+static const struct rpc_call_ops nfs_pgio_common_ops = {
.rpc_call_prepare = nfs_pgio_prepare,
.rpc_call_done = nfs_pgio_result_common,
.rpc_release = nfs_pgio_release_common,
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 54c84c1..0fe6701 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1607,7 +1607,7 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
nfs_pgheader_init(desc, hdr, pnfs_writehdr_free);
hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
atomic_inc(&hdr->refcnt);
- ret = nfs_generic_flush(desc, hdr);
+ ret = nfs_generic_pgio(desc, hdr);
if (ret != 0) {
pnfs_put_lseg(desc->pg_lseg);
desc->pg_lseg = NULL;
@@ -1766,7 +1766,7 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
nfs_pgheader_init(desc, hdr, pnfs_readhdr_free);
hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
atomic_inc(&hdr->refcnt);
- ret = nfs_generic_pagein(desc, hdr);
+ ret = nfs_generic_pgio(desc, hdr);
if (ret != 0) {
pnfs_put_lseg(desc->pg_lseg);
desc->pg_lseg = NULL;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index c623671..07c21bd 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -237,85 +237,6 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
.completion = nfs_read_completion,
};
-/*
- * Generate multiple requests to fill a single page.
- *
- * We optimize to reduce the number of read operations on the wire. If we
- * detect that we're reading a page, or an area of a page, that is past the
- * end of file, we do not generate NFS read operations but just clear the
- * parts of the page that would have come back zero from the server anyway.
- *
- * We rely on the cached value of i_size to make this determination; another
- * client can fill pages on the server past our cached end-of-file, but we
- * won't see the new data until our attribute cache is updated. This is more
- * or less conventional NFS client behavior.
- */
-static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- struct nfs_page *req = hdr->req;
- struct page *page = req->wb_page;
- struct nfs_pgio_data *data;
- size_t rsize = desc->pg_bsize, nbytes;
- unsigned int offset;
-
- offset = 0;
- nbytes = desc->pg_count;
- do {
- size_t len = min(nbytes,rsize);
-
- data = nfs_pgio_data_alloc(hdr, 1);
- if (!data)
- return nfs_pgio_error(desc, hdr);
- data->pages.pagevec[0] = page;
- nfs_pgio_rpcsetup(data, len, offset, 0, NULL);
- list_add(&data->list, &hdr->rpc_list);
- nbytes -= len;
- offset += len;
- } while (nbytes != 0);
-
- nfs_list_remove_request(req);
- nfs_list_add_request(req, &hdr->pages);
- desc->pg_rpc_callops = &nfs_pgio_common_ops;
- return 0;
-}
-
-static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- struct nfs_page *req;
- struct page **pages;
- struct nfs_pgio_data *data;
- struct list_head *head = &desc->pg_list;
-
- data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
- desc->pg_count));
- if (!data)
- return nfs_pgio_error(desc, hdr);
-
- pages = data->pages.pagevec;
- while (!list_empty(head)) {
- req = nfs_list_entry(head->next);
- nfs_list_remove_request(req);
- nfs_list_add_request(req, &hdr->pages);
- *pages++ = req->wb_page;
- }
-
- nfs_pgio_rpcsetup(data, desc->pg_count, 0, 0, NULL);
- list_add(&data->list, &hdr->rpc_list);
- desc->pg_rpc_callops = &nfs_pgio_common_ops;
- return 0;
-}
-
-int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- if (desc->pg_bsize < PAGE_CACHE_SIZE)
- return nfs_pagein_multi(desc, hdr);
- return nfs_pagein_one(desc, hdr);
-}
-EXPORT_SYMBOL_GPL(nfs_generic_pagein);
-
static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
{
struct nfs_rw_header *rhdr;
@@ -330,7 +251,7 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
hdr = &rhdr->header;
nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
atomic_inc(&hdr->refcnt);
- ret = nfs_generic_pagein(desc, hdr);
+ ret = nfs_generic_pgio(desc, hdr);
if (ret == 0)
ret = nfs_do_multiple_reads(&hdr->rpc_list,
desc->pg_rpc_callops);
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 1f98f31..8929e33 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1044,101 +1044,6 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops = {
.completion = nfs_write_completion,
};
-/*
- * Generate multiple small requests to write out a single
- * contiguous dirty area on one page.
- */
-static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- struct nfs_page *req = hdr->req;
- struct page *page = req->wb_page;
- struct nfs_pgio_data *data;
- size_t wsize = desc->pg_bsize, nbytes;
- unsigned int offset;
- int requests = 0;
- struct nfs_commit_info cinfo;
-
- nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
-
- if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
- (desc->pg_moreio || nfs_reqs_to_commit(&cinfo) ||
- desc->pg_count > wsize))
- desc->pg_ioflags &= ~FLUSH_COND_STABLE;
-
-
- offset = 0;
- nbytes = desc->pg_count;
- do {
- size_t len = min(nbytes, wsize);
-
- data = nfs_pgio_data_alloc(hdr, 1);
- if (!data)
- return nfs_pgio_error(desc, hdr);
- data->pages.pagevec[0] = page;
- nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
- list_add(&data->list, &hdr->rpc_list);
- requests++;
- nbytes -= len;
- offset += len;
- } while (nbytes != 0);
- nfs_list_remove_request(req);
- nfs_list_add_request(req, &hdr->pages);
- desc->pg_rpc_callops = &nfs_pgio_common_ops;
- return 0;
-}
-
-/*
- * Create an RPC task for the given write request and kick it.
- * The page must have been locked by the caller.
- *
- * It may happen that the page we're passed is not marked dirty.
- * This is the case if nfs_updatepage detects a conflicting request
- * that has been written but not committed.
- */
-static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- struct nfs_page *req;
- struct page **pages;
- struct nfs_pgio_data *data;
- struct list_head *head = &desc->pg_list;
- struct nfs_commit_info cinfo;
-
- data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
- desc->pg_count));
- if (!data)
- return nfs_pgio_error(desc, hdr);
-
- nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
- pages = data->pages.pagevec;
- while (!list_empty(head)) {
- req = nfs_list_entry(head->next);
- nfs_list_remove_request(req);
- nfs_list_add_request(req, &hdr->pages);
- *pages++ = req->wb_page;
- }
-
- if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
- (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
- desc->pg_ioflags &= ~FLUSH_COND_STABLE;
-
- /* Set up the argument struct */
- nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
- list_add(&data->list, &hdr->rpc_list);
- desc->pg_rpc_callops = &nfs_pgio_common_ops;
- return 0;
-}
-
-int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
- struct nfs_pgio_header *hdr)
-{
- if (desc->pg_bsize < PAGE_CACHE_SIZE)
- return nfs_flush_multi(desc, hdr);
- return nfs_flush_one(desc, hdr);
-}
-EXPORT_SYMBOL_GPL(nfs_generic_flush);
-
static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
{
struct nfs_rw_header *whdr;
@@ -1153,7 +1058,7 @@ static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
hdr = &whdr->header;
nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
atomic_inc(&hdr->refcnt);
- ret = nfs_generic_flush(desc, hdr);
+ ret = nfs_generic_pgio(desc, hdr);
if (ret == 0)
ret = nfs_do_multiple_writes(&hdr->rpc_list,
desc->pg_rpc_callops,
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 13/17] NFS: Create a generic_pgio function
2014-04-25 20:55 ` [PATCH v2 13/17] NFS: Create a generic_pgio function Anna Schumaker
@ 2014-04-30 16:13 ` Weston Andros Adamson
2014-04-30 16:22 ` Anna Schumaker
0 siblings, 1 reply; 29+ messages in thread
From: Weston Andros Adamson @ 2014-04-30 16:13 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond Myklebust, linux-nfs list, hch
On Apr 25, 2014, at 4:55 PM, Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>
> These functions are almost identical on both the read and write side.
> FLUSH_COND_STABLE will never be set for the read path, so leaving it in
> the generic code won't hurt anything.
>
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
> ---
> fs/nfs/internal.h | 10 +----
> fs/nfs/pageio.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++---
> fs/nfs/pnfs.c | 4 +-
> fs/nfs/read.c | 81 +---------------------------------------
> fs/nfs/write.c | 97 +-----------------------------------------------
> 5 files changed, 108 insertions(+), 192 deletions(-)
>
> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
> index 383175e..6422b9d 100644
> --- a/fs/nfs/internal.h
> +++ b/fs/nfs/internal.h
> @@ -396,14 +396,10 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
> struct nfs_pgio_completion_ops;
>
> /* pageio.c */
> -extern const struct rpc_call_ops nfs_pgio_common_ops;
> extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
> extern void nfs_rw_header_free(struct nfs_pgio_header *);
> -extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
> extern void nfs_pgio_data_release(struct nfs_pgio_data *);
> -extern int nfs_pgio_error(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
> -extern void nfs_pgio_rpcsetup(struct nfs_pgio_data *, unsigned int,
> - unsigned int, int, struct nfs_commit_info *);
> +extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
>
> /* read.c */
> extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
> @@ -413,8 +409,6 @@ extern int nfs_initiate_read(struct rpc_clnt *clnt,
> struct nfs_pgio_data *data,
> const struct rpc_call_ops *call_ops, int flags);
> extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
> -extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr);
> extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
>
> /* super.c */
> @@ -432,8 +426,6 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
> extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
> struct inode *inode, int ioflags, bool force_mds,
> const struct nfs_pgio_completion_ops *compl_ops);
> -extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr);
> extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
> extern void nfs_commit_free(struct nfs_commit_data *p);
> extern int nfs_initiate_write(struct rpc_clnt *clnt,
> diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
> index ff8a702..70598a7 100644
> --- a/fs/nfs/pageio.c
> +++ b/fs/nfs/pageio.c
> @@ -13,6 +13,9 @@
>
> #define NFSDBG_FACILITY NFSDBG_PAGECACHE
>
> +static const struct rpc_call_ops nfs_pgio_common_ops;
> +
> +
> static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
> {
> return container_of(hdr, struct nfs_rw_header, header);
> @@ -41,8 +44,8 @@ void nfs_rw_header_free(struct nfs_pgio_header *hdr)
> }
> EXPORT_SYMBOL_GPL(nfs_rw_header_free);
>
> -struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
> - unsigned int pagecount)
> +static struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
> + unsigned int pagecount)
> {
> struct nfs_pgio_data *data, *prealloc;
>
> @@ -87,7 +90,7 @@ void nfs_pgio_data_release(struct nfs_pgio_data *data)
> }
> EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
>
> -void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
> +static void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
> unsigned int count, unsigned int offset,
> int how, struct nfs_commit_info *cinfo)
> {
> @@ -123,7 +126,7 @@ void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
> nfs_fattr_init(&data->fattr);
> }
>
> -int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
> +static int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
> struct nfs_pgio_header *hdr)
> {
> struct nfs_pgio_data *data;
> @@ -138,6 +141,101 @@ int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
> return -ENOMEM;
> }
>
> +/*
> + * Generate multiple small requests to read or write a single
> + * contiguous dirty on one page.
> + */
> +static int nfs_pgio_multi(struct nfs_pageio_descriptor *desc,
> + struct nfs_pgio_header *hdr)
> +{
> + struct nfs_page *req = hdr->req;
> + struct page *page = req->wb_page;
> + struct nfs_pgio_data *data;
> + size_t wsize = desc->pg_bsize, nbytes;
> + unsigned int offset;
> + int requests = 0;
> + struct nfs_commit_info cinfo;
> +
> + nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
> +
> + if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
> + (desc->pg_moreio || nfs_reqs_to_commit(&cinfo) ||
> + desc->pg_count > wsize))
> + desc->pg_ioflags &= ~FLUSH_COND_STABLE;
> +
> + offset = 0;
> + nbytes = desc->pg_count;
> + do {
> + size_t len = min(nbytes, wsize);
> +
> + data = nfs_pgio_data_alloc(hdr, 1);
> + if (!data)
> + return nfs_pgio_error(desc, hdr);
> + data->pages.pagevec[0] = page;
> + nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
> + list_add(&data->list, &hdr->rpc_list);
> + requests++;
> + nbytes -= len;
> + offset += len;
> + } while (nbytes != 0);
> +
> + nfs_list_remove_request(req);
> + nfs_list_add_request(req, &hdr->pages);
> + desc->pg_rpc_callops = &nfs_pgio_common_ops;
> + return 0;
> +}
> +
> +/*
> + * Create an RPC task for the given write request and kick it.
really minor comment nit:
^ should be read/write request
-dros
> + * The page must have been locked by the caller.
> + *
> + * It may happen that the page we're passed is not marked dirty.
> + * This is the case if nfs_updatepage detects a conflicting request
> + * that has been written but not committed.
> + */
> +static int nfs_pgio_one(struct nfs_pageio_descriptor *desc,
> + struct nfs_pgio_header *hdr)
> +{
> + struct nfs_page *req;
> + struct page **pages;
> + struct nfs_pgio_data *data;
> + struct list_head *head = &desc->pg_list;
> + struct nfs_commit_info cinfo;
> +
> + data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
> + desc->pg_count));
> + if (!data)
> + return nfs_pgio_error(desc, hdr);
> +
> + nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
> + pages = data->pages.pagevec;
> + while (!list_empty(head)) {
> + req = nfs_list_entry(head->next);
> + nfs_list_remove_request(req);
> + nfs_list_add_request(req, &hdr->pages);
> + *pages++ = req->wb_page;
> + }
> +
> + if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
> + (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
> + desc->pg_ioflags &= ~FLUSH_COND_STABLE;
> +
> + /* Set up the argument struct */
> + nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
> + list_add(&data->list, &hdr->rpc_list);
> + desc->pg_rpc_callops = &nfs_pgio_common_ops;
> + return 0;
> +}
> +
> +int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
> + struct nfs_pgio_header *hdr)
> +{
> + if (desc->pg_bsize < PAGE_CACHE_SIZE)
> + return nfs_pgio_multi(desc, hdr);
> + return nfs_pgio_one(desc, hdr);
> +}
> +EXPORT_SYMBOL_GPL(nfs_generic_pgio);
> +
> static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
> {
> struct nfs_pgio_data *data = calldata;
> @@ -177,7 +275,7 @@ static void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
> data->header->rw_ops->rw_result_common(task, data);
> }
>
> -const struct rpc_call_ops nfs_pgio_common_ops = {
> +static const struct rpc_call_ops nfs_pgio_common_ops = {
> .rpc_call_prepare = nfs_pgio_prepare,
> .rpc_call_done = nfs_pgio_result_common,
> .rpc_release = nfs_pgio_release_common,
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 54c84c1..0fe6701 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1607,7 +1607,7 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
> nfs_pgheader_init(desc, hdr, pnfs_writehdr_free);
> hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
> atomic_inc(&hdr->refcnt);
> - ret = nfs_generic_flush(desc, hdr);
> + ret = nfs_generic_pgio(desc, hdr);
> if (ret != 0) {
> pnfs_put_lseg(desc->pg_lseg);
> desc->pg_lseg = NULL;
> @@ -1766,7 +1766,7 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
> nfs_pgheader_init(desc, hdr, pnfs_readhdr_free);
> hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
> atomic_inc(&hdr->refcnt);
> - ret = nfs_generic_pagein(desc, hdr);
> + ret = nfs_generic_pgio(desc, hdr);
> if (ret != 0) {
> pnfs_put_lseg(desc->pg_lseg);
> desc->pg_lseg = NULL;
> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
> index c623671..07c21bd 100644
> --- a/fs/nfs/read.c
> +++ b/fs/nfs/read.c
> @@ -237,85 +237,6 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
> .completion = nfs_read_completion,
> };
>
> -/*
> - * Generate multiple requests to fill a single page.
> - *
> - * We optimize to reduce the number of read operations on the wire. If we
> - * detect that we're reading a page, or an area of a page, that is past the
> - * end of file, we do not generate NFS read operations but just clear the
> - * parts of the page that would have come back zero from the server anyway.
> - *
> - * We rely on the cached value of i_size to make this determination; another
> - * client can fill pages on the server past our cached end-of-file, but we
> - * won't see the new data until our attribute cache is updated. This is more
> - * or less conventional NFS client behavior.
> - */
> -static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr)
> -{
> - struct nfs_page *req = hdr->req;
> - struct page *page = req->wb_page;
> - struct nfs_pgio_data *data;
> - size_t rsize = desc->pg_bsize, nbytes;
> - unsigned int offset;
> -
> - offset = 0;
> - nbytes = desc->pg_count;
> - do {
> - size_t len = min(nbytes,rsize);
> -
> - data = nfs_pgio_data_alloc(hdr, 1);
> - if (!data)
> - return nfs_pgio_error(desc, hdr);
> - data->pages.pagevec[0] = page;
> - nfs_pgio_rpcsetup(data, len, offset, 0, NULL);
> - list_add(&data->list, &hdr->rpc_list);
> - nbytes -= len;
> - offset += len;
> - } while (nbytes != 0);
> -
> - nfs_list_remove_request(req);
> - nfs_list_add_request(req, &hdr->pages);
> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
> - return 0;
> -}
> -
> -static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr)
> -{
> - struct nfs_page *req;
> - struct page **pages;
> - struct nfs_pgio_data *data;
> - struct list_head *head = &desc->pg_list;
> -
> - data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
> - desc->pg_count));
> - if (!data)
> - return nfs_pgio_error(desc, hdr);
> -
> - pages = data->pages.pagevec;
> - while (!list_empty(head)) {
> - req = nfs_list_entry(head->next);
> - nfs_list_remove_request(req);
> - nfs_list_add_request(req, &hdr->pages);
> - *pages++ = req->wb_page;
> - }
> -
> - nfs_pgio_rpcsetup(data, desc->pg_count, 0, 0, NULL);
> - list_add(&data->list, &hdr->rpc_list);
> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
> - return 0;
> -}
> -
> -int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr)
> -{
> - if (desc->pg_bsize < PAGE_CACHE_SIZE)
> - return nfs_pagein_multi(desc, hdr);
> - return nfs_pagein_one(desc, hdr);
> -}
> -EXPORT_SYMBOL_GPL(nfs_generic_pagein);
> -
> static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
> {
> struct nfs_rw_header *rhdr;
> @@ -330,7 +251,7 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
> hdr = &rhdr->header;
> nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
> atomic_inc(&hdr->refcnt);
> - ret = nfs_generic_pagein(desc, hdr);
> + ret = nfs_generic_pgio(desc, hdr);
> if (ret == 0)
> ret = nfs_do_multiple_reads(&hdr->rpc_list,
> desc->pg_rpc_callops);
> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
> index 1f98f31..8929e33 100644
> --- a/fs/nfs/write.c
> +++ b/fs/nfs/write.c
> @@ -1044,101 +1044,6 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops = {
> .completion = nfs_write_completion,
> };
>
> -/*
> - * Generate multiple small requests to write out a single
> - * contiguous dirty area on one page.
> - */
> -static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr)
> -{
> - struct nfs_page *req = hdr->req;
> - struct page *page = req->wb_page;
> - struct nfs_pgio_data *data;
> - size_t wsize = desc->pg_bsize, nbytes;
> - unsigned int offset;
> - int requests = 0;
> - struct nfs_commit_info cinfo;
> -
> - nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
> -
> - if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
> - (desc->pg_moreio || nfs_reqs_to_commit(&cinfo) ||
> - desc->pg_count > wsize))
> - desc->pg_ioflags &= ~FLUSH_COND_STABLE;
> -
> -
> - offset = 0;
> - nbytes = desc->pg_count;
> - do {
> - size_t len = min(nbytes, wsize);
> -
> - data = nfs_pgio_data_alloc(hdr, 1);
> - if (!data)
> - return nfs_pgio_error(desc, hdr);
> - data->pages.pagevec[0] = page;
> - nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
> - list_add(&data->list, &hdr->rpc_list);
> - requests++;
> - nbytes -= len;
> - offset += len;
> - } while (nbytes != 0);
> - nfs_list_remove_request(req);
> - nfs_list_add_request(req, &hdr->pages);
> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
> - return 0;
> -}
> -
> -/*
> - * Create an RPC task for the given write request and kick it.
> - * The page must have been locked by the caller.
> - *
> - * It may happen that the page we're passed is not marked dirty.
> - * This is the case if nfs_updatepage detects a conflicting request
> - * that has been written but not committed.
> - */
> -static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr)
> -{
> - struct nfs_page *req;
> - struct page **pages;
> - struct nfs_pgio_data *data;
> - struct list_head *head = &desc->pg_list;
> - struct nfs_commit_info cinfo;
> -
> - data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
> - desc->pg_count));
> - if (!data)
> - return nfs_pgio_error(desc, hdr);
> -
> - nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
> - pages = data->pages.pagevec;
> - while (!list_empty(head)) {
> - req = nfs_list_entry(head->next);
> - nfs_list_remove_request(req);
> - nfs_list_add_request(req, &hdr->pages);
> - *pages++ = req->wb_page;
> - }
> -
> - if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
> - (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
> - desc->pg_ioflags &= ~FLUSH_COND_STABLE;
> -
> - /* Set up the argument struct */
> - nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
> - list_add(&data->list, &hdr->rpc_list);
> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
> - return 0;
> -}
> -
> -int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
> - struct nfs_pgio_header *hdr)
> -{
> - if (desc->pg_bsize < PAGE_CACHE_SIZE)
> - return nfs_flush_multi(desc, hdr);
> - return nfs_flush_one(desc, hdr);
> -}
> -EXPORT_SYMBOL_GPL(nfs_generic_flush);
> -
> static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
> {
> struct nfs_rw_header *whdr;
> @@ -1153,7 +1058,7 @@ static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
> hdr = &whdr->header;
> nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
> atomic_inc(&hdr->refcnt);
> - ret = nfs_generic_flush(desc, hdr);
> + ret = nfs_generic_pgio(desc, hdr);
> if (ret == 0)
> ret = nfs_do_multiple_writes(&hdr->rpc_list,
> desc->pg_rpc_callops,
> --
> 1.9.2
>
^ permalink raw reply [flat|nested] 29+ messages in thread* Re: [PATCH v2 13/17] NFS: Create a generic_pgio function
2014-04-30 16:13 ` Weston Andros Adamson
@ 2014-04-30 16:22 ` Anna Schumaker
0 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-30 16:22 UTC (permalink / raw)
To: Weston Andros Adamson; +Cc: Trond Myklebust, linux-nfs list, hch
On 04/30/2014 12:13 PM, Weston Andros Adamson wrote:
> On Apr 25, 2014, at 4:55 PM, Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
>
>> From: Anna Schumaker <Anna.Schumaker@netapp.com>
>>
>> These functions are almost identical on both the read and write side.
>> FLUSH_COND_STABLE will never be set for the read path, so leaving it in
>> the generic code won't hurt anything.
>>
>> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
>> ---
>> fs/nfs/internal.h | 10 +----
>> fs/nfs/pageio.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++---
>> fs/nfs/pnfs.c | 4 +-
>> fs/nfs/read.c | 81 +---------------------------------------
>> fs/nfs/write.c | 97 +-----------------------------------------------
>> 5 files changed, 108 insertions(+), 192 deletions(-)
>>
>> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
>> index 383175e..6422b9d 100644
>> --- a/fs/nfs/internal.h
>> +++ b/fs/nfs/internal.h
>> @@ -396,14 +396,10 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
>> struct nfs_pgio_completion_ops;
>>
>> /* pageio.c */
>> -extern const struct rpc_call_ops nfs_pgio_common_ops;
>> extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
>> extern void nfs_rw_header_free(struct nfs_pgio_header *);
>> -extern struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *, unsigned int);
>> extern void nfs_pgio_data_release(struct nfs_pgio_data *);
>> -extern int nfs_pgio_error(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
>> -extern void nfs_pgio_rpcsetup(struct nfs_pgio_data *, unsigned int,
>> - unsigned int, int, struct nfs_commit_info *);
>> +extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
>>
>> /* read.c */
>> extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
>> @@ -413,8 +409,6 @@ extern int nfs_initiate_read(struct rpc_clnt *clnt,
>> struct nfs_pgio_data *data,
>> const struct rpc_call_ops *call_ops, int flags);
>> extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
>> -extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr);
>> extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
>>
>> /* super.c */
>> @@ -432,8 +426,6 @@ int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
>> extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
>> struct inode *inode, int ioflags, bool force_mds,
>> const struct nfs_pgio_completion_ops *compl_ops);
>> -extern int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr);
>> extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
>> extern void nfs_commit_free(struct nfs_commit_data *p);
>> extern int nfs_initiate_write(struct rpc_clnt *clnt,
>> diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
>> index ff8a702..70598a7 100644
>> --- a/fs/nfs/pageio.c
>> +++ b/fs/nfs/pageio.c
>> @@ -13,6 +13,9 @@
>>
>> #define NFSDBG_FACILITY NFSDBG_PAGECACHE
>>
>> +static const struct rpc_call_ops nfs_pgio_common_ops;
>> +
>> +
>> static inline struct nfs_rw_header *NFS_RW_HEADER(struct nfs_pgio_header *hdr)
>> {
>> return container_of(hdr, struct nfs_rw_header, header);
>> @@ -41,8 +44,8 @@ void nfs_rw_header_free(struct nfs_pgio_header *hdr)
>> }
>> EXPORT_SYMBOL_GPL(nfs_rw_header_free);
>>
>> -struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
>> - unsigned int pagecount)
>> +static struct nfs_pgio_data *nfs_pgio_data_alloc(struct nfs_pgio_header *hdr,
>> + unsigned int pagecount)
>> {
>> struct nfs_pgio_data *data, *prealloc;
>>
>> @@ -87,7 +90,7 @@ void nfs_pgio_data_release(struct nfs_pgio_data *data)
>> }
>> EXPORT_SYMBOL_GPL(nfs_pgio_data_release);
>>
>> -void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
>> +static void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
>> unsigned int count, unsigned int offset,
>> int how, struct nfs_commit_info *cinfo)
>> {
>> @@ -123,7 +126,7 @@ void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
>> nfs_fattr_init(&data->fattr);
>> }
>>
>> -int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
>> +static int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
>> struct nfs_pgio_header *hdr)
>> {
>> struct nfs_pgio_data *data;
>> @@ -138,6 +141,101 @@ int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
>> return -ENOMEM;
>> }
>>
>> +/*
>> + * Generate multiple small requests to read or write a single
>> + * contiguous dirty on one page.
>> + */
>> +static int nfs_pgio_multi(struct nfs_pageio_descriptor *desc,
>> + struct nfs_pgio_header *hdr)
>> +{
>> + struct nfs_page *req = hdr->req;
>> + struct page *page = req->wb_page;
>> + struct nfs_pgio_data *data;
>> + size_t wsize = desc->pg_bsize, nbytes;
>> + unsigned int offset;
>> + int requests = 0;
>> + struct nfs_commit_info cinfo;
>> +
>> + nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
>> +
>> + if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
>> + (desc->pg_moreio || nfs_reqs_to_commit(&cinfo) ||
>> + desc->pg_count > wsize))
>> + desc->pg_ioflags &= ~FLUSH_COND_STABLE;
>> +
>> + offset = 0;
>> + nbytes = desc->pg_count;
>> + do {
>> + size_t len = min(nbytes, wsize);
>> +
>> + data = nfs_pgio_data_alloc(hdr, 1);
>> + if (!data)
>> + return nfs_pgio_error(desc, hdr);
>> + data->pages.pagevec[0] = page;
>> + nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
>> + list_add(&data->list, &hdr->rpc_list);
>> + requests++;
>> + nbytes -= len;
>> + offset += len;
>> + } while (nbytes != 0);
>> +
>> + nfs_list_remove_request(req);
>> + nfs_list_add_request(req, &hdr->pages);
>> + desc->pg_rpc_callops = &nfs_pgio_common_ops;
>> + return 0;
>> +}
>> +
>> +/*
>> + * Create an RPC task for the given write request and kick it.
>
> really minor comment nit:
>
> ^ should be read/write request
>
Agreed, I'll fix that!
Anna
> -dros
>
>> + * The page must have been locked by the caller.
>> + *
>> + * It may happen that the page we're passed is not marked dirty.
>> + * This is the case if nfs_updatepage detects a conflicting request
>> + * that has been written but not committed.
>> + */
>> +static int nfs_pgio_one(struct nfs_pageio_descriptor *desc,
>> + struct nfs_pgio_header *hdr)
>> +{
>> + struct nfs_page *req;
>> + struct page **pages;
>> + struct nfs_pgio_data *data;
>> + struct list_head *head = &desc->pg_list;
>> + struct nfs_commit_info cinfo;
>> +
>> + data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
>> + desc->pg_count));
>> + if (!data)
>> + return nfs_pgio_error(desc, hdr);
>> +
>> + nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
>> + pages = data->pages.pagevec;
>> + while (!list_empty(head)) {
>> + req = nfs_list_entry(head->next);
>> + nfs_list_remove_request(req);
>> + nfs_list_add_request(req, &hdr->pages);
>> + *pages++ = req->wb_page;
>> + }
>> +
>> + if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
>> + (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
>> + desc->pg_ioflags &= ~FLUSH_COND_STABLE;
>> +
>> + /* Set up the argument struct */
>> + nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
>> + list_add(&data->list, &hdr->rpc_list);
>> + desc->pg_rpc_callops = &nfs_pgio_common_ops;
>> + return 0;
>> +}
>> +
>> +int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
>> + struct nfs_pgio_header *hdr)
>> +{
>> + if (desc->pg_bsize < PAGE_CACHE_SIZE)
>> + return nfs_pgio_multi(desc, hdr);
>> + return nfs_pgio_one(desc, hdr);
>> +}
>> +EXPORT_SYMBOL_GPL(nfs_generic_pgio);
>> +
>> static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
>> {
>> struct nfs_pgio_data *data = calldata;
>> @@ -177,7 +275,7 @@ static void nfs_pgio_result_common(struct rpc_task *task, void *calldata)
>> data->header->rw_ops->rw_result_common(task, data);
>> }
>>
>> -const struct rpc_call_ops nfs_pgio_common_ops = {
>> +static const struct rpc_call_ops nfs_pgio_common_ops = {
>> .rpc_call_prepare = nfs_pgio_prepare,
>> .rpc_call_done = nfs_pgio_result_common,
>> .rpc_release = nfs_pgio_release_common,
>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>> index 54c84c1..0fe6701 100644
>> --- a/fs/nfs/pnfs.c
>> +++ b/fs/nfs/pnfs.c
>> @@ -1607,7 +1607,7 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
>> nfs_pgheader_init(desc, hdr, pnfs_writehdr_free);
>> hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
>> atomic_inc(&hdr->refcnt);
>> - ret = nfs_generic_flush(desc, hdr);
>> + ret = nfs_generic_pgio(desc, hdr);
>> if (ret != 0) {
>> pnfs_put_lseg(desc->pg_lseg);
>> desc->pg_lseg = NULL;
>> @@ -1766,7 +1766,7 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
>> nfs_pgheader_init(desc, hdr, pnfs_readhdr_free);
>> hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
>> atomic_inc(&hdr->refcnt);
>> - ret = nfs_generic_pagein(desc, hdr);
>> + ret = nfs_generic_pgio(desc, hdr);
>> if (ret != 0) {
>> pnfs_put_lseg(desc->pg_lseg);
>> desc->pg_lseg = NULL;
>> diff --git a/fs/nfs/read.c b/fs/nfs/read.c
>> index c623671..07c21bd 100644
>> --- a/fs/nfs/read.c
>> +++ b/fs/nfs/read.c
>> @@ -237,85 +237,6 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
>> .completion = nfs_read_completion,
>> };
>>
>> -/*
>> - * Generate multiple requests to fill a single page.
>> - *
>> - * We optimize to reduce the number of read operations on the wire. If we
>> - * detect that we're reading a page, or an area of a page, that is past the
>> - * end of file, we do not generate NFS read operations but just clear the
>> - * parts of the page that would have come back zero from the server anyway.
>> - *
>> - * We rely on the cached value of i_size to make this determination; another
>> - * client can fill pages on the server past our cached end-of-file, but we
>> - * won't see the new data until our attribute cache is updated. This is more
>> - * or less conventional NFS client behavior.
>> - */
>> -static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr)
>> -{
>> - struct nfs_page *req = hdr->req;
>> - struct page *page = req->wb_page;
>> - struct nfs_pgio_data *data;
>> - size_t rsize = desc->pg_bsize, nbytes;
>> - unsigned int offset;
>> -
>> - offset = 0;
>> - nbytes = desc->pg_count;
>> - do {
>> - size_t len = min(nbytes,rsize);
>> -
>> - data = nfs_pgio_data_alloc(hdr, 1);
>> - if (!data)
>> - return nfs_pgio_error(desc, hdr);
>> - data->pages.pagevec[0] = page;
>> - nfs_pgio_rpcsetup(data, len, offset, 0, NULL);
>> - list_add(&data->list, &hdr->rpc_list);
>> - nbytes -= len;
>> - offset += len;
>> - } while (nbytes != 0);
>> -
>> - nfs_list_remove_request(req);
>> - nfs_list_add_request(req, &hdr->pages);
>> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
>> - return 0;
>> -}
>> -
>> -static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr)
>> -{
>> - struct nfs_page *req;
>> - struct page **pages;
>> - struct nfs_pgio_data *data;
>> - struct list_head *head = &desc->pg_list;
>> -
>> - data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
>> - desc->pg_count));
>> - if (!data)
>> - return nfs_pgio_error(desc, hdr);
>> -
>> - pages = data->pages.pagevec;
>> - while (!list_empty(head)) {
>> - req = nfs_list_entry(head->next);
>> - nfs_list_remove_request(req);
>> - nfs_list_add_request(req, &hdr->pages);
>> - *pages++ = req->wb_page;
>> - }
>> -
>> - nfs_pgio_rpcsetup(data, desc->pg_count, 0, 0, NULL);
>> - list_add(&data->list, &hdr->rpc_list);
>> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
>> - return 0;
>> -}
>> -
>> -int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr)
>> -{
>> - if (desc->pg_bsize < PAGE_CACHE_SIZE)
>> - return nfs_pagein_multi(desc, hdr);
>> - return nfs_pagein_one(desc, hdr);
>> -}
>> -EXPORT_SYMBOL_GPL(nfs_generic_pagein);
>> -
>> static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
>> {
>> struct nfs_rw_header *rhdr;
>> @@ -330,7 +251,7 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
>> hdr = &rhdr->header;
>> nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
>> atomic_inc(&hdr->refcnt);
>> - ret = nfs_generic_pagein(desc, hdr);
>> + ret = nfs_generic_pgio(desc, hdr);
>> if (ret == 0)
>> ret = nfs_do_multiple_reads(&hdr->rpc_list,
>> desc->pg_rpc_callops);
>> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
>> index 1f98f31..8929e33 100644
>> --- a/fs/nfs/write.c
>> +++ b/fs/nfs/write.c
>> @@ -1044,101 +1044,6 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops = {
>> .completion = nfs_write_completion,
>> };
>>
>> -/*
>> - * Generate multiple small requests to write out a single
>> - * contiguous dirty area on one page.
>> - */
>> -static int nfs_flush_multi(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr)
>> -{
>> - struct nfs_page *req = hdr->req;
>> - struct page *page = req->wb_page;
>> - struct nfs_pgio_data *data;
>> - size_t wsize = desc->pg_bsize, nbytes;
>> - unsigned int offset;
>> - int requests = 0;
>> - struct nfs_commit_info cinfo;
>> -
>> - nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
>> -
>> - if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
>> - (desc->pg_moreio || nfs_reqs_to_commit(&cinfo) ||
>> - desc->pg_count > wsize))
>> - desc->pg_ioflags &= ~FLUSH_COND_STABLE;
>> -
>> -
>> - offset = 0;
>> - nbytes = desc->pg_count;
>> - do {
>> - size_t len = min(nbytes, wsize);
>> -
>> - data = nfs_pgio_data_alloc(hdr, 1);
>> - if (!data)
>> - return nfs_pgio_error(desc, hdr);
>> - data->pages.pagevec[0] = page;
>> - nfs_pgio_rpcsetup(data, len, offset, desc->pg_ioflags, &cinfo);
>> - list_add(&data->list, &hdr->rpc_list);
>> - requests++;
>> - nbytes -= len;
>> - offset += len;
>> - } while (nbytes != 0);
>> - nfs_list_remove_request(req);
>> - nfs_list_add_request(req, &hdr->pages);
>> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
>> - return 0;
>> -}
>> -
>> -/*
>> - * Create an RPC task for the given write request and kick it.
>> - * The page must have been locked by the caller.
>> - *
>> - * It may happen that the page we're passed is not marked dirty.
>> - * This is the case if nfs_updatepage detects a conflicting request
>> - * that has been written but not committed.
>> - */
>> -static int nfs_flush_one(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr)
>> -{
>> - struct nfs_page *req;
>> - struct page **pages;
>> - struct nfs_pgio_data *data;
>> - struct list_head *head = &desc->pg_list;
>> - struct nfs_commit_info cinfo;
>> -
>> - data = nfs_pgio_data_alloc(hdr, nfs_page_array_len(desc->pg_base,
>> - desc->pg_count));
>> - if (!data)
>> - return nfs_pgio_error(desc, hdr);
>> -
>> - nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
>> - pages = data->pages.pagevec;
>> - while (!list_empty(head)) {
>> - req = nfs_list_entry(head->next);
>> - nfs_list_remove_request(req);
>> - nfs_list_add_request(req, &hdr->pages);
>> - *pages++ = req->wb_page;
>> - }
>> -
>> - if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
>> - (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
>> - desc->pg_ioflags &= ~FLUSH_COND_STABLE;
>> -
>> - /* Set up the argument struct */
>> - nfs_pgio_rpcsetup(data, desc->pg_count, 0, desc->pg_ioflags, &cinfo);
>> - list_add(&data->list, &hdr->rpc_list);
>> - desc->pg_rpc_callops = &nfs_pgio_common_ops;
>> - return 0;
>> -}
>> -
>> -int nfs_generic_flush(struct nfs_pageio_descriptor *desc,
>> - struct nfs_pgio_header *hdr)
>> -{
>> - if (desc->pg_bsize < PAGE_CACHE_SIZE)
>> - return nfs_flush_multi(desc, hdr);
>> - return nfs_flush_one(desc, hdr);
>> -}
>> -EXPORT_SYMBOL_GPL(nfs_generic_flush);
>> -
>> static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
>> {
>> struct nfs_rw_header *whdr;
>> @@ -1153,7 +1058,7 @@ static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
>> hdr = &whdr->header;
>> nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
>> atomic_inc(&hdr->refcnt);
>> - ret = nfs_generic_flush(desc, hdr);
>> + ret = nfs_generic_pgio(desc, hdr);
>> if (ret == 0)
>> ret = nfs_do_multiple_writes(&hdr->rpc_list,
>> desc->pg_rpc_callops,
>> --
>> 1.9.2
>>
>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v2 14/17] NFS: Create a common initiate_pgio() function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (12 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 13/17] NFS: Create a generic_pgio function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 15/17] NFS: Create a common multiple_pgios() function Anna Schumaker
` (3 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
Most of this code is the same for both the read and write paths, so
combine everything and use the rw_ops when necessary.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 9 ++------
fs/nfs/nfs4filelayout.c | 6 +++---
fs/nfs/pageio.c | 47 +++++++++++++++++++++++++++++++++++++++++
fs/nfs/read.c | 42 ++++++------------------------------
fs/nfs/write.c | 55 ++++++------------------------------------------
include/linux/nfs_page.h | 2 ++
6 files changed, 67 insertions(+), 94 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 6422b9d..027d72c 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -400,14 +400,13 @@ extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
+extern int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *,
+ const struct rpc_call_ops *, int, int);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
struct inode *inode, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops);
-extern int nfs_initiate_read(struct rpc_clnt *clnt,
- struct nfs_pgio_data *data,
- const struct rpc_call_ops *call_ops, int flags);
extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
@@ -428,10 +427,6 @@ extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
const struct nfs_pgio_completion_ops *compl_ops);
extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
extern void nfs_commit_free(struct nfs_commit_data *p);
-extern int nfs_initiate_write(struct rpc_clnt *clnt,
- struct nfs_pgio_data *data,
- const struct rpc_call_ops *call_ops,
- int how, int flags);
extern void nfs_write_prepare(struct rpc_task *task, void *calldata);
extern void nfs_commit_prepare(struct rpc_task *task, void *calldata);
extern int nfs_initiate_commit(struct rpc_clnt *clnt,
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index e693614..7954e16 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -568,8 +568,8 @@ filelayout_read_pagelist(struct nfs_pgio_data *data)
data->mds_offset = offset;
/* Perform an asynchronous read to ds */
- nfs_initiate_read(ds_clnt, data,
- &filelayout_read_call_ops, RPC_TASK_SOFTCONN);
+ nfs_initiate_pgio(ds_clnt, data,
+ &filelayout_read_call_ops, 0, RPC_TASK_SOFTCONN);
return PNFS_ATTEMPTED;
}
@@ -613,7 +613,7 @@ filelayout_write_pagelist(struct nfs_pgio_data *data, int sync)
data->args.offset = filelayout_get_dserver_offset(lseg, offset);
/* Perform an asynchronous write */
- nfs_initiate_write(ds_clnt, data,
+ nfs_initiate_pgio(ds_clnt, data,
&filelayout_write_call_ops, sync,
RPC_TASK_SOFTCONN);
return PNFS_ATTEMPTED;
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index 70598a7..f07a132 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -126,6 +126,53 @@ static void nfs_pgio_rpcsetup(struct nfs_pgio_data *data,
nfs_fattr_init(&data->fattr);
}
+int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_data *data,
+ const struct rpc_call_ops *call_ops, int how, int flags)
+{
+ struct inode *inode = data->header->inode;
+ struct rpc_task *task;
+ struct rpc_message msg = {
+ .rpc_argp = &data->args,
+ .rpc_resp = &data->res,
+ .rpc_cred = data->header->cred,
+ };
+ struct rpc_task_setup task_setup_data = {
+ .rpc_client = clnt,
+ .task = &data->task,
+ .rpc_message = &msg,
+ .callback_ops = call_ops,
+ .callback_data = data,
+ .workqueue = nfsiod_workqueue,
+ .flags = RPC_TASK_ASYNC | flags,
+ };
+ int ret = 0;
+
+ data->header->rw_ops->rw_initiate(data, &msg, &task_setup_data, how);
+
+ dprintk("NFS: %5u initiated pgio call "
+ "(req %s/%llu, %u bytes @ offset %llu)\n",
+ data->task.tk_pid,
+ inode->i_sb->s_id,
+ (unsigned long long)NFS_FILEID(inode),
+ data->args.count,
+ (unsigned long long)data->args.offset);
+
+ task = rpc_run_task(&task_setup_data);
+ if (IS_ERR(task)) {
+ ret = PTR_ERR(task);
+ goto out;
+ }
+ if (how & FLUSH_SYNC) {
+ ret = rpc_wait_for_completion_task(task);
+ if (ret == 0)
+ ret = task->tk_status;
+ }
+ rpc_put_task(task);
+out:
+ return ret;
+}
+EXPORT_SYMBOL_GPL(nfs_initiate_pgio);
+
static int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr)
{
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 07c21bd..ebea335 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -151,53 +151,22 @@ out:
hdr->release(hdr);
}
-int nfs_initiate_read(struct rpc_clnt *clnt,
- struct nfs_pgio_data *data,
- const struct rpc_call_ops *call_ops, int flags)
+static void nfs_initiate_read(struct nfs_pgio_data *data, struct rpc_message *msg,
+ struct rpc_task_setup *task_setup_data, int how)
{
struct inode *inode = data->header->inode;
int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
- struct rpc_task *task;
- struct rpc_message msg = {
- .rpc_argp = &data->args,
- .rpc_resp = &data->res,
- .rpc_cred = data->header->cred,
- };
- struct rpc_task_setup task_setup_data = {
- .task = &data->task,
- .rpc_client = clnt,
- .rpc_message = &msg,
- .callback_ops = call_ops,
- .callback_data = data,
- .workqueue = nfsiod_workqueue,
- .flags = RPC_TASK_ASYNC | swap_flags | flags,
- };
- /* Set up the initial task struct. */
- NFS_PROTO(inode)->read_setup(data, &msg);
-
- dprintk("NFS: %5u initiated read call (req %s/%llu, %u bytes @ "
- "offset %llu)\n",
- data->task.tk_pid,
- inode->i_sb->s_id,
- (unsigned long long)NFS_FILEID(inode),
- data->args.count,
- (unsigned long long)data->args.offset);
-
- task = rpc_run_task(&task_setup_data);
- if (IS_ERR(task))
- return PTR_ERR(task);
- rpc_put_task(task);
- return 0;
+ task_setup_data->flags |= swap_flags;
+ NFS_PROTO(inode)->read_setup(data, msg);
}
-EXPORT_SYMBOL_GPL(nfs_initiate_read);
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_read(NFS_CLIENT(inode), data, call_ops, 0);
+ return nfs_initiate_pgio(NFS_CLIENT(inode), data, call_ops, 0, 0);
}
static int
@@ -491,4 +460,5 @@ static const struct nfs_rw_ops nfs_rw_read_ops = {
.rw_free_header = nfs_readhdr_free,
.rw_result = nfs_readpage_result,
.rw_result_common = nfs_readpage_result_common,
+ .rw_initiate = nfs_initiate_read,
};
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 8929e33..4279f80 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -932,60 +932,18 @@ static int flush_task_priority(int how)
return RPC_PRIORITY_NORMAL;
}
-int nfs_initiate_write(struct rpc_clnt *clnt,
- struct nfs_pgio_data *data,
- const struct rpc_call_ops *call_ops,
- int how, int flags)
+static void nfs_initiate_write(struct nfs_pgio_data *data, struct rpc_message *msg,
+ struct rpc_task_setup *task_setup_data, int how)
{
struct inode *inode = data->header->inode;
int priority = flush_task_priority(how);
- struct rpc_task *task;
- struct rpc_message msg = {
- .rpc_argp = &data->args,
- .rpc_resp = &data->res,
- .rpc_cred = data->header->cred,
- };
- struct rpc_task_setup task_setup_data = {
- .rpc_client = clnt,
- .task = &data->task,
- .rpc_message = &msg,
- .callback_ops = call_ops,
- .callback_data = data,
- .workqueue = nfsiod_workqueue,
- .flags = RPC_TASK_ASYNC | flags,
- .priority = priority,
- };
- int ret = 0;
- /* Set up the initial task struct. */
- NFS_PROTO(inode)->write_setup(data, &msg);
-
- dprintk("NFS: %5u initiated write call "
- "(req %s/%llu, %u bytes @ offset %llu)\n",
- data->task.tk_pid,
- inode->i_sb->s_id,
- (unsigned long long)NFS_FILEID(inode),
- data->args.count,
- (unsigned long long)data->args.offset);
+ task_setup_data->priority = priority;
+ NFS_PROTO(inode)->write_setup(data, msg);
nfs4_state_protect_write(NFS_SERVER(inode)->nfs_client,
- &task_setup_data.rpc_client, &msg, data);
-
- task = rpc_run_task(&task_setup_data);
- if (IS_ERR(task)) {
- ret = PTR_ERR(task);
- goto out;
- }
- if (how & FLUSH_SYNC) {
- ret = rpc_wait_for_completion_task(task);
- if (ret == 0)
- ret = task->tk_status;
- }
- rpc_put_task(task);
-out:
- return ret;
+ &task_setup_data->rpc_client, msg, data);
}
-EXPORT_SYMBOL_GPL(nfs_initiate_write);
static int nfs_do_write(struct nfs_pgio_data *data,
const struct rpc_call_ops *call_ops,
@@ -993,7 +951,7 @@ static int nfs_do_write(struct nfs_pgio_data *data,
{
struct inode *inode = data->header->inode;
- return nfs_initiate_write(NFS_CLIENT(inode), data, call_ops, how, 0);
+ return nfs_initiate_pgio(NFS_CLIENT(inode), data, call_ops, how, 0);
}
static int nfs_do_multiple_writes(struct list_head *head,
@@ -1743,4 +1701,5 @@ static const struct nfs_rw_ops nfs_rw_write_ops = {
.rw_release = nfs_writeback_release_common,
.rw_result = nfs_writeback_result,
.rw_result_common = nfs_writeback_result_common,
+ .rw_initiate = nfs_initiate_write,
};
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 9477d7a..dc5e71c 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -59,6 +59,8 @@ struct nfs_rw_ops {
void (*rw_release)(struct nfs_pgio_data *);
int (*rw_result)(struct rpc_task *, struct nfs_pgio_data *, struct inode *);
void (*rw_result_common)(struct rpc_task *, struct nfs_pgio_data *);
+ void (*rw_initiate)(struct nfs_pgio_data *, struct rpc_message *,
+ struct rpc_task_setup *, int);
};
struct nfs_pageio_descriptor {
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 15/17] NFS: Create a common multiple_pgios() function
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (13 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 14/17] NFS: Create a common initiate_pgio() function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:55 ` [PATCH v2 16/17] NFS: Create a common generic_pg_pgios() Anna Schumaker
` (2 subsequent siblings)
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
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>
---
fs/nfs/internal.h | 1 +
fs/nfs/pageio.c | 29 +++++++++++++++++++++++++++++
fs/nfs/read.c | 32 ++------------------------------
fs/nfs/write.c | 31 +------------------------------
4 files changed, 33 insertions(+), 60 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 027d72c..81c314c 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -402,6 +402,7 @@ extern void nfs_pgio_data_release(struct nfs_pgio_data *);
extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
extern int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *,
const struct rpc_call_ops *, int, int);
+extern int nfs_do_multiple_pgios(struct list_head *, const struct rpc_call_ops *, int);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index f07a132..e985b0e 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -173,6 +173,35 @@ out:
}
EXPORT_SYMBOL_GPL(nfs_initiate_pgio);
+static int nfs_do_pgio(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);
+}
+
+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_do_pgio(data, call_ops, how);
+ if (ret == 0)
+ ret = ret2;
+ }
+ return ret;
+}
+
static int nfs_pgio_error(struct nfs_pageio_descriptor *desc,
struct nfs_pgio_header *hdr)
{
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index ebea335..9dd1aeb 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
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)
{
@@ -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;
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 4279f80..28fdde2 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
&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.
@@ -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))
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 16/17] NFS: Create a common generic_pg_pgios()
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (14 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 15/17] NFS: Create a common multiple_pgios() function Anna Schumaker
@ 2014-04-25 20:55 ` Anna Schumaker
2014-04-25 20:56 ` [PATCH v2 17/17] NFS: Create a common nfs_pageio_ops struct Anna Schumaker
2014-04-30 16:09 ` [PATCH v2 00/17] NFS: Create a common path used by reads and writes Weston Andros Adamson
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:55 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
From: Anna Schumaker <Anna.Schumaker@netapp.com>
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>
---
fs/nfs/internal.h | 1 +
fs/nfs/pageio.c | 23 +++++++++++++++++++++++
fs/nfs/read.c | 25 +------------------------
fs/nfs/write.c | 26 +-------------------------
4 files changed, 26 insertions(+), 49 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 81c314c..0243825 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -403,6 +403,7 @@ extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_head
extern int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *,
const struct rpc_call_ops *, int, int);
extern int nfs_do_multiple_pgios(struct list_head *, const struct rpc_call_ops *, int);
+extern int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index e985b0e..feac787 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -312,6 +312,29 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
}
EXPORT_SYMBOL_GPL(nfs_generic_pgio);
+int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
+{
+ struct nfs_rw_header *rw_hdr;
+ struct nfs_pgio_header *hdr;
+ int ret;
+
+ rw_hdr = nfs_rw_header_alloc(desc->pg_rw_ops);
+ if (!rw_hdr) {
+ desc->pg_completion_ops->error_cleanup(&desc->pg_list);
+ return -ENOMEM;
+ }
+ hdr = &rw_hdr->header;
+ nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
+ atomic_inc(&hdr->refcnt);
+ ret = nfs_generic_pgio(desc, hdr);
+ if (ret == 0)
+ 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;
+}
+
static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_pgio_data *data = calldata;
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 9dd1aeb..8460795 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 = {
.completion = nfs_read_completion,
};
-static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
-{
- struct nfs_rw_header *rhdr;
- struct nfs_pgio_header *hdr;
- int ret;
-
- rhdr = nfs_rw_header_alloc(desc->pg_rw_ops);
- if (!rhdr) {
- desc->pg_completion_ops->error_cleanup(&desc->pg_list);
- return -ENOMEM;
- }
- hdr = &rhdr->header;
- nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
- atomic_inc(&hdr->refcnt);
- ret = nfs_generic_pgio(desc, hdr);
- if (ret == 0)
- 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;
-}
-
static const struct nfs_pageio_ops nfs_pageio_read_ops = {
.pg_test = nfs_generic_pg_test,
- .pg_doio = nfs_generic_pg_readpages,
+ .pg_doio = nfs_generic_pg_pgios,
};
/*
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 28fdde2..ebbb663 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 = {
.completion = nfs_write_completion,
};
-static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
-{
- struct nfs_rw_header *whdr;
- struct nfs_pgio_header *hdr;
- int ret;
-
- whdr = nfs_rw_header_alloc(desc->pg_rw_ops);
- if (!whdr) {
- desc->pg_completion_ops->error_cleanup(&desc->pg_list);
- return -ENOMEM;
- }
- hdr = &whdr->header;
- nfs_pgheader_init(desc, hdr, nfs_rw_header_free);
- atomic_inc(&hdr->refcnt);
- ret = nfs_generic_pgio(desc, hdr);
- if (ret == 0)
- ret = nfs_do_multiple_pgios(&hdr->rpc_list,
- desc->pg_rpc_callops,
- desc->pg_ioflags);
- if (atomic_dec_and_test(&hdr->refcnt))
- hdr->completion_ops->completion(hdr);
- return ret;
-}
-
static const struct nfs_pageio_ops nfs_pageio_write_ops = {
.pg_test = nfs_generic_pg_test,
- .pg_doio = nfs_generic_pg_writepages,
+ .pg_doio = nfs_generic_pg_pgios,
};
void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* [PATCH v2 17/17] NFS: Create a common nfs_pageio_ops struct
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (15 preceding siblings ...)
2014-04-25 20:55 ` [PATCH v2 16/17] NFS: Create a common generic_pg_pgios() Anna Schumaker
@ 2014-04-25 20:56 ` Anna Schumaker
2014-04-30 16:09 ` [PATCH v2 00/17] NFS: Create a common path used by reads and writes Weston Andros Adamson
17 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-25 20:56 UTC (permalink / raw)
To: Trond.Myklebust, linux-nfs; +Cc: dros, hch
At this point the read and write structures look identical, so combine
them into something shared by both.
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
fs/nfs/internal.h | 2 +-
fs/nfs/pageio.c | 7 ++++++-
fs/nfs/read.c | 10 ++--------
fs/nfs/write.c | 9 ++-------
4 files changed, 11 insertions(+), 17 deletions(-)
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 0243825..0c22142 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -396,6 +396,7 @@ extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool
struct nfs_pgio_completion_ops;
/* pageio.c */
+extern const struct nfs_pageio_ops nfs_pgio_rw_ops;
extern struct nfs_rw_header *nfs_rw_header_alloc(const struct nfs_rw_ops *);
extern void nfs_rw_header_free(struct nfs_pgio_header *);
extern void nfs_pgio_data_release(struct nfs_pgio_data *);
@@ -403,7 +404,6 @@ extern int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_head
extern int nfs_initiate_pgio(struct rpc_clnt *, struct nfs_pgio_data *,
const struct rpc_call_ops *, int, int);
extern int nfs_do_multiple_pgios(struct list_head *, const struct rpc_call_ops *, int);
-extern int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *);
/* read.c */
extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
diff --git a/fs/nfs/pageio.c b/fs/nfs/pageio.c
index feac787..4c93611 100644
--- a/fs/nfs/pageio.c
+++ b/fs/nfs/pageio.c
@@ -312,7 +312,7 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
}
EXPORT_SYMBOL_GPL(nfs_generic_pgio);
-int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
+static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
{
struct nfs_rw_header *rw_hdr;
struct nfs_pgio_header *hdr;
@@ -379,3 +379,8 @@ static const struct rpc_call_ops nfs_pgio_common_ops = {
.rpc_call_done = nfs_pgio_result_common,
.rpc_release = nfs_pgio_release_common,
};
+
+const struct nfs_pageio_ops nfs_pgio_rw_ops = {
+ .pg_test = nfs_generic_pg_test,
+ .pg_doio = nfs_generic_pg_pgios,
+};
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 8460795..d7e9460 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -28,7 +28,6 @@
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
-static const struct nfs_pageio_ops nfs_pageio_read_ops;
static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
static const struct nfs_rw_ops nfs_rw_read_ops;
@@ -58,7 +57,7 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
const struct nfs_pgio_completion_ops *compl_ops)
{
struct nfs_server *server = NFS_SERVER(inode);
- const struct nfs_pageio_ops *pg_ops = &nfs_pageio_read_ops;
+ const struct nfs_pageio_ops *pg_ops = &nfs_pgio_rw_ops;
#ifdef CONFIG_NFS_V4_1
if (server->pnfs_curr_ld && !force_mds)
@@ -71,7 +70,7 @@ EXPORT_SYMBOL_GPL(nfs_pageio_init_read);
void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio)
{
- pgio->pg_ops = &nfs_pageio_read_ops;
+ pgio->pg_ops = &nfs_pgio_rw_ops;
pgio->pg_bsize = NFS_SERVER(pgio->pg_inode)->rsize;
}
EXPORT_SYMBOL_GPL(nfs_pageio_reset_read_mds);
@@ -178,11 +177,6 @@ static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
.completion = nfs_read_completion,
};
-static const struct nfs_pageio_ops nfs_pageio_read_ops = {
- .pg_test = nfs_generic_pg_test,
- .pg_doio = nfs_generic_pg_pgios,
-};
-
/*
* This is the callback from RPC telling us whether a reply was
* received or some error occurred (timeout or socket shutdown).
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index ebbb663..3483dd4 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -973,17 +973,12 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops = {
.completion = nfs_write_completion,
};
-static const struct nfs_pageio_ops nfs_pageio_write_ops = {
- .pg_test = nfs_generic_pg_test,
- .pg_doio = nfs_generic_pg_pgios,
-};
-
void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags, bool force_mds,
const struct nfs_pgio_completion_ops *compl_ops)
{
struct nfs_server *server = NFS_SERVER(inode);
- const struct nfs_pageio_ops *pg_ops = &nfs_pageio_write_ops;
+ const struct nfs_pageio_ops *pg_ops = &nfs_pgio_rw_ops;
#ifdef CONFIG_NFS_V4_1
if (server->pnfs_curr_ld && !force_mds)
@@ -996,7 +991,7 @@ EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio)
{
- pgio->pg_ops = &nfs_pageio_write_ops;
+ pgio->pg_ops = &nfs_pgio_rw_ops;
pgio->pg_bsize = NFS_SERVER(pgio->pg_inode)->wsize;
}
EXPORT_SYMBOL_GPL(nfs_pageio_reset_write_mds);
--
1.9.2
^ permalink raw reply related [flat|nested] 29+ messages in thread* Re: [PATCH v2 00/17] NFS: Create a common path used by reads and writes
2014-04-25 20:55 [PATCH v2 00/17] NFS: Create a common path used by reads and writes Anna Schumaker
` (16 preceding siblings ...)
2014-04-25 20:56 ` [PATCH v2 17/17] NFS: Create a common nfs_pageio_ops struct Anna Schumaker
@ 2014-04-30 16:09 ` Weston Andros Adamson
2014-04-30 16:21 ` Anna Schumaker
17 siblings, 1 reply; 29+ messages in thread
From: Weston Andros Adamson @ 2014-04-30 16:09 UTC (permalink / raw)
To: Anna Schumaker; +Cc: Trond Myklebust, linux-nfs list, hch
On Apr 25, 2014, at 4:55 PM, Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> I noticed that much of the read and write code was almost identical, with
> only minor differences in argument types and names. These patches seek to
> unify these two codepaths wherever possible in order to make future changes
> easier.
>
> Table of contents:
> Patches 01 - 05: Set up common data structures.
> Patches 06 - 10: Set up a shared rpc_call_ops struct.
> Patches 11 - 15: Set up a shared nfs_pageio_ops struct.
>
> Some of the commit setup was moved into common code, but I'm willing to
> move this back into write.c if this looks to be a problem.
>
> Future work:
> I have rough pNFS patches to combine the read and write paths in
> pnfs.c. They apply on top of Dros' multiple requests work and
> should get more testing before I submit.
Good! I was going to ask about that. pnfs_generic_pg_writepages /
pnfs_generic_pg_readpagescan are extremely similar to nfs_generic_pg_pgios.
>
> Testing:
> I tested every version of NFS using the cthon and xfs tests without
> hitting anything new. Any extra testing would be great seeing how
> the read and write paths are vitally important.
>
> Changes in v2:
> Reorder data fields in the earlier patches to keep read-only and
> write-only variables together.
>
> Questions? Comments? Thoughts?
Why did you make a new file pageio.c? pagelist.c seems like the right place for
all of these changes. Or maybe merge them both into pageio.c?
-dros
>
> Anna
>
>
> Anna Schumaker (17):
> NFS: Create a common argument structure for reads and writes
> NFS: Create a common results structure for reads and writes
> NFS: Create a common read and write data struct
> NFS: Create a common read and write header struct
> NFS: Move the write verifier into the nfs_pgio_header
> NFS: Create a common pgio_alloc and pgio_release function
> NFS: Create a common rw_header_alloc and rw_header_free function
> NFS: Create a common pgio_rpc_prepare function
> NFS: Create a common nfs_pgio_result_common function
> NFS: Create a common rpc_call_ops struct
> NFS: Create a common rpcsetup function for reads and writes
> NFS: Create a common pgio_error function
> NFS: Create a generic_pgio function
> NFS: Create a common initiate_pgio() function
> NFS: Create a common multiple_pgios() function
> NFS: Create a common generic_pg_pgios()
> NFS: Create a common nfs_pageio_ops struct
>
> fs/nfs/Makefile | 2 +-
> fs/nfs/blocklayout/blocklayout.c | 22 +-
> fs/nfs/direct.c | 4 +-
> fs/nfs/internal.h | 31 ++-
> fs/nfs/nfs2xdr.c | 14 +-
> fs/nfs/nfs3proc.c | 19 +-
> fs/nfs/nfs3xdr.c | 16 +-
> fs/nfs/nfs4_fs.h | 4 +-
> fs/nfs/nfs4filelayout.c | 40 ++--
> fs/nfs/nfs4proc.c | 52 ++---
> fs/nfs/nfs4trace.h | 8 +-
> fs/nfs/nfs4xdr.c | 19 +-
> fs/nfs/objlayout/objio_osd.c | 6 +-
> fs/nfs/objlayout/objlayout.c | 16 +-
> fs/nfs/objlayout/objlayout.h | 8 +-
> fs/nfs/pageio.c | 386 +++++++++++++++++++++++++++++++++++
> fs/nfs/pagelist.c | 2 +
> fs/nfs/pnfs.c | 46 ++---
> fs/nfs/pnfs.h | 10 +-
> fs/nfs/proc.c | 19 +-
> fs/nfs/read.c | 348 +++-----------------------------
> fs/nfs/write.c | 425 +++++----------------------------------
> include/linux/nfs_fs.h | 3 +-
> include/linux/nfs_page.h | 13 ++
> include/linux/nfs_xdr.h | 95 +++------
> 25 files changed, 662 insertions(+), 946 deletions(-)
> create mode 100644 fs/nfs/pageio.c
>
> --
> 1.9.2
>
^ permalink raw reply [flat|nested] 29+ messages in thread* Re: [PATCH v2 00/17] NFS: Create a common path used by reads and writes
2014-04-30 16:09 ` [PATCH v2 00/17] NFS: Create a common path used by reads and writes Weston Andros Adamson
@ 2014-04-30 16:21 ` Anna Schumaker
0 siblings, 0 replies; 29+ messages in thread
From: Anna Schumaker @ 2014-04-30 16:21 UTC (permalink / raw)
To: Weston Andros Adamson; +Cc: Trond Myklebust, linux-nfs list, hch
On 04/30/2014 12:09 PM, Weston Andros Adamson wrote:
> On Apr 25, 2014, at 4:55 PM, Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
>
>> I noticed that much of the read and write code was almost identical, with
>> only minor differences in argument types and names. These patches seek to
>> unify these two codepaths wherever possible in order to make future changes
>> easier.
>>
>> Table of contents:
>> Patches 01 - 05: Set up common data structures.
>> Patches 06 - 10: Set up a shared rpc_call_ops struct.
>> Patches 11 - 15: Set up a shared nfs_pageio_ops struct.
>>
>> Some of the commit setup was moved into common code, but I'm willing to
>> move this back into write.c if this looks to be a problem.
>>
>> Future work:
>> I have rough pNFS patches to combine the read and write paths in
>> pnfs.c. They apply on top of Dros' multiple requests work and
>> should get more testing before I submit.
>
> Good! I was going to ask about that. pnfs_generic_pg_writepages /
> pnfs_generic_pg_readpagescan are extremely similar to nfs_generic_pg_pgios.
>
>>
>> Testing:
>> I tested every version of NFS using the cthon and xfs tests without
>> hitting anything new. Any extra testing would be great seeing how
>> the read and write paths are vitally important.
>>
>> Changes in v2:
>> Reorder data fields in the earlier patches to keep read-only and
>> write-only variables together.
>>
>> Questions? Comments? Thoughts?
>
> Why did you make a new file pageio.c? pagelist.c seems like the right place for
> all of these changes. Or maybe merge them both into pageio.c?
I don't remember my reasoning for creating a new file, so I can put everything into pagelist.c if that would make more sense!
Anna
>
> -dros
>
>>
>> Anna
>>
>>
>> Anna Schumaker (17):
>> NFS: Create a common argument structure for reads and writes
>> NFS: Create a common results structure for reads and writes
>> NFS: Create a common read and write data struct
>> NFS: Create a common read and write header struct
>> NFS: Move the write verifier into the nfs_pgio_header
>> NFS: Create a common pgio_alloc and pgio_release function
>> NFS: Create a common rw_header_alloc and rw_header_free function
>> NFS: Create a common pgio_rpc_prepare function
>> NFS: Create a common nfs_pgio_result_common function
>> NFS: Create a common rpc_call_ops struct
>> NFS: Create a common rpcsetup function for reads and writes
>> NFS: Create a common pgio_error function
>> NFS: Create a generic_pgio function
>> NFS: Create a common initiate_pgio() function
>> NFS: Create a common multiple_pgios() function
>> NFS: Create a common generic_pg_pgios()
>> NFS: Create a common nfs_pageio_ops struct
>>
>> fs/nfs/Makefile | 2 +-
>> fs/nfs/blocklayout/blocklayout.c | 22 +-
>> fs/nfs/direct.c | 4 +-
>> fs/nfs/internal.h | 31 ++-
>> fs/nfs/nfs2xdr.c | 14 +-
>> fs/nfs/nfs3proc.c | 19 +-
>> fs/nfs/nfs3xdr.c | 16 +-
>> fs/nfs/nfs4_fs.h | 4 +-
>> fs/nfs/nfs4filelayout.c | 40 ++--
>> fs/nfs/nfs4proc.c | 52 ++---
>> fs/nfs/nfs4trace.h | 8 +-
>> fs/nfs/nfs4xdr.c | 19 +-
>> fs/nfs/objlayout/objio_osd.c | 6 +-
>> fs/nfs/objlayout/objlayout.c | 16 +-
>> fs/nfs/objlayout/objlayout.h | 8 +-
>> fs/nfs/pageio.c | 386 +++++++++++++++++++++++++++++++++++
>> fs/nfs/pagelist.c | 2 +
>> fs/nfs/pnfs.c | 46 ++---
>> fs/nfs/pnfs.h | 10 +-
>> fs/nfs/proc.c | 19 +-
>> fs/nfs/read.c | 348 +++-----------------------------
>> fs/nfs/write.c | 425 +++++----------------------------------
>> include/linux/nfs_fs.h | 3 +-
>> include/linux/nfs_page.h | 13 ++
>> include/linux/nfs_xdr.h | 95 +++------
>> 25 files changed, 662 insertions(+), 946 deletions(-)
>> create mode 100644 fs/nfs/pageio.c
>>
>> --
>> 1.9.2
>>
>
^ permalink raw reply [flat|nested] 29+ messages in thread