From ba461bcb0f8a0d26005fc7831f539dbec574056d Mon Sep 17 00:00:00 2001 From: Weston Andros Adamson Date: Tue, 23 Oct 2012 10:43:41 -0400 Subject: [PATCH] --- yaml --- r: 346561 b: refs/heads/master c: b25cd058f25ea2054351bbe501956002cd8ed4c5 h: refs/heads/master i: 346559: 23d1d708ac770158eedc555f92dba9d8c047cc39 v: v3 --- [refs] | 2 +- trunk/net/sunrpc/svc.c | 4 +++- trunk/net/sunrpc/svc_xprt.c | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 9f48deb788be..30b038e6252e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ff1fdb9b805fc03fb51c7b061604360af92d0c9e +refs/heads/master: b25cd058f25ea2054351bbe501956002cd8ed4c5 diff --git a/trunk/net/sunrpc/svc.c b/trunk/net/sunrpc/svc.c index 664979bee1d2..3bf5a54982ba 100644 --- a/trunk/net/sunrpc/svc.c +++ b/trunk/net/sunrpc/svc.c @@ -587,7 +587,9 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node) * We assume one is at most one page */ arghi = 0; - BUG_ON(pages > RPCSVC_MAXPAGES); + WARN_ON_ONCE(pages > RPCSVC_MAXPAGES); + if (pages > RPCSVC_MAXPAGES) + pages = RPCSVC_MAXPAGES; while (pages) { struct page *p = alloc_pages_node(node, GFP_KERNEL, 0); if (!p) diff --git a/trunk/net/sunrpc/svc_xprt.c b/trunk/net/sunrpc/svc_xprt.c index be89bb67f0ae..35fa74b09f77 100644 --- a/trunk/net/sunrpc/svc_xprt.c +++ b/trunk/net/sunrpc/svc_xprt.c @@ -579,7 +579,10 @@ int svc_alloc_arg(struct svc_rqst *rqstp) /* now allocate needed pages. If we get a failure, sleep briefly */ pages = (serv->sv_max_mesg + PAGE_SIZE) / PAGE_SIZE; - BUG_ON(pages >= RPCSVC_MAXPAGES); + WARN_ON_ONCE(pages >= RPCSVC_MAXPAGES); + if (pages >= RPCSVC_MAXPAGES) + /* use as many pages as possible */ + pages = RPCSVC_MAXPAGES - 1; for (i = 0; i < pages ; i++) while (rqstp->rq_pages[i] == NULL) { struct page *p = alloc_page(GFP_KERNEL);