s3:smbprofile: rewrite the internal macros
authorStefan Metzmacher <metze@samba.org>
Thu, 23 Oct 2014 16:06:15 +0000 (18:06 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 19 Nov 2014 19:51:37 +0000 (20:51 +0100)
We now autogenerate a lot of code using
SMBPROFILE_STATS_ALL_SECTIONS macro which expands to
different SMBPROFILE_STATS_{COUNT,BASIC,BYTES,IOBYTES} macros.

This also allows async profiling using:

   struct mystate {
       ...

       SMBPROFILE_BASIC_ASYNC_STATE(profile_state);
       ...
   };

   ...

   SMBPROFILE_BASIC_ASYNC_START(SMB2_negotiate, profile_p, mystate->profile_state);

   ...

   SMBPROFILE_BYTES_ASYNC_SET_IDLE(mystate->profile_state);

   ...

   SMBPROFILE_BYTES_ASYNC_SET_BUSY(mystate->profile_state);

   ...

   SMBPROFILE_BASIC_ASYNC_END(mystate->profile_state);

The current START_PROFILE*()/END_PROFILE*() are implemented as legacy wrappers.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source3/include/smbprofile.h
source3/profile/profile.c
source3/utils/status_profile.c

index 9f7b3a2a8065809a9fc836f4a01d1f7f70a80357..bae691b52b23874068347515aba5491dfb79a23f 100644 (file)
 
 #ifdef WITH_PROFILE
 
+#define SMBPROFILE_STATS_ALL_SECTIONS \
+       SMBPROFILE_STATS_START \
+       \
+       SMBPROFILE_STATS_SECTION_START("SMBD loop") \
+       SMBPROFILE_STATS_COUNT(smb_count) \
+       SMBPROFILE_STATS_COUNT(uid_changes) \
+       SMBPROFILE_STATS_BASIC(smbd_idle) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("System Calls") \
+       SMBPROFILE_STATS_BASIC(syscall_opendir) \
+       SMBPROFILE_STATS_BASIC(syscall_fdopendir) \
+       SMBPROFILE_STATS_BASIC(syscall_readdir) \
+       SMBPROFILE_STATS_BASIC(syscall_seekdir) \
+       SMBPROFILE_STATS_BASIC(syscall_telldir) \
+       SMBPROFILE_STATS_BASIC(syscall_rewinddir) \
+       SMBPROFILE_STATS_BASIC(syscall_mkdir) \
+       SMBPROFILE_STATS_BASIC(syscall_rmdir) \
+       SMBPROFILE_STATS_BASIC(syscall_closedir) \
+       SMBPROFILE_STATS_BASIC(syscall_open) \
+       SMBPROFILE_STATS_BASIC(syscall_createfile) \
+       SMBPROFILE_STATS_BASIC(syscall_close) \
+       SMBPROFILE_STATS_BYTES(syscall_read) \
+       SMBPROFILE_STATS_BYTES(syscall_pread) \
+       SMBPROFILE_STATS_BYTES(syscall_write) \
+       SMBPROFILE_STATS_BYTES(syscall_pwrite) \
+       SMBPROFILE_STATS_BASIC(syscall_lseek) \
+       SMBPROFILE_STATS_BYTES(syscall_sendfile) \
+       SMBPROFILE_STATS_BYTES(syscall_recvfile) \
+       SMBPROFILE_STATS_BASIC(syscall_rename) \
+       SMBPROFILE_STATS_BASIC(syscall_rename_at) \
+       SMBPROFILE_STATS_BASIC(syscall_fsync) \
+       SMBPROFILE_STATS_BASIC(syscall_stat) \
+       SMBPROFILE_STATS_BASIC(syscall_fstat) \
+       SMBPROFILE_STATS_BASIC(syscall_lstat) \
+       SMBPROFILE_STATS_BASIC(syscall_get_alloc_size) \
+       SMBPROFILE_STATS_BASIC(syscall_unlink) \
+       SMBPROFILE_STATS_BASIC(syscall_chmod) \
+       SMBPROFILE_STATS_BASIC(syscall_fchmod) \
+       SMBPROFILE_STATS_BASIC(syscall_chown) \
+       SMBPROFILE_STATS_BASIC(syscall_fchown) \
+       SMBPROFILE_STATS_BASIC(syscall_lchown) \
+       SMBPROFILE_STATS_BASIC(syscall_chdir) \
+       SMBPROFILE_STATS_BASIC(syscall_getwd) \
+       SMBPROFILE_STATS_BASIC(syscall_ntimes) \
+       SMBPROFILE_STATS_BASIC(syscall_ftruncate) \
+       SMBPROFILE_STATS_BASIC(syscall_fallocate) \
+       SMBPROFILE_STATS_BASIC(syscall_fcntl_lock) \
+       SMBPROFILE_STATS_BASIC(syscall_kernel_flock) \
+       SMBPROFILE_STATS_BASIC(syscall_linux_setlease) \
+       SMBPROFILE_STATS_BASIC(syscall_fcntl_getlock) \
+       SMBPROFILE_STATS_BASIC(syscall_readlink) \
+       SMBPROFILE_STATS_BASIC(syscall_symlink) \
+       SMBPROFILE_STATS_BASIC(syscall_link) \
+       SMBPROFILE_STATS_BASIC(syscall_mknod) \
+       SMBPROFILE_STATS_BASIC(syscall_realpath) \
+       SMBPROFILE_STATS_BASIC(syscall_get_quota) \
+       SMBPROFILE_STATS_BASIC(syscall_set_quota) \
+       SMBPROFILE_STATS_BASIC(syscall_get_sd) \
+       SMBPROFILE_STATS_BASIC(syscall_set_sd) \
+       SMBPROFILE_STATS_BASIC(syscall_brl_lock) \
+       SMBPROFILE_STATS_BASIC(syscall_brl_unlock) \
+       SMBPROFILE_STATS_BASIC(syscall_brl_cancel) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("ACL Calls") \
+       SMBPROFILE_STATS_BASIC(get_nt_acl) \
+       SMBPROFILE_STATS_BASIC(fget_nt_acl) \
+       SMBPROFILE_STATS_BASIC(fset_nt_acl) \
+       SMBPROFILE_STATS_BASIC(chmod_acl) \
+       SMBPROFILE_STATS_BASIC(fchmod_acl) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("Stat Cache") \
+       SMBPROFILE_STATS_COUNT(statcache_lookups) \
+       SMBPROFILE_STATS_COUNT(statcache_misses) \
+       SMBPROFILE_STATS_COUNT(statcache_hits) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("Write Cache") \
+       SMBPROFILE_STATS_COUNT(writecache_allocations) \
+       SMBPROFILE_STATS_COUNT(writecache_deallocations) \
+       SMBPROFILE_STATS_COUNT(writecache_cached_reads) \
+       SMBPROFILE_STATS_COUNT(writecache_total_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_init_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_abutted_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_non_oplock_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_direct_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_cached_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_perfect_writes) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_seek) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_read) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_readraw) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_write) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_oplock) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_close) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_sync) \
+       SMBPROFILE_STATS_COUNT(writecache_flush_reason_sizechange) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("SMB Calls") \
+       SMBPROFILE_STATS_BASIC(SMBmkdir) \
+       SMBPROFILE_STATS_BASIC(SMBrmdir) \
+       SMBPROFILE_STATS_BASIC(SMBopen) \
+       SMBPROFILE_STATS_BASIC(SMBcreate) \
+       SMBPROFILE_STATS_BASIC(SMBclose) \
+       SMBPROFILE_STATS_BASIC(SMBflush) \
+       SMBPROFILE_STATS_BASIC(SMBunlink) \
+       SMBPROFILE_STATS_BASIC(SMBmv) \
+       SMBPROFILE_STATS_BASIC(SMBgetatr) \
+       SMBPROFILE_STATS_BASIC(SMBsetatr) \
+       SMBPROFILE_STATS_BASIC(SMBread) \
+       SMBPROFILE_STATS_BASIC(SMBwrite) \
+       SMBPROFILE_STATS_BASIC(SMBlock) \
+       SMBPROFILE_STATS_BASIC(SMBunlock) \
+       SMBPROFILE_STATS_BASIC(SMBctemp) \
+       SMBPROFILE_STATS_BASIC(SMBmknew) \
+       SMBPROFILE_STATS_BASIC(SMBcheckpath) \
+       SMBPROFILE_STATS_BASIC(SMBexit) \
+       SMBPROFILE_STATS_BASIC(SMBlseek) \
+       SMBPROFILE_STATS_BASIC(SMBlockread) \
+       SMBPROFILE_STATS_BASIC(SMBwriteunlock) \
+       SMBPROFILE_STATS_BASIC(SMBreadbraw) \
+       SMBPROFILE_STATS_BASIC(SMBreadBmpx) \
+       SMBPROFILE_STATS_BASIC(SMBreadBs) \
+       SMBPROFILE_STATS_BASIC(SMBwritebraw) \
+       SMBPROFILE_STATS_BASIC(SMBwriteBmpx) \
+       SMBPROFILE_STATS_BASIC(SMBwriteBs) \
+       SMBPROFILE_STATS_BASIC(SMBwritec) \
+       SMBPROFILE_STATS_BASIC(SMBsetattrE) \
+       SMBPROFILE_STATS_BASIC(SMBgetattrE) \
+       SMBPROFILE_STATS_BASIC(SMBlockingX) \
+       SMBPROFILE_STATS_BASIC(SMBtrans) \
+       SMBPROFILE_STATS_BASIC(SMBtranss) \
+       SMBPROFILE_STATS_BASIC(SMBioctl) \
+       SMBPROFILE_STATS_BASIC(SMBioctls) \
+       SMBPROFILE_STATS_BASIC(SMBcopy) \
+       SMBPROFILE_STATS_BASIC(SMBmove) \
+       SMBPROFILE_STATS_BASIC(SMBecho) \
+       SMBPROFILE_STATS_BASIC(SMBwriteclose) \
+       SMBPROFILE_STATS_BASIC(SMBopenX) \
+       SMBPROFILE_STATS_BASIC(SMBreadX) \
+       SMBPROFILE_STATS_BASIC(SMBwriteX) \
+       SMBPROFILE_STATS_BASIC(SMBtrans2) \
+       SMBPROFILE_STATS_BASIC(SMBtranss2) \
+       SMBPROFILE_STATS_BASIC(SMBfindclose) \
+       SMBPROFILE_STATS_BASIC(SMBfindnclose) \
+       SMBPROFILE_STATS_BASIC(SMBtcon) \
+       SMBPROFILE_STATS_BASIC(SMBtdis) \
+       SMBPROFILE_STATS_BASIC(SMBnegprot) \
+       SMBPROFILE_STATS_BASIC(SMBsesssetupX) \
+       SMBPROFILE_STATS_BASIC(SMBulogoffX) \
+       SMBPROFILE_STATS_BASIC(SMBtconX) \
+       SMBPROFILE_STATS_BASIC(SMBdskattr) \
+       SMBPROFILE_STATS_BASIC(SMBsearch) \
+       SMBPROFILE_STATS_BASIC(SMBffirst) \
+       SMBPROFILE_STATS_BASIC(SMBfunique) \
+       SMBPROFILE_STATS_BASIC(SMBfclose) \
+       SMBPROFILE_STATS_BASIC(SMBnttrans) \
+       SMBPROFILE_STATS_BASIC(SMBnttranss) \
+       SMBPROFILE_STATS_BASIC(SMBntcreateX) \
+       SMBPROFILE_STATS_BASIC(SMBntcancel) \
+       SMBPROFILE_STATS_BASIC(SMBntrename) \
+       SMBPROFILE_STATS_BASIC(SMBsplopen) \
+       SMBPROFILE_STATS_BASIC(SMBsplwr) \
+       SMBPROFILE_STATS_BASIC(SMBsplclose) \
+       SMBPROFILE_STATS_BASIC(SMBsplretq) \
+       SMBPROFILE_STATS_BASIC(SMBsends) \
+       SMBPROFILE_STATS_BASIC(SMBsendb) \
+       SMBPROFILE_STATS_BASIC(SMBfwdname) \
+       SMBPROFILE_STATS_BASIC(SMBcancelf) \
+       SMBPROFILE_STATS_BASIC(SMBgetmac) \
+       SMBPROFILE_STATS_BASIC(SMBsendstrt) \
+       SMBPROFILE_STATS_BASIC(SMBsendend) \
+       SMBPROFILE_STATS_BASIC(SMBsendtxt) \
+       SMBPROFILE_STATS_BASIC(SMBinvalid) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("Trans2 Calls") \
+       SMBPROFILE_STATS_BASIC(Trans2_open) \
+       SMBPROFILE_STATS_BASIC(Trans2_findfirst) \
+       SMBPROFILE_STATS_BASIC(Trans2_findnext) \
+       SMBPROFILE_STATS_BASIC(Trans2_qfsinfo) \
+       SMBPROFILE_STATS_BASIC(Trans2_setfsinfo) \
+       SMBPROFILE_STATS_BASIC(Trans2_qpathinfo) \
+       SMBPROFILE_STATS_BASIC(Trans2_setpathinfo) \
+       SMBPROFILE_STATS_BASIC(Trans2_qfileinfo) \
+       SMBPROFILE_STATS_BASIC(Trans2_setfileinfo) \
+       SMBPROFILE_STATS_BASIC(Trans2_fsctl) \
+       SMBPROFILE_STATS_BASIC(Trans2_ioctl) \
+       SMBPROFILE_STATS_BASIC(Trans2_findnotifyfirst) \
+       SMBPROFILE_STATS_BASIC(Trans2_findnotifynext) \
+       SMBPROFILE_STATS_BASIC(Trans2_mkdir) \
+       SMBPROFILE_STATS_BASIC(Trans2_session_setup) \
+       SMBPROFILE_STATS_BASIC(Trans2_get_dfs_referral) \
+       SMBPROFILE_STATS_BASIC(Trans2_report_dfs_inconsistancy) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("NT Transact Calls") \
+       SMBPROFILE_STATS_BASIC(NT_transact_create) \
+       SMBPROFILE_STATS_BASIC(NT_transact_ioctl) \
+       SMBPROFILE_STATS_BASIC(NT_transact_set_security_desc) \
+       SMBPROFILE_STATS_BASIC(NT_transact_notify_change) \
+       SMBPROFILE_STATS_BASIC(NT_transact_rename) \
+       SMBPROFILE_STATS_BASIC(NT_transact_query_security_desc) \
+       SMBPROFILE_STATS_BASIC(NT_transact_get_user_quota) \
+       SMBPROFILE_STATS_BASIC(NT_transact_set_user_quota) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START("SMB2 Calls") \
+       SMBPROFILE_STATS_BASIC(smb2_negprot) \
+       SMBPROFILE_STATS_BASIC(smb2_sesssetup) \
+       SMBPROFILE_STATS_BASIC(smb2_logoff) \
+       SMBPROFILE_STATS_BASIC(smb2_tcon) \
+       SMBPROFILE_STATS_BASIC(smb2_tdis) \
+       SMBPROFILE_STATS_BASIC(smb2_create) \
+       SMBPROFILE_STATS_BASIC(smb2_close) \
+       SMBPROFILE_STATS_BASIC(smb2_flush) \
+       SMBPROFILE_STATS_BASIC(smb2_read) \
+       SMBPROFILE_STATS_BASIC(smb2_write) \
+       SMBPROFILE_STATS_BASIC(smb2_lock) \
+       SMBPROFILE_STATS_BASIC(smb2_ioctl) \
+       SMBPROFILE_STATS_BASIC(smb2_cancel) \
+       SMBPROFILE_STATS_BASIC(smb2_keepalive) \
+       SMBPROFILE_STATS_BASIC(smb2_find) \
+       SMBPROFILE_STATS_BASIC(smb2_notify) \
+       SMBPROFILE_STATS_BASIC(smb2_getinfo) \
+       SMBPROFILE_STATS_BASIC(smb2_setinfo) \
+       SMBPROFILE_STATS_BASIC(smb2_break) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_END
+
 /* this file defines the profile structure in the profile shared
    memory area */
 
 /* time values in the following structure are in microseconds */
 
