xprtrdma: Allocate missing pagelist
GETACL relies on transport layer to alloc memory for reply buffer. However xprtrdma assumes that the reply buffer (pagelist) has been pre-allocated in upper layer. This problem was reported by IOL OFA lab test on PPC. Signed-off-by: Shirley Ma <shirley.ma@oracle.com> Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Tested-by: Edward Mossman <emossman@iol.unh.edu> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
5bc4bc7292
commit
196c69989d
1 changed files with 6 additions and 0 deletions
|
@ -99,6 +99,12 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, unsigned int pos,
|
||||||
page_base = xdrbuf->page_base & ~PAGE_MASK;
|
page_base = xdrbuf->page_base & ~PAGE_MASK;
|
||||||
p = 0;
|
p = 0;
|
||||||
while (len && n < nsegs) {
|
while (len && n < nsegs) {
|
||||||
|
if (!ppages[p]) {
|
||||||
|
/* alloc the pagelist for receiving buffer */
|
||||||
|
ppages[p] = alloc_page(GFP_ATOMIC);
|
||||||
|
if (!ppages[p])
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
seg[n].mr_page = ppages[p];
|
seg[n].mr_page = ppages[p];
|
||||||
seg[n].mr_offset = (void *)(unsigned long) page_base;
|
seg[n].mr_offset = (void *)(unsigned long) page_base;
|
||||||
seg[n].mr_len = min_t(u32, PAGE_SIZE - page_base, len);
|
seg[n].mr_len = min_t(u32, PAGE_SIZE - page_base, len);
|
||||||
|
|
Loading…
Reference in a new issue