diff options
| -rw-r--r-- | net/sunrpc/xprtrdma/transport.c | 3 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 18 |
2 files changed, 12 insertions, 9 deletions
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 187894b4c33f..93fe7753ff94 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
| @@ -463,7 +463,8 @@ xprt_rdma_allocate(struct rpc_task *task, size_t size) | |||
| 463 | struct rpcrdma_req *req, *nreq; | 463 | struct rpcrdma_req *req, *nreq; |
| 464 | 464 | ||
| 465 | req = rpcrdma_buffer_get(&rpcx_to_rdmax(xprt)->rx_buf); | 465 | req = rpcrdma_buffer_get(&rpcx_to_rdmax(xprt)->rx_buf); |
| 466 | BUG_ON(NULL == req); | 466 | if (req == NULL) |
| 467 | return NULL; | ||
| 467 | 468 | ||
| 468 | if (size > req->rl_size) { | 469 | if (size > req->rl_size) { |
| 469 | dprintk("RPC: %s: size %zd too large for buffer[%zd]: " | 470 | dprintk("RPC: %s: size %zd too large for buffer[%zd]: " |
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index 515dfc14b731..13dbd1c389ff 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
| @@ -1302,7 +1302,6 @@ rpcrdma_buffer_put(struct rpcrdma_req *req) | |||
| 1302 | int i; | 1302 | int i; |
| 1303 | unsigned long flags; | 1303 | unsigned long flags; |
| 1304 | 1304 | ||
| 1305 | BUG_ON(req->rl_nchunks != 0); | ||
| 1306 | spin_lock_irqsave(&buffers->rb_lock, flags); | 1305 | spin_lock_irqsave(&buffers->rb_lock, flags); |
| 1307 | buffers->rb_send_bufs[--buffers->rb_send_index] = req; | 1306 | buffers->rb_send_bufs[--buffers->rb_send_index] = req; |
| 1308 | req->rl_niovs = 0; | 1307 | req->rl_niovs = 0; |
| @@ -1535,10 +1534,6 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg, | |||
| 1535 | } else | 1534 | } else |
| 1536 | post_wr = &frmr_wr; | 1535 | post_wr = &frmr_wr; |
| 1537 | 1536 | ||
| 1538 | /* Bump the key */ | ||
| 1539 | key = (u8)(seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey & 0x000000FF); | ||
| 1540 | ib_update_fast_reg_key(seg1->mr_chunk.rl_mw->r.frmr.fr_mr, ++key); | ||
| 1541 | |||
| 1542 | /* Prepare FRMR WR */ | 1537 | /* Prepare FRMR WR */ |
| 1543 | memset(&frmr_wr, 0, sizeof frmr_wr); | 1538 | memset(&frmr_wr, 0, sizeof frmr_wr); |
| 1544 | frmr_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw; | 1539 | frmr_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw; |
| @@ -1549,7 +1544,16 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg, | |||
| 1549 | frmr_wr.wr.fast_reg.page_list_len = page_no; | 1544 | frmr_wr.wr.fast_reg.page_list_len = page_no; |
| 1550 | frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT; | 1545 | frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT; |
| 1551 | frmr_wr.wr.fast_reg.length = page_no << PAGE_SHIFT; | 1546 | frmr_wr.wr.fast_reg.length = page_no << PAGE_SHIFT; |
| 1552 | BUG_ON(frmr_wr.wr.fast_reg.length < len); | 1547 | if (frmr_wr.wr.fast_reg.length < len) { |
| 1548 | while (seg1->mr_nsegs--) | ||
| 1549 | rpcrdma_unmap_one(ia, seg++); | ||
| 1550 | return -EIO; | ||
| 1551 | } | ||
| 1552 | |||
| 1553 | /* Bump the key */ | ||
| 1554 | key = (u8)(seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey & 0x000000FF); | ||
| 1555 | ib_update_fast_reg_key(seg1->mr_chunk.rl_mw->r.frmr.fr_mr, ++key); | ||
| 1556 | |||
| 1553 | frmr_wr.wr.fast_reg.access_flags = (writing ? | 1557 | frmr_wr.wr.fast_reg.access_flags = (writing ? |
| 1554 | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : | 1558 | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : |
| 1555 | IB_ACCESS_REMOTE_READ); | 1559 | IB_ACCESS_REMOTE_READ); |
| @@ -1709,9 +1713,7 @@ rpcrdma_deregister_external(struct rpcrdma_mr_seg *seg, | |||
| 1709 | 1713 | ||
| 1710 | #if RPCRDMA_PERSISTENT_REGISTRATION | 1714 | #if RPCRDMA_PERSISTENT_REGISTRATION |
| 1711 | case RPCRDMA_ALLPHYSICAL: | 1715 | case RPCRDMA_ALLPHYSICAL: |
| 1712 | BUG_ON(nsegs != 1); | ||
| 1713 | rpcrdma_unmap_one(ia, seg); | 1716 | rpcrdma_unmap_one(ia, seg); |
| 1714 | rc = 0; | ||
| 1715 | break; | 1717 | break; |
| 1716 | #endif | 1718 | #endif |
| 1717 | 1719 | ||