-#define __profile_stats_value(which, domain) domain[which]
-
-enum profile_stats_values
-{
-       PR_VALUE_SMBD_IDLE = 0,
-#define smbd_idle_count __profile_stats_value(PR_VALUE_SMBD_IDLE, count)
-#define smbd_idle_time __profile_stats_value(PR_VALUE_SMBD_IDLE, time)
-
-/* system call counters */
-       PR_VALUE_SYSCALL_OPENDIR,
-#define syscall_opendir_count __profile_stats_value(PR_VALUE_SYSCALL_OPENDIR, count)
-#define syscall_opendir_time __profile_stats_value(PR_VALUE_SYSCALL_OPENDIR, time)
-
-       PR_VALUE_SYSCALL_FDOPENDIR,
-#define syscall_fdopendir_count __profile_stats_value(PR_VALUE_SYSCALL_FDOPENDIR, count)
-#define syscall_fdopendir_time __profile_stats_value(PR_VALUE_SYSCALL_FDOPENDIR, time)
-
-       PR_VALUE_SYSCALL_READDIR,
-#define syscall_readdir_count __profile_stats_value(PR_VALUE_SYSCALL_READDIR, count)
-#define syscall_readdir_time __profile_stats_value(PR_VALUE_SYSCALL_READDIR, time)
-
-       PR_VALUE_SYSCALL_SEEKDIR,
-#define syscall_seekdir_count __profile_stats_value(PR_VALUE_SYSCALL_SEEKDIR, count)
-#define syscall_seekdir_time __profile_stats_value(PR_VALUE_SYSCALL_SEEKDIR, time)
-
-       PR_VALUE_SYSCALL_TELLDIR,
-#define syscall_telldir_count __profile_stats_value(PR_VALUE_SYSCALL_TELLDIR, count)
-#define syscall_telldir_time __profile_stats_value(PR_VALUE_SYSCALL_TELLDIR, time)
-
-       PR_VALUE_SYSCALL_REWINDDIR,
-#define syscall_rewinddir_count __profile_stats_value(PR_VALUE_SYSCALL_REWINDDIR, count)
-#define syscall_rewinddir_time __profile_stats_value(PR_VALUE_SYSCALL_REWINDDIR, time)
-
-       PR_VALUE_SYSCALL_MKDIR,
-#define syscall_mkdir_count __profile_stats_value(PR_VALUE_SYSCALL_MKDIR, count)
-#define syscall_mkdir_time __profile_stats_value(PR_VALUE_SYSCALL_MKDIR, time)
-
-       PR_VALUE_SYSCALL_RMDIR,
-#define syscall_rmdir_count __profile_stats_value(PR_VALUE_SYSCALL_RMDIR, count)
-#define syscall_rmdir_time __profile_stats_value(PR_VALUE_SYSCALL_RMDIR, time)
-
-       PR_VALUE_SYSCALL_CLOSEDIR,
-#define syscall_closedir_count __profile_stats_value(PR_VALUE_SYSCALL_CLOSEDIR, count)
-#define syscall_closedir_time __profile_stats_value(PR_VALUE_SYSCALL_CLOSEDIR, time)
-
-       PR_VALUE_SYSCALL_OPEN,
-#define syscall_open_count __profile_stats_value(PR_VALUE_SYSCALL_OPEN, count)
-#define syscall_open_time __profile_stats_value(PR_VALUE_SYSCALL_OPEN, time)
-
-       PR_VALUE_SYSCALL_CREATEFILE,
-#define syscall_createfile_count __profile_stats_value(PR_VALUE_SYSCALL_CREATEFILE, count)
-#define syscall_createfile_time __profile_stats_value(PR_VALUE_SYSCALL_CREATEFILE, time)
-
-       PR_VALUE_SYSCALL_CLOSE,
-#define syscall_close_count __profile_stats_value(PR_VALUE_SYSCALL_CLOSE, count)
-#define syscall_close_time __profile_stats_value(PR_VALUE_SYSCALL_CLOSE, time)
-
-       PR_VALUE_SYSCALL_READ,
-#define syscall_read_count __profile_stats_value(PR_VALUE_SYSCALL_READ, count)
-#define syscall_read_time __profile_stats_value(PR_VALUE_SYSCALL_READ, time)
-
-       PR_VALUE_SYSCALL_PREAD,
-#define syscall_pread_count __profile_stats_value(PR_VALUE_SYSCALL_PREAD, count)
-#define syscall_pread_time __profile_stats_value(PR_VALUE_SYSCALL_PREAD, time)
-
-       PR_VALUE_SYSCALL_WRITE,
-#define syscall_write_count __profile_stats_value(PR_VALUE_SYSCALL_WRITE, count)
-#define syscall_write_time __profile_stats_value(PR_VALUE_SYSCALL_WRITE, time)
-
-       PR_VALUE_SYSCALL_PWRITE,
-#define syscall_pwrite_count __profile_stats_value(PR_VALUE_SYSCALL_PWRITE, count)
-#define syscall_pwrite_time __profile_stats_value(PR_VALUE_SYSCALL_PWRITE, time)
-
-       PR_VALUE_SYSCALL_LSEEK,
-#define syscall_lseek_count __profile_stats_value(PR_VALUE_SYSCALL_LSEEK, count)
-#define syscall_lseek_time __profile_stats_value(PR_VALUE_SYSCALL_LSEEK, time)
-
-       PR_VALUE_SYSCALL_SENDFILE,
-#define syscall_sendfile_count __profile_stats_value(PR_VALUE_SYSCALL_SENDFILE, count)
-#define syscall_sendfile_time __profile_stats_value(PR_VALUE_SYSCALL_SENDFILE, time)
-
-       PR_VALUE_SYSCALL_RECVFILE,
-#define syscall_recvfile_count __profile_stats_value(PR_VALUE_SYSCALL_RECVFILE, count)
-#define syscall_recvfile_time __profile_stats_value(PR_VALUE_SYSCALL_RECVFILE, time)
-
-       PR_VALUE_SYSCALL_RENAME,
-#define syscall_rename_count __profile_stats_value(PR_VALUE_SYSCALL_RENAME, count)
-#define syscall_rename_time __profile_stats_value(PR_VALUE_SYSCALL_RENAME, time)
-
-       PR_VALUE_SYSCALL_RENAME_AT,
-#define syscall_rename_at_count __profile_stats_value(PR_VALUE_SYSCALL_RENAME_AT, count)
-#define syscall_rename_at_time __profile_stats_value(PR_VALUE_SYSCALL_RENAME_AT, time)
-
-       PR_VALUE_SYSCALL_FSYNC,
-#define syscall_fsync_count __profile_stats_value(PR_VALUE_SYSCALL_FSYNC, count)
-#define syscall_fsync_time __profile_stats_value(PR_VALUE_SYSCALL_FSYNC, time)
-
-       PR_VALUE_SYSCALL_STAT,
-#define syscall_stat_count __profile_stats_value(PR_VALUE_SYSCALL_STAT, count)
-#define syscall_stat_time __profile_stats_value(PR_VALUE_SYSCALL_STAT, time)
-
-       PR_VALUE_SYSCALL_FSTAT,
-#define syscall_fstat_count __profile_stats_value(PR_VALUE_SYSCALL_FSTAT, count)
-#define syscall_fstat_time __profile_stats_value(PR_VALUE_SYSCALL_FSTAT, time)
-
-       PR_VALUE_SYSCALL_LSTAT,
-#define syscall_lstat_count __profile_stats_value(PR_VALUE_SYSCALL_LSTAT, count)
-#define syscall_lstat_time __profile_stats_value(PR_VALUE_SYSCALL_LSTAT, time)
-
-       PR_VALUE_SYSCALL_GET_ALLOC_SIZE,
-#define syscall_get_alloc_size_count __profile_stats_value(PR_VALUE_SYSCALL_GET_ALLOC_SIZE, count)
-#define syscall_get_alloc_size_time __profile_stats_value(PR_VALUE_SYSCALL_GET_ALLOC_SIZE, time)
-
-       PR_VALUE_SYSCALL_UNLINK,
-#define syscall_unlink_count __profile_stats_value(PR_VALUE_SYSCALL_UNLINK, count)
-#define syscall_unlink_time __profile_stats_value(PR_VALUE_SYSCALL_UNLINK, time)
-
-       PR_VALUE_SYSCALL_CHMOD,
-#define syscall_chmod_count __profile_stats_value(PR_VALUE_SYSCALL_CHMOD, count)
-#define syscall_chmod_time __profile_stats_value(PR_VALUE_SYSCALL_CHMOD, time)
-
-       PR_VALUE_SYSCALL_FCHMOD,
-#define syscall_fchmod_count __profile_stats_value(PR_VALUE_SYSCALL_FCHMOD, count)
-#define syscall_fchmod_time __profile_stats_value(PR_VALUE_SYSCALL_FCHMOD, time)
-
-       PR_VALUE_SYSCALL_CHOWN,
-#define syscall_chown_count __profile_stats_value(PR_VALUE_SYSCALL_CHOWN, count)
-#define syscall_chown_time __profile_stats_value(PR_VALUE_SYSCALL_CHOWN, time)
-
-       PR_VALUE_SYSCALL_FCHOWN,
-#define syscall_fchown_count __profile_stats_value(PR_VALUE_SYSCALL_FCHOWN, count)
-#define syscall_fchown_time __profile_stats_value(PR_VALUE_SYSCALL_FCHOWN, time)
-
-       PR_VALUE_SYSCALL_LCHOWN,
-#define syscall_lchown_count __profile_stats_value(PR_VALUE_SYSCALL_LCHOWN, count)
-#define syscall_lchown_time __profile_stats_value(PR_VALUE_SYSCALL_LCHOWN, time)
-
-       PR_VALUE_SYSCALL_CHDIR,
-#define syscall_chdir_count __profile_stats_value(PR_VALUE_SYSCALL_CHDIR, count)
-#define syscall_chdir_time __profile_stats_value(PR_VALUE_SYSCALL_CHDIR, time)
-
-       PR_VALUE_SYSCALL_GETWD,
-#define syscall_getwd_count __profile_stats_value(PR_VALUE_SYSCALL_GETWD, count)
-#define syscall_getwd_time __profile_stats_value(PR_VALUE_SYSCALL_GETWD, time)
-
-       PR_VALUE_SYSCALL_NTIMES,
-#define syscall_ntimes_count __profile_stats_value(PR_VALUE_SYSCALL_NTIMES, count)
-#define syscall_ntimes_time __profile_stats_value(PR_VALUE_SYSCALL_NTIMES, time)
-
-       PR_VALUE_SYSCALL_FTRUNCATE,
-#define syscall_ftruncate_count __profile_stats_value(PR_VALUE_SYSCALL_FTRUNCATE, count)
-#define syscall_ftruncate_time __profile_stats_value(PR_VALUE_SYSCALL_FTRUNCATE, time)
-
-       PR_VALUE_SYSCALL_FALLOCATE,
-#define syscall_fallocate_count __profile_stats_value(PR_VALUE_SYSCALL_FALLOCATE, count)
-#define syscall_fallocate_time __profile_stats_value(PR_VALUE_SYSCALL_FALLOCATE, time)
-
-       PR_VALUE_SYSCALL_FCNTL_LOCK,
-#define syscall_fcntl_lock_count __profile_stats_value(PR_VALUE_SYSCALL_FCNTL_LOCK, count)
-#define syscall_fcntl_lock_time __profile_stats_value(PR_VALUE_SYSCALL_FCNTL_LOCK, time)
-
-       PR_VALUE_SYSCALL_KERNEL_FLOCK,
-#define syscall_kernel_flock_count __profile_stats_value(PR_VALUE_SYSCALL_KERNEL_FLOCK, count)
-#define syscall_kernel_flock_time __profile_stats_value(PR_VALUE_SYSCALL_KERNEL_FLOCK, time)
-
-       PR_VALUE_SYSCALL_LINUX_SETLEASE,
-#define syscall_linux_setlease_count __profile_stats_value(PR_VALUE_SYSCALL_LINUX_SETLEASE, count)
-#define syscall_linux_setlease_time __profile_stats_value(PR_VALUE_SYSCALL_LINUX_SETLEASE, time)
-
-       PR_VALUE_SYSCALL_FCNTL_GETLOCK,
-#define syscall_fcntl_getlock_count __profile_stats_value(PR_VALUE_SYSCALL_FCNTL_GETLOCK, count)
-#define syscall_fcntl_getlock_time __profile_stats_value(PR_VALUE_SYSCALL_FCNTL_GETLOCK, time)
-
-       PR_VALUE_SYSCALL_READLINK,
-#define syscall_readlink_count __profile_stats_value(PR_VALUE_SYSCALL_READLINK, count)
-#define syscall_readlink_time __profile_stats_value(PR_VALUE_SYSCALL_READLINK, time)
-
-       PR_VALUE_SYSCALL_SYMLINK,
-#define syscall_symlink_count __profile_stats_value(PR_VALUE_SYSCALL_SYMLINK, count)
-#define syscall_symlink_time __profile_stats_value(PR_VALUE_SYSCALL_SYMLINK, time)
-
-       PR_VALUE_SYSCALL_LINK,
-#define syscall_link_count __profile_stats_value(PR_VALUE_SYSCALL_LINK, count)
-#define syscall_link_time __profile_stats_value(PR_VALUE_SYSCALL_LINK, time)
-
-       PR_VALUE_SYSCALL_MKNOD,
-#define syscall_mknod_count __profile_stats_value(PR_VALUE_SYSCALL_MKNOD, count)
-#define syscall_mknod_time __profile_stats_value(PR_VALUE_SYSCALL_MKNOD, time)
-
-       PR_VALUE_SYSCALL_REALPATH,
-#define syscall_realpath_count __profile_stats_value(PR_VALUE_SYSCALL_REALPATH, count)
-#define syscall_realpath_time __profile_stats_value(PR_VALUE_SYSCALL_REALPATH, time)
-
-       PR_VALUE_SYSCALL_GET_QUOTA,
-#define syscall_get_quota_count __profile_stats_value(PR_VALUE_SYSCALL_GET_QUOTA, count)
-#define syscall_get_quota_time __profile_stats_value(PR_VALUE_SYSCALL_GET_QUOTA, time)
-
-       PR_VALUE_SYSCALL_SET_QUOTA,
-#define syscall_set_quota_count __profile_stats_value(PR_VALUE_SYSCALL_SET_QUOTA, count)
-#define syscall_set_quota_time __profile_stats_value(PR_VALUE_SYSCALL_SET_QUOTA, time)
-
-       PR_VALUE_SYSCALL_GET_SD,
-#define syscall_get_sd_count __profile_stats_value(PR_VALUE_SYSCALL_GET_SD, count)
-#define syscall_get_sd_time __profile_stats_value(PR_VALUE_SYSCALL_GET_SD, time)
-
-       PR_VALUE_SYSCALL_SET_SD,
-#define syscall_set_sd_count __profile_stats_value(PR_VALUE_SYSCALL_SET_SD, count)
-#define syscall_set_sd_time __profile_stats_value(PR_VALUE_SYSCALL_SET_SD, time)
-
-       PR_VALUE_SYSCALL_BRL_LOCK,
-#define syscall_brl_lock_count __profile_stats_value(PR_VALUE_SYSCALL_BRL_LOCK, count)
-#define syscall_brl_lock_time __profile_stats_value(PR_VALUE_SYSCALL_BRL_LOCK, time)
-
-       PR_VALUE_SYSCALL_BRL_UNLOCK,
-#define syscall_brl_unlock_count __profile_stats_value(PR_VALUE_SYSCALL_BRL_UNLOCK, count)
-#define syscall_brl_unlock_time __profile_stats_value(PR_VALUE_SYSCALL_BRL_UNLOCK, time)
-
-       PR_VALUE_SYSCALL_BRL_CANCEL,
-#define syscall_brl_cancel_count __profile_stats_value(PR_VALUE_SYSCALL_BRL_CANCEL, count)
-#define syscall_brl_cancel_time __profile_stats_value(PR_VALUE_SYSCALL_BRL_CANCEL, time)
-
-       PR_VALUE_SYSCALL_STRICT_LOCK,
-#define syscall_strict_lock_count __profile_stats_value(PR_VALUE_SYSCALL_STRICT_LOCK, count)
-#define syscall_strict_lock_time __profile_stats_value(PR_VALUE_SYSCALL_STRICT_LOCK, time)
-
-       PR_VALUE_SYSCALL_STRICT_UNLOCK,
-#define syscall_strict_unlock_count __profile_stats_value(PR_VALUE_SYSCALL_STRICT_UNLOCK, count)
-#define syscall_strict_unlock_time __profile_stats_value(PR_VALUE_SYSCALL_STRICT_UNLOCK, time)
-
-/* counters for individual SMB types */
-       PR_VALUE_SMBMKDIR,
-#define SMBmkdir_count __profile_stats_value(PR_VALUE_SMBMKDIR, count)
-#define SMBmkdir_time __profile_stats_value(PR_VALUE_SMBMKDIR, time)
-
-       PR_VALUE_SMBRMDIR,
-#define SMBrmdir_count __profile_stats_value(PR_VALUE_SMBRMDIR, count)
-#define SMBrmdir_time __profile_stats_value(PR_VALUE_SMBRMDIR, time)
-
-       PR_VALUE_SMBOPEN,
-#define SMBopen_count __profile_stats_value(PR_VALUE_SMBOPEN, count)
-#define SMBopen_time __profile_stats_value(PR_VALUE_SMBOPEN, time)
-
-       PR_VALUE_SMBCREATE,
-#define SMBcreate_count __profile_stats_value(PR_VALUE_SMBCREATE, count)
-#define SMBcreate_time __profile_stats_value(PR_VALUE_SMBCREATE, time)
-
-       PR_VALUE_SMBCLOSE,
-#define SMBclose_count __profile_stats_value(PR_VALUE_SMBCLOSE, count)
-#define SMBclose_time __profile_stats_value(PR_VALUE_SMBCLOSE, time)
-
-       PR_VALUE_SMBFLUSH,
-#define SMBflush_count __profile_stats_value(PR_VALUE_SMBFLUSH, count)
-#define SMBflush_time __profile_stats_value(PR_VALUE_SMBFLUSH, time)
-
-       PR_VALUE_SMBUNLINK,
-#define SMBunlink_count __profile_stats_value(PR_VALUE_SMBUNLINK, count)
-#define SMBunlink_time __profile_stats_value(PR_VALUE_SMBUNLINK, time)
-
-       PR_VALUE_SMBMV,
-#define SMBmv_count __profile_stats_value(PR_VALUE_SMBMV, count)
-#define SMBmv_time __profile_stats_value(PR_VALUE_SMBMV, time)
-
-       PR_VALUE_SMBGETATR,
-#define SMBgetatr_count __profile_stats_value(PR_VALUE_SMBGETATR, count)
-#define SMBgetatr_time __profile_stats_value(PR_VALUE_SMBGETATR, time)
-
-       PR_VALUE_SMBSETATR,
-#define SMBsetatr_count __profile_stats_value(PR_VALUE_SMBSETATR, count)
-#define SMBsetatr_time __profile_stats_value(PR_VALUE_SMBSETATR, time)
-
-       PR_VALUE_SMBREAD,
-#define SMBread_count __profile_stats_value(PR_VALUE_SMBREAD, count)
-#define SMBread_time __profile_stats_value(PR_VALUE_SMBREAD, time)
-
-       PR_VALUE_SMBWRITE,
-#define SMBwrite_count __profile_stats_value(PR_VALUE_SMBWRITE, count)
-#define SMBwrite_time __profile_stats_value(PR_VALUE_SMBWRITE, time)
-
-       PR_VALUE_SMBLOCK,
-#define SMBlock_count __profile_stats_value(PR_VALUE_SMBLOCK, count)
-#define SMBlock_time __profile_stats_value(PR_VALUE_SMBLOCK, time)
-
-       PR_VALUE_SMBUNLOCK,
-#define SMBunlock_count __profile_stats_value(PR_VALUE_SMBUNLOCK, count)
-#define SMBunlock_time __profile_stats_value(PR_VALUE_SMBUNLOCK, time)
-
-       PR_VALUE_SMBCTEMP,
-#define SMBctemp_count __profile_stats_value(PR_VALUE_SMBCTEMP, count)
-#define SMBctemp_time __profile_stats_value(PR_VALUE_SMBCTEMP, time)
-
-       /* SMBmknew stats are currently combined with SMBcreate */
-       PR_VALUE_SMBMKNEW,
-#define SMBmknew_count __profile_stats_value(PR_VALUE_SMBMKNEW, count)
-#define SMBmknew_time __profile_stats_value(PR_VALUE_SMBMKNEW, time)
-
-       PR_VALUE_SMBCHECKPATH,
-#define SMBcheckpath_count __profile_stats_value(PR_VALUE_SMBCHECKPATH, count)
-#define SMBcheckpath_time __profile_stats_value(PR_VALUE_SMBCHECKPATH, time)
-
-       PR_VALUE_SMBEXIT,
-#define SMBexit_count __profile_stats_value(PR_VALUE_SMBEXIT, count)
-#define SMBexit_time __profile_stats_value(PR_VALUE_SMBEXIT, time)
-
-       PR_VALUE_SMBLSEEK,
-#define SMBlseek_count __profile_stats_value(PR_VALUE_SMBLSEEK, count)
-#define SMBlseek_time __profile_stats_value(PR_VALUE_SMBLSEEK, time)
-
-       PR_VALUE_SMBLOCKREAD,
-#define SMBlockread_count __profile_stats_value(PR_VALUE_SMBLOCKREAD, count)
-#define SMBlockread_time __profile_stats_value(PR_VALUE_SMBLOCKREAD, time)
-
-       PR_VALUE_SMBWRITEUNLOCK,
-#define SMBwriteunlock_count __profile_stats_value(PR_VALUE_SMBWRITEUNLOCK, count)
-#define SMBwriteunlock_time __profile_stats_value(PR_VALUE_SMBWRITEUNLOCK, time)
-
-       PR_VALUE_SMBREADBRAW,
-#define SMBreadbraw_count __profile_stats_value(PR_VALUE_SMBREADBRAW, count)
-#define SMBreadbraw_time __profile_stats_value(PR_VALUE_SMBREADBRAW, time)
-
-       PR_VALUE_SMBREADBMPX,
-#define SMBreadBmpx_count __profile_stats_value(PR_VALUE_SMBREADBMPX, count)
-#define SMBreadBmpx_time __profile_stats_value(PR_VALUE_SMBREADBMPX, time)
-
-       PR_VALUE_SMBREADBS,
-#define SMBreadBs_count __profile_stats_value(PR_VALUE_SMBREADBS, count)
-#define SMBreadBs_time __profile_stats_value(PR_VALUE_SMBREADBS, time)
-
-       PR_VALUE_SMBWRITEBRAW,
-#define SMBwritebraw_count __profile_stats_value(PR_VALUE_SMBWRITEBRAW, count)
-#define SMBwritebraw_time __profile_stats_value(PR_VALUE_SMBWRITEBRAW, time)
-
-       PR_VALUE_SMBWRITEBMPX,
-#define SMBwriteBmpx_count __profile_stats_value(PR_VALUE_SMBWRITEBMPX, count)
-#define SMBwriteBmpx_time __profile_stats_value(PR_VALUE_SMBWRITEBMPX, time)
-
-       PR_VALUE_SMBWRITEBS,
-#define SMBwriteBs_count __profile_stats_value(PR_VALUE_SMBWRITEBS, count)
-#define SMBwriteBs_time __profile_stats_value(PR_VALUE_SMBWRITEBS, time)
-
-       PR_VALUE_SMBWRITEC,
-#define SMBwritec_count __profile_stats_value(PR_VALUE_SMBWRITEC, count)
-#define SMBwritec_time __profile_stats_value(PR_VALUE_SMBWRITEC, time)
-
-       PR_VALUE_SMBSETATTRE,
-#define SMBsetattrE_count __profile_stats_value(PR_VALUE_SMBSETATTRE, count)
-#define SMBsetattrE_time __profile_stats_value(PR_VALUE_SMBSETATTRE, time)
-
-       PR_VALUE_SMBGETATTRE,
-#define SMBgetattrE_count __profile_stats_value(PR_VALUE_SMBGETATTRE, count)
-#define SMBgetattrE_time __profile_stats_value(PR_VALUE_SMBGETATTRE, time)
-
-       PR_VALUE_SMBLOCKINGX,
-#define SMBlockingX_count __profile_stats_value(PR_VALUE_SMBLOCKINGX, count)
-#define SMBlockingX_time __profile_stats_value(PR_VALUE_SMBLOCKINGX, time)
-
-       PR_VALUE_SMBTRANS,
-#define SMBtrans_count __profile_stats_value(PR_VALUE_SMBTRANS, count)
-#define SMBtrans_time __profile_stats_value(PR_VALUE_SMBTRANS, time)
-
-       PR_VALUE_SMBTRANSS,
-#define SMBtranss_count __profile_stats_value(PR_VALUE_SMBTRANSS, count)
-#define SMBtranss_time __profile_stats_value(PR_VALUE_SMBTRANSS, time)
-
-       PR_VALUE_SMBIOCTL,
-#define SMBioctl_count __profile_stats_value(PR_VALUE_SMBIOCTL, count)
-#define SMBioctl_time __profile_stats_value(PR_VALUE_SMBIOCTL, time)
-
-       PR_VALUE_SMBIOCTLS,
-#define SMBioctls_count __profile_stats_value(PR_VALUE_SMBIOCTLS, count)
-#define SMBioctls_time __profile_stats_value(PR_VALUE_SMBIOCTLS, time)
-
-       PR_VALUE_SMBCOPY,
-#define SMBcopy_count __profile_stats_value(PR_VALUE_SMBCOPY, count)
-#define SMBcopy_time __profile_stats_value(PR_VALUE_SMBCOPY, time)
-
-       PR_VALUE_SMBMOVE,
-#define SMBmove_count __profile_stats_value(PR_VALUE_SMBMOVE, count)
-#define SMBmove_time __profile_stats_value(PR_VALUE_SMBMOVE, time)
-
-       PR_VALUE_SMBECHO,
-#define SMBecho_count __profile_stats_value(PR_VALUE_SMBECHO, count)
-#define SMBecho_time __profile_stats_value(PR_VALUE_SMBECHO, time)
-
-       PR_VALUE_SMBWRITECLOSE,
-#define SMBwriteclose_count __profile_stats_value(PR_VALUE_SMBWRITECLOSE, count)
-#define SMBwriteclose_time __profile_stats_value(PR_VALUE_SMBWRITECLOSE, time)
-
-       PR_VALUE_SMBOPENX,
-#define SMBopenX_count __profile_stats_value(PR_VALUE_SMBOPENX, count)
-#define SMBopenX_time __profile_stats_value(PR_VALUE_SMBOPENX, time)
-
-       PR_VALUE_SMBREADX,
-#define SMBreadX_count __profile_stats_value(PR_VALUE_SMBREADX, count)
-#define SMBreadX_time __profile_stats_value(PR_VALUE_SMBREADX, time)
-
-       PR_VALUE_SMBWRITEX,
-#define SMBwriteX_count __profile_stats_value(PR_VALUE_SMBWRITEX, count)
-#define SMBwriteX_time __profile_stats_value(PR_VALUE_SMBWRITEX, time)
-
-       PR_VALUE_SMBTRANS2,
-#define SMBtrans2_count __profile_stats_value(PR_VALUE_SMBTRANS2, count)
-#define SMBtrans2_time __profile_stats_value(PR_VALUE_SMBTRANS2, time)
-
-       PR_VALUE_SMBTRANSS2,
-#define SMBtranss2_count __profile_stats_value(PR_VALUE_SMBTRANSS2, count)
-#define SMBtranss2_time __profile_stats_value(PR_VALUE_SMBTRANSS2, time)
-
-       PR_VALUE_SMBFINDCLOSE,
-#define SMBfindclose_count __profile_stats_value(PR_VALUE_SMBFINDCLOSE, count)
-#define SMBfindclose_time __profile_stats_value(PR_VALUE_SMBFINDCLOSE, time)
-
-       PR_VALUE_SMBFINDNCLOSE,
-#define SMBfindnclose_count __profile_stats_value(PR_VALUE_SMBFINDNCLOSE, count)
-#define SMBfindnclose_time __profile_stats_value(PR_VALUE_SMBFINDNCLOSE, time)
-
-       PR_VALUE_SMBTCON,
-#define SMBtcon_count __profile_stats_value(PR_VALUE_SMBTCON, count)
-#define SMBtcon_time __profile_stats_value(PR_VALUE_SMBTCON, time)
-
-       PR_VALUE_SMBTDIS,
-#define SMBtdis_count __profile_stats_value(PR_VALUE_SMBTDIS, count)
-#define SMBtdis_time __profile_stats_value(PR_VALUE_SMBTDIS, time)
-
-       PR_VALUE_SMBNEGPROT,
-#define SMBnegprot_count __profile_stats_value(PR_VALUE_SMBNEGPROT, count)
-#define SMBnegprot_time __profile_stats_value(PR_VALUE_SMBNEGPROT, time)
-
-       PR_VALUE_SMBSESSSETUPX,
-#define SMBsesssetupX_count __profile_stats_value(PR_VALUE_SMBSESSSETUPX, count)
-#define SMBsesssetupX_time __profile_stats_value(PR_VALUE_SMBSESSSETUPX, time)
-
-       PR_VALUE_SMBULOGOFFX,
-#define SMBulogoffX_count __profile_stats_value(PR_VALUE_SMBULOGOFFX, count)
-#define SMBulogoffX_time __profile_stats_value(PR_VALUE_SMBULOGOFFX, time)
-
-       PR_VALUE_SMBTCONX,
-#define SMBtconX_count __profile_stats_value(PR_VALUE_SMBTCONX, count)
-#define SMBtconX_time __profile_stats_value(PR_VALUE_SMBTCONX, time)
-
-       PR_VALUE_SMBDSKATTR,
-#define SMBdskattr_count __profile_stats_value(PR_VALUE_SMBDSKATTR, count)
-#define SMBdskattr_time __profile_stats_value(PR_VALUE_SMBDSKATTR, time)
-
-       PR_VALUE_SMBSEARCH,
-#define SMBsearch_count __profile_stats_value(PR_VALUE_SMBSEARCH, count)
-#define SMBsearch_time __profile_stats_value(PR_VALUE_SMBSEARCH, time)
-
-       /* SBMffirst stats combined with SMBsearch */
-       PR_VALUE_SMBFFIRST,
-#define SMBffirst_count __profile_stats_value(PR_VALUE_SMBFFIRST, count)
-#define SMBffirst_time __profile_stats_value(PR_VALUE_SMBFFIRST, time)
-
-       /* SBMfunique stats combined with SMBsearch */
-       PR_VALUE_SMBFUNIQUE,
-#define SMBfunique_count __profile_stats_value(PR_VALUE_SMBFUNIQUE, count)
-#define SMBfunique_time __profile_stats_value(PR_VALUE_SMBFUNIQUE, time)
-
-       PR_VALUE_SMBFCLOSE,
-#define SMBfclose_count __profile_stats_value(PR_VALUE_SMBFCLOSE, count)
-#define SMBfclose_time __profile_stats_value(PR_VALUE_SMBFCLOSE, time)
-
-       PR_VALUE_SMBNTTRANS,
-#define SMBnttrans_count __profile_stats_value(PR_VALUE_SMBNTTRANS, count)
-#define SMBnttrans_time __profile_stats_value(PR_VALUE_SMBNTTRANS, time)
-
-       PR_VALUE_SMBNTTRANSS,
-#define SMBnttranss_count __profile_stats_value(PR_VALUE_SMBNTTRANSS, count)
-#define SMBnttranss_time __profile_stats_value(PR_VALUE_SMBNTTRANSS, time)
-
-       PR_VALUE_SMBNTCREATEX,
-#define SMBntcreateX_count __profile_stats_value(PR_VALUE_SMBNTCREATEX, count)
-#define SMBntcreateX_time __profile_stats_value(PR_VALUE_SMBNTCREATEX, time)
-
-       PR_VALUE_SMBNTCANCEL,
-#define SMBntcancel_count __profile_stats_value(PR_VALUE_SMBNTCANCEL, count)
-#define SMBntcancel_time __profile_stats_value(PR_VALUE_SMBNTCANCEL, time)
-
-       PR_VALUE_SMBNTRENAME,
-#define SMBntrename_count __profile_stats_value(PR_VALUE_SMBNTRENAME, count)
-#define SMBntrename_time __profile_stats_value(PR_VALUE_SMBNTRENAME, time)
-
-       PR_VALUE_SMBSPLOPEN,
-#define SMBsplopen_count __profile_stats_value(PR_VALUE_SMBSPLOPEN, count)
-#define SMBsplopen_time __profile_stats_value(PR_VALUE_SMBSPLOPEN, time)
-
-       PR_VALUE_SMBSPLWR,
-#define SMBsplwr_count __profile_stats_value(PR_VALUE_SMBSPLWR, count)
-#define SMBsplwr_time __profile_stats_value(PR_VALUE_SMBSPLWR, time)
-
-       PR_VALUE_SMBSPLCLOSE,
-#define SMBsplclose_count __profile_stats_value(PR_VALUE_SMBSPLCLOSE, count)
-#define SMBsplclose_time __profile_stats_value(PR_VALUE_SMBSPLCLOSE, time)
-
-       PR_VALUE_SMBSPLRETQ,
-#define SMBsplretq_count __profile_stats_value(PR_VALUE_SMBSPLRETQ, count)
-#define SMBsplretq_time __profile_stats_value(PR_VALUE_SMBSPLRETQ, time)
-
-       PR_VALUE_SMBSENDS,
-#define SMBsends_count __profile_stats_value(PR_VALUE_SMBSENDS, count)
-#define SMBsends_time __profile_stats_value(PR_VALUE_SMBSENDS, time)
-
-       PR_VALUE_SMBSENDB,
-#define SMBsendb_count __profile_stats_value(PR_VALUE_SMBSENDB, count)
-#define SMBsendb_time __profile_stats_value(PR_VALUE_SMBSENDB, time)
-
-       PR_VALUE_SMBFWDNAME,
-#define SMBfwdname_count __profile_stats_value(PR_VALUE_SMBFWDNAME, count)
-#define SMBfwdname_time __profile_stats_value(PR_VALUE_SMBFWDNAME, time)
-
-       PR_VALUE_SMBCANCELF,
-#define SMBcancelf_count __profile_stats_value(PR_VALUE_SMBCANCELF, count)
-#define SMBcancelf_time __profile_stats_value(PR_VALUE_SMBCANCELF, time)
-
-       PR_VALUE_SMBGETMAC,
-#define SMBgetmac_count __profile_stats_value(PR_VALUE_SMBGETMAC, count)
-#define SMBgetmac_time __profile_stats_value(PR_VALUE_SMBGETMAC, time)
-
-       PR_VALUE_SMBSENDSTRT,
-#define SMBsendstrt_count __profile_stats_value(PR_VALUE_SMBSENDSTRT, count)
-#define SMBsendstrt_time __profile_stats_value(PR_VALUE_SMBSENDSTRT, time)
-
-       PR_VALUE_SMBSENDEND,
-#define SMBsendend_count __profile_stats_value(PR_VALUE_SMBSENDEND, count)
-#define SMBsendend_time __profile_stats_value(PR_VALUE_SMBSENDEND, time)
-
-       PR_VALUE_SMBSENDTXT,
-#define SMBsendtxt_count __profile_stats_value(PR_VALUE_SMBSENDTXT, count)
-#define SMBsendtxt_time __profile_stats_value(PR_VALUE_SMBSENDTXT, time)
-
-       PR_VALUE_SMBINVALID,
-#define SMBinvalid_count __profile_stats_value(PR_VALUE_SMBINVALID, count)
-#define SMBinvalid_time __profile_stats_value(PR_VALUE_SMBINVALID, time)
-
-/* These are the TRANS2 sub commands */
-       PR_VALUE_TRANS2_OPEN,
-#define Trans2_open_count __profile_stats_value(PR_VALUE_TRANS2_OPEN, count)
-#define Trans2_open_time __profile_stats_value(PR_VALUE_TRANS2_OPEN, time)
-
-       PR_VALUE_TRANS2_FINDFIRST,
-#define Trans2_findfirst_count __profile_stats_value(PR_VALUE_TRANS2_FINDFIRST, count)
-#define Trans2_findfirst_time __profile_stats_value(PR_VALUE_TRANS2_FINDFIRST, time)
-
-       PR_VALUE_TRANS2_FINDNEXT,
-#define Trans2_findnext_count __profile_stats_value(PR_VALUE_TRANS2_FINDNEXT, count)
-#define Trans2_findnext_time __profile_stats_value(PR_VALUE_TRANS2_FINDNEXT, time)
-
-       PR_VALUE_TRANS2_QFSINFO,
-#define Trans2_qfsinfo_count __profile_stats_value(PR_VALUE_TRANS2_QFSINFO, count)
-#define Trans2_qfsinfo_time __profile_stats_value(PR_VALUE_TRANS2_QFSINFO, time)
-
-       PR_VALUE_TRANS2_SETFSINFO,
-#define Trans2_setfsinfo_count __profile_stats_value(PR_VALUE_TRANS2_SETFSINFO, count)
-#define Trans2_setfsinfo_time __profile_stats_value(PR_VALUE_TRANS2_SETFSINFO, time)
-
-       PR_VALUE_TRANS2_QPATHINFO,
-#define Trans2_qpathinfo_count __profile_stats_value(PR_VALUE_TRANS2_QPATHINFO, count)
-#define Trans2_qpathinfo_time __profile_stats_value(PR_VALUE_TRANS2_QPATHINFO, time)
-
-       PR_VALUE_TRANS2_SETPATHINFO,
-#define Trans2_setpathinfo_count __profile_stats_value(PR_VALUE_TRANS2_SETPATHINFO, count)
-#define Trans2_setpathinfo_time __profile_stats_value(PR_VALUE_TRANS2_SETPATHINFO, time)
-
-       PR_VALUE_TRANS2_QFILEINFO,
-#define Trans2_qfileinfo_count __profile_stats_value(PR_VALUE_TRANS2_QFILEINFO, count)
-#define Trans2_qfileinfo_time __profile_stats_value(PR_VALUE_TRANS2_QFILEINFO, time)
-
-       PR_VALUE_TRANS2_SETFILEINFO,
-#define Trans2_setfileinfo_count __profile_stats_value(PR_VALUE_TRANS2_SETFILEINFO, count)
-#define Trans2_setfileinfo_time __profile_stats_value(PR_VALUE_TRANS2_SETFILEINFO, time)
-
-       PR_VALUE_TRANS2_FSCTL,
-#define Trans2_fsctl_count __profile_stats_value(PR_VALUE_TRANS2_FSCTL, count)
-#define Trans2_fsctl_time __profile_stats_value(PR_VALUE_TRANS2_FSCTL, time)
-
-       PR_VALUE_TRANS2_IOCTL,
-#define Trans2_ioctl_count __profile_stats_value(PR_VALUE_TRANS2_IOCTL, count)
-#define Trans2_ioctl_time __profile_stats_value(PR_VALUE_TRANS2_IOCTL, time)
-
-       PR_VALUE_TRANS2_FINDNOTIFYFIRST,
-#define Trans2_findnotifyfirst_count __profile_stats_value(PR_VALUE_TRANS2_FINDNOTIFYFIRST, count)
-#define Trans2_findnotifyfirst_time __profile_stats_value(PR_VALUE_TRANS2_FINDNOTIFYFIRST, time)
-
-       PR_VALUE_TRANS2_FINDNOTIFYNEXT,
-#define Trans2_findnotifynext_count __profile_stats_value(PR_VALUE_TRANS2_FINDNOTIFYNEXT, count)
-#define Trans2_findnotifynext_time __profile_stats_value(PR_VALUE_TRANS2_FINDNOTIFYNEXT, time)
-
-       PR_VALUE_TRANS2_MKDIR,
-#define Trans2_mkdir_count __profile_stats_value(PR_VALUE_TRANS2_MKDIR, count)
-#define Trans2_mkdir_time __profile_stats_value(PR_VALUE_TRANS2_MKDIR, time)
-
-       PR_VALUE_TRANS2_SESSION_SETUP,
-#define Trans2_session_setup_count __profile_stats_value(PR_VALUE_TRANS2_SESSION_SETUP, count)
-#define Trans2_session_setup_time __profile_stats_value(PR_VALUE_TRANS2_SESSION_SETUP, time)
-
-       PR_VALUE_TRANS2_GET_DFS_REFERRAL,
-#define Trans2_get_dfs_referral_count __profile_stats_value(PR_VALUE_TRANS2_GET_DFS_REFERRAL, count)
-#define Trans2_get_dfs_referral_time __profile_stats_value(PR_VALUE_TRANS2_GET_DFS_REFERRAL, time)
-
-       PR_VALUE_TRANS2_REPORT_DFS_INCONSISTANCY,
-#define Trans2_report_dfs_inconsistancy_count __profile_stats_value(PR_VALUE_TRANS2_REPORT_DFS_INCONSISTANCY, count)
-#define Trans2_report_dfs_inconsistancy_time __profile_stats_value(PR_VALUE_TRANS2_REPORT_DFS_INCONSISTANCY, time)
-
-/* These are the NT transact sub commands. */
-       PR_VALUE_NT_TRANSACT_CREATE,
-#define NT_transact_create_count __profile_stats_value(PR_VALUE_NT_TRANSACT_CREATE, count)
-#define NT_transact_create_time __profile_stats_value(PR_VALUE_NT_TRANSACT_CREATE, time)
-
-       PR_VALUE_NT_TRANSACT_IOCTL,
-#define NT_transact_ioctl_count __profile_stats_value(PR_VALUE_NT_TRANSACT_IOCTL, count)
-#define NT_transact_ioctl_time __profile_stats_value(PR_VALUE_NT_TRANSACT_IOCTL, time)
-
-       PR_VALUE_NT_TRANSACT_SET_SECURITY_DESC,
-#define NT_transact_set_security_desc_count __profile_stats_value(PR_VALUE_NT_TRANSACT_SET_SECURITY_DESC, count)
-#define NT_transact_set_security_desc_time __profile_stats_value(PR_VALUE_NT_TRANSACT_SET_SECURITY_DESC, time)
-
-       PR_VALUE_NT_TRANSACT_NOTIFY_CHANGE,
-#define NT_transact_notify_change_count __profile_stats_value(PR_VALUE_NT_TRANSACT_NOTIFY_CHANGE, count)
-#define NT_transact_notify_change_time __profile_stats_value(PR_VALUE_NT_TRANSACT_NOTIFY_CHANGE, time)
-
-       PR_VALUE_NT_TRANSACT_RENAME,
-#define NT_transact_rename_count __profile_stats_value(PR_VALUE_NT_TRANSACT_RENAME, count)
-#define NT_transact_rename_time __profile_stats_value(PR_VALUE_NT_TRANSACT_RENAME, time)
-
-       PR_VALUE_NT_TRANSACT_QUERY_SECURITY_DESC,
-#define NT_transact_query_security_desc_count __profile_stats_value(PR_VALUE_NT_TRANSACT_QUERY_SECURITY_DESC, count)
-#define NT_transact_query_security_desc_time __profile_stats_value(PR_VALUE_NT_TRANSACT_QUERY_SECURITY_DESC, time)
-
-       PR_VALUE_NT_TRANSACT_GET_USER_QUOTA,
-#define NT_transact_get_user_quota_count __profile_stats_value(PR_VALUE_NT_TRANSACT_GET_USER_QUOTA, count)
-#define NT_transact_get_user_quota_time __profile_stats_value(PR_VALUE_NT_TRANSACT_GET_USER_QUOTA, time)
-
-       PR_VALUE_NT_TRANSACT_SET_USER_QUOTA,
-#define NT_transact_set_user_quota_count __profile_stats_value(PR_VALUE_NT_TRANSACT_SET_USER_QUOTA, count)
-#define NT_transact_set_user_quota_time __profile_stats_value(PR_VALUE_NT_TRANSACT_SET_USER_QUOTA, time)
-
-/* These are ACL manipulation calls */
-       PR_VALUE_GET_NT_ACL,
-#define get_nt_acl_count __profile_stats_value(PR_VALUE_GET_NT_ACL, count)
-#define get_nt_acl_time __profile_stats_value(PR_VALUE_GET_NT_ACL, time)
-
-       PR_VALUE_FGET_NT_ACL,
-#define fget_nt_acl_count __profile_stats_value(PR_VALUE_FGET_NT_ACL, count)
-#define fget_nt_acl_time __profile_stats_value(PR_VALUE_FGET_NT_ACL, time)
-
-       PR_VALUE_FSET_NT_ACL,
-#define fset_nt_acl_count __profile_stats_value(PR_VALUE_FSET_NT_ACL, count)
-#define fset_nt_acl_time __profile_stats_value(PR_VALUE_FSET_NT_ACL, time)
-
-       PR_VALUE_CHMOD_ACL,
-#define chmod_acl_count __profile_stats_value(PR_VALUE_CHMOD_ACL, count)
-#define chmod_acl_time __profile_stats_value(PR_VALUE_CHMOD_ACL, time)
-
-       PR_VALUE_FCHMOD_ACL,
-#define fchmod_acl_count __profile_stats_value(PR_VALUE_FCHMOD_ACL, count)
-#define fchmod_acl_time __profile_stats_value(PR_VALUE_FCHMOD_ACL, time)
-
-       PR_VALUE_SMB2_NEGPROT,
-#define smb2_negprot_count __profile_stats_value(PR_VALUE_SMB2_NEGPROT, count)
-#define smb2_negprot_time __profile_stats_value(PR_VALUE_SMB2_NEGPROT, time)
-
-       PR_VALUE_SMB2_SESSSETUP,
-#define smb2_sesssetup_count __profile_stats_value(PR_VALUE_SMB2_SESSSETUP, count)
-#define smb2_sesssetup_time __profile_stats_value(PR_VALUE_SMB2_SESSSETUP, time)
-
-       PR_VALUE_SMB2_LOGOFF,
-#define smb2_logoff_count __profile_stats_value(PR_VALUE_SMB2_LOGOFF, count)
-#define smb2_logoff_time __profile_stats_value(PR_VALUE_SMB2_LOGOFF, time)
-
-       PR_VALUE_SMB2_TCON,
-#define smb2_tcon_count __profile_stats_value(PR_VALUE_SMB2_TCON, count)
-#define smb2_tcon_time __profile_stats_value(PR_VALUE_SMB2_TCON, time)
-
-       PR_VALUE_SMB2_TDIS,
-#define smb2_tdis_count __profile_stats_value(PR_VALUE_SMB2_TDIS, count)
-#define smb2_tdis_time __profile_stats_value(PR_VALUE_SMB2_TDIS, time)
-
-       PR_VALUE_SMB2_CREATE,
-#define smb2_create_count __profile_stats_value(PR_VALUE_SMB2_CREATE, count)
-#define smb2_create_time __profile_stats_value(PR_VALUE_SMB2_CREATE, time)
-
-       PR_VALUE_SMB2_CLOSE,
-#define smb2_close_count __profile_stats_value(PR_VALUE_SMB2_CLOSE, count)
-#define smb2_close_time __profile_stats_value(PR_VALUE_SMB2_CLOSE, time)
-
-       PR_VALUE_SMB2_FLUSH,
-#define smb2_flush_count __profile_stats_value(PR_VALUE_SMB2_FLUSH, count)
-#define smb2_flush_time __profile_stats_value(PR_VALUE_SMB2_FLUSH, time)
-
-       PR_VALUE_SMB2_READ,
-#define smb2_read_count __profile_stats_value(PR_VALUE_SMB2_READ, count)
-#define smb2_read_time __profile_stats_value(PR_VALUE_SMB2_READ, time)
-
-       PR_VALUE_SMB2_WRITE,
-#define smb2_write_count __profile_stats_value(PR_VALUE_SMB2_WRITE, count)
-#define smb2_write_time __profile_stats_value(PR_VALUE_SMB2_WRITE, time)
-
-       PR_VALUE_SMB2_LOCK,
-#define smb2_lock_count __profile_stats_value(PR_VALUE_SMB2_LOCK, count)
-#define smb2_lock_time __profile_stats_value(PR_VALUE_SMB2_LOCK, time)
-
-       PR_VALUE_SMB2_IOCTL,
-#define smb2_ioctl_count __profile_stats_value(PR_VALUE_SMB2_IOCTL, count)
-#define smb2_ioctl_time __profile_stats_value(PR_VALUE_SMB2_IOCTL, time)
-
-       PR_VALUE_SMB2_CANCEL,
-#define smb2_cancel_count __profile_stats_value(PR_VALUE_SMB2_CANCEL, count)
-#define smb2_cancel_time __profile_stats_value(PR_VALUE_SMB2_CANCEL, time)
+struct smbprofile_stats_count {
+       uint64_t count;         /* number of events */
+};
 
-       PR_VALUE_SMB2_KEEPALIVE,
-#define smb2_keepalive_count __profile_stats_value(PR_VALUE_SMB2_KEEPALIVE, count)
-#define smb2_keepalive_time __profile_stats_value(PR_VALUE_SMB2_KEEPALIVE, time)
+struct smbprofile_stats_time {
+       uint64_t time;          /* microseconds */
+};
 
-       PR_VALUE_SMB2_FIND,
-#define smb2_find_count __profile_stats_value(PR_VALUE_SMB2_FIND, count)
-#define smb2_find_time __profile_stats_value(PR_VALUE_SMB2_FIND, time)
+struct smbprofile_stats_time_async {
+       uint64_t start;
+       struct smbprofile_stats_time *stats;
+};
 
-       PR_VALUE_SMB2_NOTIFY,
-#define smb2_notify_count __profile_stats_value(PR_VALUE_SMB2_NOTIFY, count)
-#define smb2_notify_time __profile_stats_value(PR_VALUE_SMB2_NOTIFY, time)
+struct smbprofile_stats_basic {
+       uint64_t count;         /* number of events */
+       uint64_t time;          /* microseconds */
+};
 
-       PR_VALUE_SMB2_GETINFO,
-#define smb2_getinfo_count __profile_stats_value(PR_VALUE_SMB2_GETINFO, count)
-#define smb2_getinfo_time __profile_stats_value(PR_VALUE_SMB2_GETINFO, time)
+struct smbprofile_stats_basic_async {
+       uint64_t start;
+       struct smbprofile_stats_basic *stats;
+};
 
-       PR_VALUE_SMB2_SETINFO,
-#define smb2_setinfo_count __profile_stats_value(PR_VALUE_SMB2_SETINFO, count)
-#define smb2_setinfo_time __profile_stats_value(PR_VALUE_SMB2_SETINFO, time)
+struct smbprofile_stats_bytes {
+       uint64_t count;         /* number of events */
+       uint64_t time;          /* microseconds */
+       uint64_t idle;          /* idle time compared to 'time' microseconds */
+       uint64_t bytes;         /* bytes */
+};
 
-       PR_VALUE_SMB2_BREAK,
-#define smb2_break_count __profile_stats_value(PR_VALUE_SMB2_BREAK, count)
-#define smb2_break_time __profile_stats_value(PR_VALUE_SMB2_BREAK, time)
+struct smbprofile_stats_bytes_async {
+       uint64_t start;
+       uint64_t idle_start;
+       uint64_t idle_time;
+       struct smbprofile_stats_bytes *stats;
+};
 
-       /* This must remain the last value. */
-       PR_VALUE_MAX
-}; /* enum profile_stats_values */
+struct smbprofile_stats_iobytes {
+       uint64_t count;         /* number of events */
+       uint64_t time;          /* microseconds */
+       uint64_t idle;          /* idle time compared to 'time' microseconds */
+       uint64_t inbytes;       /* bytes read */
+       uint64_t outbytes;      /* bytes written */
+};
 
