Skip to content

Commit 5fc83f4

Browse files
chuckleveramschuma-ntap
authored andcommitted
xprtrdma: Fix panic in rpcrdma_register_frmr_external()
seg1->mr_nsegs is not yet initialized when it is used to unmap segments during an error exit. Use the same unmapping logic for all error exits. "if (frmr_wr.wr.fast_reg.length < len) {" used to be a BUG_ON check. The broken code will never be executed under normal operation. Fixes: c977dea (xprtrdma: Remove BUG_ON() call sites) Signed-off-by: Chuck Lever <[email protected]> Tested-by: Steve Wise <[email protected]> Tested-by: Shirley Ma <[email protected]> Tested-by: Devesh Sharma <[email protected]> Signed-off-by: Anna Schumaker <[email protected]>
1 parent bf858ab commit 5fc83f4

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

net/sunrpc/xprtrdma/verbs.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,9 +1548,8 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg,
15481548
frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
15491549
frmr_wr.wr.fast_reg.length = page_no << PAGE_SHIFT;
15501550
if (frmr_wr.wr.fast_reg.length < len) {
1551-
while (seg1->mr_nsegs--)
1552-
rpcrdma_unmap_one(ia, seg++);
1553-
return -EIO;
1551+
rc = -EIO;
1552+
goto out_err;
15541553
}
15551554

15561555
/* Bump the key */
@@ -1568,15 +1567,18 @@ rpcrdma_register_frmr_external(struct rpcrdma_mr_seg *seg,
15681567
if (rc) {
15691568
dprintk("RPC: %s: failed ib_post_send for register,"
15701569
" status %i\n", __func__, rc);
1571-
while (i--)
1572-
rpcrdma_unmap_one(ia, --seg);
1570+
goto out_err;
15731571
} else {
15741572
seg1->mr_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
15751573
seg1->mr_base = seg1->mr_dma + pageoff;
15761574
seg1->mr_nsegs = i;
15771575
seg1->mr_len = len;
15781576
}
15791577
*nsegs = i;
1578+
return 0;
1579+
out_err:
1580+
while (i--)
1581+
rpcrdma_unmap_one(ia, --seg);
15801582
return rc;
15811583
}
15821584

0 commit comments

Comments
 (0)