]> git.hungrycats.org Git - linux/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:42:30 +0000 (14:42 +0200)
[ Upstream commit 1807abcf8778bcbbf584fe54da9ccbe9029c49bb ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/ksmbd/connection.c
fs/ksmbd/connection.h
fs/ksmbd/smb2pdu.c
fs/ksmbd/transport_rdma.c

index bc6050b67256d6490697192d4adc9ca28af1dc00..e8f476c5f18903b2e9816b3fdf29cc0dec320f50 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 7a59aacb5daa5879608dd55955877cf85043ee47..98c1cbe45ec970b9a216e838cce7cfa207da8820 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 5df87fe18905aee46014d58c6cf771a8a41a1960..8f86b8d6765f3c5f7707ad349ffd4d8890455d8c 100644 (file)
@@ -6132,7 +6132,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;
@@ -6158,7 +6157,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;
 }
 
@@ -6166,14 +6166,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;
 
@@ -6217,7 +6215,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;
@@ -6395,21 +6392,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;
@@ -6461,7 +6455,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 3f5d135716945ae9ff190128a123619398cd96b8..479d279ee1465ea918a1226529ce3be4bf56cdbd 100644 (file)
@@ -1352,14 +1352,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)
@@ -1424,22 +1428,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)