|
@@ -177,15 +177,22 @@ frwr_op_recover_mr(struct rpcrdma_mw *mw)
|
|
|
|
|
|
rc = __frwr_reset_mr(ia, mw);
|
|
|
ib_dma_unmap_sg(ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir);
|
|
|
- if (rc) {
|
|
|
- pr_err("rpcrdma: FRMR reset status %d, %p orphaned\n",
|
|
|
- rc, mw);
|
|
|
- r_xprt->rx_stats.mrs_orphaned++;
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (rc)
|
|
|
+ goto out_release;
|
|
|
|
|
|
rpcrdma_put_mw(r_xprt, mw);
|
|
|
r_xprt->rx_stats.mrs_recovered++;
|
|
|
+ return;
|
|
|
+
|
|
|
+out_release:
|
|
|
+ pr_err("rpcrdma: FRMR reset failed %d, %p release\n", rc, mw);
|
|
|
+ r_xprt->rx_stats.mrs_orphaned++;
|
|
|
+
|
|
|
+ spin_lock(&r_xprt->rx_buf.rb_mwlock);
|
|
|
+ list_del(&mw->mw_all);
|
|
|
+ spin_unlock(&r_xprt->rx_buf.rb_mwlock);
|
|
|
+
|
|
|
+ frwr_op_release_mr(mw);
|
|
|
}
|
|
|
|
|
|
static int
|