-const char * profile_value_name(enum profile_stats_values val);
+struct smbprofile_stats_iobytes_async {
+       uint64_t start;
+       uint64_t idle_start;
+       uint64_t idle_time;
+       struct smbprofile_stats_iobytes *stats;
+};
 
 struct profile_stats {
-/* general counters */
-       unsigned smb_count; /* how many SMB packets we have processed */
-       unsigned uid_changes; /* how many times we change our effective uid */
-
-/* system call and protocol operation counters and cumulative times */
-       unsigned count[PR_VALUE_MAX];
-       unsigned time[PR_VALUE_MAX];
-
-/* cumulative byte counts */
-       unsigned syscall_pread_bytes;
-       unsigned syscall_pwrite_bytes;
-       unsigned syscall_read_bytes;
-       unsigned syscall_write_bytes;
-       unsigned syscall_sendfile_bytes;
-       unsigned syscall_recvfile_bytes;
-
-/* stat cache counters */
-       unsigned statcache_lookups;
-       unsigned statcache_misses;
-       unsigned statcache_hits;
-
-/* write cache counters */
-       unsigned writecache_allocations;
-       unsigned writecache_deallocations;
-       unsigned writecache_cached_reads;
-       unsigned writecache_total_writes;
-       unsigned writecache_init_writes;
-       unsigned writecache_abutted_writes;
-       unsigned writecache_non_oplock_writes;
-       unsigned writecache_direct_writes;
-       unsigned writecache_cached_writes;
-       unsigned writecache_perfect_writes;
-       unsigned writecache_flush_reason_seek;
-       unsigned writecache_flush_reason_read;
-       unsigned writecache_flush_reason_readraw;
-       unsigned writecache_flush_reason_write;
-       unsigned writecache_flush_reason_oplock;
-       unsigned writecache_flush_reason_close;
-       unsigned writecache_flush_reason_sync;
-       unsigned writecache_flush_reason_sizechange;
+#define SMBPROFILE_STATS_START
+#define SMBPROFILE_STATS_SECTION_START(name)
+#define SMBPROFILE_STATS_COUNT(name) \
+       struct smbprofile_stats_count name##_stats;
+#define SMBPROFILE_STATS_TIME(name) \
+       struct smbprofile_stats_time name##_stats;
+#define SMBPROFILE_STATS_BASIC(name) \
+       struct smbprofile_stats_basic name##_stats;
+#define SMBPROFILE_STATS_BYTES(name) \
+       struct smbprofile_stats_bytes name##_stats;
+#define SMBPROFILE_STATS_IOBYTES(name) \
+       struct smbprofile_stats_iobytes name##_stats;
+#define SMBPROFILE_STATS_SECTION_END
+#define SMBPROFILE_STATS_END
+       SMBPROFILE_STATS_ALL_SECTIONS
+#undef SMBPROFILE_STATS_START
+#undef SMBPROFILE_STATS_SECTION_START
+#undef SMBPROFILE_STATS_COUNT
+#undef SMBPROFILE_STATS_TIME
+#undef SMBPROFILE_STATS_BASIC
+#undef SMBPROFILE_STATS_BYTES
+#undef SMBPROFILE_STATS_IOBYTES
+#undef SMBPROFILE_STATS_SECTION_END
+#undef SMBPROFILE_STATS_END
 };
 
