ksmbd: smbd: change prototypes of RDMA read/write related functions
authorHyunchul Lee <hyc.lee@gmail.com>
Fri, 29 Apr 2022 23:30:25 +0000 (08:30 +0900)
committerSteve French <stfrench@microsoft.com>
Sat, 21 May 2022 20:01:19 +0000 (15:01 -0500)
Change the prototypes of RDMA read/write
operations to accept a pointer and length
of buffer descriptors.

Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/ksmbd/connection.c
fs/ksmbd/connection.h
fs/ksmbd/smb2pdu.c
fs/ksmbd/transport_rdma.c

index 208d2cf..7db8777 100644 (file)
@@ -205,31 +205,31 @@ int ksmbd_conn_write(struct ksmbd_work *work)
        return 0;
 }
 
-int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, void *buf,
-                        unsigned int buflen, u32 remote_key, u64 remote_offset,
-                        u32 remote_len)
+int ksmbd_conn_rdma_read(struct ksmbd_conn *conn,
+                        void *buf, unsigned int buflen,
+                        struct smb2_buffer_desc_v1 *desc,
+                        unsigned int desc_len)
 {
        int ret = -EINVAL;
 
        if (conn->transport->ops->rdma_read)
                ret = conn->transport->ops->rdma_read(conn->transport,
                                                      buf, buflen,
-                                                     remote_key, remote_offset,
-                                                     remote_len);
+                                                     desc, desc_len);
        return ret;
 }
 
-int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, void *buf,
-                         unsigned int buflen, u32 remote_key,
-                         u64 remote_offset, u32 remote_len)
+int ksmbd_conn_rdma_write(struct ksmbd_conn *conn,
+                         void *buf, unsigned int buflen,
+                         struct smb2_buffer_desc_v1 *desc,
+                         unsigned int desc_len)
 {
        int ret = -EINVAL;
 
        if (conn->transport->ops->rdma_write)
                ret = conn->transport->ops->rdma_write(conn->transport,
                                                       buf, buflen,
-                                                      remote_key, remote_offset,
-                                                      remote_len);
+                                                      desc, desc_len);
        return ret;
 }
 
index 7a59aac..98c1cbe 100644 (file)
@@ -122,11 +122,14 @@ struct ksmbd_transport_ops {
        int (*writev)(struct ksmbd_transport *t, struct kvec *iovs, int niov,
                      int size, bool need_invalidate_rkey,
                      unsigned int remote_key);
-       int (*rdma_read)(struct ksmbd_transport *t, void *buf, unsigned int len,
-                        u32 remote_key, u64 remote_offset, u32 remote_len);
-       int (*rdma_write)(struct ksmbd_transport *t, void *buf,
-                         unsigned int len, u32 remote_key, u64 remote_offset,
-                         u32 remote_len);
+       int (*rdma_read)(struct ksmbd_transport *t,
+                        void *buf, unsigned int len,
+                        struct smb2_buffer_desc_v1 *desc,
+                        unsigned int desc_len);
+       int (*rdma_write)(struct ksmbd_transport *t,
+                         void *buf, unsigned int len,
+                         struct smb2_buffer_desc_v1 *desc,
+                         unsigned int desc_len);
 };
 
 struct ksmbd_transport {
@@ -148,12 +151,14 @@ struct ksmbd_conn *ksmbd_conn_alloc(void);
 void ksmbd_conn_free(struct ksmbd_conn *conn);
 bool ksmbd_conn_lookup_dialect(struct ksmbd_conn *c);
 int ksmbd_conn_write(struct ksmbd_work *work);
-int ksmbd_conn_rdma_read(struct ksmbd_conn *conn, void *buf,
-                        unsigned int buflen, u32 remote_key, u64 remote_offset,
-                        u32 remote_len);
-int ksmbd_conn_rdma_write(struct ksmbd_conn *conn, void *buf,
-                         unsigned int buflen, u32 remote_key, u64 remote_offset,
-                         u32 remote_len);
+int ksmbd_conn_rdma_read(struct ksmbd_conn *conn,
+                        void *buf, unsigned int buflen,
+                        struct smb2_buffer_desc_v1 *desc,
+                        unsigned int desc_len);
+int ksmbd_conn_rdma_write(struct ksmbd_conn *conn,
+                         void *buf, unsigned int buflen,
+                         struct smb2_buffer_desc_v1 *desc,
+                         unsigned int desc_len);
 void ksmbd_conn_enqueue_request(struct ksmbd_work *work);
 int ksmbd_conn_try_dequeue_request(struct ksmbd_work *work);
 void ksmbd_conn_init_server_callbacks(struct ksmbd_conn_ops *ops);
index 2bdfe44..07d8c36 100644 (file)
@@ -6116,7 +6116,6 @@ out:
 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work,
                                        struct smb2_buffer_desc_v1 *desc,
                                        __le32 Channel,
-                                       __le16 ChannelInfoOffset,
                                        __le16 ChannelInfoLength)
 {
        unsigned int i, ch_count;
@@ -6142,7 +6141,8 @@ static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work,
 
        work->need_invalidate_rkey =
                (Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE);
-       work->remote_key = le32_to_cpu(desc->token);
+       if (Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE)
+               work->remote_key = le32_to_cpu(desc->token);
        return 0;
 }
 
