[01/19] cifs: Add smb2_send_recv

Message ID 20171109011433.14468-2-lsahlber@redhat.com
State New
Headers show
Series
  • Remove rfc1002 header from smb2 request structs
Related show

Commit Message

Leif Sahlberg Nov. 9, 2017, 1:14 a.m.
This function is similar to SendReceive2 except it does not expect
a 4 byte rfc1002 length header in the first io vector.

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
---
 fs/cifs/cifsproto.h |  4 ++++
 fs/cifs/transport.c | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

Comments

Aurélien Aptel Nov. 9, 2017, 2:09 p.m. | #1
Reviewed-by: Aurelien Aptel <aaptel@suse.com>
Steve French Nov. 17, 2017, 6:05 p.m. | #2
Note checkpatch warnings (I have fixed some up)

./scripts/checkpatch.pl ~/Downloads/01-19-cifs-Add-smb2_send_recv.patch
ERROR: space prohibited before that ',' (ctx:WxW)
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
                                                        ^

WARNING: function definition argument 'const unsigned int' should also
have an identifier name
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,

WARNING: function definition argument 'struct cifs_ses *' should also
have an identifier name
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,

WARNING: function definition argument 'struct kvec *' should also have
an identifier name
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,

WARNING: function definition argument 'int' should also have an identifier name
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,

WARNING: function definition argument 'int *' should also have an
identifier name
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,

WARNING: function definition argument 'struct kvec *' should also have
an identifier name
#31: FILE: fs/cifs/cifsproto.h:109:
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,

On Wed, Nov 8, 2017 at 7:14 PM, Ronnie Sahlberg <lsahlber@redhat.com> wrote:
> This function is similar to SendReceive2 except it does not expect
> a 4 byte rfc1002 length header in the first io vector.
>
> Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
> ---
>  fs/cifs/cifsproto.h |  4 ++++
>  fs/cifs/transport.c | 38 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 42 insertions(+)
>
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 4143c9dec463..6d86cd120349 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -106,6 +106,10 @@ extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *,
>                         struct kvec *, int /* nvec to send */,
>                         int * /* type of buf returned */, const int flags,
>                         struct kvec * /* resp vec */);
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
> +                         struct kvec *, int /* nvec to send */,
> +                         int * /* type of buf returned */, const int flags,
> +                         struct kvec * /* resp vec */);
>  extern int SendReceiveBlockingLock(const unsigned int xid,
>                         struct cifs_tcon *ptcon,
>                         struct smb_hdr *in_buf ,
> diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
> index 7efbab013957..e678307bb7a0 100644
> --- a/fs/cifs/transport.c
> +++ b/fs/cifs/transport.c
> @@ -827,6 +827,44 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
>         return rc;
>  }
>
> +/* Like SendReceive2 but iov[0] does not contain an rfc1002 header */
> +int
> +smb2_send_recv(const unsigned int xid, struct cifs_ses *ses,
> +              struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
> +              const int flags, struct kvec *resp_iov)
> +{
> +       struct smb_rqst rqst;
> +       struct kvec *new_iov;
> +       int rc;
> +       int i;
> +       __u32 count;
> +       __be32 rfc1002_marker;
> +
> +       new_iov = kmalloc(sizeof(struct kvec) * (n_vec + 1), GFP_KERNEL);
> +       if (!new_iov)
> +               return -ENOMEM;
> +
> +       /* 1st iov is an RFC1002 Session Message length */
> +       memcpy(new_iov + 1, iov, (sizeof(struct kvec) * n_vec));
> +
> +       count = 0;
> +       for (i = 1; i < n_vec + 1; i++)
> +               count += new_iov[i].iov_len;
> +
> +       rfc1002_marker = cpu_to_be32(count);
> +
> +       new_iov[0].iov_base = &rfc1002_marker;
> +       new_iov[0].iov_len = 4;
> +
> +       memset(&rqst, 0, sizeof(struct smb_rqst));
> +       rqst.rq_iov = new_iov;
> +       rqst.rq_nvec = n_vec + 1;
> +
> +       rc = cifs_send_recv(xid, ses, &rqst, resp_buf_type, flags, resp_iov);
> +       kfree(new_iov);
> +       return rc;
> +}
> +
>  int
>  SendReceive(const unsigned int xid, struct cifs_ses *ses,
>             struct smb_hdr *in_buf, struct smb_hdr *out_buf,
> --
> 2.13.3
>
Steve French Nov. 17, 2017, 6:11 p.m. | #3
I fixed up checkpatch warnings in the first patch - and after
reviewing merged the first three (so far)

On Fri, Nov 17, 2017 at 12:05 PM, Steve French <smfrench@gmail.com> wrote:
> Note checkpatch warnings (I have fixed some up)
>
> ./scripts/checkpatch.pl ~/Downloads/01-19-cifs-Add-smb2_send_recv.patch
> ERROR: space prohibited before that ',' (ctx:WxW)
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>                                                         ^
>
> WARNING: function definition argument 'const unsigned int' should also
> have an identifier name
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>
> WARNING: function definition argument 'struct cifs_ses *' should also
> have an identifier name
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>
> WARNING: function definition argument 'struct kvec *' should also have
> an identifier name
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>
> WARNING: function definition argument 'int' should also have an identifier name
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>
> WARNING: function definition argument 'int *' should also have an
> identifier name
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>
> WARNING: function definition argument 'struct kvec *' should also have
> an identifier name
> #31: FILE: fs/cifs/cifsproto.h:109:
> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>
> On Wed, Nov 8, 2017 at 7:14 PM, Ronnie Sahlberg <lsahlber@redhat.com> wrote:
>> This function is similar to SendReceive2 except it does not expect
>> a 4 byte rfc1002 length header in the first io vector.
>>
>> Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
>> ---
>>  fs/cifs/cifsproto.h |  4 ++++
>>  fs/cifs/transport.c | 38 ++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 42 insertions(+)
>>
>> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
>> index 4143c9dec463..6d86cd120349 100644
>> --- a/fs/cifs/cifsproto.h
>> +++ b/fs/cifs/cifsproto.h
>> @@ -106,6 +106,10 @@ extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *,
>>                         struct kvec *, int /* nvec to send */,
>>                         int * /* type of buf returned */, const int flags,
>>                         struct kvec * /* resp vec */);
>> +extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
>> +                         struct kvec *, int /* nvec to send */,
>> +                         int * /* type of buf returned */, const int flags,
>> +                         struct kvec * /* resp vec */);
>>  extern int SendReceiveBlockingLock(const unsigned int xid,
>>                         struct cifs_tcon *ptcon,
>>                         struct smb_hdr *in_buf ,
>> diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
>> index 7efbab013957..e678307bb7a0 100644
>> --- a/fs/cifs/transport.c
>> +++ b/fs/cifs/transport.c
>> @@ -827,6 +827,44 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
>>         return rc;
>>  }
>>
>> +/* Like SendReceive2 but iov[0] does not contain an rfc1002 header */
>> +int
>> +smb2_send_recv(const unsigned int xid, struct cifs_ses *ses,
>> +              struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
>> +              const int flags, struct kvec *resp_iov)
>> +{
>> +       struct smb_rqst rqst;
>> +       struct kvec *new_iov;
>> +       int rc;
>> +       int i;
>> +       __u32 count;
>> +       __be32 rfc1002_marker;
>> +
>> +       new_iov = kmalloc(sizeof(struct kvec) * (n_vec + 1), GFP_KERNEL);
>> +       if (!new_iov)
>> +               return -ENOMEM;
>> +
>> +       /* 1st iov is an RFC1002 Session Message length */
>> +       memcpy(new_iov + 1, iov, (sizeof(struct kvec) * n_vec));
>> +
>> +       count = 0;
>> +       for (i = 1; i < n_vec + 1; i++)
>> +               count += new_iov[i].iov_len;
>> +
>> +       rfc1002_marker = cpu_to_be32(count);
>> +
>> +       new_iov[0].iov_base = &rfc1002_marker;
>> +       new_iov[0].iov_len = 4;
>> +
>> +       memset(&rqst, 0, sizeof(struct smb_rqst));
>> +       rqst.rq_iov = new_iov;
>> +       rqst.rq_nvec = n_vec + 1;
>> +
>> +       rc = cifs_send_recv(xid, ses, &rqst, resp_buf_type, flags, resp_iov);
>> +       kfree(new_iov);
>> +       return rc;
>> +}
>> +
>>  int
>>  SendReceive(const unsigned int xid, struct cifs_ses *ses,
>>             struct smb_hdr *in_buf, struct smb_hdr *out_buf,
>> --
>> 2.13.3
>>
>
>
>
> --
> Thanks,
>
> Steve

Patch

diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 4143c9dec463..6d86cd120349 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -106,6 +106,10 @@  extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *,
 			struct kvec *, int /* nvec to send */,
 			int * /* type of buf returned */, const int flags,
 			struct kvec * /* resp vec */);
