Commit 19345cb2 authored by Benny Halevy's avatar Benny Halevy Committed by Trond Myklebust

NFSv4.1: file layout must consider pg_bsize for coalescing

Otherwise we end up overflowing the rpc buffer size on the receive end.
Signed-off-by: default avatarBenny Halevy <benny@tonian.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent df18d127
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
*/ */
#include <linux/nfs_fs.h> #include <linux/nfs_fs.h>
#include <linux/nfs_page.h>
#include "internal.h" #include "internal.h"
#include "nfs4filelayout.h" #include "nfs4filelayout.h"
...@@ -666,8 +667,9 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, ...@@ -666,8 +667,9 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
u64 p_stripe, r_stripe; u64 p_stripe, r_stripe;
u32 stripe_unit; u32 stripe_unit;
if (!pnfs_generic_pg_test(pgio, prev, req)) if (!pnfs_generic_pg_test(pgio, prev, req) ||
return 0; !nfs_generic_pg_test(pgio, prev, req))
return false;
if (!pgio->pg_lseg) if (!pgio->pg_lseg)
return 1; return 1;
......
...@@ -204,7 +204,7 @@ nfs_wait_on_request(struct nfs_page *req) ...@@ -204,7 +204,7 @@ nfs_wait_on_request(struct nfs_page *req)
TASK_UNINTERRUPTIBLE); TASK_UNINTERRUPTIBLE);
} }
static bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, struct nfs_page *prev, struct nfs_page *req) bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, struct nfs_page *prev, struct nfs_page *req)
{ {
/* /*
* FIXME: ideally we should be able to coalesce all requests * FIXME: ideally we should be able to coalesce all requests
...@@ -218,6 +218,7 @@ static bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, struct nfs_p ...@@ -218,6 +218,7 @@ static bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, struct nfs_p
return desc->pg_count + req->wb_bytes <= desc->pg_bsize; return desc->pg_count + req->wb_bytes <= desc->pg_bsize;
} }
EXPORT_SYMBOL_GPL(nfs_generic_pg_test);
/** /**
* nfs_pageio_init - initialise a page io descriptor * nfs_pageio_init - initialise a page io descriptor
......
...@@ -92,6 +92,9 @@ extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *, ...@@ -92,6 +92,9 @@ extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
struct nfs_page *); struct nfs_page *);
extern void nfs_pageio_complete(struct nfs_pageio_descriptor *desc); extern void nfs_pageio_complete(struct nfs_pageio_descriptor *desc);
extern void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t); extern void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t);
extern bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
struct nfs_page *prev,
struct nfs_page *req);
extern int nfs_wait_on_request(struct nfs_page *); extern int nfs_wait_on_request(struct nfs_page *);
extern void nfs_unlock_request(struct nfs_page *req); extern void nfs_unlock_request(struct nfs_page *req);
extern int nfs_set_page_tag_locked(struct nfs_page *req); extern int nfs_set_page_tag_locked(struct nfs_page *req);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment