CIFS: Allow SMB2 statistics to be tracked
authorPavel Shilovsky <pshilovsky@samba.org>
Mon, 28 May 2012 11:19:39 +0000 (15:19 +0400)
committerPavel Shilovsky <pshilovsky@samba.org>
Tue, 24 Jul 2012 17:55:20 +0000 (21:55 +0400)
Since there are only 19 command codes, it also is easier to track by exact
command code than it was for cifs.

Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/cifsglob.h
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c

index 0896328418aa509ba4000732ed732e6d09ec6c15..12b1176b87b07cc25bf9bf640d112e4c861693ef 100644 (file)
@@ -28,6 +28,9 @@
 #include "cifsacl.h"
 #include <crypto/internal/hash.h>
 #include <linux/scatterlist.h>
+#ifdef CONFIG_CIFS_SMB2
+#include "smb2pdu.h"
+#endif
 
 /*
  * The sizes of various internal tables and strings
@@ -592,6 +595,12 @@ struct cifs_tcon {
                        atomic_t num_acl_get;
                        atomic_t num_acl_set;
                } cifs_stats;
+#ifdef CONFIG_CIFS_SMB2
+               struct {
+                       atomic_t smb2_com_sent[NUMBER_OF_SMB2_COMMANDS];
+                       atomic_t smb2_com_failed[NUMBER_OF_SMB2_COMMANDS];
+               } smb2_stats;
+#endif /* CONFIG_CIFS_SMB2 */
        } stats;
 #ifdef CONFIG_CIFS_STATS2
        unsigned long long time_writes;
index 483bd0ba2ecb881c178510824c46e7a7efe9f76d..1018c5c6b5be68e78483ee99cec4cc3f3bdfbadb 100644 (file)
@@ -213,6 +213,85 @@ smb2_can_echo(struct TCP_Server_Info *server)
        return server->echoes;
 }
 
