smb: client: make use of common smbdirect_pdu.h
[ Upstream commit 64946d5be665ddac6b5bf11f5b5ff319aae0f4c6 ] 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> Signed-off-by: Steve French <stfrench@microsoft.com> Stable-dep-of: 43e7e284fc77 ("cifs: Fix the smbd_response slab to allow usercopy") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a9bb4006c4
commit
6509de31b1
+19
-21
@@ -7,6 +7,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/folio_queue.h>
|
#include <linux/folio_queue.h>
|
||||||
|
#include "../common/smbdirect/smbdirect_pdu.h"
|
||||||
#include "smbdirect.h"
|
#include "smbdirect.h"
|
||||||
#include "cifs_debug.h"
|
#include "cifs_debug.h"
|
||||||
#include "cifsproto.h"
|
#include "cifsproto.h"
|
||||||
@@ -50,9 +51,6 @@ struct smb_extract_to_rdma {
|
|||||||
static ssize_t smb_extract_iter_to_rdma(struct iov_iter *iter, size_t len,
|
static ssize_t smb_extract_iter_to_rdma(struct iov_iter *iter, size_t len,
|
||||||
struct smb_extract_to_rdma *rdma);
|
struct smb_extract_to_rdma *rdma);
|
||||||
|
|
||||||
/* SMBD version number */
|
|
||||||
#define SMBD_V1 0x0100
|
|
||||||
|
|
||||||
/* Port numbers for SMBD transport */
|
/* Port numbers for SMBD transport */
|
||||||
#define SMB_PORT 445
|
#define SMB_PORT 445
|
||||||
#define SMBD_PORT 5445
|
#define SMBD_PORT 5445
|
||||||
@@ -299,7 +297,7 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
|
|||||||
mempool_free(request, request->info->request_mempool);
|
mempool_free(request, request->info->request_mempool);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_smbd_negotiate_resp(struct smbd_negotiate_resp *resp)
|
static void dump_smbdirect_negotiate_resp(struct smbdirect_negotiate_resp *resp)
|
||||||
{
|
{
|
||||||
log_rdma_event(INFO, "resp message min_version %u max_version %u negotiated_version %u credits_requested %u credits_granted %u status %u max_readwrite_size %u preferred_send_size %u max_receive_size %u max_fragmented_size %u\n",
|
log_rdma_event(INFO, "resp message min_version %u max_version %u negotiated_version %u credits_requested %u credits_granted %u status %u max_readwrite_size %u preferred_send_size %u max_receive_size %u max_fragmented_size %u\n",
|
||||||
resp->min_version, resp->max_version,
|
resp->min_version, resp->max_version,
|
||||||
@@ -318,15 +316,15 @@ static bool process_negotiation_response(
|
|||||||
struct smbd_response *response, int packet_length)
|
struct smbd_response *response, int packet_length)
|
||||||
{
|
{
|
||||||
struct smbd_connection *info = response->info;
|
struct smbd_connection *info = response->info;
|
||||||
struct smbd_negotiate_resp *packet = smbd_response_payload(response);
|
struct smbdirect_negotiate_resp *packet = smbd_response_payload(response);
|
||||||
|
|
||||||
if (packet_length < sizeof(struct smbd_negotiate_resp)) {
|
if (packet_length < sizeof(struct smbdirect_negotiate_resp)) {
|
||||||
log_rdma_event(ERR,
|
log_rdma_event(ERR,
|
||||||
"error: packet_length=%d\n", packet_length);
|
"error: packet_length=%d\n", packet_length);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (le16_to_cpu(packet->negotiated_version) != SMBD_V1) {
|
if (le16_to_cpu(packet->negotiated_version) != SMBDIRECT_V1) {
|
||||||
log_rdma_event(ERR, "error: negotiated_version=%x\n",
|
log_rdma_event(ERR, "error: negotiated_version=%x\n",
|
||||||
le16_to_cpu(packet->negotiated_version));
|
le16_to_cpu(packet->negotiated_version));
|
||||||
return false;
|
return false;
|
||||||
@@ -448,7 +446,7 @@ static void smbd_post_send_credits(struct work_struct *work)
|
|||||||
/* Called from softirq, when recv is done */
|
/* Called from softirq, when recv is done */
|
||||||
static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||||
{
|
{
|
||||||
struct smbd_data_transfer *data_transfer;
|
struct smbdirect_data_transfer *data_transfer;
|
||||||
struct smbd_response *response =
|
struct smbd_response *response =
|
||||||
container_of(wc->wr_cqe, struct smbd_response, cqe);
|
container_of(wc->wr_cqe, struct smbd_response, cqe);
|
||||||
struct smbd_connection *info = response->info;
|
struct smbd_connection *info = response->info;
|
||||||
@@ -474,7 +472,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
|||||||
switch (response->type) {
|
switch (response->type) {
|
||||||
/* SMBD negotiation response */
|
/* SMBD negotiation response */
|
||||||
case SMBD_NEGOTIATE_RESP:
|
case SMBD_NEGOTIATE_RESP:
|
||||||
dump_smbd_negotiate_resp(smbd_response_payload(response));
|
dump_smbdirect_negotiate_resp(smbd_response_payload(response));
|
||||||
info->full_packet_received = true;
|
info->full_packet_received = true;
|
||||||
info->negotiate_done =
|
info->negotiate_done =
|
||||||
process_negotiation_response(response, wc->byte_len);
|
process_negotiation_response(response, wc->byte_len);
|
||||||
@@ -531,7 +529,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
|||||||
/* Send a KEEP_ALIVE response right away if requested */
|
/* Send a KEEP_ALIVE response right away if requested */
|
||||||
info->keep_alive_requested = KEEP_ALIVE_NONE;
|
info->keep_alive_requested = KEEP_ALIVE_NONE;
|
||||||
if (le16_to_cpu(data_transfer->flags) &
|
if (le16_to_cpu(data_transfer->flags) &
|
||||||
SMB_DIRECT_RESPONSE_REQUESTED) {
|
SMBDIRECT_FLAG_RESPONSE_REQUESTED) {
|
||||||
info->keep_alive_requested = KEEP_ALIVE_PENDING;
|
info->keep_alive_requested = KEEP_ALIVE_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -686,7 +684,7 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
|
|||||||
struct ib_send_wr send_wr;
|
struct ib_send_wr send_wr;
|
||||||
int rc = -ENOMEM;
|
int rc = -ENOMEM;
|
||||||
struct smbd_request *request;
|
struct smbd_request *request;
|
||||||
struct smbd_negotiate_req *packet;
|
struct smbdirect_negotiate_req *packet;
|
||||||
|
|
||||||
request = mempool_alloc(info->request_mempool, GFP_KERNEL);
|
request = mempool_alloc(info->request_mempool, GFP_KERNEL);
|
||||||
if (!request)
|
if (!request)
|
||||||
@@ -695,8 +693,8 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
|
|||||||
request->info = info;
|
request->info = info;
|
||||||
|
|
||||||
packet = smbd_request_payload(request);
|
packet = smbd_request_payload(request);
|
||||||
packet->min_version = cpu_to_le16(SMBD_V1);
|
packet->min_version = cpu_to_le16(SMBDIRECT_V1);
|
||||||
packet->max_version = cpu_to_le16(SMBD_V1);
|
packet->max_version = cpu_to_le16(SMBDIRECT_V1);
|
||||||
packet->reserved = 0;
|
packet->reserved = 0;
|
||||||
packet->credits_requested = cpu_to_le16(info->send_credit_target);
|
packet->credits_requested = cpu_to_le16(info->send_credit_target);
|
||||||
packet->preferred_send_size = cpu_to_le32(info->max_send_size);
|
packet->preferred_send_size = cpu_to_le32(info->max_send_size);
|
||||||
@@ -774,10 +772,10 @@ static int manage_credits_prior_sending(struct smbd_connection *info)
|
|||||||
/*
|
/*
|
||||||
* Check if we need to send a KEEP_ALIVE message
|
* Check if we need to send a KEEP_ALIVE message
|
||||||
* The idle connection timer triggers a KEEP_ALIVE message when expires
|
* The idle connection timer triggers a KEEP_ALIVE message when expires
|
||||||
* SMB_DIRECT_RESPONSE_REQUESTED is set in the message flag to have peer send
|
* SMBDIRECT_FLAG_RESPONSE_REQUESTED is set in the message flag to have peer send
|
||||||
* back a response.
|
* back a response.
|
||||||
* return value:
|
* return value:
|
||||||
* 1 if SMB_DIRECT_RESPONSE_REQUESTED needs to be set
|
* 1 if SMBDIRECT_FLAG_RESPONSE_REQUESTED needs to be set
|
||||||
* 0: otherwise
|
* 0: otherwise
|
||||||
*/
|
*/
|
||||||
static int manage_keep_alive_before_sending(struct smbd_connection *info)
|
static int manage_keep_alive_before_sending(struct smbd_connection *info)
|
||||||
@@ -837,7 +835,7 @@ static int smbd_post_send_iter(struct smbd_connection *info,
|
|||||||
int header_length;
|
int header_length;
|
||||||
int data_length;
|
int data_length;
|
||||||
struct smbd_request *request;
|
struct smbd_request *request;
|
||||||
struct smbd_data_transfer *packet;
|
struct smbdirect_data_transfer *packet;
|
||||||
int new_credits = 0;
|
int new_credits = 0;
|
||||||
|
|
||||||
wait_credit:
|
wait_credit:
|
||||||
@@ -919,7 +917,7 @@ wait_send_queue:
|
|||||||
|
|
||||||
packet->flags = 0;
|
packet->flags = 0;
|
||||||
if (manage_keep_alive_before_sending(info))
|
if (manage_keep_alive_before_sending(info))
|
||||||
packet->flags |= cpu_to_le16(SMB_DIRECT_RESPONSE_REQUESTED);
|
packet->flags |= cpu_to_le16(SMBDIRECT_FLAG_RESPONSE_REQUESTED);
|
||||||
|
|
||||||
packet->reserved = 0;
|
packet->reserved = 0;
|
||||||
if (!data_length)
|
if (!data_length)
|
||||||
@@ -938,10 +936,10 @@ wait_send_queue:
|
|||||||
le32_to_cpu(packet->remaining_data_length));
|
le32_to_cpu(packet->remaining_data_length));
|
||||||
|
|
||||||
/* Map the packet to DMA */
|
/* Map the packet to DMA */
|
||||||
header_length = sizeof(struct smbd_data_transfer);
|
header_length = sizeof(struct smbdirect_data_transfer);
|
||||||
/* If this is a packet without payload, don't send padding */
|
/* If this is a packet without payload, don't send padding */
|
||||||
if (!data_length)
|
if (!data_length)
|
||||||
header_length = offsetof(struct smbd_data_transfer, padding);
|
header_length = offsetof(struct smbdirect_data_transfer, padding);
|
||||||
|
|
||||||
request->sge[0].addr = ib_dma_map_single(info->id->device,
|
request->sge[0].addr = ib_dma_map_single(info->id->device,
|
||||||
(void *)packet,
|
(void *)packet,
|
||||||
@@ -1432,7 +1430,7 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info)
|
|||||||
kmem_cache_create(
|
kmem_cache_create(
|
||||||
name,
|
name,
|
||||||
sizeof(struct smbd_request) +
|
sizeof(struct smbd_request) +
|
||||||
sizeof(struct smbd_data_transfer),
|
sizeof(struct smbdirect_data_transfer),
|
||||||
0, SLAB_HWCACHE_ALIGN, NULL);
|
0, SLAB_HWCACHE_ALIGN, NULL);
|
||||||
if (!info->request_cache)
|
if (!info->request_cache)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -1735,7 +1733,7 @@ static int smbd_recv_buf(struct smbd_connection *info, char *buf,
|
|||||||
unsigned int size)
|
unsigned int size)
|
||||||
{
|
{
|
||||||
struct smbd_response *response;
|
struct smbd_response *response;
|
||||||
struct smbd_data_transfer *data_transfer;
|
struct smbdirect_data_transfer *data_transfer;
|
||||||
int to_copy, to_read, data_read, offset;
|
int to_copy, to_read, data_read, offset;
|
||||||
u32 data_length, remaining_data_length, data_offset;
|
u32 data_length, remaining_data_length, data_offset;
|
||||||
int rc;
|
int rc;
|
||||||
|
|||||||
@@ -177,47 +177,6 @@ enum smbd_message_type {
|
|||||||
SMBD_TRANSFER_DATA,
|
SMBD_TRANSFER_DATA,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SMB_DIRECT_RESPONSE_REQUESTED 0x0001
|
|
||||||
|
|
||||||
/* SMBD negotiation request packet [MS-SMBD] 2.2.1 */
|
|
||||||
struct smbd_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;
|
|
||||||
|
|
||||||
/* SMBD negotiation response packet [MS-SMBD] 2.2.2 */
|
|
||||||
struct smbd_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;
|
|
||||||
|
|
||||||
/* SMBD data transfer packet with payload [MS-SMBD] 2.2.3 */
|
|
||||||
struct smbd_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;
|
|
||||||
|
|
||||||
/* The packet fields for a registered RDMA buffer */
|
/* The packet fields for a registered RDMA buffer */
|
||||||
struct smbd_buffer_descriptor_v1 {
|
struct smbd_buffer_descriptor_v1 {
|
||||||
__le64 offset;
|
__le64 offset;
|
||||||
|
|||||||
Reference in New Issue
Block a user