mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 09:43:59 +08:00
cifs: Add smb2_send_recv
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> Reviewed-by: Aurelien Aptel <aaptel@suse.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
5b7d27967d
commit
83b7739180
@ -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 *pses,
|
||||
struct kvec *pkvec, int nvec_to_send,
|
||||
int *pbuftype, const int flags,
|
||||
struct kvec *presp);
|
||||
extern int SendReceiveBlockingLock(const unsigned int xid,
|
||||
struct cifs_tcon *ptcon,
|
||||
struct smb_hdr *in_buf ,
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user