if (rc) {
                ib_dma_unmap_single(sc->ib.dev, response->sge.addr,
                                    response->sge.length, DMA_FROM_DEVICE);
+               response->sge.length = 0;
                smbd_disconnect_rdma_connection(info);
                log_rdma_recv(ERR, "ib_post_recv failed rc=%d\n", rc);
        }
        struct smbdirect_socket *sc = &info->socket;
        unsigned long flags;
 
-       ib_dma_unmap_single(sc->ib.dev, response->sge.addr,
-               response->sge.length, DMA_FROM_DEVICE);
+       if (likely(response->sge.length != 0)) {
+               ib_dma_unmap_single(sc->ib.dev,
+                                   response->sge.addr,
+                                   response->sge.length,
+                                   DMA_FROM_DEVICE);
+               response->sge.length = 0;
+       }
 
        spin_lock_irqsave(&info->receive_queue_lock, flags);
        list_add_tail(&response->list, &info->receive_queue);
                        goto allocate_failed;
 
                response->info = info;
+               response->sge.length = 0;
                list_add_tail(&response->list, &info->receive_queue);
                info->count_receive_queue++;
        }