From: Long Li <lon...@microsoft.com>

In preparation for handling sending SMBD requests, add code to handle the send 
completion. In send complemention, the SMBD transport is responsible for 
freeing resources used in send.

Signed-off-by: Long Li <lon...@microsoft.com>
---
 fs/cifs/cifsrdma.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/fs/cifs/cifsrdma.c b/fs/cifs/cifsrdma.c
index 20237b7..ecbc832 100644
--- a/fs/cifs/cifsrdma.c
+++ b/fs/cifs/cifsrdma.c
@@ -197,6 +197,31 @@ cifs_rdma_qp_async_error_upcall(struct ib_event *event, 
void *context)
        }
 }
 
+/* Called in softirq, when a RDMA send is donea */
+static void send_done(struct ib_cq *cq, struct ib_wc *wc)
+{
+       int i;
+       struct cifs_rdma_request *request =
+               container_of(wc->wr_cqe, struct cifs_rdma_request, cqe);
+
+       log_rdma_send("cifs_rdma_request %p completed wc->status=%d\n",
+               request, wc->status);
+
+       if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_SEND) {
+               log_rdma_send("wc->status=%d wc->opcode=%d\n",
+                       wc->status, wc->opcode);
+       }
+
+       for (i=0; i<request->num_sge; i++)
+               ib_dma_unmap_single(request->info->id->device,
+                       request->sge[i].addr,
+                       request->sge[i].length,
+                       DMA_TO_DEVICE);
+
+       kfree(request->sge);
+       mempool_free(request, request->info->request_mempool);
+}
+
 /* Called from softirq, when recv is done */
 static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-- 
2.7.4

Reply via email to