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: Benny Halevy <benny@tonian.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
df18d127f4
commit
19345cb299
3 changed files with 9 additions and 3 deletions
|
@ -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,
|
||||||
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)
|
||||||
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
|
||||||
|
|
||||||
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 *,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue