xprtrdma: Release orphaned MRs immediately
[cascardo/linux.git] / net / sunrpc / xprtrdma / frwr_ops.c
index e77776b..f4c06c8 100644 (file)
@@ -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