static void frwr_mr_unmap(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr *mr)
 {
-       if (mr->mr_dir != DMA_NONE) {
+       if (mr->mr_device) {
                trace_xprtrdma_mr_unmap(mr);
-               ib_dma_unmap_sg(r_xprt->rx_ep->re_id->device,
-                               mr->mr_sg, mr->mr_nents, mr->mr_dir);
-               mr->mr_dir = DMA_NONE;
+               ib_dma_unmap_sg(mr->mr_device, mr->mr_sg, mr->mr_nents,
+                               mr->mr_dir);
+               mr->mr_device = NULL;
        }
 }
 
 
        mr->mr_xprt = r_xprt;
        mr->frwr.fr_mr = frmr;
-       mr->mr_dir = DMA_NONE;
+       mr->mr_device = NULL;
        INIT_LIST_HEAD(&mr->mr_list);
        init_completion(&mr->frwr.fr_linv_done);
 
                                  mr->mr_dir);
        if (!dma_nents)
                goto out_dmamap_err;
+       mr->mr_device = ep->re_id->device;
 
        ibmr = mr->frwr.fr_mr;
        n = ib_map_mr_sg(ibmr, mr->mr_sg, dma_nents, NULL, PAGE_SIZE);
        return seg;
 
 out_dmamap_err:
-       mr->mr_dir = DMA_NONE;
        trace_xprtrdma_frwr_sgerr(mr, i);
        return ERR_PTR(-EIO);
 
 
 struct rpcrdma_mr {
        struct list_head        mr_list;
        struct rpcrdma_req      *mr_req;
+       struct ib_device        *mr_device;
        struct scatterlist      *mr_sg;
        int                     mr_nents;
        enum dma_data_direction mr_dir;