+static void
+smb2_clear_stats(struct cifs_tcon *tcon)
+{
+#ifdef CONFIG_CIFS_STATS
+       int i;
+       for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) {
+               atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0);
+               atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0);
+       }
+#endif
+}
+
+static void
+smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
+{
+#ifdef CONFIG_CIFS_STATS
+       atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent;
+       atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed;
+       seq_printf(m, "\nNegotiates: %d sent %d failed",
+                  atomic_read(&sent[SMB2_NEGOTIATE_HE]),
+                  atomic_read(&failed[SMB2_NEGOTIATE_HE]));
+       seq_printf(m, "\nSessionSetups: %d sent %d failed",
+                  atomic_read(&sent[SMB2_SESSION_SETUP_HE]),
+                  atomic_read(&failed[SMB2_SESSION_SETUP_HE]));
+#define SMB2LOGOFF             0x0002 /* trivial request/resp */
+       seq_printf(m, "\nLogoffs: %d sent %d failed",
+                  atomic_read(&sent[SMB2_LOGOFF_HE]),
+                  atomic_read(&failed[SMB2_LOGOFF_HE]));
+       seq_printf(m, "\nTreeConnects: %d sent %d failed",
+                  atomic_read(&sent[SMB2_TREE_CONNECT_HE]),
+                  atomic_read(&failed[SMB2_TREE_CONNECT_HE]));
+       seq_printf(m, "\nTreeDisconnects: %d sent %d failed",
+                  atomic_read(&sent[SMB2_TREE_DISCONNECT_HE]),
+                  atomic_read(&failed[SMB2_TREE_DISCONNECT_HE]));
+       seq_printf(m, "\nCreates: %d sent %d failed",
+                  atomic_read(&sent[SMB2_CREATE_HE]),
+                  atomic_read(&failed[SMB2_CREATE_HE]));
+       seq_printf(m, "\nCloses: %d sent %d failed",
+                  atomic_read(&sent[SMB2_CLOSE_HE]),
+                  atomic_read(&failed[SMB2_CLOSE_HE]));
+       seq_printf(m, "\nFlushes: %d sent %d failed",
+                  atomic_read(&sent[SMB2_FLUSH_HE]),
+                  atomic_read(&failed[SMB2_FLUSH_HE]));
+       seq_printf(m, "\nReads: %d sent %d failed",
+                  atomic_read(&sent[SMB2_READ_HE]),
+                  atomic_read(&failed[SMB2_READ_HE]));
+       seq_printf(m, "\nWrites: %d sent %d failed",
+                  atomic_read(&sent[SMB2_WRITE_HE]),
+                  atomic_read(&failed[SMB2_WRITE_HE]));
+       seq_printf(m, "\nLocks: %d sent %d failed",
+                  atomic_read(&sent[SMB2_LOCK_HE]),
+                  atomic_read(&failed[SMB2_LOCK_HE]));
+       seq_printf(m, "\nIOCTLs: %d sent %d failed",
+                  atomic_read(&sent[SMB2_IOCTL_HE]),
+                  atomic_read(&failed[SMB2_IOCTL_HE]));
+       seq_printf(m, "\nCancels: %d sent %d failed",
+                  atomic_read(&sent[SMB2_CANCEL_HE]),
+                  atomic_read(&failed[SMB2_CANCEL_HE]));
+       seq_printf(m, "\nEchos: %d sent %d failed",
+                  atomic_read(&sent[SMB2_ECHO_HE]),
+                  atomic_read(&failed[SMB2_ECHO_HE]));
+       seq_printf(m, "\nQueryDirectories: %d sent %d failed",
+                  atomic_read(&sent[SMB2_QUERY_DIRECTORY_HE]),
+                  atomic_read(&failed[SMB2_QUERY_DIRECTORY_HE]));
+       seq_printf(m, "\nChangeNotifies: %d sent %d failed",
+                  atomic_read(&sent[SMB2_CHANGE_NOTIFY_HE]),
+                  atomic_read(&failed[SMB2_CHANGE_NOTIFY_HE]));
+       seq_printf(m, "\nQueryInfos: %d sent %d failed",
+                  atomic_read(&sent[SMB2_QUERY_INFO_HE]),
+                  atomic_read(&failed[SMB2_QUERY_INFO_HE]));
+       seq_printf(m, "\nSetInfos: %d sent %d failed",
+                  atomic_read(&sent[SMB2_SET_INFO_HE]),
+                  atomic_read(&failed[SMB2_SET_INFO_HE]));
+       seq_printf(m, "\nOplockBreaks: %d sent %d failed",
+                  atomic_read(&sent[SMB2_OPLOCK_BREAK_HE]),
+                  atomic_read(&failed[SMB2_OPLOCK_BREAK_HE]));
+#endif
+}
+
 struct smb_version_operations smb21_operations = {
        .setup_request = smb2_setup_request,
        .setup_async_request = smb2_setup_async_request,
@@ -225,6 +304,8 @@ struct smb_version_operations smb21_operations = {
        .find_mid = smb2_find_mid,
        .check_message = smb2_check_message,
        .dump_detail = smb2_dump_detail,
+       .clear_stats = smb2_clear_stats,
+       .print_stats = smb2_print_stats,
        .need_neg = smb2_need_neg,
        .negotiate = smb2_negotiate,
        .sess_setup = SMB2_sess_setup,
index 373b6945161fd7d9563ba51f76323e865a455239..e4eb1d3fb7d92379edca58b948e8fb8e0e8d253f 100644 (file)
@@ -282,10 +282,8 @@ small_smb2_init(__le16 smb2_command, struct cifs_tcon *tcon,
 
        if (tcon != NULL) {
 #ifdef CONFIG_CIFS_STATS2
-               /*
                uint16_t com_code = le16_to_cpu(smb2_command);
                cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]);
-               */
 #endif
                cifs_stats_inc(&tcon->num_smbs_sent);
        }
@@ -677,7 +675,7 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
 
 static inline void cifs_stats_fail_inc(struct cifs_tcon *tcon, uint16_t code)
 {
-       /* cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[code]); */
+       cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_failed[code]);
 }
 
 #define MAX_SHARENAME_LENGTH (255 /* server */ + 80 /* share */ + 1 /* NULL */)