mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
smb: server: make use of common smbdirect_pdu.h
Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: Long Li <longli@microsoft.com> Cc: Namjae Jeon <linkinjeon@kernel.org> Cc: Hyunchul Lee <hyc.lee@gmail.com> Cc: Meetakshi Setiya <meetakshisetiyaoss@gmail.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
fad988a215
commit
575c1af4dc
|
|
@ -23,12 +23,13 @@
|
|||
#include "connection.h"
|
||||
#include "smb_common.h"
|
||||
#include "../common/smb2status.h"
|
||||
#include "../common/smbdirect/smbdirect_pdu.h"
|
||||
#include "transport_rdma.h"
|
||||
|
||||
#define SMB_DIRECT_PORT_IWARP 5445
|
||||
#define SMB_DIRECT_PORT_INFINIBAND 445
|
||||
|
||||
#define SMB_DIRECT_VERSION_LE cpu_to_le16(0x0100)
|
||||
#define SMB_DIRECT_VERSION_LE cpu_to_le16(SMBDIRECT_V1)
|
||||
|
||||
/* SMB_DIRECT negotiation timeout in seconds */
|
||||
#define SMB_DIRECT_NEGOTIATE_TIMEOUT 120
|
||||
|
|
@ -479,8 +480,8 @@ static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
|
|||
{
|
||||
switch (recvmsg->type) {
|
||||
case SMB_DIRECT_MSG_DATA_TRANSFER: {
|
||||
struct smb_direct_data_transfer *req =
|
||||
(struct smb_direct_data_transfer *)recvmsg->packet;
|
||||
struct smbdirect_data_transfer *req =
|
||||
(struct smbdirect_data_transfer *)recvmsg->packet;
|
||||
struct smb2_hdr *hdr = (struct smb2_hdr *)(recvmsg->packet
|
||||
+ le32_to_cpu(req->data_offset));
|
||||
ksmbd_debug(RDMA,
|
||||
|
|
@ -492,8 +493,8 @@ static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
|
|||
break;
|
||||
}
|
||||
case SMB_DIRECT_MSG_NEGOTIATE_REQ: {
|
||||
struct smb_direct_negotiate_req *req =
|
||||
(struct smb_direct_negotiate_req *)recvmsg->packet;
|
||||
struct smbdirect_negotiate_req *req =
|
||||
(struct smbdirect_negotiate_req *)recvmsg->packet;
|
||||
ksmbd_debug(RDMA,
|
||||
"MinVersion: %u, MaxVersion: %u, CreditRequested: %u, MaxSendSize: %u, MaxRecvSize: %u, MaxFragmentedSize: %u\n",
|
||||
le16_to_cpu(req->min_version),
|
||||
|
|
@ -547,7 +548,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
|||
|
||||
switch (recvmsg->type) {
|
||||
case SMB_DIRECT_MSG_NEGOTIATE_REQ:
|
||||
if (wc->byte_len < sizeof(struct smb_direct_negotiate_req)) {
|
||||
if (wc->byte_len < sizeof(struct smbdirect_negotiate_req)) {
|
||||
put_recvmsg(t, recvmsg);
|
||||
smb_direct_disconnect_rdma_connection(t);
|
||||
return;
|
||||
|
|
@ -559,13 +560,13 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
|||
wake_up_interruptible(&t->wait_status);
|
||||
return;
|
||||
case SMB_DIRECT_MSG_DATA_TRANSFER: {
|
||||
struct smb_direct_data_transfer *data_transfer =
|
||||
(struct smb_direct_data_transfer *)recvmsg->packet;
|
||||
struct smbdirect_data_transfer *data_transfer =
|
||||
(struct smbdirect_data_transfer *)recvmsg->packet;
|
||||
u32 remaining_data_length, data_offset, data_length;
|
||||
int avail_recvmsg_count, receive_credits;
|
||||
|
||||
if (wc->byte_len <
|
||||
offsetof(struct smb_direct_data_transfer, padding)) {
|
||||
offsetof(struct smbdirect_data_transfer, padding)) {
|
||||
put_recvmsg(t, recvmsg);
|
||||
smb_direct_disconnect_rdma_connection(t);
|
||||
return;
|
||||
|
|
@ -615,7 +616,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
|||
&t->send_credits);
|
||||
|
||||
if (le16_to_cpu(data_transfer->flags) &
|
||||
SMB_DIRECT_RESPONSE_REQUESTED)
|
||||
SMBDIRECT_FLAG_RESPONSE_REQUESTED)
|
||||
queue_work(smb_direct_wq, &t->send_immediate_work);
|
||||
|
||||
if (atomic_read(&t->send_credits) > 0)
|
||||
|
|
@ -680,7 +681,7 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,
|
|||
unsigned int size, int unused)
|
||||
{
|
||||
struct smb_direct_recvmsg *recvmsg;
|
||||
struct smb_direct_data_transfer *data_transfer;
|
||||
struct smbdirect_data_transfer *data_transfer;
|
||||
int to_copy, to_read, data_read, offset;
|
||||
u32 data_length, remaining_data_length, data_offset;
|
||||
int rc;
|
||||
|
|
@ -1016,7 +1017,7 @@ static int smb_direct_create_header(struct smb_direct_transport *t,
|
|||
struct smb_direct_sendmsg **sendmsg_out)
|
||||
{
|
||||
struct smb_direct_sendmsg *sendmsg;
|
||||
struct smb_direct_data_transfer *packet;
|
||||
struct smbdirect_data_transfer *packet;
|
||||
int header_length;
|
||||
int ret;
|
||||
|
||||
|
|
@ -1025,7 +1026,7 @@ static int smb_direct_create_header(struct smb_direct_transport *t,
|
|||
return PTR_ERR(sendmsg);
|
||||
|
||||
/* Fill in the packet header */
|
||||
packet = (struct smb_direct_data_transfer *)sendmsg->packet;
|
||||
packet = (struct smbdirect_data_transfer *)sendmsg->packet;
|
||||
packet->credits_requested = cpu_to_le16(t->send_credit_target);
|
||||
packet->credits_granted = cpu_to_le16(manage_credits_prior_sending(t));
|
||||
|
||||
|
|
@ -1048,11 +1049,11 @@ static int smb_direct_create_header(struct smb_direct_transport *t,
|
|||
le32_to_cpu(packet->remaining_data_length));
|
||||
|
||||
/* Map the packet to DMA */
|
||||
header_length = sizeof(struct smb_direct_data_transfer);
|
||||
header_length = sizeof(struct smbdirect_data_transfer);
|
||||
/* If this is a packet without payload, don't send padding */
|
||||
if (!size)
|
||||
header_length =
|
||||
offsetof(struct smb_direct_data_transfer, padding);
|
||||
offsetof(struct smbdirect_data_transfer, padding);
|
||||
|
||||
sendmsg->sge[0].addr = ib_dma_map_single(t->cm_id->device,
|
||||
(void *)packet,
|
||||
|
|
@ -1228,7 +1229,7 @@ static int smb_direct_writev(struct ksmbd_transport *t,
|
|||
size_t iov_idx;
|
||||
size_t iov_ofs;
|
||||
size_t max_iov_size = st->max_send_size -
|
||||
sizeof(struct smb_direct_data_transfer);
|
||||
sizeof(struct smbdirect_data_transfer);
|
||||
int ret;
|
||||
struct smb_direct_send_ctx send_ctx;
|
||||
int error = 0;
|
||||
|
|
@ -1627,18 +1628,18 @@ static int smb_direct_send_negotiate_response(struct smb_direct_transport *t,
|
|||
int failed)
|
||||
{
|
||||
struct smb_direct_sendmsg *sendmsg;
|
||||
struct smb_direct_negotiate_resp *resp;
|
||||
struct smbdirect_negotiate_resp *resp;
|
||||
int ret;
|
||||
|
||||
sendmsg = smb_direct_alloc_sendmsg(t);
|
||||
if (IS_ERR(sendmsg))
|
||||
return -ENOMEM;
|
||||
|
||||
resp = (struct smb_direct_negotiate_resp *)sendmsg->packet;
|
||||
resp = (struct smbdirect_negotiate_resp *)sendmsg->packet;
|
||||
if (failed) {
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
resp->min_version = cpu_to_le16(0x0100);
|
||||
resp->max_version = cpu_to_le16(0x0100);
|
||||
resp->min_version = SMB_DIRECT_VERSION_LE;
|
||||
resp->max_version = SMB_DIRECT_VERSION_LE;
|
||||
resp->status = STATUS_NOT_SUPPORTED;
|
||||
} else {
|
||||
resp->status = STATUS_SUCCESS;
|
||||
|
|
@ -1875,7 +1876,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
|
|||
snprintf(name, sizeof(name), "smb_direct_rqst_pool_%p", t);
|
||||
t->sendmsg_cache = kmem_cache_create(name,
|
||||
sizeof(struct smb_direct_sendmsg) +
|
||||
sizeof(struct smb_direct_negotiate_resp),
|
||||
sizeof(struct smbdirect_negotiate_resp),
|
||||
0, SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!t->sendmsg_cache)
|
||||
return -ENOMEM;
|
||||
|
|
@ -2008,7 +2009,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
|
|||
{
|
||||
struct smb_direct_transport *st = smb_trans_direct_transfort(t);
|
||||
struct smb_direct_recvmsg *recvmsg;
|
||||
struct smb_direct_negotiate_req *req;
|
||||
struct smbdirect_negotiate_req *req;
|
||||
int ret;
|
||||
|
||||
ksmbd_debug(RDMA, "Waiting for SMB_DIRECT negotiate request\n");
|
||||
|
|
@ -2027,7 +2028,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
|
|||
if (ret == -ECONNABORTED)
|
||||
goto out;
|
||||
|
||||
req = (struct smb_direct_negotiate_req *)recvmsg->packet;
|
||||
req = (struct smbdirect_negotiate_req *)recvmsg->packet;
|
||||
st->max_recv_size = min_t(int, st->max_recv_size,
|
||||
le32_to_cpu(req->preferred_send_size));
|
||||
st->max_send_size = min_t(int, st->max_send_size,
|
||||
|
|
|
|||
|
|
@ -11,47 +11,6 @@
|
|||
#define SMBD_MIN_IOSIZE (512 * 1024)
|
||||
#define SMBD_MAX_IOSIZE (16 * 1024 * 1024)
|
||||
|
||||
/* SMB DIRECT negotiation request packet [MS-SMBD] 2.2.1 */
|
||||
struct smb_direct_negotiate_req {
|
||||
__le16 min_version;
|
||||
__le16 max_version;
|
||||
__le16 reserved;
|
||||
__le16 credits_requested;
|
||||
__le32 preferred_send_size;
|
||||
__le32 max_receive_size;
|
||||
__le32 max_fragmented_size;
|
||||
} __packed;
|
||||
|
||||
/* SMB DIRECT negotiation response packet [MS-SMBD] 2.2.2 */
|
||||
struct smb_direct_negotiate_resp {
|
||||
__le16 min_version;
|
||||
__le16 max_version;
|
||||
__le16 negotiated_version;
|
||||
__le16 reserved;
|
||||
__le16 credits_requested;
|
||||
__le16 credits_granted;
|
||||
__le32 status;
|
||||
__le32 max_readwrite_size;
|
||||
__le32 preferred_send_size;
|
||||
__le32 max_receive_size;
|
||||
__le32 max_fragmented_size;
|
||||
} __packed;
|
||||
|
||||
#define SMB_DIRECT_RESPONSE_REQUESTED 0x0001
|
||||
|
||||
/* SMB DIRECT data transfer packet with payload [MS-SMBD] 2.2.3 */
|
||||
struct smb_direct_data_transfer {
|
||||
__le16 credits_requested;
|
||||
__le16 credits_granted;
|
||||
__le16 flags;
|
||||
__le16 reserved;
|
||||
__le32 remaining_data_length;
|
||||
__le32 data_offset;
|
||||
__le32 data_length;
|
||||
__le32 padding;
|
||||
__u8 buffer[];
|
||||
} __packed;
|
||||
|
||||
#ifdef CONFIG_SMB_SERVER_SMBDIRECT
|
||||
int ksmbd_rdma_init(void);
|
||||
void ksmbd_rdma_stop_listening(void);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user