+#define _SMBPROFILE_COUNT_INCREMENT(_stats, _area, _v) do { \
+       if (do_profile_flag) { \
+               (_area)->_stats.count += (_v); \
+       } \
+} while(0)
+#define SMBPROFILE_COUNT_INCREMENT(_name, _area, _v) \
+       _SMBPROFILE_COUNT_INCREMENT(_name##_stats, _area, _v)
+
+#define SMBPROFILE_TIME_ASYNC_STATE(_async_name) \
+       struct smbprofile_stats_time_async _async_name;
+#define _SMBPROFILE_TIME_ASYNC_START(_stats, _area, _async) do { \
+       (_async) = (struct smbprofile_stats_time_async) {}; \
+       if (smbprofile_state.config.do_times) { \
+               (_async).stats = &((_area)->_stats), \
+               (_async).start = profile_timestamp(); \
+       } \
+} while(0)
+#define SMBPROFILE_TIME_ASYNC_START(_name, _area, _async) \
+       _SMBPROFILE_TIME_ASYNC_START(_name##_stats, _area, _async)
+#define SMBPROFILE_TIME_ASYNC_END(_async) do { \
+       if ((_async).start != 0) { \
+               (_async).stats->time += profile_timestamp() - (_async).start; \
+               (_async) = (struct smbprofile_stats_basic_async) {}; \
+       } \
+} while(0)
+
+#define SMBPROFILE_BASIC_ASYNC_STATE(_async_name) \
+       struct smbprofile_stats_basic_async _async_name;
+#define _SMBPROFILE_BASIC_ASYNC_START(_stats, _area, _async) do { \
+       (_async) = (struct smbprofile_stats_basic_async) {}; \
+       if (do_profile_flag) { \
+               if (do_profile_times) { \
+                       (_async).start = profile_timestamp(); \
+                       (_async).stats = &((_area)->_stats); \
+               } \
+               (_area)->_stats.count += 1; \
+       } \
+} while(0)
+#define SMBPROFILE_BASIC_ASYNC_START(_name, _area, _async) \
+       _SMBPROFILE_BASIC_ASYNC_START(_name##_stats, _area, _async)
+#define SMBPROFILE_BASIC_ASYNC_END(_async) do { \
+       if ((_async).start != 0) { \
+               (_async).stats->time += profile_timestamp() - (_async).start; \
+               (_async) = (struct smbprofile_stats_basic_async) {}; \
+       } \
+} while(0)
+
+#define _SMBPROFILE_TIMER_ASYNC_START(_stats, _area, _async) do { \
+       (_async).stats = &((_area)->_stats); \
+       if (do_profile_times) { \
+               (_async).start = profile_timestamp(); \
+       } \
+} while(0)
+#define _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async) do { \
+       if ((_async).start != 0) { \
+               if ((_async).idle_start == 0) { \
+                       (_async).idle_start = profile_timestamp(); \
+               } \
+       } \
+} while(0)
+#define _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async) do { \
+       if ((_async).idle_start != 0) { \
+               (_async).idle_time += \
+                       profile_timestamp() - (_async).idle_start; \
+               (_async).idle_start = 0; \
+       } \
+} while(0)
+#define _SMBPROFILE_TIMER_ASYNC_END(_async) do { \
+       if ((_async).start != 0) { \
+               _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async); \
+               (_async).stats->time += profile_timestamp() - (_async).start; \
+               (_async).stats->idle += (_async).idle_time; \
+       } \
+} while(0)
+
+#define SMBPROFILE_BYTES_ASYNC_STATE(_async_name) \
+       struct smbprofile_stats_bytes_async _async_name;
+#define _SMBPROFILE_BYTES_ASYNC_START(_stats, _area, _async, _bytes) do { \
+       (_async) = (struct smbprofile_stats_bytes_async) {}; \
+       if (do_profile_flag) { \
+               _SMBPROFILE_TIMER_ASYNC_START(_stats, _area, _async); \
+               (_area)->_stats.count += 1; \
+               (_area)->_stats.bytes += (_bytes); \
+       } \
+} while(0)
+#define SMBPROFILE_BYTES_ASYNC_START(_name, _area, _async, _bytes) \
+       _SMBPROFILE_BYTES_ASYNC_START(_name##_stats, _area, _async, _bytes)
+#define SMBPROFILE_BYTES_ASYNC_SET_IDLE(_async) \
+       _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async)
+#define SMBPROFILE_BYTES_ASYNC_SET_BUSY(_async) \
+       _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async)
+#define SMBPROFILE_BYTES_ASYNC_END(_async) do { \
+       if ((_async).stats != NULL) { \
+               _SMBPROFILE_TIMER_ASYNC_END(_async); \
+               (_async) = (struct smbprofile_stats_bytes_async) {}; \
+       } \
+} while(0)
+
+#define SMBPROFILE_IOBYTES_ASYNC_STATE(_async_name) \
+       struct smbprofile_stats_iobytes_async _async_name;
+#define _SMBPROFILE_IOBYTES_ASYNC_START(_stats, _area, _async, _inbytes) do { \
+       (_async) = (struct smbprofile_stats_iobytes_async) {}; \
+       if (do_profile_flag) { \
+               _SMBPROFILE_TIMER_ASYNC_START(_stats, _area, _async); \
+               (_area)->_stats.count += 1; \
+               (_area)->_stats.inbytes += (_inbytes); \
+       } \
+} while(0)
+#define SMBPROFILE_IOBYTES_ASYNC_START(_name, _area, _async, _inbytes) \
+       _SMBPROFILE_IOBYTES_ASYNC_START(_name##_stats, _area, _async, _inbytes)
+#define SMBPROFILE_IOBYTES_ASYNC_SET_IDLE(_async) \
+       _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async)
+#define SMBPROFILE_IOBYTES_ASYNC_SET_BUSY(_async) \
+       _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async)
+#define SMBPROFILE_IOBYTES_ASYNC_END(_async, _outbytes) do { \
+       if ((_async).stats != NULL) { \
+               (_async).stats->outbytes += (_outbytes); \
+               _SMBPROFILE_TIMER_ASYNC_END(_async); \
+               (_async) = (struct smbprofile_stats_iobytes_async) {}; \
+       } \
+} while(0)
+
 extern struct profile_stats *profile_p;
 extern bool do_profile_flag;
 extern bool do_profile_times;
 
