* Unlike a normal reconnection, a fresh PD and a new set
  * of MRs and buffers is needed.
  */
-static int
-rpcrdma_ep_recreate_xprt(struct rpcrdma_xprt *r_xprt,
-                        struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
+static int rpcrdma_ep_recreate_xprt(struct rpcrdma_xprt *r_xprt,
+                                   struct ib_qp_init_attr *qp_init_attr)
 {
+       struct rpcrdma_ia *ia = &r_xprt->rx_ia;
        int rc, err;
 
        trace_xprtrdma_reinsert(r_xprt);
        }
 
        rc = -ENETUNREACH;
-       err = rdma_create_qp(ia->ri_id, ia->ri_pd, &ep->rep_attr);
+       err = rdma_create_qp(ia->ri_id, ia->ri_pd, qp_init_attr);
        if (err) {
                pr_err("rpcrdma: rdma_create_qp returned %d\n", err);
                goto out3;
        return rc;
 }
 
-static int
-rpcrdma_ep_reconnect(struct rpcrdma_xprt *r_xprt, struct rpcrdma_ep *ep,
-                    struct rpcrdma_ia *ia)
+static int rpcrdma_ep_reconnect(struct rpcrdma_xprt *r_xprt,
+                               struct ib_qp_init_attr *qp_init_attr)
 {
+       struct rpcrdma_ia *ia = &r_xprt->rx_ia;
        struct rdma_cm_id *id, *old;
        int err, rc;
 
        trace_xprtrdma_reconnect(r_xprt);
 
-       rpcrdma_ep_disconnect(ep, ia);
+       rpcrdma_ep_disconnect(&r_xprt->rx_ep, ia);
 
        rc = -EHOSTUNREACH;
        id = rpcrdma_create_id(r_xprt, ia);
                goto out_destroy;
        }
 
-       err = rdma_create_qp(id, ia->ri_pd, &ep->rep_attr);
+       err = rdma_create_qp(id, ia->ri_pd, qp_init_attr);
        if (err)
                goto out_destroy;
 
        struct rpcrdma_xprt *r_xprt = container_of(ia, struct rpcrdma_xprt,
                                                   rx_ia);
        struct rpc_xprt *xprt = &r_xprt->rx_xprt;
+       struct ib_qp_init_attr qp_init_attr;
        int rc;
 
 retry:
+       memcpy(&qp_init_attr, &ep->rep_attr, sizeof(qp_init_attr));
        switch (ep->rep_connected) {
        case 0:
                dprintk("RPC:       %s: connecting...\n", __func__);
-               rc = rdma_create_qp(ia->ri_id, ia->ri_pd, &ep->rep_attr);
+               rc = rdma_create_qp(ia->ri_id, ia->ri_pd, &qp_init_attr);
                if (rc) {
                        rc = -ENETUNREACH;
                        goto out_noupdate;
                }
                break;
        case -ENODEV:
-               rc = rpcrdma_ep_recreate_xprt(r_xprt, ep, ia);
+               rc = rpcrdma_ep_recreate_xprt(r_xprt, &qp_init_attr);
                if (rc)
                        goto out_noupdate;
                break;
        default:
-               rc = rpcrdma_ep_reconnect(r_xprt, ep, ia);
+               rc = rpcrdma_ep_reconnect(r_xprt, &qp_init_attr);
                if (rc)
                        goto out;
        }