mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 00:24:12 +08:00
5 fixes to cifs client, 1 for stable
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmJYRzcACgkQiiy9cAdy T1EECAwAuCUHV174bwd5XQBeP7aouw6upKPF9jbXXJpQy/NKxwFAGpiKaEiGAGjb dA1M+wdBZfeIQQW7pCuFWuWvtagJChEdnAKUamnX+G+l2iWCxsJz64nisc27u6CR z/n6YfIT8OPVQLhfU9xgyXmmmDSSJy6YFNgL3Bh+poR/8764HhEkCgeV3P3kD4Vo uvj9p6M4K1Ddh4v914QgDhLzk1UsR++zHCE9IuXrxNDgzrQ5Kh5VFn52vaEaNz7g hIr790gALsGNnLrapiaD3L2alrGwr3GO3WT5pqAdCgzTWq5bngBBQYl0qSWnSHs+ OhnFFBtZ1efRX2bp6SeR8r2z5hNj4YiLJCo/cjoJBIU7W4YDOdLo+UVm/sW9xKgA tbw5lYWNDMpHygkb+/uSnw807y1cz/3Ip9QbN/ESQP6b9hg/woAXkjgiMVDcew0P nNcQEz0LZHUAzidIAHlByTo17QNQdHOhhZYQuA48dH4KJJrSEWXmiG9n9Qp4Q6cX 6aueD1Lw =q5N5 -----END PGP SIGNATURE----- Merge tag '5.18-rc2-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs fixes from Steve French: - two fixes related to unmount - symlink overflow fix - minor netfs fix - improved tracing for crediting (flow control) * tag '5.18-rc2-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: cifs: verify that tcon is valid before dereference in cifs_kill_sb cifs: potential buffer overflow in handling symlinks cifs: Split the smb3_add_credits tracepoint cifs: release cached dentries only if mount is complete cifs: Check the IOCB_DIRECT flag, not O_DIRECT
This commit is contained in:
commit
62345e4828
@ -266,22 +266,24 @@ static void cifs_kill_sb(struct super_block *sb)
|
||||
* before we kill the sb.
|
||||
*/
|
||||
if (cifs_sb->root) {
|
||||
for (node = rb_first(root); node; node = rb_next(node)) {
|
||||
tlink = rb_entry(node, struct tcon_link, tl_rbnode);
|
||||
tcon = tlink_tcon(tlink);
|
||||
if (IS_ERR(tcon))
|
||||
continue;
|
||||
cfid = &tcon->crfid;
|
||||
mutex_lock(&cfid->fid_mutex);
|
||||
if (cfid->dentry) {
|
||||
dput(cfid->dentry);
|
||||
cfid->dentry = NULL;
|
||||
}
|
||||
mutex_unlock(&cfid->fid_mutex);
|
||||
}
|
||||
|
||||
/* finally release root dentry */
|
||||
dput(cifs_sb->root);
|
||||
cifs_sb->root = NULL;
|
||||
}
|
||||
node = rb_first(root);
|
||||
while (node != NULL) {
|
||||
tlink = rb_entry(node, struct tcon_link, tl_rbnode);
|
||||
tcon = tlink_tcon(tlink);
|
||||
cfid = &tcon->crfid;
|
||||
mutex_lock(&cfid->fid_mutex);
|
||||
if (cfid->dentry) {
|
||||
dput(cfid->dentry);
|
||||
cfid->dentry = NULL;
|
||||
}
|
||||
mutex_unlock(&cfid->fid_mutex);
|
||||
node = rb_next(node);
|
||||
}
|
||||
|
||||
kill_anon_super(sb);
|
||||
cifs_umount(cifs_sb);
|
||||
@ -944,7 +946,7 @@ cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
ssize_t rc;
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
|
||||
if (iocb->ki_filp->f_flags & O_DIRECT)
|
||||
if (iocb->ki_flags & IOCB_DIRECT)
|
||||
return cifs_user_readv(iocb, iter);
|
||||
|
||||
rc = cifs_revalidate_mapping(inode);
|
||||
|
@ -1049,7 +1049,7 @@ smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
|
||||
spin_unlock(&server->req_lock);
|
||||
wake_up(&server->request_q);
|
||||
|
||||
trace_smb3_add_credits(server->CurrentMid,
|
||||
trace_smb3_hdr_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, scredits,
|
||||
le16_to_cpu(shdr->CreditRequest), in_flight);
|
||||
cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
|
||||
|
@ -85,6 +85,9 @@ parse_mf_symlink(const u8 *buf, unsigned int buf_len, unsigned int *_link_len,
|
||||
if (rc != 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (link_len > CIFS_MF_SYMLINK_LINK_MAXLEN)
|
||||
return -EINVAL;
|
||||
|
||||
rc = symlink_hash(link_len, link_str, md5_hash);
|
||||
if (rc) {
|
||||
cifs_dbg(FYI, "%s: MD5 hash failure: %d\n", __func__, rc);
|
||||
|
@ -86,6 +86,9 @@ smb2_add_credits(struct TCP_Server_Info *server,
|
||||
if (*val > 65000) {
|
||||
*val = 65000; /* Don't get near 64K credits, avoid srv bugs */
|
||||
pr_warn_once("server overflowed SMB3 credits\n");
|
||||
trace_smb3_overflow_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, *val,
|
||||
add, server->in_flight);
|
||||
}
|
||||
server->in_flight--;
|
||||
if (server->in_flight == 0 &&
|
||||
@ -251,7 +254,7 @@ smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
|
||||
in_flight = server->in_flight;
|
||||
spin_unlock(&server->req_lock);
|
||||
|
||||
trace_smb3_add_credits(server->CurrentMid,
|
||||
trace_smb3_wait_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, scredits, -(credits->value), in_flight);
|
||||
cifs_dbg(FYI, "%s: removed %u credits total=%d\n",
|
||||
__func__, credits->value, scredits);
|
||||
@ -300,7 +303,7 @@ smb2_adjust_credits(struct TCP_Server_Info *server,
|
||||
spin_unlock(&server->req_lock);
|
||||
wake_up(&server->request_q);
|
||||
|
||||
trace_smb3_add_credits(server->CurrentMid,
|
||||
trace_smb3_adj_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, scredits,
|
||||
credits->value - new_val, in_flight);
|
||||
cifs_dbg(FYI, "%s: adjust added %u credits total=%d\n",
|
||||
@ -2492,7 +2495,7 @@ smb2_is_status_pending(char *buf, struct TCP_Server_Info *server)
|
||||
spin_unlock(&server->req_lock);
|
||||
wake_up(&server->request_q);
|
||||
|
||||
trace_smb3_add_credits(server->CurrentMid,
|
||||
trace_smb3_pend_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, scredits,
|
||||
le16_to_cpu(shdr->CreditRequest), in_flight);
|
||||
cifs_dbg(FYI, "%s: status pending add %u credits total=%d\n",
|
||||
|
@ -1006,6 +1006,13 @@ DEFINE_SMB3_CREDIT_EVENT(credit_timeout);
|
||||
DEFINE_SMB3_CREDIT_EVENT(insufficient_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(too_many_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(add_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(adj_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(hdr_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(nblk_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(pend_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(wait_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(waitff_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(overflow_credits);
|
||||
DEFINE_SMB3_CREDIT_EVENT(set_credits);
|
||||
|
||||
#endif /* _CIFS_TRACE_H */
|
||||
|
@ -542,7 +542,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
|
||||
in_flight = server->in_flight;
|
||||
spin_unlock(&server->req_lock);
|
||||
|
||||
trace_smb3_add_credits(server->CurrentMid,
|
||||
trace_smb3_nblk_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, scredits, -1, in_flight);
|
||||
cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
|
||||
__func__, 1, scredits);
|
||||
@ -648,7 +648,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
|
||||
in_flight = server->in_flight;
|
||||
spin_unlock(&server->req_lock);
|
||||
|
||||
trace_smb3_add_credits(server->CurrentMid,
|
||||
trace_smb3_waitff_credits(server->CurrentMid,
|
||||
server->conn_id, server->hostname, scredits,
|
||||
-(num_credits), in_flight);
|
||||
cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
|
||||
|
Loading…
Reference in New Issue
Block a user