aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/cifsproto.h4
-rw-r--r--fs/cifs/smb2pdu.c137
-rw-r--r--fs/cifs/transport.c17
3 files changed, 116 insertions, 42 deletions
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 4f9218281ff3..03018be17283 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -112,10 +112,6 @@ extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *,
112 struct kvec *, int /* nvec to send */, 112 struct kvec *, int /* nvec to send */,
113 int * /* type of buf returned */, const int flags, 113 int * /* type of buf returned */, const int flags,
114 struct kvec * /* resp vec */); 114 struct kvec * /* resp vec */);
115extern int smb2_send_recv(const unsigned int xid, struct cifs_ses *pses,
116 struct kvec *pkvec, int nvec_to_send,
117 int *pbuftype, const int flags,
118 struct kvec *presp);
119extern int SendReceiveBlockingLock(const unsigned int xid, 115extern int SendReceiveBlockingLock(const unsigned int xid,
120 struct cifs_tcon *ptcon, 116 struct cifs_tcon *ptcon,
121 struct smb_hdr *in_buf , 117 struct smb_hdr *in_buf ,
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index c48608c5a0fb..7daf38ab814a 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -602,6 +602,7 @@ static void assemble_neg_contexts(struct smb2_negotiate_req *req,
602int 602int
603SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) 603SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
604{ 604{
605 struct smb_rqst rqst;
605 struct smb2_negotiate_req *req; 606 struct smb2_negotiate_req *req;
606 struct smb2_negotiate_rsp *rsp; 607 struct smb2_negotiate_rsp *rsp;
607 struct kvec iov[1]; 608 struct kvec iov[1];
@@ -673,7 +674,11 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
673 iov[0].iov_base = (char *)req; 674 iov[0].iov_base = (char *)req;
674 iov[0].iov_len = total_len; 675 iov[0].iov_len = total_len;
675 676
676 rc = smb2_send_recv(xid, ses, iov, 1, &resp_buftype, flags, &rsp_iov); 677 memset(&rqst, 0, sizeof(struct smb_rqst));
678 rqst.rq_iov = iov;
679 rqst.rq_nvec = 1;
680
681 rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
677 cifs_small_buf_release(req); 682 cifs_small_buf_release(req);
678 rsp = (struct smb2_negotiate_rsp *)rsp_iov.iov_base; 683 rsp = (struct smb2_negotiate_rsp *)rsp_iov.iov_base;
679 /* 684 /*
@@ -1028,6 +1033,7 @@ static int
1028SMB2_sess_sendreceive(struct SMB2_sess_data *sess_data) 1033SMB2_sess_sendreceive(struct SMB2_sess_data *sess_data)
1029{ 1034{
1030 int rc; 1035 int rc;
1036 struct smb_rqst rqst;
1031 struct smb2_sess_setup_req *req = sess_data->iov[0].iov_base; 1037 struct smb2_sess_setup_req *req = sess_data->iov[0].iov_base;
1032 struct kvec rsp_iov = { NULL, 0 }; 1038 struct kvec rsp_iov = { NULL, 0 };
1033 1039
@@ -1036,10 +1042,13 @@ SMB2_sess_sendreceive(struct SMB2_sess_data *sess_data)
1036 cpu_to_le16(sizeof(struct smb2_sess_setup_req) - 1 /* pad */); 1042 cpu_to_le16(sizeof(struct smb2_sess_setup_req) - 1 /* pad */);
1037 req->SecurityBufferLength = cpu_to_le16(sess_data->iov[1].iov_len); 1043 req->SecurityBufferLength = cpu_to_le16(sess_data->iov[1].iov_len);
1038 1044
1039 /* BB add code to build os and lm fields */ 1045 memset(&rqst, 0, sizeof(struct smb_rqst));
1046 rqst.rq_iov = sess_data->iov;
1047 rqst.rq_nvec = 2;
1040 1048
1041 rc = smb2_send_recv(sess_data->xid, sess_data->ses, 1049 /* BB add code to build os and lm fields */
1042 sess_data->iov, 2, 1050 rc = cifs_send_recv(sess_data->xid, sess_data->ses,
1051 &rqst,
1043 &sess_data->buf0_type, 1052 &sess_data->buf0_type,
1044 CIFS_LOG_ERROR | CIFS_NEG_OP, &rsp_iov); 1053 CIFS_LOG_ERROR | CIFS_NEG_OP, &rsp_iov);
1045 cifs_small_buf_release(sess_data->iov[0].iov_base); 1054 cifs_small_buf_release(sess_data->iov[0].iov_base);
@@ -1377,6 +1386,7 @@ out:
1377int 1386int
1378SMB2_logoff(const unsigned int xid, struct cifs_ses *ses) 1387SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
1379{ 1388{
1389 struct smb_rqst rqst;
1380 struct smb2_logoff_req *req; /* response is also trivial struct */ 1390 struct smb2_logoff_req *req; /* response is also trivial struct */
1381 int rc = 0; 1391 int rc = 0;
1382 struct TCP_Server_Info *server; 1392 struct TCP_Server_Info *server;
@@ -1414,7 +1424,11 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
1414 iov[0].iov_base = (char *)req; 1424 iov[0].iov_base = (char *)req;
1415 iov[0].iov_len = total_len; 1425 iov[0].iov_len = total_len;
1416 1426
1417 rc = smb2_send_recv(xid, ses, iov, 1, &resp_buf_type, flags, &rsp_iov); 1427 memset(&rqst, 0, sizeof(struct smb_rqst));
1428 rqst.rq_iov = iov;
1429 rqst.rq_nvec = 1;
1430
1431 rc = cifs_send_recv(xid, ses, &rqst, &resp_buf_type, flags, &rsp_iov);
1418 cifs_small_buf_release(req); 1432 cifs_small_buf_release(req);
1419 /* 1433 /*
1420 * No tcon so can't do 1434 * No tcon so can't do
@@ -1444,6 +1458,7 @@ int
1444SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, 1458SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
1445 struct cifs_tcon *tcon, const struct nls_table *cp) 1459 struct cifs_tcon *tcon, const struct nls_table *cp)
1446{ 1460{
1461 struct smb_rqst rqst;
1447 struct smb2_tree_connect_req *req; 1462 struct smb2_tree_connect_req *req;
1448 struct smb2_tree_connect_rsp *rsp = NULL; 1463 struct smb2_tree_connect_rsp *rsp = NULL;
1449 struct kvec iov[2]; 1464 struct kvec iov[2];
@@ -1500,7 +1515,11 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
1500 !smb3_encryption_required(tcon)) 1515 !smb3_encryption_required(tcon))
1501 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED; 1516 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
1502 1517
1503 rc = smb2_send_recv(xid, ses, iov, 2, &resp_buftype, flags, &rsp_iov); 1518 memset(&rqst, 0, sizeof(struct smb_rqst));
1519 rqst.rq_iov = iov;
1520 rqst.rq_nvec = 2;
1521
1522 rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
1504 cifs_small_buf_release(req); 1523 cifs_small_buf_release(req);
1505 rsp = (struct smb2_tree_connect_rsp *)rsp_iov.iov_base; 1524 rsp = (struct smb2_tree_connect_rsp *)rsp_iov.iov_base;
1506 1525
@@ -1564,6 +1583,7 @@ tcon_error_exit:
1564int 1583int
1565SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon) 1584SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon)
1566{ 1585{
1586 struct smb_rqst rqst;
1567 struct smb2_tree_disconnect_req *req; /* response is trivial */ 1587 struct smb2_tree_disconnect_req *req; /* response is trivial */
1568 int rc = 0; 1588 int rc = 0;
1569 struct cifs_ses *ses = tcon->ses; 1589 struct cifs_ses *ses = tcon->ses;
@@ -1594,7 +1614,11 @@ SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon)
1594 iov[0].iov_base = (char *)req; 1614 iov[0].iov_base = (char *)req;
1595 iov[0].iov_len = total_len; 1615 iov[0].iov_len = total_len;
1596 1616
1597 rc = smb2_send_recv(xid, ses, iov, 1, &resp_buf_type, flags, &rsp_iov); 1617 memset(&rqst, 0, sizeof(struct smb_rqst));
1618 rqst.rq_iov = iov;
1619 rqst.rq_nvec = 1;
1620
1621 rc = cifs_send_recv(xid, ses, &rqst, &resp_buf_type, flags, &rsp_iov);
1598 cifs_small_buf_release(req); 1622 cifs_small_buf_release(req);
1599 if (rc) 1623 if (rc)
1600 cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE); 1624 cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE);
@@ -1892,6 +1916,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
1892 __u8 *oplock, struct smb2_file_all_info *buf, 1916 __u8 *oplock, struct smb2_file_all_info *buf,
1893 struct kvec *err_iov, int *buftype) 1917 struct kvec *err_iov, int *buftype)
1894{ 1918{
1919 struct smb_rqst rqst;
1895 struct smb2_create_req *req; 1920 struct smb2_create_req *req;
1896 struct smb2_create_rsp *rsp; 1921 struct smb2_create_rsp *rsp;
1897 struct TCP_Server_Info *server; 1922 struct TCP_Server_Info *server;
@@ -2044,7 +2069,11 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
2044 } 2069 }
2045#endif /* SMB311 */ 2070#endif /* SMB311 */
2046 2071
2047 rc = smb2_send_recv(xid, ses, iov, n_iov, &resp_buftype, flags, 2072 memset(&rqst, 0, sizeof(struct smb_rqst));
2073 rqst.rq_iov = iov;
2074 rqst.rq_nvec = n_iov;
2075
2076 rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags,
2048 &rsp_iov); 2077 &rsp_iov);
2049 cifs_small_buf_release(req); 2078 cifs_small_buf_release(req);
2050 rsp = (struct smb2_create_rsp *)rsp_iov.iov_base; 2079 rsp = (struct smb2_create_rsp *)rsp_iov.iov_base;
@@ -2100,6 +2129,7 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
2100 char *in_data, u32 indatalen, 2129 char *in_data, u32 indatalen,
2101 char **out_data, u32 *plen /* returned data len */) 2130 char **out_data, u32 *plen /* returned data len */)
2102{ 2131{
2132 struct smb_rqst rqst;
2103 struct smb2_ioctl_req *req; 2133 struct smb2_ioctl_req *req;
2104 struct smb2_ioctl_rsp *rsp; 2134 struct smb2_ioctl_rsp *rsp;
2105 struct cifs_ses *ses; 2135 struct cifs_ses *ses;
@@ -2190,7 +2220,11 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
2190 if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO) 2220 if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO)
2191 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED; 2221 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
2192 2222
2193 rc = smb2_send_recv(xid, ses, iov, n_iov, &resp_buftype, flags, 2223 memset(&rqst, 0, sizeof(struct smb_rqst));
2224 rqst.rq_iov = iov;
2225 rqst.rq_nvec = n_iov;
2226
2227 rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags,
2194 &rsp_iov); 2228 &rsp_iov);
2195 cifs_small_buf_release(req); 2229 cifs_small_buf_release(req);
2196 rsp = (struct smb2_ioctl_rsp *)rsp_iov.iov_base; 2230 rsp = (struct smb2_ioctl_rsp *)rsp_iov.iov_base;
@@ -2275,6 +2309,7 @@ int
2275SMB2_close_flags(const unsigned int xid, struct cifs_tcon *tcon, 2309SMB2_close_flags(const unsigned int xid, struct cifs_tcon *tcon,
2276 u64 persistent_fid, u64 volatile_fid, int flags) 2310 u64 persistent_fid, u64 volatile_fid, int flags)
2277{ 2311{
2312 struct smb_rqst rqst;
2278 struct smb2_close_req *req; 2313 struct smb2_close_req *req;
2279 struct smb2_close_rsp *rsp; 2314 struct smb2_close_rsp *rsp;