static void put_recvmsg(struct smb_direct_transport *t,
                        struct smb_direct_recvmsg *recvmsg)
 {
-       ib_dma_unmap_single(t->cm_id->device, recvmsg->sge.addr,
-                           recvmsg->sge.length, DMA_FROM_DEVICE);
+       if (likely(recvmsg->sge.length != 0)) {
+               ib_dma_unmap_single(t->cm_id->device,
+                                   recvmsg->sge.addr,
+                                   recvmsg->sge.length,
+                                   DMA_FROM_DEVICE);
+               recvmsg->sge.length = 0;
+       }
 
        spin_lock(&t->recvmsg_queue_lock);
        list_add(&recvmsg->list, &t->recvmsg_queue);
                ib_dma_unmap_single(t->cm_id->device,
                                    recvmsg->sge.addr, recvmsg->sge.length,
                                    DMA_FROM_DEVICE);
+               recvmsg->sge.length = 0;
                smb_direct_disconnect_rdma_connection(t);
                return ret;
        }
                if (!recvmsg)
                        goto err;
                recvmsg->transport = t;
+               recvmsg->sge.length = 0;
                list_add(&recvmsg->list, &t->recvmsg_queue);
        }
        t->count_avail_recvmsg = t->recv_credit_max;