SUNRPC: remove BUG_ONs checking RPCSVC_MAXPAGES
authorWeston Andros Adamson <dros@netapp.com>
Tue, 23 Oct 2012 14:43:41 +0000 (10:43 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 4 Nov 2012 19:43:41 +0000 (14:43 -0500)
Replace two bounds checking BUG_ON() calls with WARN_ON_ONCE() and resetting
the requested size to RPCSVC_MAXPAGES.

Signed-off-by: Weston Andros Adamson <dros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c

index 664979bee1d23093cc9f68685e0144c81add7203..3bf5a54982ba3834b8cc1db9fc242fbca1220f76 100644 (file)
@@ -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)
index be89bb67f0ae40f3eb00f3b66eda96aa441d4f5c..35fa74b09f77c953d5b505ccee82b7b71c598278 100644 (file)
@@ -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);