mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
four smb3 fixes for stable
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmMkBrUACgkQiiy9cAdy T1HweAv/XBCQJzpgObz6TDGBp38lu9DCRIRIZzkSMzuuwXyZhhRfdLrvtiuWHgbw A3kzRnhHuigGiWda6vY+IlncTJHomqAntsyVg+9Dj1MoNzGtbOLHYnBAV/4mz5GK zAJMp7LaZSSFJTcG9QlsbJvvxfFWBUHI3/feu7mhJBF9vCV2cfyuzJoEsF2A4x2k QbfyaVQyyJmKFu+c8Auzwz72scR0Qy98iYvd81DaU3IvTYgtHSbb79zNf02M+BOf Ocfl9c6DNawkcuXaLeCy5adScXBzzmmEfcZJvRHIfWZGTTaB1/6lMzABLAukY7RQ YWKtxQoVfpKchFUEmlzhEFzQWzZh/3C2lvmIDeINXbB+8+YNGqBTQTu8UtyfPBVI Bf+Z0zDpITocnwfjeUhD7fSD6YCpk+jymlBaRbxLGa7NlTWEltK6IITwT7Y4fuy+ Dx6ev3rpeRSL25kmoJFYwA8/wnofBuO2mNE5FMvK33SO/ByGBY1oAnGghuRq0tJA JKUad27E =waB8 -----END PGP SIGNATURE----- Merge tag '6.0-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs fixes from Steve French: "Four smb3 fixes for stable: - important fix to revalidate mapping when doing direct writes - missing spinlock - two fixes to socket handling - trivial change to update internal version number for cifs.ko" * tag '6.0-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: cifs: update internal module number cifs: add missing spinlock around tcon refcount cifs: always initialize struct msghdr smb_msg completely cifs: don't send down the destination address to sendmsg for a SOCK_STREAM cifs: revalidate mapping when doing direct writes
This commit is contained in:
commit
714820c639
4 changed files with 12 additions and 15 deletions
|
@ -153,6 +153,6 @@ extern const struct export_operations cifs_export_ops;
|
||||||
#endif /* CONFIG_CIFS_NFSD_EXPORT */
|
#endif /* CONFIG_CIFS_NFSD_EXPORT */
|
||||||
|
|
||||||
/* when changing internal version - update following two lines at same time */
|
/* when changing internal version - update following two lines at same time */
|
||||||
#define SMB3_PRODUCT_BUILD 38
|
#define SMB3_PRODUCT_BUILD 39
|
||||||
#define CIFS_VERSION "2.38"
|
#define CIFS_VERSION "2.39"
|
||||||
#endif /* _CIFSFS_H */
|
#endif /* _CIFSFS_H */
|
||||||
|
|
|
@ -702,9 +702,6 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
|
||||||
int length = 0;
|
int length = 0;
|
||||||
int total_read;
|
int total_read;
|
||||||
|
|
||||||
smb_msg->msg_control = NULL;
|
|
||||||
smb_msg->msg_controllen = 0;
|
|
||||||
|
|
||||||
for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
|
for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
|
||||||
try_to_freeze();
|
try_to_freeze();
|
||||||
|
|
||||||
|
@ -760,7 +757,7 @@ int
|
||||||
cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
|
cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
|
||||||
unsigned int to_read)
|
unsigned int to_read)
|
||||||
{
|
{
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
struct kvec iov = {.iov_base = buf, .iov_len = to_read};
|
struct kvec iov = {.iov_base = buf, .iov_len = to_read};
|
||||||
iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
|
iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
|
||||||
|
|
||||||
|
@ -770,15 +767,13 @@ cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
|
||||||
ssize_t
|
ssize_t
|
||||||
cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
|
cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
|
||||||
{
|
{
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iov_iter_discard already sets smb_msg.type and count and iov_offset
|
* iov_iter_discard already sets smb_msg.type and count and iov_offset
|
||||||
* and cifs_readv_from_socket sets msg_control and msg_controllen
|
* and cifs_readv_from_socket sets msg_control and msg_controllen
|
||||||
* so little to initialize in struct msghdr
|
* so little to initialize in struct msghdr
|
||||||
*/
|
*/
|
||||||
smb_msg.msg_name = NULL;
|
|
||||||
smb_msg.msg_namelen = 0;
|
|
||||||
iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
|
iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
|
||||||
|
|
||||||
return cifs_readv_from_socket(server, &smb_msg);
|
return cifs_readv_from_socket(server, &smb_msg);
|
||||||
|
@ -788,7 +783,7 @@ int
|
||||||
cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
|
cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
|
||||||
unsigned int page_offset, unsigned int to_read)
|
unsigned int page_offset, unsigned int to_read)
|
||||||
{
|
{
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
struct bio_vec bv = {
|
struct bio_vec bv = {
|
||||||
.bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
|
.bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
|
||||||
iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
|
iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
|
||||||
|
@ -2350,7 +2345,9 @@ cifs_put_tcon(struct cifs_tcon *tcon)
|
||||||
ses = tcon->ses;
|
ses = tcon->ses;
|
||||||
cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
|
cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
|
||||||
spin_lock(&cifs_tcp_ses_lock);
|
spin_lock(&cifs_tcp_ses_lock);
|
||||||
|
spin_lock(&tcon->tc_lock);
|
||||||
if (--tcon->tc_count > 0) {
|
if (--tcon->tc_count > 0) {
|
||||||
|
spin_unlock(&tcon->tc_lock);
|
||||||
spin_unlock(&cifs_tcp_ses_lock);
|
spin_unlock(&cifs_tcp_ses_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2359,6 +2356,7 @@ cifs_put_tcon(struct cifs_tcon *tcon)
|
||||||
WARN_ON(tcon->tc_count < 0);
|
WARN_ON(tcon->tc_count < 0);
|
||||||
|
|
||||||
list_del_init(&tcon->tcon_list);
|
list_del_init(&tcon->tcon_list);
|
||||||
|
spin_unlock(&tcon->tc_lock);
|
||||||
spin_unlock(&cifs_tcp_ses_lock);
|
spin_unlock(&cifs_tcp_ses_lock);
|
||||||
|
|
||||||
/* cancel polling of interfaces */
|
/* cancel polling of interfaces */
|
||||||
|
|
|
@ -3575,6 +3575,9 @@ static ssize_t __cifs_writev(
|
||||||
|
|
||||||
ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from)
|
ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from)
|
||||||
{
|
{
|
||||||
|
struct file *file = iocb->ki_filp;
|
||||||
|
|
||||||
|
cifs_revalidate_mapping(file->f_inode);
|
||||||
return __cifs_writev(iocb, from, true);
|
return __cifs_writev(iocb, from, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -194,10 +194,6 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
|
||||||
|
|
||||||
*sent = 0;
|
*sent = 0;
|
||||||
|
|
||||||
smb_msg->msg_name = (struct sockaddr *) &server->dstaddr;
|
|
||||||
smb_msg->msg_namelen = sizeof(struct sockaddr);
|
|
||||||
smb_msg->msg_control = NULL;
|
|
||||||
smb_msg->msg_controllen = 0;
|
|
||||||
if (server->noblocksnd)
|
if (server->noblocksnd)
|
||||||
smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
|
smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
|
||||||
else
|
else
|
||||||
|
@ -309,7 +305,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
|
||||||
sigset_t mask, oldmask;
|
sigset_t mask, oldmask;
|
||||||
size_t total_len = 0, sent, size;
|
size_t total_len = 0, sent, size;
|
||||||
struct socket *ssocket = server->ssocket;
|
struct socket *ssocket = server->ssocket;
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
__be32 rfc1002_marker;
|
__be32 rfc1002_marker;
|
||||||
|
|
||||||
if (cifs_rdma_enabled(server)) {
|
if (cifs_rdma_enabled(server)) {
|
||||||
|
|
Loading…
Reference in a new issue