Skip to content

Commit 1807abc

Browse files
hcleesmfrench
authored andcommitted
ksmbd: smbd: change prototypes of RDMA read/write related functions
Change the prototypes of RDMA read/write operations to accept a pointer and length of buffer descriptors. Signed-off-by: Hyunchul Lee <[email protected]> Acked-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 158a66b commit 1807abc

File tree

4 files changed

+51
-49
lines changed

4 files changed

+51
-49
lines changed

fs/ksmbd/connection.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,31 +205,31 @@ int ksmbd_conn_write(struct ksmbd_work *work)
205205
return 0;
206206
}
207207

208-
int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, void *buf,
209-
unsigned int buflen, u32 remote_key, u64 remote_offset,
210-
u32 remote_len)
208+
int ksmbd_conn_rdma_read(struct ksmbd_conn *conn,
209+
void *buf, unsigned int buflen,
210+
struct smb2_buffer_desc_v1 *desc,
211+
unsigned int desc_len)
211212
{
212213
int ret = -EINVAL;
213214

214215
if (conn->transport->ops->rdma_read)
215216
ret = conn->transport->ops->rdma_read(conn->transport,
216217
buf, buflen,
217-
remote_key, remote_offset,
218-
remote_len);
218+
desc, desc_len);
219219
return ret;
220220
}
221221

222-
int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, void *buf,
223-
unsigned int buflen, u32 remote_key,
224-
u64 remote_offset, u32 remote_len)
222+
int ksmbd_conn_rdma_write(struct ksmbd_conn *conn,
223+
void *buf, unsigned int buflen,
224+
struct smb2_buffer_desc_v1 *desc,
225+
unsigned int desc_len)
225226
{
226227
int ret = -EINVAL;
227228

228229
if (conn->transport->ops->rdma_write)
229230
ret = conn->transport->ops->rdma_write(conn->transport,
230231
buf, buflen,
231-
remote_key, remote_offset,
232-
remote_len);
232+
desc, desc_len);
233233
return ret;
234234
}
235235

fs/ksmbd/connection.h

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,14 @@ struct ksmbd_transport_ops {
122122
int (*writev)(struct ksmbd_transport *t, struct kvec *iovs, int niov,
123123
int size, bool need_invalidate_rkey,
124124
unsigned int remote_key);
125-
int (*rdma_read)(struct ksmbd_transport *t, void *buf, unsigned int len,
126-
u32 remote_key, u64 remote_offset, u32 remote_len);
127-
int (*rdma_write)(struct ksmbd_transport *t, void *buf,
128-
unsigned int len, u32 remote_key, u64 remote_offset,
129-
u32 remote_len);
125+
int (*rdma_read)(struct ksmbd_transport *t,
126+
void *buf, unsigned int len,
127+
struct smb2_buffer_desc_v1 *desc,
128+
unsigned int desc_len);
129+
int (*rdma_write)(struct ksmbd_transport *t,
130+
void *buf, unsigned int len,
131+
struct smb2_buffer_desc_v1 *desc,
132+
unsigned int desc_len);
130133
};
131134

132135
struct ksmbd_transport {
@@ -148,12 +151,14 @@ struct ksmbd_conn *ksmbd_conn_alloc(void);
148151
void ksmbd_conn_free(struct ksmbd_conn *conn);
149152
bool ksmbd_conn_lookup_dialect(struct ksmbd_conn *c);
150153
int ksmbd_conn_write(struct ksmbd_work *work);
151-
int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, void *buf,
152-
unsigned int buflen, u32 remote_key, u64 remote_offset,
153-
u32 remote_len);
154-
int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, void *buf,
155-
unsigned int buflen, u32 remote_key, u64 remote_offset,
156-
u32 remote_len);
154+
int ksmbd_conn_rdma_read(struct ksmbd_conn *conn,
155+
void *buf, unsigned int buflen,
156+
struct smb2_buffer_desc_v1 *desc,
157+
unsigned int desc_len);
158+
int ksmbd_conn_rdma_write(struct ksmbd_conn *conn,
159+
void *buf, unsigned int buflen,
160+
struct smb2_buffer_desc_v1 *desc,
161+
unsigned int desc_len);
157162
void ksmbd_conn_enqueue_request(struct ksmbd_work *work);
158163
int ksmbd_conn_try_dequeue_request(struct ksmbd_work *work);
159164
void ksmbd_conn_init_server_callbacks(struct ksmbd_conn_ops *ops);

fs/ksmbd/smb2pdu.c

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6116,7 +6116,6 @@ static noinline int smb2_read_pipe(struct ksmbd_work *work)
61166116
static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work,
61176117
struct smb2_buffer_desc_v1 *desc,
61186118
__le32 Channel,
6119-
__le16 ChannelInfoOffset,
61206119
__le16 ChannelInfoLength)
61216120
{
61226121
unsigned int i, ch_count;
@@ -6142,22 +6141,21 @@ static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work,
61426141

61436142
work->need_invalidate_rkey =
61446143
(Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE);
6145-
work->remote_key = le32_to_cpu(desc->token);
6144+
if (Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE)
6145+
work->remote_key = le32_to_cpu(desc->token);
61466146
return 0;
61476147
}
61486148