-/* these are helper macros - do not call them directly in the code
- * use the DO_PROFILE_* START_PROFILE and END_PROFILE ones
- * below which test for the profile flags first
- */
-#define INC_PROFILE_COUNT(x) profile_p->x++
-#define DEC_PROFILE_COUNT(x) profile_p->x--
-#define ADD_PROFILE_COUNT(x,y) profile_p->x += (y)
-
 static inline uint64_t profile_timestamp(void)
 {
        struct timespec ts;
@@ -831,72 +476,65 @@ static inline uint64_t profile_timestamp(void)
        return (ts.tv_sec * 1000000) + (ts.tv_nsec / 1000); /* usec */
 }
 
-/* end of helper macros */
-
 #define DO_PROFILE_INC(x) \
-       if (do_profile_flag) { \
-               INC_PROFILE_COUNT(x); \
-       }
+       _SMBPROFILE_COUNT_INCREMENT(x##_stats, profile_p, 1); \
 
-#define DO_PROFILE_DEC(x) \
-       if (do_profile_flag) { \
-               DEC_PROFILE_COUNT(x); \
-       }
-
-#define DO_PROFILE_DEC_INC(x,y) \
-       if (do_profile_flag) { \
-               DEC_PROFILE_COUNT(x); \
-               INC_PROFILE_COUNT(y); \
-       }
-
-#define DO_PROFILE_ADD(x,n) \
-       if (do_profile_flag) { \
-               ADD_PROFILE_COUNT(x,n); \
-       }
-
-#define START_PROFILE_RAW(x, _stamp, _count) \
-       _stamp = 0; \
-       if (do_profile_flag) { \
-               _stamp = do_profile_times ? profile_timestamp() : 0;\
-               INC_PROFILE_COUNT(_count); \
-       }
-
-#define START_PROFILE_STAMP(x, _stamp) \
-       START_PROFILE_RAW(x, _stamp, x##_count)
+#define START_PROFILE_STAMP(x, _stamp) do { \
+       struct smbprofile_stats_basic_async __profasync_##x = {}; \
+       _SMBPROFILE_BASIC_ASYNC_START(x##_stats, profile_p, __profasync_##x); \
+       _stamp = __profasync_##x.start; \
+} while(0)
 
 #define START_PROFILE(x) \
-       uint64_t __profstamp_##x = 0; \
-       START_PROFILE_RAW(x, __profstamp_##x, x##_count)
+       struct smbprofile_stats_basic_async __profasync_##x = {}; \
+       _SMBPROFILE_BASIC_ASYNC_START(x##_stats, profile_p, __profasync_##x);
 
 #define START_PROFILE_BYTES(x,n) \
-       uint64_t __profstamp_##x = 0; \
-       if (do_profile_flag) { \
-               __profstamp_##x = do_profile_times ? profile_timestamp() : 0;\
-               INC_PROFILE_COUNT(x##_count); \
-               ADD_PROFILE_COUNT(x##_bytes, n); \
-       }
-
-#define END_PROFILE_RAW(x, _stamp, _time) \
-       if (do_profile_times) { \
-               ADD_PROFILE_COUNT(_time, \
-                   profile_timestamp() - _stamp); \
-       }
-
-#define END_PROFILE_STAMP(x, _stamp) \
-       END_PROFILE_RAW(x, _stamp, x##_time)
+       struct smbprofile_stats_bytes_async __profasync_##x = {}; \
+       _SMBPROFILE_BYTES_ASYNC_START(x##_stats, profile_p, __profasync_##x, n);
+
+#define END_PROFILE_STAMP(x, _stamp) do { \
+       struct smbprofile_stats_basic_async __profasync_##x = {}; \
+       if (do_profile_flag && do_profile_times) { \
+               __profasync_##x = (struct smbprofile_stats_basic_async) { \
+                       .start = (_stamp), \
+                       .stats = &(profile_p->x##_stats), \
+               }; \
+       } \
+       SMBPROFILE_BASIC_ASYNC_END(__profasync_##x); \
+} while(0)
 
 #define END_PROFILE(x) \
-       END_PROFILE_RAW(x, __profstamp_##x, x##_time)
+       SMBPROFILE_BASIC_ASYNC_END(__profasync_##x)
 
 #define END_PROFILE_BYTES(x) \
-       END_PROFILE_RAW(x, __profstamp_##x, x##_time)
+       SMBPROFILE_BYTES_ASYNC_END(__profasync_##x)
 
 #else /* WITH_PROFILE */
 
+#define SMBPROFILE_COUNT_INCREMENT(_name, _area, _v)
+
+#define SMBPROFILE_TIME_ASYNC_STATE(_async_name)
+#define SMBPROFILE_TIME_ASYNC_START(_name, _area, _async)
+#define SMBPROFILE_TIME_ASYNC_END(_async)
+
+#define SMBPROFILE_BASIC_ASYNC_STATE(_async_name)
+#define SMBPROFILE_BASIC_ASYNC_START(_name, _area, _async)
+#define SMBPROFILE_BASIC_ASYNC_END(_async)
+
+#define SMBPROFILE_BYTES_ASYNC_STATE(_async_name)
+#define SMBPROFILE_BYTES_ASYNC_START(_name, _area, _async, _inbytes)
+#define SMBPROFILE_BYTES_ASYNC_SET_IDLE(_async)
+#define SMBPROFILE_BYTES_ASYNC_SET_BUSY(_async)
+#define SMBPROFILE_BYTES_ASYNC_END(_async)
+
+#define SMBPROFILE_IOBYTES_ASYNC_STATE(_async_name)
+#define SMBPROFILE_IOBYTES_ASYNC_START(_name, _area, _async, _inbytes)
+#define SMBPROFILE_IOBYTES_ASYNC_SET_IDLE(_async)
+#define SMBPROFILE_IOBYTES_ASYNC_SET_BUSY(_async)
+#define SMBPROFILE_IOBYTES_ASYNC_END(_async, _outbytes)
+
 #define DO_PROFILE_INC(x)
-#define DO_PROFILE_DEC(x)
-#define DO_PROFILE_DEC_INC(x,y)
-#define DO_PROFILE_ADD(x,n)
 #define START_PROFILE_STAMP(x, _stamp)
 #define START_PROFILE(x)
 #define START_PROFILE_BYTES(x,n)
index faeae7abb5878385ab0243cf40cdea2aec2d5b76..c720638502783126045d351b41ab9031a8057034 100644 (file)
@@ -27,7 +27,7 @@
 
 #define PROF_SHMEM_KEY ((key_t)0x07021999)
 #define PROF_SHM_MAGIC 0x6349985
-#define PROF_SHM_VERSION 14
+#define PROF_SHM_VERSION 15
 
 #define IPC_PERMS ((S_IRUSR | S_IWUSR) | S_IRGRP | S_IROTH)
 
@@ -194,190 +194,3 @@ bool profile_setup(struct messaging_context *msg_ctx, bool rdonly)
        }
        return True;
 }
-
- const char * profile_value_name(enum profile_stats_values val)
-{
-       static const char * valnames[PR_VALUE_MAX + 1] =
-       {
-           "smbd_idle",                /* PR_VALUE_SMBD_IDLE */
-           "syscall_opendir",          /* PR_VALUE_SYSCALL_OPENDIR */
-           "syscall_readdir",          /* PR_VALUE_SYSCALL_READDIR */
-           "syscall_seekdir",          /* PR_VALUE_SYSCALL_SEEKDIR */
-           "syscall_telldir",          /* PR_VALUE_SYSCALL_TELLDIR */
-           "syscall_rewinddir",        /* PR_VALUE_SYSCALL_REWINDDIR */
-           "syscall_mkdir",            /* PR_VALUE_SYSCALL_MKDIR */
-           "syscall_rmdir",            /* PR_VALUE_SYSCALL_RMDIR */
-           "syscall_closedir",         /* PR_VALUE_SYSCALL_CLOSEDIR */
-           "syscall_open",             /* PR_VALUE_SYSCALL_OPEN */
-           "syscall_createfile",       /* PR_VALUE_SYSCALL_CREATEFILE */
-           "syscall_close",            /* PR_VALUE_SYSCALL_CLOSE */
-           "syscall_read",             /* PR_VALUE_SYSCALL_READ */
-           "syscall_pread",            /* PR_VALUE_SYSCALL_PREAD */
-           "syscall_write",            /* PR_VALUE_SYSCALL_WRITE */
-           "syscall_pwrite",           /* PR_VALUE_SYSCALL_PWRITE */
-           "syscall_lseek",            /* PR_VALUE_SYSCALL_LSEEK */
-           "syscall_sendfile",         /* PR_VALUE_SYSCALL_SENDFILE */
-           "syscall_recvfile",         /* PR_VALUE_SYSCALL_RECVFILE */
-           "syscall_rename",           /* PR_VALUE_SYSCALL_RENAME */
-           "syscall_rename_at",        /* PR_VALUE_SYSCALL_RENAME_AT */
-           "syscall_fsync",            /* PR_VALUE_SYSCALL_FSYNC */
-           "syscall_stat",             /* PR_VALUE_SYSCALL_STAT */
-           "syscall_fstat",            /* PR_VALUE_SYSCALL_FSTAT */
-           "syscall_lstat",            /* PR_VALUE_SYSCALL_LSTAT */
-           "syscall_unlink",           /* PR_VALUE_SYSCALL_UNLINK */
-           "syscall_chmod",            /* PR_VALUE_SYSCALL_CHMOD */
-           "syscall_fchmod",           /* PR_VALUE_SYSCALL_FCHMOD */
-           "syscall_chown",            /* PR_VALUE_SYSCALL_CHOWN */
-           "syscall_fchown",           /* PR_VALUE_SYSCALL_FCHOWN */
-           "syscall_chdir",            /* PR_VALUE_SYSCALL_CHDIR */
-           "syscall_getwd",            /* PR_VALUE_SYSCALL_GETWD */
-           "syscall_ntimes",           /* PR_VALUE_SYSCALL_NTIMES */
-           "syscall_ftruncate",        /* PR_VALUE_SYSCALL_FTRUNCATE */
-           "syscall_fallocate",        /* PR_VALUE_SYSCALL_FALLOCATE */
-           "syscall_fcntl_lock",       /* PR_VALUE_SYSCALL_FCNTL_LOCK */
-           "syscall_kernel_flock",     /* PR_VALUE_SYSCALL_KERNEL_FLOCK */
-           "syscall_linux_setlease",   /* PR_VALUE_SYSCALL_LINUX_SETLEASE */
-           "syscall_fcntl_getlock",    /* PR_VALUE_SYSCALL_FCNTL_GETLOCK */
-           "syscall_readlink",         /* PR_VALUE_SYSCALL_READLINK */
-           "syscall_symlink",          /* PR_VALUE_SYSCALL_SYMLINK */
-           "syscall_link",             /* PR_VALUE_SYSCALL_LINK */
-           "syscall_mknod",            /* PR_VALUE_SYSCALL_MKNOD */
-           "syscall_realpath",         /* PR_VALUE_SYSCALL_REALPATH */
-           "syscall_get_quota",        /* PR_VALUE_SYSCALL_GET_QUOTA */
-           "syscall_set_quota",        /* PR_VALUE_SYSCALL_SET_QUOTA */
-           "syscall_get_sd",           /* PR_VALUE_SYSCALL_GET_SD */
-           "syscall_set_sd",           /* PR_VALUE_SYSCALL_SET_SD */
-           "syscall_brl_lock",         /* PR_VALUE_SYSCALL_BRL_LOCK */
-           "syscall_brl_unlock",       /* PR_VALUE_SYSCALL_BRL_UNLOCK */
-           "syscall_brl_cancel",       /* PR_VALUE_SYSCALL_BRL_CANCEL */
-           "SMBmkdir",         /* PR_VALUE_SMBMKDIR */
-           "SMBrmdir",         /* PR_VALUE_SMBRMDIR */
-           "SMBopen",          /* PR_VALUE_SMBOPEN */
-           "SMBcreate",        /* PR_VALUE_SMBCREATE */
-           "SMBclose",         /* PR_VALUE_SMBCLOSE */
-           "SMBflush",         /* PR_VALUE_SMBFLUSH */
-           "SMBunlink",        /* PR_VALUE_SMBUNLINK */
-           "SMBmv",            /* PR_VALUE_SMBMV */
-           "SMBgetatr",        /* PR_VALUE_SMBGETATR */
-           "SMBsetatr",        /* PR_VALUE_SMBSETATR */
-           "SMBread",          /* PR_VALUE_SMBREAD */
-           "SMBwrite",         /* PR_VALUE_SMBWRITE */
-           "SMBlock",          /* PR_VALUE_SMBLOCK */
-           "SMBunlock",        /* PR_VALUE_SMBUNLOCK */
-           "SMBctemp",         /* PR_VALUE_SMBCTEMP */
-           "SMBmknew",         /* PR_VALUE_SMBMKNEW */
-           "SMBcheckpath",     /* PR_VALUE_SMBCHECKPATH */
-           "SMBexit",          /* PR_VALUE_SMBEXIT */
-           "SMBlseek",         /* PR_VALUE_SMBLSEEK */
-           "SMBlockread",              /* PR_VALUE_SMBLOCKREAD */
-           "SMBwriteunlock",           /* PR_VALUE_SMBWRITEUNLOCK */
-           "SMBreadbraw",              /* PR_VALUE_SMBREADBRAW */
-           "SMBreadBmpx",              /* PR_VALUE_SMBREADBMPX */
-           "SMBreadBs",                /* PR_VALUE_SMBREADBS */
-           "SMBwritebraw",             /* PR_VALUE_SMBWRITEBRAW */
-           "SMBwriteBmpx",             /* PR_VALUE_SMBWRITEBMPX */
-           "SMBwriteBs",               /* PR_VALUE_SMBWRITEBS */
-           "SMBwritec",                /* PR_VALUE_SMBWRITEC */
-           "SMBsetattrE",              /* PR_VALUE_SMBSETATTRE */
-           "SMBgetattrE",              /* PR_VALUE_SMBGETATTRE */
-           "SMBlockingX",              /* PR_VALUE_SMBLOCKINGX */
-           "SMBtrans",         /* PR_VALUE_SMBTRANS */
-           "SMBtranss",        /* PR_VALUE_SMBTRANSS */
-           "SMBioctl",         /* PR_VALUE_SMBIOCTL */
-           "SMBioctls",        /* PR_VALUE_SMBIOCTLS */
-           "SMBcopy",          /* PR_VALUE_SMBCOPY */
-           "SMBmove",          /* PR_VALUE_SMBMOVE */
-           "SMBecho",          /* PR_VALUE_SMBECHO */
-           "SMBwriteclose",    /* PR_VALUE_SMBWRITECLOSE */
-           "SMBopenX",         /* PR_VALUE_SMBOPENX */
-           "SMBreadX",         /* PR_VALUE_SMBREADX */
-           "SMBwriteX",        /* PR_VALUE_SMBWRITEX */
-           "SMBtrans2",        /* PR_VALUE_SMBTRANS2 */
-           "SMBtranss2",       /* PR_VALUE_SMBTRANSS2 */
-           "SMBfindclose",     /* PR_VALUE_SMBFINDCLOSE */
-           "SMBfindnclose",    /* PR_VALUE_SMBFINDNCLOSE */
-           "SMBtcon",          /* PR_VALUE_SMBTCON */
-           "SMBtdis",          /* PR_VALUE_SMBTDIS */
-           "SMBnegprot",       /* PR_VALUE_SMBNEGPROT */
-           "SMBsesssetupX",    /* PR_VALUE_SMBSESSSETUPX */
-           "SMBulogoffX",      /* PR_VALUE_SMBULOGOFFX */
-           "SMBtconX",         /* PR_VALUE_SMBTCONX */
-           "SMBdskattr",               /* PR_VALUE_SMBDSKATTR */
-           "SMBsearch",                /* PR_VALUE_SMBSEARCH */
-           "SMBffirst",                /* PR_VALUE_SMBFFIRST */
-           "SMBfunique",               /* PR_VALUE_SMBFUNIQUE */
-           "SMBfclose",                /* PR_VALUE_SMBFCLOSE */
-           "SMBnttrans",               /* PR_VALUE_SMBNTTRANS */
-           "SMBnttranss",              /* PR_VALUE_SMBNTTRANSS */
-           "SMBntcreateX",             /* PR_VALUE_SMBNTCREATEX */
-           "SMBntcancel",              /* PR_VALUE_SMBNTCANCEL */
-           "SMBntrename",              /* PR_VALUE_SMBNTRENAME */
-           "SMBsplopen",               /* PR_VALUE_SMBSPLOPEN */
-           "SMBsplwr",                 /* PR_VALUE_SMBSPLWR */
-           "SMBsplclose",              /* PR_VALUE_SMBSPLCLOSE */
-           "SMBsplretq",               /* PR_VALUE_SMBSPLRETQ */
-           "SMBsends",                 /* PR_VALUE_SMBSENDS */
-           "SMBsendb",                 /* PR_VALUE_SMBSENDB */
-           "SMBfwdname",               /* PR_VALUE_SMBFWDNAME */
-           "SMBcancelf",               /* PR_VALUE_SMBCANCELF */
-           "SMBgetmac",                /* PR_VALUE_SMBGETMAC */
-           "SMBsendstrt",              /* PR_VALUE_SMBSENDSTRT */
-           "SMBsendend",               /* PR_VALUE_SMBSENDEND */
-           "SMBsendtxt",               /* PR_VALUE_SMBSENDTXT */
-           "SMBinvalid",               /* PR_VALUE_SMBINVALID */
-           "Trans2_open",              /* PR_VALUE_TRANS2_OPEN */
-           "Trans2_findfirst",         /* PR_VALUE_TRANS2_FINDFIRST */
-           "Trans2_findnext",          /* PR_VALUE_TRANS2_FINDNEXT */
-           "Trans2_qfsinfo",           /* PR_VALUE_TRANS2_QFSINFO */
-           "Trans2_setfsinfo",         /* PR_VALUE_TRANS2_SETFSINFO */
-           "Trans2_qpathinfo",         /* PR_VALUE_TRANS2_QPATHINFO */
-           "Trans2_setpathinfo",       /* PR_VALUE_TRANS2_SETPATHINFO */
-           "Trans2_qfileinfo",         /* PR_VALUE_TRANS2_QFILEINFO */
-           "Trans2_setfileinfo",       /* PR_VALUE_TRANS2_SETFILEINFO */
-           "Trans2_fsctl",             /* PR_VALUE_TRANS2_FSCTL */
-           "Trans2_ioctl",             /* PR_VALUE_TRANS2_IOCTL */
-           "Trans2_findnotifyfirst",   /* PR_VALUE_TRANS2_FINDNOTIFYFIRST */
-           "Trans2_findnotifynext",    /* PR_VALUE_TRANS2_FINDNOTIFYNEXT */
-           "Trans2_mkdir",             /* PR_VALUE_TRANS2_MKDIR */
-           "Trans2_session_setup",     /* PR_VALUE_TRANS2_SESSION_SETUP */
-           "Trans2_get_dfs_referral",  /* PR_VALUE_TRANS2_GET_DFS_REFERRAL */
-           "Trans2_report_dfs_inconsistancy",  /* PR_VALUE_TRANS2_REPORT_DFS_INCONSISTANCY */
-           "NT_transact_create",       /* PR_VALUE_NT_TRANSACT_CREATE */
-           "NT_transact_ioctl",        /* PR_VALUE_NT_TRANSACT_IOCTL */
-           "NT_transact_set_security_desc",    /* PR_VALUE_NT_TRANSACT_SET_SECURITY_DESC */
-           "NT_transact_notify_change",/* PR_VALUE_NT_TRANSACT_NOTIFY_CHANGE */
-           "NT_transact_rename",       /* PR_VALUE_NT_TRANSACT_RENAME */
-           "NT_transact_query_security_desc",  /* PR_VALUE_NT_TRANSACT_QUERY_SECURITY_DESC */
-           "NT_transact_get_user_quota",/* PR_VALUE_NT_TRANSACT_GET_USER_QUOTA */
-           "NT_transact_set_user_quota",/* PR_VALUE_NT_TRANSACT_SET_USER_QUOTA */
-           "get_nt_acl",               /* PR_VALUE_GET_NT_ACL */
-           "fget_nt_acl",              /* PR_VALUE_FGET_NT_ACL */
-           "fset_nt_acl",              /* PR_VALUE_FSET_NT_ACL */
-           "chmod_acl",                /* PR_VALUE_CHMOD_ACL */
-           "fchmod_acl",               /* PR_VALUE_FCHMOD_ACL */
-           "smb2_negprot",             /* PR_VALUE_SMB2_NEGPROT */
-           "smb2_sesssetup",           /* PR_VALUE_SMB2_SESSETUP */
-           "smb2_logoff",              /* PR_VALUE_SMB2_LOGOFF */
-           "smb2_tcon",                /* PR_VALUE_SMB2_TCON */
-           "smb2_tdis",                /* PR_VALUE_SMB2_TDIS */
-           "smb2_create",              /* PR_VALUE_SMB2_CREATE */
-           "smb2_close",               /* PR_VALUE_SMB2_CLOSE */
-           "smb2_flush",               /* PR_VALUE_SMB2_FLUSH */
-           "smb2_read",                /* PR_VALUE_SMB2_READ */
-           "smb2_write",               /* PR_VALUE_SMB2_WRITE */
-           "smb2_lock",                /* PR_VALUE_SMB2_LOCK */
-           "smb2_ioctl",               /* PR_VALUE_SMB2_IOCTL */
-           "smb2_cancel",              /* PR_VALUE_SMB2_CANCEL */
-           "smb2_keepalive",           /* PR_VALUE_SMB2_KEEPALIVE */
-           "smb2_find",                /* PR_VALUE_SMB2_FIND */
-           "smb2_notify",              /* PR_VALUE_SMB2_NOTIFY */
-           "smb2_getinfo",             /* PR_VALUE_SMB2_GETINFO */
-           "smb2_setinfo"              /* PR_VALUE_SMB2_SETINFO */
-           "smb2_break",               /* PR_VALUE_SMB2_BREAK */
-           "" /* PR_VALUE_MAX */
-       };
-
-       SMB_ASSERT(val >= 0);
-       SMB_ASSERT(val < PR_VALUE_MAX);
-       return valnames[val];
-}
index 059d321780e8a303ecd2fa25e28d1f4ebda71da3..f0cf405e18515ee5fe66956d361946f6775adf70 100644 (file)
@@ -47,686 +47,49 @@ bool status_profile_dump(bool verbose)
                return False;
        }
 
-       d_printf("smb_count:                      %u\n",
-                profile_p->smb_count);
-       d_printf("uid_changes:                    %u\n",
-                profile_p->uid_changes);
-
-       profile_separator("System Calls");
-       d_printf("opendir_count:                  %u\n",
-                profile_p->syscall_opendir_count);
-       d_printf("opendir_time:                   %u\n",
-                profile_p->syscall_opendir_time);
-       d_printf("fdopendir_count:                %u\n",
-                profile_p->syscall_fdopendir_count);
-       d_printf("fdopendir_time:                 %u\n",
-                profile_p->syscall_fdopendir_time);
-       d_printf("readdir_count:                  %u\n",
-                profile_p->syscall_readdir_count);
-       d_printf("readdir_time:                   %u\n",
-                profile_p->syscall_readdir_time);
-       d_printf("mkdir_count:                    %u\n",
-                profile_p->syscall_mkdir_count);
-       d_printf("mkdir_time:                     %u\n",
-                profile_p->syscall_mkdir_time);
-       d_printf("rmdir_count:                    %u\n",
-                profile_p->syscall_rmdir_count);
-       d_printf("rmdir_time:                     %u\n",
-                profile_p->syscall_rmdir_time);
-       d_printf("closedir_count:                 %u\n",
-                profile_p->syscall_closedir_count);
-       d_printf("closedir_time:                  %u\n",
-                profile_p->syscall_closedir_time);
-       d_printf("open_count:                     %u\n",
-                profile_p->syscall_open_count);
-       d_printf("open_time:                      %u\n",
-                profile_p->syscall_open_time);
-       d_printf("close_count:                    %u\n",
-                profile_p->syscall_close_count);
-       d_printf("close_time:                     %u\n",
-                profile_p->syscall_close_time);
-       d_printf("read_count:                     %u\n",
-                profile_p->syscall_read_count);
-       d_printf("read_time:                      %u\n",
-                profile_p->syscall_read_time);
-       d_printf("read_bytes:                     %u\n",
-                profile_p->syscall_read_bytes);
-       d_printf("write_count:                    %u\n",
-                profile_p->syscall_write_count);
-       d_printf("write_time:                     %u\n",
-                profile_p->syscall_write_time);
-       d_printf("write_bytes:                    %u\n",
-                profile_p->syscall_write_bytes);
-       d_printf("pread_count:                    %u\n",
-                profile_p->syscall_pread_count);
-       d_printf("pread_time:                     %u\n",
-                profile_p->syscall_pread_time);
-       d_printf("pread_bytes:                    %u\n",
-                profile_p->syscall_pread_bytes);
-       d_printf("pwrite_count:                   %u\n",
-                profile_p->syscall_pwrite_count);
-       d_printf("pwrite_time:                    %u\n",
-                profile_p->syscall_pwrite_time);
-       d_printf("pwrite_bytes:                   %u\n",
-                profile_p->syscall_pwrite_bytes);
-       d_printf("sendfile_count:                 %u\n",
-                profile_p->syscall_sendfile_count);
-       d_printf("sendfile_time:                  %u\n",
-                profile_p->syscall_sendfile_time);
-       d_printf("sendfile_bytes:                 %u\n",
-                profile_p->syscall_sendfile_bytes);
-       d_printf("lseek_count:                    %u\n",
-                profile_p->syscall_lseek_count);
-       d_printf("lseek_time:                     %u\n",
-                profile_p->syscall_lseek_time);
-       d_printf("rename_count:                   %u\n",
-                profile_p->syscall_rename_count);
-       d_printf("rename_time:                    %u\n",
-                profile_p->syscall_rename_time);
-       d_printf("fsync_count:                    %u\n",
-                profile_p->syscall_fsync_count);
-       d_printf("fsync_time:                     %u\n",
-                profile_p->syscall_fsync_time);
-       d_printf("stat_count:                     %u\n",
-                profile_p->syscall_stat_count);
-       d_printf("stat_time:                      %u\n",
-                profile_p->syscall_stat_time);
-       d_printf("fstat_count:                    %u\n",
-                profile_p->syscall_fstat_count);
-       d_printf("fstat_time:                     %u\n",
-                profile_p->syscall_fstat_time);
-       d_printf("lstat_count:                    %u\n",
-                profile_p->syscall_lstat_count);
-       d_printf("lstat_time:                     %u\n",
-                profile_p->syscall_lstat_time);
-       d_printf("unlink_count:                   %u\n",
-                profile_p->syscall_unlink_count);
-       d_printf("unlink_time:                    %u\n",
-                profile_p->syscall_unlink_time);
-       d_printf("chmod_count:                    %u\n",
-                profile_p->syscall_chmod_count);
-       d_printf("chmod_time:                     %u\n",
-                profile_p->syscall_chmod_time);
-       d_printf("fchmod_count:                   %u\n",
-                profile_p->syscall_fchmod_count);
-       d_printf("fchmod_time:                    %u\n",
-                profile_p->syscall_fchmod_time);
-       d_printf("chown_count:                    %u\n",
-                profile_p->syscall_chown_count);
-       d_printf("chown_time:                     %u\n",
-                profile_p->syscall_chown_time);
-       d_printf("fchown_count:                   %u\n",
-                profile_p->syscall_fchown_count);
-       d_printf("fchown_time:                    %u\n",
-                profile_p->syscall_fchown_time);
-       d_printf("chdir_count:                    %u\n",
-                profile_p->syscall_chdir_count);
-       d_printf("chdir_time:                     %u\n",
-                profile_p->syscall_chdir_time);
-       d_printf("getwd_count:                    %u\n",
-                profile_p->syscall_getwd_count);
-       d_printf("getwd_time:                     %u\n",
-                profile_p->syscall_getwd_time);
-       d_printf("ntimes_count:                   %u\n",
-                profile_p->syscall_ntimes_count);
-       d_printf("ntimes_time:                    %u\n",
-                profile_p->syscall_ntimes_time);
-       d_printf("ftruncate_count:                %u\n",
-                profile_p->syscall_ftruncate_count);
-       d_printf("ftruncate_time:                 %u\n",
-                profile_p->syscall_ftruncate_time);
-       d_printf("fcntl_lock_count:               %u\n",
-                profile_p->syscall_fcntl_lock_count);
-       d_printf("fcntl_lock_time:                %u\n",
-                profile_p->syscall_fcntl_lock_time);
-       d_printf("readlink_count:                 %u\n",
-                profile_p->syscall_readlink_count);
-       d_printf("readlink_time:                  %u\n",
-                profile_p->syscall_readlink_time);
-       d_printf("symlink_count:                  %u\n",
-                profile_p->syscall_symlink_count);
-       d_printf("symlink_time:                   %u\n",
-                profile_p->syscall_symlink_time);
-
-       profile_separator("Stat Cache");
-       d_printf("lookups:                        %u\n",
-                profile_p->statcache_lookups);
-       d_printf("misses:                         %u\n",
-                profile_p->statcache_misses);
-       d_printf("hits:                           %u\n",
-                profile_p->statcache_hits);
-
-       profile_separator("Write Cache");
-       d_printf("allocations:                    %u\n",
-                profile_p->writecache_allocations);
-       d_printf("deallocations:                  %u\n",
-                profile_p->writecache_deallocations);
-       d_printf("cached_reads:                   %u\n",
-                profile_p->writecache_cached_reads);
-       d_printf("total_writes:                   %u\n",
-                profile_p->writecache_total_writes);
-       d_printf("init_writes:                    %u\n",
-                profile_p->writecache_init_writes);
-       d_printf("abutted_writes:                 %u\n",
-                profile_p->writecache_abutted_writes);
-       d_printf("non_oplock_writes:              %u\n",
-                profile_p->writecache_non_oplock_writes);
-       d_printf("direct_writes:                  %u\n",
-                profile_p->writecache_direct_writes);
-       d_printf("cached_writes:                  %u\n",
-                profile_p->writecache_cached_writes);
-       d_printf("perfect_writes:                 %u\n",
-                profile_p->writecache_perfect_writes);
-       d_printf("flush_reason_seek:              %u\n",
-                profile_p->writecache_flush_reason_seek);
-       d_printf("flush_reason_read:              %u\n",
-                profile_p->writecache_flush_reason_read);
-       d_printf("flush_reason_readraw:           %u\n",
-                profile_p->writecache_flush_reason_readraw);
-       d_printf("flush_reason_write:             %u\n",
-                profile_p->writecache_flush_reason_write);
-       d_printf("flush_reason_oplock:            %u\n",
-                profile_p->writecache_flush_reason_oplock);
-       d_printf("flush_reason_close:             %u\n",
-                profile_p->writecache_flush_reason_close);
-       d_printf("flush_reason_sync:              %u\n",
-                profile_p->writecache_flush_reason_sync);
-       d_printf("flush_reason_sizechange:        %u\n",
-                profile_p->writecache_flush_reason_sizechange);
-
-       profile_separator("SMB Calls");
-       d_printf("mkdir_count:                    %u\n",
-                profile_p->SMBmkdir_count);
-       d_printf("mkdir_time:                     %u\n",
-                profile_p->SMBmkdir_time);
-       d_printf("rmdir_count:                    %u\n",
-                profile_p->SMBrmdir_count);
-       d_printf("rmdir_time:                     %u\n",
-                profile_p->SMBrmdir_time);
-       d_printf("open_count:                     %u\n",
-                profile_p->SMBopen_count);
-       d_printf("open_time:                      %u\n",
-                profile_p->SMBopen_time);
-       d_printf("create_count:                   %u\n",
-                profile_p->SMBcreate_count);
-       d_printf("create_time:                    %u\n",
-                profile_p->SMBcreate_time);
-       d_printf("close_count:                    %u\n",
-                profile_p->SMBclose_count);
-       d_printf("close_time:                     %u\n",
-                profile_p->SMBclose_time);
-       d_printf("flush_count:                    %u\n",
-                profile_p->SMBflush_count);
-       d_printf("flush_time:                     %u\n",
-                profile_p->SMBflush_time);
-       d_printf("unlink_count:                   %u\n",
-                profile_p->SMBunlink_count);
-       d_printf("unlink_time:                    %u\n",
-                profile_p->SMBunlink_time);
-       d_printf("mv_count:                       %u\n",
-                profile_p->SMBmv_count);
-       d_printf("mv_time:                        %u\n",
-                profile_p->SMBmv_time);
-       d_printf("getatr_count:                   %u\n",
-                profile_p->SMBgetatr_count);
-       d_printf("getatr_time:                    %u\n",
-                profile_p->SMBgetatr_time);
-       d_printf("setatr_count:                   %u\n",
-                profile_p->SMBsetatr_count);
-       d_printf("setatr_time:                    %u\n",
-                profile_p->SMBsetatr_time);
-       d_printf("read_count:                     %u\n",
-                profile_p->SMBread_count);
-       d_printf("read_time:                      %u\n",
-                profile_p->SMBread_time);
-       d_printf("write_count:                    %u\n",
-                profile_p->SMBwrite_count);
-       d_printf("write_time:                     %u\n",
-                profile_p->SMBwrite_time);
-       d_printf("lock_count:                     %u\n",
-                profile_p->SMBlock_count);
-       d_printf("lock_time:                      %u\n",
-                profile_p->SMBlock_time);
-       d_printf("unlock_count:                   %u\n",
-                profile_p->SMBunlock_count);
-       d_printf("unlock_time:                    %u\n",
-                profile_p->SMBunlock_time);
-       d_printf("ctemp_count:                    %u\n",
-                profile_p->SMBctemp_count);
-       d_printf("ctemp_time:                     %u\n",
-                profile_p->SMBctemp_time);
-       d_printf("mknew_count:                    %u\n",
-                profile_p->SMBmknew_count);
-       d_printf("mknew_time:                     %u\n",
-                profile_p->SMBmknew_time);
-       d_printf("checkpath_count:                %u\n",
-                profile_p->SMBcheckpath_count);
-       d_printf("checkpath_time:                 %u\n",
-                profile_p->SMBcheckpath_time);
-       d_printf("exit_count:                     %u\n",
-                profile_p->SMBexit_count);
-       d_printf("exit_time:                      %u\n",
-                profile_p->SMBexit_time);
-       d_printf("lseek_count:                    %u\n",
-                profile_p->SMBlseek_count);
-       d_printf("lseek_time:                     %u\n",
-                profile_p->SMBlseek_time);
-       d_printf("lockread_count:                 %u\n",
-                profile_p->SMBlockread_count);
-       d_printf("lockread_time:                  %u\n",
-                profile_p->SMBlockread_time);
-       d_printf("writeunlock_count:              %u\n",
-                profile_p->SMBwriteunlock_count);
-       d_printf("writeunlock_time:               %u\n",
-                profile_p->SMBwriteunlock_time);
-       d_printf("readbraw_count:                 %u\n",
-                profile_p->SMBreadbraw_count);
-       d_printf("readbraw_time:                  %u\n",
-                profile_p->SMBreadbraw_time);
-       d_printf("readBmpx_count:                 %u\n",
-                profile_p->SMBreadBmpx_count);
-       d_printf("readBmpx_time:                  %u\n",
-                profile_p->SMBreadBmpx_time);
-       d_printf("readBs_count:                   %u\n",
-                profile_p->SMBreadBs_count);
-       d_printf("readBs_time:                    %u\n",
-                profile_p->SMBreadBs_time);
-       d_printf("writebraw_count:                %u\n",
-                profile_p->SMBwritebraw_count);
-       d_printf("writebraw_time:                 %u\n",
-                profile_p->SMBwritebraw_time);
-       d_printf("writeBmpx_count:                %u\n",
-                profile_p->SMBwriteBmpx_count);
-       d_printf("writeBmpx_time:                 %u\n",
-                profile_p->SMBwriteBmpx_time);
-       d_printf("writeBs_count:                  %u\n",
-                profile_p->SMBwriteBs_count);
-       d_printf("writeBs_time:                   %u\n",
-                profile_p->SMBwriteBs_time);
-       d_printf("writec_count:                   %u\n",
-                profile_p->SMBwritec_count);
-       d_printf("writec_time:                    %u\n",
-                profile_p->SMBwritec_time);
-       d_printf("setattrE_count:                 %u\n",
-                profile_p->SMBsetattrE_count);
-       d_printf("setattrE_time:                  %u\n",
-                profile_p->SMBsetattrE_time);
-       d_printf("getattrE_count:                 %u\n",
-                profile_p->SMBgetattrE_count);
-       d_printf("getattrE_time:                  %u\n",
-                profile_p->SMBgetattrE_time);
-       d_printf("lockingX_count:                 %u\n",
-                profile_p->SMBlockingX_count);
-       d_printf("lockingX_time:                  %u\n",
-                profile_p->SMBlockingX_time);
-       d_printf("trans_count:                    %u\n",
-                profile_p->SMBtrans_count);
-       d_printf("trans_time:                     %u\n",
-                profile_p->SMBtrans_time);
-       d_printf("transs_count:                   %u\n",
-                profile_p->SMBtranss_count);
-       d_printf("transs_time:                    %u\n",
-                profile_p->SMBtranss_time);
-       d_printf("ioctl_count:                    %u\n",
-                profile_p->SMBioctl_count);
-       d_printf("ioctl_time:                     %u\n",
-                profile_p->SMBioctl_time);
-       d_printf("ioctls_count:                   %u\n",
-                profile_p->SMBioctls_count);
-       d_printf("ioctls_time:                    %u\n",
-                profile_p->SMBioctls_time);
-       d_printf("copy_count:                     %u\n",
-                profile_p->SMBcopy_count);
-       d_printf("copy_time:                      %u\n",
-                profile_p->SMBcopy_time);
-       d_printf("move_count:                     %u\n",
-                profile_p->SMBmove_count);
-       d_printf("move_time:                      %u\n",
-                profile_p->SMBmove_time);
-       d_printf("echo_count:                     %u\n",
-                profile_p->SMBecho_count);
-       d_printf("echo_time:                      %u\n",
-                profile_p->SMBecho_time);
-       d_printf("writeclose_count:               %u\n",
-                profile_p->SMBwriteclose_count);
-       d_printf("writeclose_time:                %u\n",
-                profile_p->SMBwriteclose_time);
-       d_printf("openX_count:                    %u\n",
-                profile_p->SMBopenX_count);
-       d_printf("openX_time:                     %u\n",
-                profile_p->SMBopenX_time);
-       d_printf("readX_count:                    %u\n",
-                profile_p->SMBreadX_count);
-       d_printf("readX_time:                     %u\n",
-                profile_p->SMBreadX_time);
-       d_printf("writeX_count:                   %u\n",
-                profile_p->SMBwriteX_count);
-       d_printf("writeX_time:                    %u\n",
-                profile_p->SMBwriteX_time);
-       d_printf("trans2_count:                   %u\n",
-                profile_p->SMBtrans2_count);
-       d_printf("trans2_time:                    %u\n",
-                profile_p->SMBtrans2_time);
-       d_printf("transs2_count:                  %u\n",
-                profile_p->SMBtranss2_count);
-       d_printf("transs2_time:                   %u\n",
-                profile_p->SMBtranss2_time);
-       d_printf("findclose_count:                %u\n",
-                profile_p->SMBfindclose_count);
-       d_printf("findclose_time:                 %u\n",
-                profile_p->SMBfindclose_time);
-       d_printf("findnclose_count:               %u\n",
-                profile_p->SMBfindnclose_count);
-       d_printf("findnclose_time:                %u\n",
-                profile_p->SMBfindnclose_time);
-       d_printf("tcon_count:                     %u\n",
-                profile_p->SMBtcon_count);
-       d_printf("tcon_time:                      %u\n",
-                profile_p->SMBtcon_time);
-       d_printf("tdis_count:                     %u\n",
-                profile_p->SMBtdis_count);
-       d_printf("tdis_time:                      %u\n",
-                profile_p->SMBtdis_time);
-       d_printf("negprot_count:                  %u\n",
-                profile_p->SMBnegprot_count);
-       d_printf("negprot_time:                   %u\n",
-                profile_p->SMBnegprot_time);
-       d_printf("sesssetupX_count:               %u\n",
-                profile_p->SMBsesssetupX_count);
-       d_printf("sesssetupX_time:                %u\n",
-                profile_p->SMBsesssetupX_time);
-       d_printf("ulogoffX_count:                 %u\n",
-                profile_p->SMBulogoffX_count);
-       d_printf("ulogoffX_time:                  %u\n",
-                profile_p->SMBulogoffX_time);
-       d_printf("tconX_count:                    %u\n",
-                profile_p->SMBtconX_count);
-       d_printf("tconX_time:                     %u\n",
-                profile_p->SMBtconX_time);
-       d_printf("dskattr_count:                  %u\n",
-                profile_p->SMBdskattr_count);
-       d_printf("dskattr_time:                   %u\n",
-                profile_p->SMBdskattr_time);
-       d_printf("search_count:                   %u\n",
-                profile_p->SMBsearch_count);
-       d_printf("search_time:                    %u\n",
-                profile_p->SMBsearch_time);
-       d_printf("ffirst_count:                   %u\n",
-                profile_p->SMBffirst_count);
-       d_printf("ffirst_time:                    %u\n",
-                profile_p->SMBffirst_time);
-       d_printf("funique_count:                  %u\n",
-                profile_p->SMBfunique_count);
-       d_printf("funique_time:                   %u\n",
-                profile_p->SMBfunique_time);
-       d_printf("fclose_count:                   %u\n",
-                profile_p->SMBfclose_count);
-       d_printf("fclose_time:                    %u\n",
-                profile_p->SMBfclose_time);
-       d_printf("nttrans_count:                  %u\n",
-                profile_p->SMBnttrans_count);
-       d_printf("nttrans_time:                   %u\n",
-                profile_p->SMBnttrans_time);
-       d_printf("nttranss_count:                 %u\n",
-                profile_p->SMBnttranss_count);
-       d_printf("nttranss_time:                  %u\n",
-                profile_p->SMBnttranss_time);
-       d_printf("ntcreateX_count:                %u\n",
-                profile_p->SMBntcreateX_count);
-       d_printf("ntcreateX_time:                 %u\n",
-                profile_p->SMBntcreateX_time);
-       d_printf("ntcancel_count:                 %u\n",
-                profile_p->SMBntcancel_count);
-       d_printf("ntcancel_time:                  %u\n",
-                profile_p->SMBntcancel_time);
-       d_printf("splopen_count:                  %u\n",
-                profile_p->SMBsplopen_count);
-       d_printf("splopen_time:                   %u\n",
-                profile_p->SMBsplopen_time);
-       d_printf("splwr_count:                    %u\n",
-                profile_p->SMBsplwr_count);
-       d_printf("splwr_time:                     %u\n",
-                profile_p->SMBsplwr_time);
-       d_printf("splclose_count:                 %u\n",
-                profile_p->SMBsplclose_count);
-       d_printf("splclose_time:                  %u\n",
-                profile_p->SMBsplclose_time);
-       d_printf("splretq_count:                  %u\n",
-                profile_p->SMBsplretq_count);
-       d_printf("splretq_time:                   %u\n",
-                profile_p->SMBsplretq_time);
-       d_printf("sends_count:                    %u\n",
-                profile_p->SMBsends_count);
-       d_printf("sends_time:                     %u\n",
-                profile_p->SMBsends_time);
-       d_printf("sendb_count:                    %u\n",
-                profile_p->SMBsendb_count);
-       d_printf("sendb_time:                     %u\n",
-                profile_p->SMBsendb_time);
-       d_printf("fwdname_count:                  %u\n",
-                profile_p->SMBfwdname_count);
-       d_printf("fwdname_time:                   %u\n",
-                profile_p->SMBfwdname_time);
-       d_printf("cancelf_count:                  %u\n",
-                profile_p->SMBcancelf_count);
-       d_printf("cancelf_time:                   %u\n",
-                profile_p->SMBcancelf_time);
-       d_printf("getmac_count:                   %u\n",
-                profile_p->SMBgetmac_count);
-       d_printf("getmac_time:                    %u\n",
-                profile_p->SMBgetmac_time);
-       d_printf("sendstrt_count:                 %u\n",
-                profile_p->SMBsendstrt_count);
-       d_printf("sendstrt_time:                  %u\n",
-                profile_p->SMBsendstrt_time);
-       d_printf("sendend_count:                  %u\n",
-                profile_p->SMBsendend_count);
-       d_printf("sendend_time:                   %u\n",
-                profile_p->SMBsendend_time);
-       d_printf("sendtxt_count:                  %u\n",
-                profile_p->SMBsendtxt_count);
-       d_printf("sendtxt_time:                   %u\n",
-                profile_p->SMBsendtxt_time);
-       d_printf("invalid_count:                  %u\n",
-                profile_p->SMBinvalid_count);
-       d_printf("invalid_time:                   %u\n",
-                profile_p->SMBinvalid_time);
-
-       profile_separator("Trans2 Calls");
-       d_printf("open_count:                     %u\n",
-                profile_p->Trans2_open_count);
-       d_printf("open_time:                      %u\n",
-                profile_p->Trans2_open_time);
-       d_printf("findfirst_count:                %u\n",
-                profile_p->Trans2_findfirst_count);
-       d_printf("findfirst_time:                 %u\n",
-                profile_p->Trans2_findfirst_time);
-       d_printf("findnext_count:                 %u\n",
-                profile_p->Trans2_findnext_count);
-       d_printf("findnext_time:                  %u\n",
-                profile_p->Trans2_findnext_time);
-       d_printf("qfsinfo_count:                  %u\n",
-                profile_p->Trans2_qfsinfo_count);
-       d_printf("qfsinfo_time:                   %u\n",
-                profile_p->Trans2_qfsinfo_time);
-       d_printf("setfsinfo_count:                %u\n",
-                profile_p->Trans2_setfsinfo_count);
-       d_printf("setfsinfo_time:                 %u\n",
-                profile_p->Trans2_setfsinfo_time);
-       d_printf("qpathinfo_count:                %u\n",
-                profile_p->Trans2_qpathinfo_count);
-       d_printf("qpathinfo_time:                 %u\n",
-                profile_p->Trans2_qpathinfo_time);
-       d_printf("setpathinfo_count:              %u\n",
-                profile_p->Trans2_setpathinfo_count);
-       d_printf("setpathinfo_time:               %u\n",
-                profile_p->Trans2_setpathinfo_time);
-       d_printf("qfileinfo_count:                %u\n",
-                profile_p->Trans2_qfileinfo_count);
-       d_printf("qfileinfo_time:                 %u\n",
-                profile_p->Trans2_qfileinfo_time);
-       d_printf("setfileinfo_count:              %u\n",
-                profile_p->Trans2_setfileinfo_count);
-       d_printf("setfileinfo_time:               %u\n",
-                profile_p->Trans2_setfileinfo_time);
-       d_printf("fsctl_count:                    %u\n",
-                profile_p->Trans2_fsctl_count);
-       d_printf("fsctl_time:                     %u\n",
-                profile_p->Trans2_fsctl_time);
-       d_printf("ioctl_count:                    %u\n",
-                profile_p->Trans2_ioctl_count);
-       d_printf("ioctl_time:                     %u\n",
-                profile_p->Trans2_ioctl_time);
-       d_printf("findnotifyfirst_count:          %u\n",
-                profile_p->Trans2_findnotifyfirst_count);
-       d_printf("findnotifyfirst_time:           %u\n",
-                profile_p->Trans2_findnotifyfirst_time);
-       d_printf("findnotifynext_count:           %u\n",
-                profile_p->Trans2_findnotifynext_count);
-       d_printf("findnotifynext_time:            %u\n",
-                profile_p->Trans2_findnotifynext_time);
-       d_printf("mkdir_count:                    %u\n",
-                profile_p->Trans2_mkdir_count);
-       d_printf("mkdir_time:                     %u\n",
-                profile_p->Trans2_mkdir_time);
-       d_printf("session_setup_count:            %u\n",
-                profile_p->Trans2_session_setup_count);
-       d_printf("session_setup_time:             %u\n",
-                profile_p->Trans2_session_setup_time);
-       d_printf("get_dfs_referral_count:         %u\n",
-                profile_p->Trans2_get_dfs_referral_count);
-       d_printf("get_dfs_referral_time:          %u\n",
-                profile_p->Trans2_get_dfs_referral_time);
-       d_printf("report_dfs_inconsistancy_count: %u\n",
-                profile_p->Trans2_report_dfs_inconsistancy_count);
-       d_printf("report_dfs_inconsistancy_time:  %u\n",
-                profile_p->Trans2_report_dfs_inconsistancy_time);
-
-       profile_separator("NT Transact Calls");
-       d_printf("create_count:                   %u\n",
-                profile_p->NT_transact_create_count);
-       d_printf("create_time:                    %u\n",
-                profile_p->NT_transact_create_time);
-       d_printf("ioctl_count:                    %u\n",
-                profile_p->NT_transact_ioctl_count);
-       d_printf("ioctl_time:                     %u\n",
-                profile_p->NT_transact_ioctl_time);
-       d_printf("set_security_desc_count:        %u\n",
-                profile_p->NT_transact_set_security_desc_count);
-       d_printf("set_security_desc_time:         %u\n",
-                profile_p->NT_transact_set_security_desc_time);
-       d_printf("notify_change_count:            %u\n",
-                profile_p->NT_transact_notify_change_count);
-       d_printf("notify_change_time:             %u\n",
-                profile_p->NT_transact_notify_change_time);
-       d_printf("rename_count:                   %u\n",
-                profile_p->NT_transact_rename_count);
-       d_printf("rename_time:                    %u\n",
-                profile_p->NT_transact_rename_time);
-       d_printf("query_security_desc_count:      %u\n",
-                profile_p->NT_transact_query_security_desc_count);
-       d_printf("query_security_desc_time:       %u\n",
-                profile_p->NT_transact_query_security_desc_time);
-
-       profile_separator("ACL Calls");
-       d_printf("get_nt_acl_count:               %u\n",
-                profile_p->get_nt_acl_count);
-       d_printf("get_nt_acl_time:                %u\n",
-                profile_p->get_nt_acl_time);
-       d_printf("fget_nt_acl_count:              %u\n",
-                profile_p->fget_nt_acl_count);
-       d_printf("fget_nt_acl_time:               %u\n",
-                profile_p->fget_nt_acl_time);
-       d_printf("fset_nt_acl_count:              %u\n",
-                profile_p->fset_nt_acl_count);
-       d_printf("fset_nt_acl_time:               %u\n",
-                profile_p->fset_nt_acl_time);
-       d_printf("chmod_acl_count:                %u\n",
-                profile_p->chmod_acl_count);
-       d_printf("chmod_acl_time:                 %u\n",
-                profile_p->chmod_acl_time);
-       d_printf("fchmod_acl_count:               %u\n",
-                profile_p->fchmod_acl_count);
-       d_printf("fchmod_acl_time:                %u\n",
-                profile_p->fchmod_acl_time);
-
-       profile_separator("SMB2 Calls");
-       d_printf("smb2_negprot_count:             %u\n",
-                profile_p->smb2_negprot_count);
-       d_printf("smb2_negprot_time:              %u\n",
-                profile_p->smb2_negprot_time);
-       d_printf("smb2_sesssetup_count:           %u\n",
-                profile_p->smb2_sesssetup_count);
-       d_printf("smb2_sesssetup_time:            %u\n",
-                profile_p->smb2_sesssetup_time);
-       d_printf("smb2_logoff_count:              %u\n",
-                profile_p->smb2_logoff_count);
-       d_printf("smb2_logoff_time:               %u\n",
-                profile_p->smb2_logoff_time);
-       d_printf("smb2_tcon_count:                %u\n",
-                profile_p->smb2_tcon_count);
-       d_printf("smb2_tcon_time:                 %u\n",
-                profile_p->smb2_tcon_time);
-       d_printf("smb2_tdis_count:                %u\n",
-                profile_p->smb2_tdis_count);
-       d_printf("smb2_tdis_time:                 %u\n",
-                profile_p->smb2_tdis_time);
-       d_printf("smb2_create_count:              %u\n",
-                profile_p->smb2_create_count);
-       d_printf("smb2_create_time:               %u\n",
-                profile_p->smb2_create_time);
-       d_printf("smb2_close_count:               %u\n",
-                profile_p->smb2_close_count);
-       d_printf("smb2_close_time:                %u\n",
-                profile_p->smb2_close_time);
-       d_printf("smb2_flush_count:               %u\n",
-                profile_p->smb2_flush_count);
-       d_printf("smb2_flush_time:                %u\n",
-                profile_p->smb2_flush_time);
-       d_printf("smb2_read_count:                %u\n",
-                profile_p->smb2_read_count);
-       d_printf("smb2_read_time:                 %u\n",
-                profile_p->smb2_read_time);
-       d_printf("smb2_write_count:               %u\n",
-                profile_p->smb2_write_count);
-       d_printf("smb2_write_time:                %u\n",
-                profile_p->smb2_write_time);
-       d_printf("smb2_lock_count:                %u\n",
-                profile_p->smb2_lock_count);
-       d_printf("smb2_lock_time:                 %u\n",
-                profile_p->smb2_lock_time);
-       d_printf("smb2_ioctl_count:               %u\n",
-                profile_p->smb2_ioctl_count);
-       d_printf("smb2_ioctl_time:                %u\n",
-                profile_p->smb2_ioctl_time);
-       d_printf("smb2_cancel_count:              %u\n",
-                profile_p->smb2_cancel_count);
-       d_printf("smb2_cancel_time:               %u\n",
-                profile_p->smb2_cancel_time);
-       d_printf("smb2_keepalive_count:           %u\n",
-                profile_p->smb2_keepalive_count);
-       d_printf("smb2_keepalive_time:            %u\n",
-                profile_p->smb2_keepalive_time);
-       d_printf("smb2_find_count:                %u\n",
-                profile_p->smb2_find_count);
-       d_printf("smb2_find_time:                 %u\n",
-                profile_p->smb2_find_time);
-       d_printf("smb2_notify_count:              %u\n",
-                profile_p->smb2_notify_count);
-       d_printf("smb2_notify_time:               %u\n",
-                profile_p->smb2_notify_time);
-       d_printf("smb2_getinfo_count:             %u\n",
-                profile_p->smb2_getinfo_count);
-       d_printf("smb2_getinfo_time:              %u\n",
-                profile_p->smb2_getinfo_time);
-       d_printf("smb2_setinfo_count:             %u\n",
-                profile_p->smb2_setinfo_count);
-       d_printf("smb2_setinfo_time:              %u\n",
-                profile_p->smb2_setinfo_time);
-       d_printf("smb2_break_count:               %u\n",
-                profile_p->smb2_break_count);
-       d_printf("smb2_break_time:                %u\n",
-                profile_p->smb2_break_time);
+#define __PRINT_FIELD_LINE(name, _stats, field) do { \
+       d_printf("%-59s%20ju\n", \
+                name "_" #field ":", \
+                (uintmax_t)profile_p->_stats.field); \
+} while(0);
+#define SMBPROFILE_STATS_START
+#define SMBPROFILE_STATS_SECTION_START(name) profile_separator(#name);
+#define SMBPROFILE_STATS_COUNT(name) do { \
+       __PRINT_FIELD_LINE(#name, name##_stats,  count); \
+} while(0);
+#define SMBPROFILE_STATS_TIME(name) do { \
+       __PRINT_FIELD_LINE(#name, name##_stats,  time); \
+} while(0);
+#define SMBPROFILE_STATS_BASIC(name) do { \
+       __PRINT_FIELD_LINE(#name, name##_stats,  count); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  time); \
+} while(0);
+#define SMBPROFILE_STATS_BYTES(name) do { \
+       __PRINT_FIELD_LINE(#name, name##_stats,  count); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  time); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  idle); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  bytes); \
+} while(0);
+#define SMBPROFILE_STATS_IOBYTES(name) do { \
+       __PRINT_FIELD_LINE(#name, name##_stats,  count); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  time); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  idle); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  inbytes); \
+       __PRINT_FIELD_LINE(#name, name##_stats,  outbytes); \
+} while(0);
+#define SMBPROFILE_STATS_SECTION_END
+#define SMBPROFILE_STATS_END
+       SMBPROFILE_STATS_ALL_SECTIONS
+#undef __PRINT_FIELD_LINE
+#undef SMBPROFILE_STATS_START
+#undef SMBPROFILE_STATS_SECTION_START
+#undef SMBPROFILE_STATS_COUNT
+#undef SMBPROFILE_STATS_TIME
+#undef SMBPROFILE_STATS_BASIC
+#undef SMBPROFILE_STATS_BYTES
+#undef SMBPROFILE_STATS_IOBYTES
+#undef SMBPROFILE_STATS_SECTION_END
+#undef SMBPROFILE_STATS_END
 
        return True;
 }
@@ -742,52 +105,196 @@ bool status_profile_dump(bool verbose)
 
 #define percent_time(used, period) ((double)(used) / (double)(period) * 100.0 )
 
-static int print_count_samples(
-       const struct profile_stats * const current,
-       const struct profile_stats * const last,
+static uint64_t print_count_count_samples(
+       char *buf, const size_t buflen,
+       const char *name,
+       const struct smbprofile_stats_count * const current,
+       const struct smbprofile_stats_count * const last,
        uint64_t delta_usec)
 {
-       int i;
-       int count = 0;
-       unsigned step;
-       uint64_t spent;
-       int delta_sec;
-       const char * name;
-       char buf[40];
+       uint64_t step = current->count - last->count;
+       uint64_t count = 0;
 
-       if (delta_usec == 0) {
-               return 0;
+       if (step != 0) {
+               uint64_t delta_sec = usec_to_sec(delta_usec);
+
+               count++;
+
+               if (buf[0] == '\0') {
+                       snprintf(buf, buflen,
+                               "%s %ju/sec",
+                               name, (uintmax_t)(step / delta_sec));
+               } else {
+                       printf("%-40s %s %ju/sec\n",
+                               buf, name, (uintmax_t)(step / delta_sec));
+                       buf[0] = '\0';
+               }
        }
 
-       buf[0] = '\0';
-       delta_sec = usec_to_sec(delta_usec);
+       return count;
+}
 
-       for (i = 0; i < PR_VALUE_MAX; ++i) {
-               step = current->count[i] - last->count[i];
-               spent = current->time[i] - last->time[i];
+static uint64_t print_basic_count_samples(
+       char *buf, const size_t buflen,
+       const char *name,
+       const struct smbprofile_stats_basic * const current,
+       const struct smbprofile_stats_basic * const last,
+       uint64_t delta_usec)
+{
+       uint64_t step = current->count - last->count;
+       uint64_t spent = current->time - last->time;
+       uint64_t count = 0;
 
-               if (step) {
-                       ++count;
+       if (step != 0) {
+               uint64_t delta_sec = usec_to_sec(delta_usec);
 
-                       name = profile_value_name(i);
+               count++;
 
-                       if (buf[0] == '\0') {
-                               snprintf(buf, sizeof(buf),
-                                       "%s %d/sec (%.2f%%)",
-                                       name, step / delta_sec,
-                                       percent_time(spent, delta_usec));
-                       } else {
-                               printf("%-40s %s %d/sec (%.2f%%)\n",
-                                       buf, name, step / delta_sec,
-                                       percent_time(spent, delta_usec));
-                               buf[0] = '\0';
-                       }
+               if (buf[0] == '\0') {
+                       snprintf(buf, buflen,
+                               "%s %ju/sec (%.2f%%)",
+                               name, (uintmax_t)(step / delta_sec),
+                               percent_time(spent, delta_usec));
+               } else {
+                       printf("%-40s %s %ju/sec (%.2f%%)\n",
+                               buf, name, (uintmax_t)(step / delta_sec),
+                               percent_time(spent, delta_usec));
+                       buf[0] = '\0';
+               }
+       }
+
+       return count;
+}
+
+static uint64_t print_bytes_count_samples(
+       char *buf, const size_t buflen,
+       const char *name,
+       const struct smbprofile_stats_bytes * const current,
+       const struct smbprofile_stats_bytes * const last,
+       uint64_t delta_usec)
+{
+       uint64_t step = current->count - last->count;
+       uint64_t spent = current->time - last->time;
+       uint64_t count = 0;
+
+       if (step != 0) {
+               uint64_t delta_sec = usec_to_sec(delta_usec);
+
+               count++;
+
+               if (buf[0] == '\0') {
+                       snprintf(buf, buflen,
+                               "%s %ju/sec (%.2f%%)",
+                               name, (uintmax_t)(step / delta_sec),
+                               percent_time(spent, delta_usec));
+               } else {
+                       printf("%-40s %s %ju/sec (%.2f%%)\n",
+                               buf, name, (uintmax_t)(step / delta_sec),
+                               percent_time(spent, delta_usec));
+                       buf[0] = '\0';
                }
        }
 
        return count;
 }
 
+static uint64_t print_iobytes_count_samples(
+       char *buf, const size_t buflen,
+       const char *name,
+       const struct smbprofile_stats_iobytes * const current,
+       const struct smbprofile_stats_iobytes * const last,
+       uint64_t delta_usec)
+{
+       uint64_t step = current->count - last->count;
+       uint64_t spent = current->time - last->time;
+       uint64_t count = 0;
+
+       if (step != 0) {
+               uint64_t delta_sec = usec_to_sec(delta_usec);
+
+               count++;
+
+               if (buf[0] == '\0') {
+                       snprintf(buf, buflen,
+                               "%s %ju/sec (%.2f%%)",
+                               name, (uintmax_t)(step / delta_sec),
+                               percent_time(spent, delta_usec));
+               } else {
+                       printf("%-40s %s %ju/sec (%.2f%%)\n",
+                               buf, name, (uintmax_t)(step / delta_sec),
+                               percent_time(spent, delta_usec));
+                       buf[0] = '\0';
+               }
+       }
+
+       return count;
+}
+
+static uint64_t print_count_samples(
+       const struct profile_stats * const current,
+       const struct profile_stats * const last,
+       uint64_t delta_usec)
+{
+       uint64_t count = 0;
+       char buf[40] = { '\0', };
+
+       if (delta_usec == 0) {
+               return 0;
+       }
+
+#define SMBPROFILE_STATS_START
+#define SMBPROFILE_STATS_SECTION_START(name)
+#define SMBPROFILE_STATS_COUNT(name) do { \
+       count += print_count_count_samples(buf, sizeof(buf), \
+                                          #name, \
+                                          &current->name##_stats, \
+                                          &last->name##_stats, \
+                                          delta_usec); \
+} while(0);
+#define SMBPROFILE_STATS_TIME(name) do { \
+} while(0);
+#define SMBPROFILE_STATS_BASIC(name) do { \
+       count += print_basic_count_samples(buf, sizeof(buf), \
+                                          #name, \
+                                          &current->name##_stats, \
+                                          &last->name##_stats, \
+                                          delta_usec); \
+} while(0);
+#define SMBPROFILE_STATS_BYTES(name) do { \
+       count += print_bytes_count_samples(buf, sizeof(buf), \
+                                          #name, \
+                                          &current->name##_stats, \
+                                          &last->name##_stats, \
+                                          delta_usec); \
+} while(0);
+#define SMBPROFILE_STATS_IOBYTES(name) do { \
+       count += print_iobytes_count_samples(buf, sizeof(buf), \
+                                            #name, \
+                                            &current->name##_stats, \
+                                            &last->name##_stats, \
+                                            delta_usec); \
+} while(0);
+#define SMBPROFILE_STATS_SECTION_END
+#define SMBPROFILE_STATS_END
+       SMBPROFILE_STATS_ALL_SECTIONS
+#undef SMBPROFILE_STATS_START
+#undef SMBPROFILE_STATS_SECTION_START
+#undef SMBPROFILE_STATS_COUNT
+#undef SMBPROFILE_STATS_TIME
+#undef SMBPROFILE_STATS_BASIC
+#undef SMBPROFILE_STATS_BYTES
+#undef SMBPROFILE_STATS_IOBYTES
+#undef SMBPROFILE_STATS_SECTION_END
+#undef SMBPROFILE_STATS_END
+
+       if (buf[0] != '\0') {
+               printf("%-40s\n", buf);
+               buf[0] = '\0';
+       }
+
+       return count;
+}
+
 static struct profile_stats    sample_data[2];
 static uint64_t                sample_time[2];