summaryrefslogtreecommitdiff
path: root/fs/cifs/smbdirect.h
diff options
context:
space:
mode:
authorLong Li <longli@microsoft.com>2017-11-22 17:38:40 -0700
committerSteve French <smfrench@gmail.com>2018-01-24 19:49:06 -0600
commitf64b78fd1835d1d764685b0c80c292c5d3daaa07 (patch)
tree2a5dee3f1b6e15f7c5d9e927dfefa223b08f1c6b /fs/cifs/smbdirect.h
parent09902f8dc849fd9d3f1258a5c926c5d5472646b1 (diff)
CIFS: SMBD: Implement function to receive data via RDMA receive
On the receive path, the transport maintains receive buffers and a reassembly queue for transferring payload via RDMA recv. There is data copy in the transport on recv when it copies the payload to upper layer. The transport recognizes the RFC1002 header length use in the SMB upper layer payloads in CIFS. Because this length is mainly used for TCP and not applicable to RDMA, it is handled as a out-of-band information and is never sent over the wire, and the trasnport behaves like TCP to upper layer by processing and exposing the length correctly on data payloads. Signed-off-by: Long Li <longli@microsoft.com> Signed-off-by: Steve French <smfrench@gmail.com> Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com> Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
Diffstat (limited to 'fs/cifs/smbdirect.h')
-rw-r--r--fs/cifs/smbdirect.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/cifs/smbdirect.h b/fs/cifs/smbdirect.h
index f0ce934650c1..c072a68e1321 100644
--- a/fs/cifs/smbdirect.h
+++ b/fs/cifs/smbdirect.h
@@ -91,6 +91,9 @@ struct smbd_connection {
int fragment_reassembly_remaining;
/* Activity accoutning */
+ /* Pending reqeusts issued from upper layer */
+ int smbd_recv_pending;
+ wait_queue_head_t wait_smbd_recv_pending;
atomic_t send_pending;
wait_queue_head_t wait_send_pending;
@@ -252,6 +255,9 @@ int smbd_reconnect(struct TCP_Server_Info *server);
/* Destroy SMBDirect session */
void smbd_destroy(struct smbd_connection *info);
+/* Interface for carrying upper layer I/O through send/recv */
+int smbd_recv(struct smbd_connection *info, struct msghdr *msg);
+
#else
#define cifs_rdma_enabled(server) 0
struct smbd_connection {};
@@ -259,6 +265,7 @@ static inline void *smbd_get_connection(
struct TCP_Server_Info *server, struct sockaddr *dstaddr) {return NULL;}
static inline int smbd_reconnect(struct TCP_Server_Info *server) {return -1; }
static inline void smbd_destroy(struct smbd_connection *info) {}
+static inline int smbd_recv(struct smbd_connection *info, struct msghdr *msg) {return -1; }
#endif
#endif