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

smb: client: Add tracepoint for krb5 auth

Add tracepoint to help debugging krb5 auth failures.

Example:

$ trace-cmd record -e smb3_kerberos_auth
$ mount.cifs ...
$ trace-cmd report
mount.cifs-1667 [003] ..... 5810.668549: smb3_kerberos_auth: vers=2
host=w22-dc1.zelda.test ip=192.168.124.30:445 sec=krb5 uid=0 cruid=0
user=root pid=1667 upcall_target=app err=-126

Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Reviewed-by: David Howells <dhowells@redhat.com>
Cc: Pierguido Lambri <plambri@redhat.com>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

Paulo Alcantara and committed by
Steve French
7ad78592 a8fce7c8

+45 -2
+1
fs/smb/client/cifs_spnego.c
··· 159 159 cifs_dbg(FYI, "key description = %s\n", description); 160 160 scoped_with_creds(spnego_cred) 161 161 spnego_key = request_key(&cifs_spnego_key_type, description, ""); 162 + trace_smb3_kerberos_auth(server, sesInfo, PTR_ERR_OR_ZERO(spnego_key)); 162 163 163 164 #ifdef CONFIG_CIFS_DEBUG2 164 165 if (cifsFYI && !IS_ERR(spnego_key)) {
-2
fs/smb/client/smb2pdu.c
··· 1695 1695 spnego_key = cifs_get_spnego_key(ses, server); 1696 1696 if (IS_ERR(spnego_key)) { 1697 1697 rc = PTR_ERR(spnego_key); 1698 - if (rc == -ENOKEY) 1699 - cifs_dbg(VFS, "Verify user has a krb5 ticket and keyutils is installed\n"); 1700 1698 spnego_key = NULL; 1701 1699 goto out; 1702 1700 }
+1
fs/smb/client/trace.c
··· 5 5 * Author(s): Steve French <stfrench@microsoft.com> 6 6 */ 7 7 #include "cifsglob.h" 8 + #include "cifs_spnego.h" 8 9 #define CREATE_TRACE_POINTS 9 10 #include "trace.h"
+43
fs/smb/client/trace.h
··· 1692 1692 DEFINE_SMB3_CREDIT_EVENT(overflow_credits); 1693 1693 DEFINE_SMB3_CREDIT_EVENT(set_credits); 1694 1694 1695 + TRACE_EVENT(smb3_kerberos_auth, 1696 + TP_PROTO(struct TCP_Server_Info *server, 1697 + struct cifs_ses *ses, 1698 + int rc), 1699 + TP_ARGS(server, ses, rc), 1700 + TP_STRUCT__entry( 1701 + __field(pid_t, pid) 1702 + __field(uid_t, uid) 1703 + __field(uid_t, cruid) 1704 + __string(host, server->hostname) 1705 + __string(user, ses->user_name) 1706 + __array(__u8, addr, sizeof(struct sockaddr_storage)) 1707 + __array(char, sec, sizeof("ntlmsspi")) 1708 + __array(char, upcall_target, sizeof("mount")) 1709 + __field(int, rc) 1710 + ), 1711 + TP_fast_assign( 1712 + __entry->pid = current->pid; 1713 + __entry->uid = from_kuid_munged(&init_user_ns, ses->linux_uid); 1714 + __entry->cruid = from_kuid_munged(&init_user_ns, ses->cred_uid); 1715 + __assign_str(host); 1716 + __assign_str(user); 1717 + memcpy(__entry->addr, &server->dstaddr, sizeof(__entry->addr)); 1718 + 1719 + if (server->sec_kerberos) 1720 + memcpy(__entry->sec, "krb5", sizeof("krb5")); 1721 + else if (server->sec_mskerberos) 1722 + memcpy(__entry->sec, "mskrb5", sizeof("mskrb5")); 1723 + else if (server->sec_iakerb) 1724 + memcpy(__entry->sec, "iakerb", sizeof("iakerb")); 1725 + else 1726 + memcpy(__entry->sec, "krb5", sizeof("krb5")); 1727 + 1728 + if (ses->upcall_target == UPTARGET_MOUNT) 1729 + memcpy(__entry->upcall_target, "mount", sizeof("mount")); 1730 + else 1731 + memcpy(__entry->upcall_target, "app", sizeof("app")); 1732 + __entry->rc = rc; 1733 + ), 1734 + TP_printk("vers=%d host=%s ip=%pISpsfc sec=%s uid=%d cruid=%d user=%s pid=%d upcall_target=%s err=%d", 1735 + CIFS_SPNEGO_UPCALL_VERSION, __get_str(host), __entry->addr, 1736 + __entry->sec, __entry->uid, __entry->cruid, __get_str(user), 1737 + __entry->pid, __entry->upcall_target, __entry->rc)) 1695 1738 1696 1739 TRACE_EVENT(smb3_tcon_ref, 1697 1740 TP_PROTO(unsigned int tcon_debug_id, int ref,