+extern int smb2_send_recv(const unsigned int /* xid */ , struct cifs_ses *,
+			  struct kvec *, int /* nvec to send */,
+			  int * /* type of buf returned */, const int flags,
+			  struct kvec * /* resp vec */);
 extern int SendReceiveBlockingLock(const unsigned int xid,
 			struct cifs_tcon *ptcon,
 			struct smb_hdr *in_buf ,
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index 7efbab013957..e678307bb7a0 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -827,6 +827,44 @@  SendReceive2(const unsigned int xid, struct cifs_ses *ses,
 	return rc;
 }
 
+/* Like SendReceive2 but iov[0] does not contain an rfc1002 header */
+int
+smb2_send_recv(const unsigned int xid, struct cifs_ses *ses,
+	       struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
+	       const int flags, struct kvec *resp_iov)
+{
+	struct smb_rqst rqst;
+	struct kvec *new_iov;
+	int rc;
+	int i;
+	__u32 count;
+	__be32 rfc1002_marker;
+
+	new_iov = kmalloc(sizeof(struct kvec) * (n_vec + 1), GFP_KERNEL);
+	if (!new_iov)
+		return -ENOMEM;
+
+	/* 1st iov is an RFC1002 Session Message length */
+	memcpy(new_iov + 1, iov, (sizeof(struct kvec) * n_vec));
+
+	count = 0;
+	for (i = 1; i < n_vec + 1; i++)
+		count += new_iov[i].iov_len;
+
+	rfc1002_marker = cpu_to_be32(count);
+
+	new_iov[0].iov_base = &rfc1002_marker;
+	new_iov[0].iov_len = 4;
+
+	memset(&rqst, 0, sizeof(struct smb_rqst));
+	rqst.rq_iov = new_iov;
+	rqst.rq_nvec = n_vec + 1;
+
+	rc = cifs_send_recv(xid, ses, &rqst, resp_buf_type, flags, resp_iov);
+	kfree(new_iov);
+	return rc;
+}
+
 int
 SendReceive(const unsigned int xid, struct cifs_ses *ses,
 	    struct smb_hdr *in_buf, struct smb_hdr *out_buf,