diff options
author | J. Bruce Fields <bfields@redhat.com> | 2012-03-21 16:42:14 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2012-03-26 11:48:54 -0400 |
commit | 1df00640c9111c881633d9b219f18e66c52599ec (patch) | |
tree | e36d3924d84f47ec93f6650ff1fd5b8ea7d10d24 /net/sunrpc/xprtrdma | |
parent | ab4684d1560f8d77f6ce82bd3f1f82937070d397 (diff) | |
parent | 5a7c9eec9fde1da0e3adf0a4ddb64ff2a324a492 (diff) |
Merge nfs containerization work from Trond's tree
The nfs containerization work is a prerequisite for Jeff Layton's reboot
recovery rework.
Diffstat (limited to 'net/sunrpc/xprtrdma')
-rw-r--r-- | net/sunrpc/xprtrdma/rpc_rdma.c | 9 | ||||
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 17 |
2 files changed, 19 insertions, 7 deletions
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c index 554d0814c875..12de982b7a50 100644 --- a/net/sunrpc/xprtrdma/rpc_rdma.c +++ b/net/sunrpc/xprtrdma/rpc_rdma.c | |||
@@ -771,13 +771,18 @@ repost: | |||
771 | 771 | ||
772 | /* get request object */ | 772 | /* get request object */ |
773 | req = rpcr_to_rdmar(rqst); | 773 | req = rpcr_to_rdmar(rqst); |
774 | if (req->rl_reply) { | ||
775 | spin_unlock(&xprt->transport_lock); | ||
776 | dprintk("RPC: %s: duplicate reply 0x%p to RPC " | ||
777 | "request 0x%p: xid 0x%08x\n", __func__, rep, req, | ||
778 | headerp->rm_xid); | ||
779 | goto repost; | ||
780 | } | ||
774 | 781 | ||
775 | dprintk("RPC: %s: reply 0x%p completes request 0x%p\n" | 782 | dprintk("RPC: %s: reply 0x%p completes request 0x%p\n" |
776 | " RPC request 0x%p xid 0x%08x\n", | 783 | " RPC request 0x%p xid 0x%08x\n", |
777 | __func__, rep, req, rqst, headerp->rm_xid); | 784 | __func__, rep, req, rqst, headerp->rm_xid); |
778 | 785 | ||
779 | BUG_ON(!req || req->rl_reply); | ||
780 | |||
781 | /* from here on, the reply is no longer an orphan */ | 786 | /* from here on, the reply is no longer an orphan */ |
782 | req->rl_reply = rep; | 787 | req->rl_reply = rep; |
783 | 788 | ||
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index 28236bab57f9..745973b729af 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -1490,6 +1490,9 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg, | |||
1490 | u8 key; | 1490 | u8 key; |
1491 | int len, pageoff; | 1491 | int len, pageoff; |
1492 | int i, rc; | 1492 | int i, rc; |
1493 | int seg_len; | ||
1494 | u64 pa; | ||
1495 | int page_no; | ||
1493 | 1496 | ||
1494 | pageoff = offset_in_page(seg1->mr_offset); | 1497 | pageoff = offset_in_page(seg1->mr_offset); |
1495 | seg1->mr_offset -= pageoff; /* start of page */ | 1498 | seg1->mr_offset -= pageoff; /* start of page */ |
@@ -1497,11 +1500,15 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg, | |||
1497 | len = -pageoff; | 1500 | len = -pageoff; |
1498 | if (*nsegs > RPCRDMA_MAX_DATA_SEGS) | 1501 | if (*nsegs > RPCRDMA_MAX_DATA_SEGS) |
1499 | *nsegs = RPCRDMA_MAX_DATA_SEGS; | 1502 | *nsegs = RPCRDMA_MAX_DATA_SEGS; |
1500 | for (i = 0; i < *nsegs;) { | 1503 | for (page_no = i = 0; i < *nsegs;) { |
1501 | rpcrdma_map_one(ia, seg, writing); | 1504 | rpcrdma_map_one(ia, seg, writing); |
1502 | seg1->mr_chunk.rl_mw->r.frmr.fr_pgl->page_list[i] = seg->mr_dma; | 1505 | pa = seg->mr_dma; |
1506 | for (seg_len = seg->mr_len; seg_len > 0; seg_len -= PAGE_SIZE) { | ||
1507 | seg1->mr_chunk.rl_mw->r.frmr.fr_pgl-> | ||
1508 | page_list[page_no++] = pa; | ||
1509 | pa += PAGE_SIZE; | ||
1510 | } | ||
1503 | len += seg->mr_len; | 1511 | len += seg->mr_len; |
1504 | BUG_ON(seg->mr_len > PAGE_SIZE); | ||
1505 | ++seg; | 1512 | ++seg; |
1506 | ++i; | 1513 | ++i; |
1507 | /* Check for holes */ | 1514 | /* Check for holes */ |
@@ -1540,9 +1547,9 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg, | |||
1540 | frmr_wr.send_flags = IB_SEND_SIGNALED; | 1547 | frmr_wr.send_flags = IB_SEND_SIGNALED; |
1541 | frmr_wr.wr.fast_reg.iova_start = seg1->mr_dma; | 1548 | frmr_wr.wr.fast_reg.iova_start = seg1->mr_dma; |
1542 | frmr_wr.wr.fast_reg.page_list = seg1->mr_chunk.rl_mw->r.frmr.fr_pgl; | 1549 | frmr_wr.wr.fast_reg.page_list = seg1->mr_chunk.rl_mw->r.frmr.fr_pgl; |
1543 | frmr_wr.wr.fast_reg.page_list_len = i; | 1550 | frmr_wr.wr.fast_reg.page_list_len = page_no; |
1544 | frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT; | 1551 | frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT; |
1545 | frmr_wr.wr.fast_reg.length = i << PAGE_SHIFT; | 1552 | frmr_wr.wr.fast_reg.length = page_no << PAGE_SHIFT; |
1546 | BUG_ON(frmr_wr.wr.fast_reg.length < len); | 1553 | BUG_ON(frmr_wr.wr.fast_reg.length < len); |
1547 | frmr_wr.wr.fast_reg.access_flags = (writing ? | 1554 | frmr_wr.wr.fast_reg.access_flags = (writing ? |
1548 | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : | 1555 | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : |