CIFS: Move clear/print_stats code to ops struct
authorPavel Shilovsky <pshilovsky@samba.org>
Mon, 28 May 2012 10:16:31 +0000 (14:16 +0400)
committerPavel Shilovsky <pshilovsky@samba.org>
Tue, 24 Jul 2012 17:55:18 +0000 (21:55 +0400)
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/cifs_debug.c
fs/cifs/cifsglob.h
fs/cifs/cifssmb.c
fs/cifs/misc.c
fs/cifs/smb1ops.c

index 8aa8693bb65c29a849776d87f416fb4a01355789..d9ea6ede6a7a7e5fbd60aae056cfded4b41b6f18 100644 (file)
@@ -282,24 +282,8 @@ static ssize_t cifs_stats_proc_write(struct file *file,
                                                          struct cifs_tcon,
                                                          tcon_list);
                                        atomic_set(&tcon->num_smbs_sent, 0);
-                                       atomic_set(&tcon->num_writes, 0);
-                                       atomic_set(&tcon->num_reads, 0);
-                                       atomic_set(&tcon->num_oplock_brks, 0);
-                                       atomic_set(&tcon->num_opens, 0);
-                                       atomic_set(&tcon->num_posixopens, 0);
-                                       atomic_set(&tcon->num_posixmkdirs, 0);
-                                       atomic_set(&tcon->num_closes, 0);
-                                       atomic_set(&tcon->num_deletes, 0);
-                                       atomic_set(&tcon->num_mkdirs, 0);
-                                       atomic_set(&tcon->num_rmdirs, 0);
-                                       atomic_set(&tcon->num_renames, 0);
-                                       atomic_set(&tcon->num_t2renames, 0);
-                                       atomic_set(&tcon->num_ffirst, 0);
-                                       atomic_set(&tcon->num_fnext, 0);
-                                       atomic_set(&tcon->num_fclose, 0);
-                                       atomic_set(&tcon->num_hardlinks, 0);
-                                       atomic_set(&tcon->num_symlinks, 0);
-                                       atomic_set(&tcon->num_locks, 0);
+                                       if (server->ops->clear_stats)
+                                               server->ops->clear_stats(tcon);
                                }
                        }
                }
@@ -358,42 +342,10 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
                                seq_printf(m, "\n%d) %s", i, tcon->treeName);
                                if (tcon->need_reconnect)
                                        seq_puts(m, "\tDISCONNECTED ");
-                               seq_printf(m, "\nSMBs: %d Oplock Breaks: %d",
-                                       atomic_read(&tcon->num_smbs_sent),
-                                       atomic_read(&tcon->num_oplock_brks));
-                               seq_printf(m, "\nReads:  %d Bytes: %lld",
-                                       atomic_read(&tcon->num_reads),
-                                       (long long)(tcon->bytes_read));
-                               seq_printf(m, "\nWrites: %d Bytes: %lld",
-                                       atomic_read(&tcon->num_writes),
-                                       (long long)(tcon->bytes_written));
-                               seq_printf(m, "\nFlushes: %d",
-                                       atomic_read(&tcon->num_flushes));
-                               seq_printf(m, "\nLocks: %d HardLinks: %d "
-                                             "Symlinks: %d",
-                                       atomic_read(&tcon->num_locks),
-                                       atomic_read(&tcon->num_hardlinks),
-                                       atomic_read(&tcon->num_symlinks));
-                               seq_printf(m, "\nOpens: %d Closes: %d "
-                                             "Deletes: %d",
-                                       atomic_read(&tcon->num_opens),
-                                       atomic_read(&tcon->num_closes),
-                                       atomic_read(&tcon->num_deletes));
-                               seq_printf(m, "\nPosix Opens: %d "
-                                             "Posix Mkdirs: %d",
-                                       atomic_read(&tcon->num_posixopens),
-                                       atomic_read(&tcon->num_posixmkdirs));
-                               seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
-                                       atomic_read(&tcon->num_mkdirs),
-                                       atomic_read(&tcon->num_rmdirs));
-                               seq_printf(m, "\nRenames: %d T2 Renames %d",
-                                       atomic_read(&tcon->num_renames),
-                                       atomic_read(&tcon->num_t2renames));
-                               seq_printf(m, "\nFindFirst: %d FNext %d "
-                                             "FClose %d",
-                                       atomic_read(&tcon->num_ffirst),
-                                       atomic_read(&tcon->num_fnext),
-                                       atomic_read(&tcon->num_fclose));
+                               seq_printf(m, "\nSMBs: %d",
+                                          atomic_read(&tcon->num_smbs_sent));
+                               if (server->ops->print_stats)
+                                       server->ops->print_stats(m, tcon);
                        }
                }
        }
index ae9a1e900c1582e39c2558b9d6e30dfd2736c10b..0896328418aa509ba4000732ed732e6d09ec6c15 100644 (file)
@@ -197,6 +197,8 @@ struct smb_version_operations {
        /* find mid corresponding to the response message */
        struct mid_q_entry * (*find_mid)(struct TCP_Server_Info *, char *);
        void (*dump_detail)(void *);
+       void (*clear_stats)(struct cifs_tcon *);
+       void (*print_stats)(struct seq_file *m, struct cifs_tcon *);
        /* verify the message */
        int (*check_message)(char *, unsigned int);
        bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
@@ -566,27 +568,31 @@ struct cifs_tcon {
        enum statusEnum tidStatus;
 #ifdef CONFIG_CIFS_STATS
        atomic_t num_smbs_sent;
-       atomic_t num_writes;
-       atomic_t num_reads;
-       atomic_t num_flushes;
-       atomic_t num_oplock_brks;
-       atomic_t num_opens;
-       atomic_t num_closes;
-       atomic_t num_deletes;
-       atomic_t num_mkdirs;
-       atomic_t num_posixopens;
-       atomic_t num_posixmkdirs;
-       atomic_t num_rmdirs;
-       atomic_t num_renames;
-       atomic_t num_t2renames;
-       atomic_t num_ffirst;
-       atomic_t num_fnext;
-       atomic_t num_fclose;
-       atomic_t num_hardlinks;
-       atomic_t num_symlinks;
-       atomic_t num_locks;
-       atomic_t num_acl_get;
-       atomic_t num_acl_set;
+       union {
+               struct {
+                       atomic_t num_writes;
+                       atomic_t num_reads;
+                       atomic_t num_flushes;
+                       atomic_t num_oplock_brks;
+                       atomic_t num_opens;
+                       atomic_t num_closes;
+                       atomic_t num_deletes;
+                       atomic_t num_mkdirs;
+                       atomic_t num_posixopens;
+                       atomic_t num_posixmkdirs;
+                       atomic_t num_rmdirs;
+                       atomic_t num_renames;
+                       atomic_t num_t2renames;
+                       atomic_t num_ffirst;
+                       atomic_t num_fnext;
+                       atomic_t num_fclose;
+                       atomic_t num_hardlinks;
+                       atomic_t num_symlinks;
+                       atomic_t num_locks;
+                       atomic_t num_acl_get;
+                       atomic_t num_acl_set;
+               } cifs_stats;
+       } stats;
 #ifdef CONFIG_CIFS_STATS2
        unsigned long long time_writes;
        unsigned long long time_reads;
index fe30bb5dd2d8c44bccc9fd2901d4b705969facb7..cabc7a01f5df2d17d4ebd3c4e6b2c04504b3c118 100644 (file)
@@ -893,7 +893,7 @@ PsxDelete:
                cFYI(1, "Posix delete returned %d", rc);
        cifs_buf_release(pSMB);
 
-       cifs_stats_inc(&tcon->num_deletes);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes);
 
        if (rc == -EAGAIN)
                goto PsxDelete;
@@ -936,7 +936,7 @@ DelFileRetry:
        pSMB->ByteCount = cpu_to_le16(name_len + 1);
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_deletes);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes);
        if (rc)
                cFYI(1, "Error in RMFile = %d", rc);
 
@@ -981,7 +981,7 @@ RmDirRetry:
        pSMB->ByteCount = cpu_to_le16(name_len + 1);
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_rmdirs);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_rmdirs);
        if (rc)
                cFYI(1, "Error in RMDir = %d", rc);
 
@@ -1024,7 +1024,7 @@ MkDirRetry:
        pSMB->ByteCount = cpu_to_le16(name_len + 1);
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_mkdirs);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_mkdirs);
        if (rc)
                cFYI(1, "Error in Mkdir = %d", rc);
 
@@ -1147,9 +1147,9 @@ psx_create_err:
        cifs_buf_release(pSMB);
 
        if (posix_flags & SMB_O_DIRECTORY)
-               cifs_stats_inc(&tcon->num_posixmkdirs);
+               cifs_stats_inc(&tcon->stats.cifs_stats.num_posixmkdirs);
        else
-               cifs_stats_inc(&tcon->num_posixopens);
+               cifs_stats_inc(&tcon->stats.cifs_stats.num_posixopens);
 
        if (rc == -EAGAIN)
                goto PsxCreat;
@@ -1270,7 +1270,7 @@ OldOpenRetry:
        /* long_op set to 1 to allow for oplock break timeouts */
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                        (struct smb_hdr *)pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_opens);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_opens);
        if (rc) {
                cFYI(1, "Error in Open = %d", rc);
        } else {
@@ -1383,7 +1383,7 @@ openRetry:
        /* long_op set to 1 to allow for oplock break timeouts */
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                        (struct smb_hdr *)pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_opens);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_opens);
        if (rc) {
                cFYI(1, "Error in Open = %d", rc);
        } else {
@@ -1650,7 +1650,7 @@ cifs_async_readv(struct cifs_readdata *rdata)
                             rdata, 0);
 
        if (rc == 0)
-               cifs_stats_inc(&tcon->num_reads);
+               cifs_stats_inc(&tcon->stats.cifs_stats.num_reads);
        else
                kref_put(&rdata->refcount, cifs_readdata_release);
 
@@ -1720,7 +1720,7 @@ CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms,
        iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4;
        rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */,
                         &resp_buf_type, CIFS_LOG_ERROR);
-       cifs_stats_inc(&tcon->num_reads);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_reads);
        pSMBr = (READ_RSP *)iov[0].iov_base;
        if (rc) {
                cERROR(1, "Send error in read = %d", rc);
@@ -1872,7 +1872,7 @@ CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms,
 
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, long_op);
-       cifs_stats_inc(&tcon->num_writes);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
        if (rc) {
                cFYI(1, "Send error in write = %d", rc);
        } else {
@@ -2123,7 +2123,7 @@ cifs_async_writev(struct cifs_writedata *wdata)
                             NULL, cifs_writev_callback, wdata, 0);
 
        if (rc == 0)
-               cifs_stats_inc(&tcon->num_writes);
+               cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
        else
                kref_put(&wdata->refcount, cifs_writedata_release);
 
@@ -2213,7 +2213,7 @@ CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
 
        rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type,
                          long_op);
-       cifs_stats_inc(&tcon->num_writes);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
        if (rc) {
                cFYI(1, "Send error Write2 = %d", rc);
        } else if (resp_buf_type == 0) {
@@ -2279,7 +2279,7 @@ int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon,
        iov[1].iov_base = (char *)buf;
        iov[1].iov_len = (num_unlock + num_lock) * sizeof(LOCKING_ANDX_RANGE);
 
-       cifs_stats_inc(&tcon->num_locks);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_locks);
        rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, CIFS_NO_RESP);
        if (rc)
                cFYI(1, "Send error in cifs_lockv = %d", rc);
@@ -2348,7 +2348,7 @@ CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon,
                rc = SendReceiveNoRsp(xid, tcon->ses, (char *)pSMB, flags);
                /* SMB buffer freed by function above */
        }
-       cifs_stats_inc(&tcon->num_locks);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_locks);
        if (rc)
                cFYI(1, "Send error in Lock = %d", rc);
 
@@ -2511,7 +2511,7 @@ CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon, int smb_file_id)
        pSMB->LastWriteTime = 0xFFFFFFFF;
        pSMB->ByteCount = 0;
        rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
-       cifs_stats_inc(&tcon->num_closes);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_closes);
        if (rc) {
                if (rc != -EINTR) {
                        /* EINTR is expected when user ctl-c to kill app */
@@ -2540,7 +2540,7 @@ CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon, int smb_file_id)
        pSMB->FileID = (__u16) smb_file_id;
        pSMB->ByteCount = 0;
        rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
-       cifs_stats_inc(&tcon->num_flushes);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_flushes);
        if (rc)
                cERROR(1, "Send error in Flush = %d", rc);
 
@@ -2603,7 +2603,7 @@ renameRetry:
 
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_renames);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_renames);
        if (rc)
                cFYI(1, "Send error in rename = %d", rc);
 
@@ -2684,7 +2684,7 @@ int CIFSSMBRenameOpenFile(const unsigned int xid, struct cifs_tcon *pTcon,
        pSMB->ByteCount = cpu_to_le16(byte_count);
        rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&pTcon->num_t2renames);
+       cifs_stats_inc(&pTcon->stats.cifs_stats.num_t2renames);
        if (rc)
                cFYI(1, "Send error in Rename (by file handle) = %d", rc);
 
@@ -2841,7 +2841,7 @@ createSymLinkRetry:
        pSMB->ByteCount = cpu_to_le16(byte_count);
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_symlinks);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_symlinks);
        if (rc)
                cFYI(1, "Send error in SetPathInfo create symlink = %d", rc);
 
@@ -2927,7 +2927,7 @@ createHardLinkRetry:
        pSMB->ByteCount = cpu_to_le16(byte_count);
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_hardlinks);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks);
        if (rc)
                cFYI(1, "Send error in SetPathInfo (hard link) = %d", rc);
 
@@ -2999,7 +2999,7 @@ winCreateHardLinkRetry:
 
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_hardlinks);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks);
        if (rc)
                cFYI(1, "Send error in hard link (NT rename) = %d", rc);
 
@@ -3417,7 +3417,7 @@ queryAclRetry:
 
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_acl_get);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get);
        if (rc) {
                cFYI(1, "Send error in Query POSIX ACL = %d", rc);
        } else {
@@ -3728,7 +3728,7 @@ CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid,
 
        rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type,
                         0);
-       cifs_stats_inc(&tcon->num_acl_get);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get);
        if (rc) {
                cFYI(1, "Send error in QuerySecDesc = %d", rc);
        } else {                /* decode response */
@@ -4330,7 +4330,7 @@ findFirstRetry:
 
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                         (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_ffirst);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_ffirst);
 
        if (rc) {/* BB add logic to retry regular search if Unix search
                        rejected unexpectedly by server */
@@ -4457,7 +4457,7 @@ int CIFSFindNext(const unsigned int xid, struct cifs_tcon *tcon,
 
        rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
                        (struct smb_hdr *) pSMBr, &bytes_returned, 0);
-       cifs_stats_inc(&tcon->num_fnext);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_fnext);
        if (rc) {
                if (rc == -EBADF) {
                        psrch_inf->endOfSearch = true;
@@ -4548,7 +4548,7 @@ CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon,
        if (rc)
                cERROR(1, "Send error in FindClose = %d", rc);
 
-       cifs_stats_inc(&tcon->num_fclose);
+       cifs_stats_inc(&tcon->stats.cifs_stats.num_fclose);
 
        /* Since session is dead, search handle closed on server already */
        if (rc == -EAGAIN)
index ad2538a64c7089531ecd2c46abf6116f21559a04..ce41fee07e5b87917abe7d2acd5af53e7c2268d8 100644 (file)
@@ -461,7 +461,7 @@ is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv)
                        if (tcon->tid != buf->Tid)
                                continue;
 
-                       cifs_stats_inc(&tcon->num_oplock_brks);
+                       cifs_stats_inc(&tcon->stats.cifs_stats.num_oplock_brks);
                        spin_lock(&cifs_file_list_lock);
                        list_for_each(tmp2, &tcon->openFileList) {
                                netfile = list_entry(tmp2, struct cifsFileInfo,
index c9326b4ec6cd92cd6dfe7ecf55202ab25fc7254a..581740998735ee36e64ef0a958eca2d9c985def2 100644 (file)
@@ -520,6 +520,72 @@ cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
        return full_path;
 }
 
+static void
+cifs_clear_stats(struct cifs_tcon *tcon)
+{
+#ifdef CONFIG_CIFS_STATS
+       atomic_set(&tcon->stats.cifs_stats.num_writes, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_reads, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_flushes, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_oplock_brks, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_opens, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_posixopens, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_posixmkdirs, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_closes, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_deletes, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_mkdirs, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_rmdirs, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_renames, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_t2renames, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_ffirst, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_fnext, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_fclose, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_hardlinks, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_symlinks, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_locks, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_acl_get, 0);
+       atomic_set(&tcon->stats.cifs_stats.num_acl_set, 0);
+#endif
+}
+
+static void
+cifs_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
+{
+#ifdef CONFIG_CIFS_STATS
+       seq_printf(m, " Oplocks breaks: %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_oplock_brks));
+       seq_printf(m, "\nReads:  %d Bytes: %llu",
+                  atomic_read(&tcon->stats.cifs_stats.num_reads),
+                  (long long)(tcon->bytes_read));
+       seq_printf(m, "\nWrites: %d Bytes: %llu",
+                  atomic_read(&tcon->stats.cifs_stats.num_writes),
+                  (long long)(tcon->bytes_written));
+       seq_printf(m, "\nFlushes: %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_flushes));
+       seq_printf(m, "\nLocks: %d HardLinks: %d Symlinks: %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_locks),
+                  atomic_read(&tcon->stats.cifs_stats.num_hardlinks),
+                  atomic_read(&tcon->stats.cifs_stats.num_symlinks));
+       seq_printf(m, "\nOpens: %d Closes: %d Deletes: %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_opens),
+                  atomic_read(&tcon->stats.cifs_stats.num_closes),
+                  atomic_read(&tcon->stats.cifs_stats.num_deletes));
+       seq_printf(m, "\nPosix Opens: %d Posix Mkdirs: %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_posixopens),
+                  atomic_read(&tcon->stats.cifs_stats.num_posixmkdirs));
+       seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_mkdirs),
+                  atomic_read(&tcon->stats.cifs_stats.num_rmdirs));
+       seq_printf(m, "\nRenames: %d T2 Renames %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_renames),
+                  atomic_read(&tcon->stats.cifs_stats.num_t2renames));
+       seq_printf(m, "\nFindFirst: %d FNext %d FClose %d",
+                  atomic_read(&tcon->stats.cifs_stats.num_ffirst),
+                  atomic_read(&tcon->stats.cifs_stats.num_fnext),
+                  atomic_read(&tcon->stats.cifs_stats.num_fclose));
+#endif
+}
+
 struct smb_version_operations smb1_operations = {
        .send_cancel = send_nt_cancel,
        .compare_fids = cifs_compare_fids,
@@ -537,6 +603,8 @@ struct smb_version_operations smb1_operations = {
        .find_mid = cifs_find_mid,
        .check_message = checkSMB,
        .dump_detail = cifs_dump_detail,
+       .clear_stats = cifs_clear_stats,
+       .print_stats = cifs_print_stats,
        .is_oplock_break = is_valid_oplock_break,
        .check_trans2 = cifs_check_trans2,
        .need_neg = cifs_need_neg,