61496149
static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work,
61506150
struct smb2_read_req *req, void *data_buf,
61516151
size_t length)
61526152
{
6153-
struct smb2_buffer_desc_v1 *desc =
6154-
(struct smb2_buffer_desc_v1 *)&req->Buffer[0];
61556153
int err;
61566154

61576155
err = ksmbd_conn_rdma_write(work->conn, data_buf, length,
6158-
le32_to_cpu(desc->token),
6159-
le64_to_cpu(desc->offset),
6160-
le32_to_cpu(desc->length));
6156+
(struct smb2_buffer_desc_v1 *)
6157+
((char *)req + le16_to_cpu(req->ReadChannelInfoOffset)),
6158+
le16_to_cpu(req->ReadChannelInfoLength));
61616159
if (err)
61626160
return err;
61636161

@@ -6201,7 +6199,6 @@ int smb2_read(struct ksmbd_work *work)
62016199
(struct smb2_buffer_desc_v1 *)
62026200
((char *)req + ch_offset),
62036201
req->Channel,
6204-
req->ReadChannelInfoOffset,
62056202
req->ReadChannelInfoLength);
62066203
if (err)
62076204
goto out;
@@ -6379,21 +6376,18 @@ static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work,
63796376
struct ksmbd_file *fp,
63806377
loff_t offset, size_t length, bool sync)
63816378
{
6382-
struct smb2_buffer_desc_v1 *desc;
63836379
char *data_buf;
63846380
int ret;
63856381
ssize_t nbytes;
63866382

6387-
desc = (struct smb2_buffer_desc_v1 *)&req->Buffer[0];
6388-
63896383
data_buf = kvmalloc(length, GFP_KERNEL | __GFP_ZERO);
63906384
if (!data_buf)
63916385
return -ENOMEM;
63926386

63936387
ret = ksmbd_conn_rdma_read(work->conn, data_buf, length,
6394-
le32_to_cpu(desc->token),
6395-
le64_to_cpu(desc->offset),
6396-
le32_to_cpu(desc->length));
6388+
(struct smb2_buffer_desc_v1 *)
6389+
((char *)req + le16_to_cpu(req->WriteChannelInfoOffset)),
6390+
le16_to_cpu(req->WriteChannelInfoLength));
63976391
if (ret < 0) {
63986392
kvfree(data_buf);
63996393
return ret;
@@ -6445,7 +6439,6 @@ int smb2_write(struct ksmbd_work *work)
64456439
(struct smb2_buffer_desc_v1 *)
64466440
((char *)req + ch_offset),
64476441
req->Channel,
6448-
req->WriteChannelInfoOffset,
64496442
req->WriteChannelInfoLength);
64506443
if (err)
64516444
goto out;

fs/ksmbd/transport_rdma.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,14 +1351,18 @@ static void write_done(struct ib_cq *cq, struct ib_wc *wc)
13511351
read_write_done(cq, wc, DMA_TO_DEVICE);
13521352
}
13531353

1354-
static int smb_direct_rdma_xmit(struct smb_direct_transport *t, void *buf,
1355-
int buf_len, u32 remote_key, u64 remote_offset,
1356-
u32 remote_len, bool is_read)
1354+
static int smb_direct_rdma_xmit(struct smb_direct_transport *t,
1355+
void *buf, int buf_len,
1356+
struct smb2_buffer_desc_v1 *desc,
1357+
unsigned int desc_len,
1358+
bool is_read)
13571359
{
13581360
struct smb_direct_rdma_rw_msg *msg;
13591361
int ret;
13601362
DECLARE_COMPLETION_ONSTACK(completion);
13611363
struct ib_send_wr *first_wr = NULL;
1364+
u32 remote_key = le32_to_cpu(desc[0].token);
1365+
u64 remote_offset = le64_to_cpu(desc[0].offset);
13621366

13631367
ret = wait_for_credits(t, &t->wait_rw_avail_ops, &t->rw_avail_ops);
13641368
if (ret < 0)
@@ -1423,22 +1427,22 @@ static int smb_direct_rdma_xmit(struct smb_direct_transport *t, void *buf,
14231427
return ret;
14241428
}
14251429

1426-
static int smb_direct_rdma_write(struct ksmbd_transport *t, void *buf,
1427-
unsigned int buflen, u32 remote_key,
1428-
u64 remote_offset, u32 remote_len)
1430+
static int smb_direct_rdma_write(struct ksmbd_transport *t,
1431+
void *buf, unsigned int buflen,
1432+
struct smb2_buffer_desc_v1 *desc,
1433+
unsigned int desc_len)
14291434
{
14301435
return smb_direct_rdma_xmit(smb_trans_direct_transfort(t), buf, buflen,
1431-
remote_key, remote_offset,
1432-
remote_len, false);
1436+
desc, desc_len, false);
14331437
}
14341438

1435-
static int smb_direct_rdma_read(struct ksmbd_transport *t, void *buf,
1436-
unsigned int buflen, u32 remote_key,
1437-
u64 remote_offset, u32 remote_len)
1439+
static int smb_direct_rdma_read(struct ksmbd_transport *t,
1440+
void *buf, unsigned int buflen,
1441+
struct smb2_buffer_desc_v1 *desc,
1442+
unsigned int desc_len)
14381443
{
14391444
return smb_direct_rdma_xmit(smb_trans_direct_transfort(t), buf, buflen,
1440-
remote_key, remote_offset,
1441-
remote_len, true);
1445+
desc, desc_len, true);
14421446
}
14431447

14441448
static void smb_direct_disconnect(struct ksmbd_transport *t)

0 commit comments

Comments
 (0)