Skip to content

Commit 62345e4

Browse files
committed
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
2 parents b3d4650 + 8b6c584 commit 62345e4

6 files changed

Lines changed: 35 additions & 20 deletions

File tree

fs/cifs/cifsfs.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -266,22 +266,24 @@ static void cifs_kill_sb(struct super_block *sb)
266266
* before we kill the sb.
267267
*/
268268
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 */
269284
dput(cifs_sb->root);
270285
cifs_sb->root = NULL;
271286
}
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-
}
285287

286288
kill_anon_super(sb);
287289
cifs_umount(cifs_sb);
@@ -944,7 +946,7 @@ cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
944946
ssize_t rc;
945947
struct inode *inode = file_inode(iocb->ki_filp);
946948

947-
if (iocb->ki_filp->f_flags & O_DIRECT)
949+
if (iocb->ki_flags & IOCB_DIRECT)
948950
return cifs_user_readv(iocb, iter);
949951

950952
rc = cifs_revalidate_mapping(inode);

fs/cifs/connect.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
10491049
spin_unlock(&server->req_lock);
10501050
wake_up(&server->request_q);
10511051

1052-
trace_smb3_add_credits(server->CurrentMid,
1052+
trace_smb3_hdr_credits(server->CurrentMid,
10531053
server->conn_id, server->hostname, scredits,
10541054
le16_to_cpu(shdr->CreditRequest), in_flight);
10551055
cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",

fs/cifs/link.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ parse_mf_symlink(const u8 *buf, unsigned int buf_len, unsigned int *_link_len,
8585
if (rc != 1)
8686
return -EINVAL;
8787

88+
if (link_len > CIFS_MF_SYMLINK_LINK_MAXLEN)
89+
return -EINVAL;
90+
8891
rc = symlink_hash(link_len, link_str, md5_hash);
8992
if (rc) {
9093
cifs_dbg(FYI, "%s: MD5 hash failure: %d\n", __func__, rc);

fs/cifs/smb2ops.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ smb2_add_credits(struct TCP_Server_Info *server,
8686
if (*val > 65000) {
8787
*val = 65000; /* Don't get near 64K credits, avoid srv bugs */
8888
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);
8992
}
9093
server->in_flight--;
9194
if (server->in_flight == 0 &&
@@ -251,7 +254,7 @@ smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
251254
in_flight = server->in_flight;
252255
spin_unlock(&server->req_lock);
253256

254-
trace_smb3_add_credits(server->CurrentMid,
257+
trace_smb3_wait_credits(server->CurrentMid,
255258
server->conn_id, server->hostname, scredits, -(credits->value), in_flight);
256259
cifs_dbg(FYI, "%s: removed %u credits total=%d\n",
257260
__func__, credits->value, scredits);
@@ -300,7 +303,7 @@ smb2_adjust_credits(struct TCP_Server_Info *server,
300303
spin_unlock(&server->req_lock);
301304
wake_up(&server->request_q);
302305

303-
trace_smb3_add_credits(server->CurrentMid,
306+
trace_smb3_adj_credits(server->CurrentMid,
304307
server->conn_id, server->hostname, scredits,
305308
credits->value - new_val, in_flight);
306309
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)
24922495
spin_unlock(&server->req_lock);
24932496
wake_up(&server->request_q);
24942497

2495-
trace_smb3_add_credits(server->CurrentMid,
2498+
trace_smb3_pend_credits(server->CurrentMid,
24962499
server->conn_id, server->hostname, scredits,
24972500
le16_to_cpu(shdr->CreditRequest), in_flight);
24982501
cifs_dbg(FYI, "%s: status pending add %u credits total=%d\n",

fs/cifs/trace.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,13 @@ DEFINE_SMB3_CREDIT_EVENT(credit_timeout);
10061006
DEFINE_SMB3_CREDIT_EVENT(insufficient_credits);
10071007
DEFINE_SMB3_CREDIT_EVENT(too_many_credits);
10081008
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);
10091016
DEFINE_SMB3_CREDIT_EVENT(set_credits);
10101017

10111018
#endif /* _CIFS_TRACE_H */

fs/cifs/transport.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
542542
in_flight = server->in_flight;
543543
spin_unlock(&server->req_lock);
544544

545-
trace_smb3_add_credits(server->CurrentMid,
545+
trace_smb3_nblk_credits(server->CurrentMid,
546546
server->conn_id, server->hostname, scredits, -1, in_flight);
547547
cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
548548
__func__, 1, scredits);
@@ -648,7 +648,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
648648
in_flight = server->in_flight;
649649
spin_unlock(&server->req_lock);
650650

651-
trace_smb3_add_credits(server->CurrentMid,
651+
trace_smb3_waitff_credits(server->CurrentMid,
652652
server->conn_id, server->hostname, scredits,
653653
-(num_credits), in_flight);
654654
cifs_dbg(FYI, "%s: remove %u credits total=%d\n",

0 commit comments

Comments
 (0)