nfs: cap request size to fit a kmalloced page array

pNFS servers may return arbitrarily large layouts.  Trim back the I/O size
to one that we can at least allocate the page array for.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Christoph Hellwig 2014-08-21 11:09:17 -05:00 committed by Trond Myklebust
parent bc7d4b8fd0
commit 2e11f8296d

View File

@ -481,6 +481,14 @@ size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
return 0; return 0;
} }
/*
* Limit the request size so that we can still allocate a page array
* for it without upsetting the slab allocator.
*/
if (((desc->pg_count + req->wb_bytes) >> PAGE_SHIFT) *
sizeof(struct page) > PAGE_SIZE)
return 0;
return min(desc->pg_bsize - desc->pg_count, (size_t)req->wb_bytes); return min(desc->pg_bsize - desc->pg_count, (size_t)req->wb_bytes);
} }
EXPORT_SYMBOL_GPL(nfs_generic_pg_test); EXPORT_SYMBOL_GPL(nfs_generic_pg_test);