Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+35 -20
+16 -14
fs/cifs/cifsfs.c
··· 266 266 * before we kill the sb. 267 267 */ 268 268 if (cifs_sb->root) { 269 + for (node = rb_first(root); node; node = rb_next(node)) { 270 + tlink = rb_entry(node, struct tcon_link, tl_rbnode); 271 + tcon = tlink_tcon(tlink); 272 + if (IS_ERR(tcon)) 273 + continue; 274 + cfid = &tcon->crfid; 275 + mutex_lock(&cfid->fid_mutex); 276 + if (cfid->dentry) { 277 + dput(cfid->dentry); 278 + cfid->dentry = NULL; 279 + } 280 + mutex_unlock(&cfid->fid_mutex); 281 + } 282 + 283 + /* finally release root dentry */ 269 284 dput(cifs_sb->root); 270 285 cifs_sb->root = NULL; 271 - } 272 - node = rb_first(root); 273 - while (node != NULL) { 274 - tlink = rb_entry(node, struct tcon_link, tl_rbnode); 275 - tcon = tlink_tcon(tlink); 276 - cfid = &tcon->crfid; 277 - mutex_lock(&cfid->fid_mutex); 278 - if (cfid->dentry) { 279 - dput(cfid->dentry); 280 - cfid->dentry = NULL; 281 - } 282 - mutex_unlock(&cfid->fid_mutex); 283 - node = rb_next(node); 284 286 } 285 287 286 288 kill_anon_super(sb); ··· 946 944 ssize_t rc; 947 945 struct inode *inode = file_inode(iocb->ki_filp); 948 946 949 - if (iocb->ki_filp->f_flags & O_DIRECT) 947 + if (iocb->ki_flags & IOCB_DIRECT) 950 948 return cifs_user_readv(iocb, iter); 951 949 952 950 rc = cifs_revalidate_mapping(inode);
+1 -1
fs/cifs/connect.c
··· 1049 1049 spin_unlock(&server->req_lock); 1050 1050 wake_up(&server->request_q); 1051 1051 1052 - trace_smb3_add_credits(server->CurrentMid, 1052 + trace_smb3_hdr_credits(server->CurrentMid, 1053 1053 server->conn_id, server->hostname, scredits, 1054 1054 le16_to_cpu(shdr->CreditRequest), in_flight); 1055 1055 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
+3
fs/cifs/link.c
··· 85 85 if (rc != 1) 86 86 return -EINVAL; 87 87 88 + if (link_len > CIFS_MF_SYMLINK_LINK_MAXLEN) 89 + return -EINVAL; 90 + 88 91 rc = symlink_hash(link_len, link_str, md5_hash); 89 92 if (rc) { 90 93 cifs_dbg(FYI, "%s: MD5 hash failure: %d\n", __func__, rc);
+6 -3
fs/cifs/smb2ops.c
··· 86 86 if (*val > 65000) { 87 87 *val = 65000; /* Don't get near 64K credits, avoid srv bugs */ 88 88 pr_warn_once("server overflowed SMB3 credits\n"); 89 + trace_smb3_overflow_credits(server->CurrentMid, 90 + server->conn_id, server->hostname, *val, 91 + add, server->in_flight); 89 92 } 90 93 server->in_flight--; 91 94 if (server->in_flight == 0 && ··· 254 251 in_flight = server->in_flight; 255 252 spin_unlock(&server->req_lock); 256 253 257 - trace_smb3_add_credits(server->CurrentMid, 254 + trace_smb3_wait_credits(server->CurrentMid, 258 255 server->conn_id, server->hostname, scredits, -(credits->value), in_flight); 259 256 cifs_dbg(FYI, "%s: removed %u credits total=%d\n", 260 257 __func__, credits->value, scredits); ··· 303 300 spin_unlock(&server->req_lock); 304 301 wake_up(&server->request_q); 305 302 306 - trace_smb3_add_credits(server->CurrentMid, 303 + trace_smb3_adj_credits(server->CurrentMid, 307 304 server->conn_id, server->hostname, scredits, 308 305 credits->value - new_val, in_flight); 309 306 cifs_dbg(FYI, "%s: adjust added %u credits total=%d\n", ··· 2495 2492 spin_unlock(&server->req_lock); 2496 2493 wake_up(&server->request_q); 2497 2494 2498 - trace_smb3_add_credits(server->CurrentMid, 2495 + trace_smb3_pend_credits(server->CurrentMid, 2499 2496 server->conn_id, server->hostname, scredits, 2500 2497 le16_to_cpu(shdr->CreditRequest), in_flight); 2501 2498 cifs_dbg(FYI, "%s: status pending add %u credits total=%d\n",
+7
fs/cifs/trace.h
··· 1006 1006 DEFINE_SMB3_CREDIT_EVENT(insufficient_credits); 1007 1007 DEFINE_SMB3_CREDIT_EVENT(too_many_credits); 1008 1008 DEFINE_SMB3_CREDIT_EVENT(add_credits); 1009 + DEFINE_SMB3_CREDIT_EVENT(adj_credits); 1010 + DEFINE_SMB3_CREDIT_EVENT(hdr_credits); 1011 + DEFINE_SMB3_CREDIT_EVENT(nblk_credits); 1012 + DEFINE_SMB3_CREDIT_EVENT(pend_credits); 1013 + DEFINE_SMB3_CREDIT_EVENT(wait_credits); 1014 + DEFINE_SMB3_CREDIT_EVENT(waitff_credits); 1015 + DEFINE_SMB3_CREDIT_EVENT(overflow_credits); 1009 1016 DEFINE_SMB3_CREDIT_EVENT(set_credits); 1010 1017 1011 1018 #endif /* _CIFS_TRACE_H */
+2 -2
fs/cifs/transport.c
··· 542 542 in_flight = server->in_flight; 543 543 spin_unlock(&server->req_lock); 544 544 545 - trace_smb3_add_credits(server->CurrentMid, 545 + trace_smb3_nblk_credits(server->CurrentMid, 546 546 server->conn_id, server->hostname, scredits, -1, in_flight); 547 547 cifs_dbg(FYI, "%s: remove %u credits total=%d\n", 548 548 __func__, 1, scredits); ··· 648 648 in_flight = server->in_flight; 649 649 spin_unlock(&server->req_lock); 650 650 651 - trace_smb3_add_credits(server->CurrentMid, 651 + trace_smb3_waitff_credits(server->CurrentMid, 652 652 server->conn_id, server->hostname, scredits, 653 653 -(num_credits), in_flight); 654 654 cifs_dbg(FYI, "%s: remove %u credits total=%d\n",