@@ -6150,14 +6150,12 @@ static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work,
                                      struct smb2_read_req *req, void *data_buf,
                                      size_t length)
 {
-       struct smb2_buffer_desc_v1 *desc =
-               (struct smb2_buffer_desc_v1 *)&req->Buffer[0];
        int err;
 
        err = ksmbd_conn_rdma_write(work->conn, data_buf, length,
-                                   le32_to_cpu(desc->token),
-                                   le64_to_cpu(desc->offset),
-                                   le32_to_cpu(desc->length));
+                                   (struct smb2_buffer_desc_v1 *)
+                                   ((char *)req + le16_to_cpu(req->ReadChannelInfoOffset)),
+                                   le16_to_cpu(req->ReadChannelInfoLength));
        if (err)
                return err;
 
@@ -6201,7 +6199,6 @@ int smb2_read(struct ksmbd_work *work)
                                                   (struct smb2_buffer_desc_v1 *)
                                                   ((char *)req + ch_offset),
                                                   req->Channel,
-                                                  req->ReadChannelInfoOffset,
                                                   req->ReadChannelInfoLength);
                if (err)
                        goto out;
@@ -6379,21 +6376,18 @@ static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work,
                                       struct ksmbd_file *fp,
                                       loff_t offset, size_t length, bool sync)
 {
-       struct smb2_buffer_desc_v1 *desc;
        char *data_buf;
        int ret;
        ssize_t nbytes;
 
-       desc = (struct smb2_buffer_desc_v1 *)&req->Buffer[0];
-
        data_buf = kvmalloc(length, GFP_KERNEL | __GFP_ZERO);
        if (!data_buf)
                return -ENOMEM;
 
        ret = ksmbd_conn_rdma_read(work->conn, data_buf, length,
-                                  le32_to_cpu(desc->token),
-                                  le64_to_cpu(desc->offset),
-                                  le32_to_cpu(desc->length));
+                                  (struct smb2_buffer_desc_v1 *)
+                                  ((char *)req + le16_to_cpu(req->WriteChannelInfoOffset)),
+                                  le16_to_cpu(req->WriteChannelInfoLength));
        if (ret < 0) {
                kvfree(data_buf);
                return ret;
@@ -6445,7 +6439,6 @@ int smb2_write(struct ksmbd_work *work)
                                                   (struct smb2_buffer_desc_v1 *)
                                                   ((char *)req + ch_offset),
                                                   req->Channel,
-                                                  req->WriteChannelInfoOffset,
                                                   req->WriteChannelInfoLength);
                if (err)
                        goto out;
index e646d79..5e34625 100644 (file)
@@ -1351,14 +1351,18 @@ static void write_done(struct ib_cq *cq, struct ib_wc *wc)
        read_write_done(cq, wc, DMA_TO_DEVICE);
 }
 
-static int smb_direct_rdma_xmit(struct smb_direct_transport *t, void *buf,
-                               int buf_len, u32 remote_key, u64 remote_offset,
-                               u32 remote_len, bool is_read)
+static int smb_direct_rdma_xmit(struct smb_direct_transport *t,
+                               void *buf, int buf_len,
+                               struct smb2_buffer_desc_v1 *desc,
+                               unsigned int desc_len,
+                               bool is_read)
 {
        struct smb_direct_rdma_rw_msg *msg;
        int ret;
        DECLARE_COMPLETION_ONSTACK(completion);
        struct ib_send_wr *first_wr = NULL;
+       u32 remote_key = le32_to_cpu(desc[0].token);
+       u64 remote_offset = le64_to_cpu(desc[0].offset);
 
        ret = wait_for_credits(t, &t->wait_rw_avail_ops, &t->rw_avail_ops);
        if (ret < 0)
@@ -1423,22 +1427,22 @@ err:
        return ret;
 }
 
-static int smb_direct_rdma_write(struct ksmbd_transport *t, void *buf,
-                                unsigned int buflen, u32 remote_key,
-                                u64 remote_offset, u32 remote_len)
+static int smb_direct_rdma_write(struct ksmbd_transport *t,
+                                void *buf, unsigned int buflen,
+                                struct smb2_buffer_desc_v1 *desc,
+                                unsigned int desc_len)
 {
        return smb_direct_rdma_xmit(smb_trans_direct_transfort(t), buf, buflen,
-                                   remote_key, remote_offset,
-                                   remote_len, false);
+                                   desc, desc_len, false);
 }
 
-static int smb_direct_rdma_read(struct ksmbd_transport *t, void *buf,
-                               unsigned int buflen, u32 remote_key,
-                               u64 remote_offset, u32 remote_len)
+static int smb_direct_rdma_read(struct ksmbd_transport *t,
+                               void *buf, unsigned int buflen,
+                               struct smb2_buffer_desc_v1 *desc,
+                               unsigned int desc_len)
 {
        return smb_direct_rdma_xmit(smb_trans_direct_transfort(t), buf, buflen,
-                                   remote_key, remote_offset,
-                                   remote_len, true);
+                                   desc, desc_len, true);
 }
 
 static void smb_direct_disconnect(struct ksmbd_transport *t)