diff options
| -rw-r--r-- | fs/cifs/cifsproto.h | 4 | ||||
| -rw-r--r-- | fs/cifs/smb2pdu.c | 137 | ||||
| -rw-r--r-- | fs/cifs/transport.c | 17 |
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 */); |
| 115 | extern 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); | ||
| 119 | extern int SendReceiveBlockingLock(const unsigned int xid, | 115 | extern 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, | |||
| 602 | int | 602 | int |
| 603 | SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) | 603 | SMB2_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 | |||
| 1028 | SMB2_sess_sendreceive(struct SMB2_sess_data *sess_data) | 1033 | SMB2_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: | |||
| 1377 | int | 1386 | int |
| 1378 | SMB2_logoff(const unsigned int xid, struct cifs_ses *ses) | 1387 | SMB2_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 | |||
| 1444 | SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, | 1458 | SMB2_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: | |||
| 1564 | int | 1583 | int |
| 1565 | SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon) | 1584 | SMB2_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 | |||
| 2275 | SMB2_close_flags(const unsigned int xid, struct cifs_tcon *tcon, | 2309 | SMB2_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; |
