Commit b340a4d4 authored by Steve French's avatar Steve French
Browse files

smb3: add tracepoint to catch cases where credit refund of failed op overlaps reconnect



Add tracepoint to catch potential cases where a pending operation overlapping a
reconnect could fail and incorrectly refund its credits causing the client
to think it has more credits available than the server thinks it does.

Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
Reviewed-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
parent ce7fb50f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -74,6 +74,12 @@ smb2_add_credits(struct TCP_Server_Info *server, const unsigned int add,
	int *val, rc = 0;
	spin_lock(&server->req_lock);
	val = server->ops->get_credits_field(server, optype);

	/* eg found case where write overlapping reconnect messed up credits */
	if (((optype & CIFS_OP_MASK) == CIFS_NEG_OP) && (*val != 0))
		trace_smb3_reconnect_with_invalid_credits(server->CurrentMid,
			server->hostname, *val);

	*val += add;
	if (*val > 65000) {
		*val = 65000; /* Don't get near 64K credits, avoid srv bugs */
+30 −0
Original line number Diff line number Diff line
@@ -486,6 +486,36 @@ DEFINE_EVENT(smb3_reconnect_class, smb3_##name, \
DEFINE_SMB3_RECONNECT_EVENT(reconnect);
DEFINE_SMB3_RECONNECT_EVENT(partial_send_reconnect);

DECLARE_EVENT_CLASS(smb3_credit_class,
	TP_PROTO(__u64	currmid,
		char *hostname,
		int credits),
	TP_ARGS(currmid, hostname, credits),
	TP_STRUCT__entry(
		__field(__u64, currmid)
		__field(char *, hostname)
		__field(int, credits)
	),
	TP_fast_assign(
		__entry->currmid = currmid;
		__entry->hostname = hostname;
		__entry->credits = credits;
	),
	TP_printk("server=%s current_mid=0x%llx credits=%d",
		__entry->hostname,
		__entry->currmid,
		__entry->credits)
)

#define DEFINE_SMB3_CREDIT_EVENT(name)        \
DEFINE_EVENT(smb3_credit_class, smb3_##name,  \
	TP_PROTO(__u64	currmid,		\
		char *hostname,			\
		int  credits),			\
	TP_ARGS(currmid, hostname, credits))

DEFINE_SMB3_CREDIT_EVENT(reconnect_with_invalid_credits);

#endif /* _CIFS_TRACE_H */

#undef TRACE_INCLUDE_PATH