The branch, master has been updated
       via  9f8d272b0ec vfs_ceph_new: use per-share profile macros
       via  a794e96e62b vfs_default: use per-share profile macros
       via  5869280bec9 s3/smb_prometheus_endpoint: export per-share profile 
stats
       via  7f65710d8ee status: dump only relevant sections of per-share
       via  cfadbb73f35 status: dump per-share profile counters
       via  303b473515b smbd: smb2-operations per-share profile counters
       via  904577f90ef smbd: init per-share profile counters
       via  fd1e4620cd3 param: allow per-share profiling mode
       via  51c52fafb2d profile: reset per-share counters
       via  a65ba08c037 profile: collect per-share counters from TDB
       via  e753abce911 profile: defined helper macros for per-share counters
       via  0733f232f49 profile: dynamic per-share in-memory counters
      from  5d68404dc0b auth: Direct variable initialization

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 9f8d272b0ec456ca713f8afda71ccfe2acbe5e39
Author: Shachar Sharon <[email protected]>
Date:   Mon May 12 12:14:52 2025 +0300

    vfs_ceph_new: use per-share profile macros
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>
    
    Autobuild-User(master): Anoop C S <[email protected]>
    Autobuild-Date(master): Mon Jun 23 14:01:51 UTC 2025 on atb-devel-224

commit a794e96e62b44248b3f1f44ede956c549490cc0a
Author: Shachar Sharon <[email protected]>
Date:   Mon Apr 28 21:36:39 2025 +0300

    vfs_default: use per-share profile macros
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 5869280bec92c3390d5e455ba54f24a2b4178e70
Author: Shachar Sharon <[email protected]>
Date:   Mon May 26 11:51:04 2025 +0300

    s3/smb_prometheus_endpoint: export per-share profile stats
    
    Iterate over per-share TDB entries (is exists) and export as Prometheus
    metrics via call-back function.
    
    Allow passing share-name as additional label to Prometheus metrics. By
    default, use empty label to follow OpenMetrics[1] conventions ("Empty
    label values SHOULD be treated as if the label was not present").
    
    [1] 
https://github.com/prometheus/OpenMetrics/blob/main/specification/OpenMetrics.md
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 7f65710d8ee903c75e1a7fca88000c44692d53a6
Author: Shachar Sharon <[email protected]>
Date:   Tue May 20 10:27:23 2025 +0300

    status: dump only relevant sections of per-share
    
    Some profile sections are not relevant for per-share profile counters.
    Ignore non-implemented section with all-zeros (avoid confusion).
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit cfadbb73f35b0a46fe02c74b9a228bea3812ba51
Author: Shachar Sharon <[email protected]>
Date:   Mon Apr 28 21:30:22 2025 +0300

    status: dump per-share profile counters
    
    When dumping profile information, try to iterate also on per-share
    profile entries and emit (json format).
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 303b473515b9460b2c0ec1e47dfee8abe60685bc
Author: Shachar Sharon <[email protected]>
Date:   Tue May 13 12:24:15 2025 +0300

    smbd: smb2-operations per-share profile counters
    
    Allow per-share profile counters for SMB2 operations.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 904577f90ef4cc75ec24c5ced86082adc87a91bc
Author: Shachar Sharon <[email protected]>
Date:   Mon Apr 28 15:11:06 2025 +0300

    smbd: init per-share profile counters
    
    When per-share profile counters are enabled, setup/teardown the
    profiling entry for specific 'snum' before/after VFS connect/disconnect.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit fd1e4620cd31cb2889810f6dd3bd416a3505fb8a
Author: Shachar Sharon <[email protected]>
Date:   Sun Apr 27 12:18:09 2025 +0300

    param: allow per-share profiling mode
    
    Allow per-share profile counters by setting a configure option
    'smbd profiling share = yes' on each share which wants this option
    enabled. Requires global profiling to be enabled.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 51c52fafb2d9605dbddf7ba7b1c418901741fb9d
Author: Shachar Sharon <[email protected]>
Date:   Thu May 29 15:31:46 2025 +0300

    profile: reset per-share counters
    
    Allow zero-reset dynamic per-share profile counters when sending
    'smbcontrol smbd profile flush' to active smbd.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit a65ba08c0372f439bb8d06be0246bd0573f6cf12
Author: Shachar Sharon <[email protected]>
Date:   Mon Apr 28 15:06:59 2025 +0300

    profile: collect per-share counters from TDB
    
    Helper functions to iterate over per-share profile counters from TDB
    file using callback function.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit e753abce911240b0f3d8cde55590fe0847db4c62
Author: Shachar Sharon <[email protected]>
Date:   Mon Apr 28 15:00:43 2025 +0300

    profile: defined helper macros for per-share counters
    
    Helper macros the use per-share profile counters, using 'snum' as
    lookup key.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Co-Authored-By: Anoop C S <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

commit 0733f232f49944fee8371b6db4adb949d59aa965
Author: Shachar Sharon <[email protected]>
Date:   Mon Apr 28 12:05:25 2025 +0300

    profile: dynamic per-share in-memory counters
    
    Mechanism to support per-share per-process run-time profiling counters.
    Use in-memory cache for storing run-time entries, using 'snum' as key.
    When storing in TDB file, uses unique key for each per-share profile
    entry.
    
    Signed-off-by: Shachar Sharon <[email protected]>
    Signed-off-by: Avan Thakkar <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Anoop C S <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/misc/smbdprofilingext.xml |  14 +
 source3/include/smbprofile.h                  | 302 +++++++++++++++-
 source3/modules/vfs_ceph_new.c                | 166 ++++-----
 source3/modules/vfs_default.c                 | 248 +++++++------
 source3/profile/profile.c                     | 222 ++++++++++++
 source3/profile/profile_read.c                |  46 +++
 source3/smbd/globals.h                        |   1 +
 source3/smbd/smb2_create.c                    |   3 +-
 source3/smbd/smb2_notify.c                    |   6 +-
 source3/smbd/smb2_server.c                    | 156 ++++++---
 source3/smbd/smb2_service.c                   |  17 +
 source3/utils/smb_prometheus_endpoint.c       | 478 ++++++++++++++++++--------
 source3/utils/status_json.c                   |  80 +++--
 source3/utils/status_json.h                   |   7 +
 source3/utils/status_json_dummy.c             |  10 +
 source3/utils/status_profile.c                |  97 ++++++
 16 files changed, 1435 insertions(+), 418 deletions(-)
 create mode 100644 docs-xml/smbdotconf/misc/smbdprofilingext.xml


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/misc/smbdprofilingext.xml 
b/docs-xml/smbdotconf/misc/smbdprofilingext.xml
new file mode 100644
index 00000000000..3720d38df58
--- /dev/null
+++ b/docs-xml/smbdotconf/misc/smbdprofilingext.xml
@@ -0,0 +1,14 @@
+<samba:parameter name="smbd profiling share"
+                 context="S"
+                 type="boolean"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc";>
+<description>
+       <para>This parameter allows the administrator to enable per-share
+       profiling support. When enabled, profile counters may be collected
+       with per-share granularity a specific shares. Takes affect only
+       when global option
+       <smbconfoption name="smbd profiling level"/> is enabled.
+       </para>
+</description>
+<value type="default">no</value>
+</samba:parameter>
diff --git a/source3/include/smbprofile.h b/source3/include/smbprofile.h
index c8d2696884e..b45d709b016 100644
--- a/source3/include/smbprofile.h
+++ b/source3/include/smbprofile.h
@@ -256,6 +256,94 @@ struct tevent_context;
        \
        SMBPROFILE_STATS_END
 
+#define SMBPROFILE_STATS_PERSVC_SECTIONS \
+       SMBPROFILE_STATS_START \
+       \
+       SMBPROFILE_STATS_SECTION_START(syscall, "System Calls") \
+       SMBPROFILE_STATS_BASIC(syscall_opendir) \
+       SMBPROFILE_STATS_BASIC(syscall_fdopendir) \
+       SMBPROFILE_STATS_BASIC(syscall_readdir) \
+       SMBPROFILE_STATS_BASIC(syscall_rewinddir) \
+       SMBPROFILE_STATS_BASIC(syscall_mkdirat) \
+       SMBPROFILE_STATS_BASIC(syscall_closedir) \
+       SMBPROFILE_STATS_BASIC(syscall_open) \
+       SMBPROFILE_STATS_BASIC(syscall_openat) \
+       SMBPROFILE_STATS_BASIC(syscall_createfile) \
+       SMBPROFILE_STATS_BASIC(syscall_close) \
+       SMBPROFILE_STATS_BYTES(syscall_pread) \
+       SMBPROFILE_STATS_BYTES(syscall_asys_pread) \
+       SMBPROFILE_STATS_BYTES(syscall_pwrite) \
+       SMBPROFILE_STATS_BYTES(syscall_asys_pwrite) \
+       SMBPROFILE_STATS_BASIC(syscall_lseek) \
+       SMBPROFILE_STATS_BYTES(syscall_sendfile) \
+       SMBPROFILE_STATS_BYTES(syscall_recvfile) \
+       SMBPROFILE_STATS_BASIC(syscall_renameat) \
+       SMBPROFILE_STATS_BYTES(syscall_asys_fsync) \
+       SMBPROFILE_STATS_BASIC(syscall_stat) \
+       SMBPROFILE_STATS_BASIC(syscall_fstat) \
+       SMBPROFILE_STATS_BASIC(syscall_lstat) \
+       SMBPROFILE_STATS_BASIC(syscall_fstatat) \
+       SMBPROFILE_STATS_BASIC(syscall_get_alloc_size) \
+       SMBPROFILE_STATS_BASIC(syscall_unlinkat) \
+       SMBPROFILE_STATS_BASIC(syscall_chmod) \
+       SMBPROFILE_STATS_BASIC(syscall_fchmod) \
+       SMBPROFILE_STATS_BASIC(syscall_fchown) \
+       SMBPROFILE_STATS_BASIC(syscall_lchown) \
+       SMBPROFILE_STATS_BASIC(syscall_chdir) \
+       SMBPROFILE_STATS_BASIC(syscall_getwd) \
+       SMBPROFILE_STATS_BASIC(syscall_fntimes) \
+       SMBPROFILE_STATS_BASIC(syscall_ftruncate) \
+       SMBPROFILE_STATS_BASIC(syscall_fallocate) \
+       SMBPROFILE_STATS_BASIC(syscall_fcntl_lock) \
+       SMBPROFILE_STATS_BASIC(syscall_fcntl) \
+       SMBPROFILE_STATS_BASIC(syscall_linux_setlease) \
+       SMBPROFILE_STATS_BASIC(syscall_fcntl_getlock) \
+       SMBPROFILE_STATS_BASIC(syscall_readlinkat) \
+       SMBPROFILE_STATS_BASIC(syscall_symlinkat) \
+       SMBPROFILE_STATS_BASIC(syscall_linkat) \
+       SMBPROFILE_STATS_BASIC(syscall_mknodat) \
+       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_BYTES(syscall_asys_getxattrat) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START(acl, "ACL Calls") \
+       SMBPROFILE_STATS_BASIC(get_nt_acl) \
+       SMBPROFILE_STATS_BASIC(get_nt_acl_at) \
+       SMBPROFILE_STATS_BASIC(fget_nt_acl) \
+       SMBPROFILE_STATS_BASIC(fset_nt_acl) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_SECTION_START(smb2, "SMB2 Calls") \
+       SMBPROFILE_STATS_IOBYTES(smb2_negprot) \
+       SMBPROFILE_STATS_IOBYTES(smb2_sesssetup) \
+       SMBPROFILE_STATS_IOBYTES(smb2_logoff) \
+       SMBPROFILE_STATS_IOBYTES(smb2_tcon) \
+       SMBPROFILE_STATS_IOBYTES(smb2_tdis) \
+       SMBPROFILE_STATS_IOBYTES(smb2_create) \
+       SMBPROFILE_STATS_IOBYTES(smb2_close) \
+       SMBPROFILE_STATS_IOBYTES(smb2_flush) \
+       SMBPROFILE_STATS_IOBYTES(smb2_read) \
+       SMBPROFILE_STATS_IOBYTES(smb2_write) \
+       SMBPROFILE_STATS_IOBYTES(smb2_lock) \
+       SMBPROFILE_STATS_IOBYTES(smb2_ioctl) \
+       SMBPROFILE_STATS_IOBYTES(smb2_cancel) \
+       SMBPROFILE_STATS_IOBYTES(smb2_keepalive) \
+       SMBPROFILE_STATS_IOBYTES(smb2_find) \
+       SMBPROFILE_STATS_IOBYTES(smb2_notify) \
+       SMBPROFILE_STATS_IOBYTES(smb2_getinfo) \
+       SMBPROFILE_STATS_IOBYTES(smb2_setinfo) \
+       SMBPROFILE_STATS_IOBYTES(smb2_break) \
+       SMBPROFILE_STATS_SECTION_END \
+       \
+       SMBPROFILE_STATS_END
+
 /* this file defines the profile structure in the profile shared
    memory area */
 
@@ -436,19 +524,21 @@ struct profile_stats {
                smbprofile_dump_schedule(); \
        } \
 } 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 { \
+#define _SMBPROFILE_BYTES_ASYNC_END(_async) do { \
        if ((_async).stats != NULL) { \
                _SMBPROFILE_TIMER_ASYNC_END(_async); \
                (_async) = (struct smbprofile_stats_bytes_async) {}; \
                smbprofile_dump_schedule(); \
        } \
 } 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) \
+       _SMBPROFILE_BYTES_ASYNC_END(_async)
 
 #define SMBPROFILE_IOBYTES_ASYNC_STATE(_async_name) \
        struct smbprofile_stats_iobytes_async _async_name;
@@ -461,13 +551,7 @@ struct profile_stats {
                smbprofile_dump_schedule(); \
        } \
 } 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, _opcode, _status) do { 
\
+#define _SMBPROFILE_IOBYTES_ASYNC_END(_async, _outbytes, _opcode, _status) do 
{ \
        if ((_async).stats != NULL) { \
                (_async).stats->outbytes += (_outbytes); \
                _SMBPROFILE_TIMER_ASYNC_END(_async); \
@@ -478,6 +562,15 @@ struct profile_stats {
        } \
 } 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, _opcode, _status) \
+       _SMBPROFILE_IOBYTES_ASYNC_END(_async, _outbytes, _opcode, _status) \
+
 #define DO_PROFILE_INC_AUTH_SUCCESS() \
        DO_PROFILE_INC(authentication); \
 
@@ -485,6 +578,14 @@ struct profile_stats {
        DO_PROFILE_INC(authentication); \
        DO_PROFILE_INC(authentication_failed); \
 
+struct profile_stats_persvc {
+       struct profile_stats stats;
+       int snum;
+       int refcnt;
+       bool active;
+       char dbkey[];
+};
+
 extern struct profile_stats *profile_p;
 
 struct smbprofile_global_state {
@@ -503,6 +604,10 @@ struct smbprofile_global_state {
        struct {
                struct profile_stats global;
        } stats;
+
+       struct {
+               struct profile_stats_persvc **tbl;
+       } persvc;
 };
 
 extern struct smbprofile_global_state smbprofile_state;
@@ -727,4 +832,173 @@ void set_profile_level(int level, const struct server_id 
*src);
 struct messaging_context;
 bool profile_setup(struct messaging_context *msg_ctx, bool rdonly);
 
+/* Per-share profiling */
+#ifdef WITH_PROFILE
+
+void smbprofile_persvc_mkref(int snum, const char *svc, const char *remote);
+void smbprofile_persvc_unref(int snum);
+struct profile_stats *smbprofile_persvc_get(int snum);
+void smbprofile_persvc_reset(void);
+
+int smbprofile_persvc_collect(int (*fn)(const char *key,
+                                       const struct profile_stats *stats,
+                                       void *private_data),
+                             void *private_data);
+
+int smbprofile_persvc_collect_tdb(struct tdb_context *tdb,
+                                 int (*fn)(const char *,
+                                           const struct profile_stats *,
+                                           void *),
+                                 void *userp);
+
+#define START_PROFILE_X(_snum, x)                                              
\
+       struct smbprofile_stats_basic_async __profasync_##x = {};              \
+       struct smbprofile_stats_basic_async __profasync_persvc_##x = {};       \
+       _SMBPROFILE_BASIC_ASYNC_START(x##_stats, profile_p, __profasync_##x);  \
+       do {                                                                   \
+               struct profile_stats *persvc_##x = smbprofile_persvc_get(      \
+                       _snum);                                                \
+               if (persvc_##x != NULL) {                                      \
+                       _SMBPROFILE_BASIC_ASYNC_START(x##_stats,               \
+                                                     persvc_##x,              \
+                                                     __profasync_persvc_##x); \
+               }                                                              \
+       } while (0)
+
+#define START_PROFILE_BYTES_X(_snum, x, n)                                    \
+       struct smbprofile_stats_bytes_async __profasync_##x = {};             \
+       struct smbprofile_stats_bytes_async __profasync_persvc_##x = {};      \
+       _SMBPROFILE_BYTES_ASYNC_START(x##_stats,                              \
+                                     profile_p,                              \
+                                     __profasync_##x,                        \
+                                     n);                                     \
+       do {                                                                  \
+               struct profile_stats *persvc_##x = smbprofile_persvc_get(     \
+                       _snum);                                               \
+               if (persvc_##x != NULL) {                                     \
+                       _SMBPROFILE_BYTES_ASYNC_START(x##_stats,              \
+                                                     persvc_##x,             \
+                                                     __profasync_persvc_##x, \
+                                                     n);                     \
+               }                                                             \
+       } while (0)
+
+#define END_PROFILE_X(x)                                            \
+       do {                                                        \
+               SMBPROFILE_BASIC_ASYNC_END(__profasync_##x);        \
+               SMBPROFILE_BASIC_ASYNC_END(__profasync_persvc_##x); \
+       } while (0)
+
+#define END_PROFILE_BYTES_X(x)                                      \
+       do {                                                        \
+               SMBPROFILE_BYTES_ASYNC_END(__profasync_##x);        \
+               SMBPROFILE_BYTES_ASYNC_END(__profasync_persvc_##x); \
+       } while (0)
+
+#define SMBPROFILE_BYTES_ASYNC_START_X(_snum, _name, _async, _async_persvc, 
_bytes) \
+       _SMBPROFILE_BYTES_ASYNC_START(_name##_stats, profile_p, _async, 
_bytes);    \
+       do {                                                                    
    \
+               struct profile_stats *_px = smbprofile_persvc_get(_snum);       
    \
+               if (_px != NULL) {                                              
    \
+                       _SMBPROFILE_BYTES_ASYNC_START(_name##_stats,            
    \
+                                                     _px,                      
    \
+                                                     _async_persvc,            
    \
+                                                     _bytes);                  
    \
+               }                                                               
    \
+       } while (0)
+
+#define SMBPROFILE_BYTES_ASYNC_SET_IDLE_X(_async, _async_persvc) \
+       do {                                                     \
+               _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async);        \
+               _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async_persvc); \
+       } while (0)
+
+#define SMBPROFILE_BYTES_ASYNC_SET_BUSY_X(_async, _async_persvc) \
+       do {                                                     \
+               _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async);        \
+               _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async_persvc); \
+       } while (0)
+
+#define SMBPROFILE_BYTES_ASYNC_END_X(_async, _async_persvc) \
+       do {                                                \
+               _SMBPROFILE_BYTES_ASYNC_END(_async);        \
+               _SMBPROFILE_BYTES_ASYNC_END(_async_persvc); \
+       } while (0)
+
+#define SMBPROFILE_IOBYTES_ASYNC_START_X(_snum, _name, _async, _async_persvc, 
_bytes) \
+       _SMBPROFILE_IOBYTES_ASYNC_START(_name##_stats, profile_p, _async, 
_bytes);    \
+       do {                                                                    
      \
+               struct profile_stats *_px = smbprofile_persvc_get(_snum);       
      \
+               if (_px != NULL) {                                              
      \
+                       _SMBPROFILE_IOBYTES_ASYNC_START(_name##_stats,          
      \
+                                                     _px,                      
      \
+                                                     _async_persvc,            
      \
+                                                     _bytes);                  
      \
+               }                                                               
      \
+       } while (0)
+
+#define SMBPROFILE_IOBYTES_ASYNC_SET_IDLE_X(_async, _async_persvc) \
+       do {                                                       \
+               _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async);          \
+               _SMBPROFILE_TIMER_ASYNC_SET_IDLE(_async_persvc);   \
+       } while (0)
+
+#define SMBPROFILE_IOBYTES_ASYNC_SET_BUSY_X(_async, _async_persvc) \
+       do {                                                       \
+               _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async);          \
+               _SMBPROFILE_TIMER_ASYNC_SET_BUSY(_async_persvc);   \
+       } while (0)
+
+#define SMBPROFILE_IOBYTES_ASYNC_END_X(                      \
+       _async, _async_persvc, _outbytes, _opcode, _status)  \
+       do {                                                 \
+               _SMBPROFILE_IOBYTES_ASYNC_END(_async,        \
+                                             _outbytes,     \
+                                             _opcode,       \
+                                             _status);      \
+               _SMBPROFILE_IOBYTES_ASYNC_END(_async_persvc, \
+                                             _outbytes,     \
+                                             _opcode,       \
+                                             _status);      \
+       } while (0)
+
+#else /* WITH_PROFILE */
+
+#define START_PROFILE_X(_snum, x)
+#define START_PROFILE_BYTES_X(_snum, x, n)
+#define END_PROFILE_X(x)
+#define END_PROFILE_BYTES_X(x)
+#define SMBPROFILE_BYTES_ASYNC_START_X(_name, _snum, _async, _async_persvc, 
_bytes)
+#define SMBPROFILE_BYTES_ASYNC_SET_IDLE_X(_async, _async_persvc)
+#define SMBPROFILE_BYTES_ASYNC_SET_BUSY_X(_async, _async_persvc)
+#define SMBPROFILE_BYTES_ASYNC_END_X(_async, _async_persvc)
+#define SMBPROFILE_IOBYTES_ASYNC_START_X(_name, _snum, _async, _async_persvc, 
_bytes)
+#define SMBPROFILE_IOBYTES_ASYNC_SET_IDLE_X(_async, _async_persvc)
+#define SMBPROFILE_IOBYTES_ASYNC_SET_BUSY_X(_async, _async_persvc)
+#define SMBPROFILE_IOBYTES_ASYNC_END_X(_async, _async_persvc, _outbytes, 
_opcode, _status)
+
+static inline void smbprofile_persvc_mkref(int snum,
+                                          const char *svc,
+                                          const char *remote)
+{
+       return;
+}
+
+static inline void smbprofile_persvc_unref(int snum)
+{
+       return;
+}
+
+static inline struct profile_stats *smbprofile_persvc_get(int snum)
+{
+       return NULL;
+}
+
+static inline void smbprofile_persvc_reset(void)
+{
+       return;
+}
+
+#endif /* WITH_PROFILE */
+
 #endif
diff --git a/source3/modules/vfs_ceph_new.c b/source3/modules/vfs_ceph_new.c
index 17f20ed2d6b..04694d56baf 100644
--- a/source3/modules/vfs_ceph_new.c
+++ b/source3/modules/vfs_ceph_new.c
@@ -2186,7 +2186,7 @@ static DIR *vfs_ceph_fdopendir(struct vfs_handle_struct 
*handle,
        void *result = NULL;
        struct vfs_ceph_fh *cfh = NULL;
 
-       START_PROFILE(syscall_fdopendir);
+       START_PROFILE_X(SNUM(handle->conn), syscall_fdopendir);
        DBG_DEBUG("[CEPH] fdopendir: name=%s\n", fsp->fsp_name->base_name);
        ret = vfs_ceph_fetch_fh(handle, fsp, &cfh);
        if (ret != 0) {
@@ -2204,7 +2204,7 @@ out:
        if (ret != 0) {
                errno = -ret;
        }
-       END_PROFILE(syscall_fdopendir);
+       END_PROFILE_X(syscall_fdopendir);
        return (DIR *)result;
 }
 
@@ -2217,7 +2217,7 @@ static struct dirent *vfs_ceph_readdir(struct 
vfs_handle_struct *handle,
        int saved_errno = errno;
        int ret = -1;
 
-       START_PROFILE(syscall_readdir);
+       START_PROFILE_X(SNUM(handle->conn), syscall_readdir);
        DBG_DEBUG("[CEPH] readdir: name=%s\n", dirfsp->fsp_name->base_name);
 
        result = vfs_ceph_get_fh_dirent(dircfh);
@@ -2245,7 +2245,7 @@ static struct dirent *vfs_ceph_readdir(struct 
vfs_handle_struct *handle,
 out:
        DBG_DEBUG("[CEPH] readdir: handle=%p name=%s ret=%d\n",
                  handle, dirfsp->fsp_name->base_name, ret);
-       END_PROFILE(syscall_readdir);
+       END_PROFILE_X(syscall_readdir);
        return result;
 }
 
@@ -2253,10 +2253,10 @@ static void vfs_ceph_rewinddir(struct vfs_handle_struct 
*handle, DIR *dirp)
 {
        const struct vfs_ceph_fh *dircfh = (const struct vfs_ceph_fh *)dirp;
 
-       START_PROFILE(syscall_rewinddir);
+       START_PROFILE_X(SNUM(handle->conn), syscall_rewinddir);
        DBG_DEBUG("[CEPH] rewinddir: handle=%p dirp=%p\n", handle, dirp);
        vfs_ceph_ll_rewinddir(handle, dircfh);
-       END_PROFILE(syscall_rewinddir);
+       END_PROFILE_X(syscall_rewinddir);
 }
 
 static int vfs_ceph_mkdirat(struct vfs_handle_struct *handle,
@@ -2269,7 +2269,7 @@ static int vfs_ceph_mkdirat(struct vfs_handle_struct 
*handle,
        struct vfs_ceph_fh *dircfh = NULL;
        struct vfs_ceph_iref iref = {0};
 
-       START_PROFILE(syscall_mkdirat);
+       START_PROFILE_X(SNUM(handle->conn), syscall_mkdirat);
        DBG_DEBUG("[CEPH] mkdirat: handle=%p name=%s\n", handle, name);
        result = vfs_ceph_fetch_fh(handle, dirfsp, &dircfh);
        if (result != 0) {
@@ -2280,7 +2280,7 @@ static int vfs_ceph_mkdirat(struct vfs_handle_struct 
*handle,
        vfs_ceph_iput(handle, &iref);
 out:
        DBG_DEBUG("[CEPH] mkdirat: name=%s result=%d\n", name, result);
-       END_PROFILE(syscall_mkdirat);
+       END_PROFILE_X(syscall_mkdirat);
        return status_code(result);
 }
 
@@ -2289,13 +2289,13 @@ static int vfs_ceph_closedir(struct vfs_handle_struct 
*handle, DIR *dirp)
        int result;
        struct vfs_ceph_fh *cfh = (struct vfs_ceph_fh *)dirp;
 
-       START_PROFILE(syscall_closedir);
+       START_PROFILE_X(SNUM(handle->conn), syscall_closedir);
        DBG_DEBUG("[CEPH] closedir: handle=%p dirp=%p\n", handle, dirp);
        result = vfs_ceph_ll_releasedir(handle, cfh);
        vfs_ceph_release_fh(cfh);
        vfs_ceph_remove_fh(handle, cfh->fsp);
        DBG_DEBUG("[CEPH] closedir: dirp=%p result=%d\n", dirp, result);
-       END_PROFILE(syscall_closedir);
+       END_PROFILE_X(syscall_closedir);
        return status_code(result);
 }
 
@@ -2313,7 +2313,7 @@ static int vfs_ceph_openat(struct vfs_handle_struct 
*handle,
        mode_t mode = how->mode;
        int result = -ENOENT;
 
-       START_PROFILE(syscall_openat);
+       START_PROFILE_X(SNUM(handle->conn), syscall_openat);
        if ((how->resolve & ~VFS_OPEN_HOW_WITH_BACKUP_INTENT) != 0) {
                result = -ENOSYS;
                goto err_out;
@@ -2388,7 +2388,7 @@ out:
 err_out:
        DBG_DEBUG("[CEPH] openat: name=%s result=%d",
                  fsp->fsp_name->base_name, result);
-       END_PROFILE(syscall_openat);
+       END_PROFILE_X(syscall_openat);
        return status_code(result);
 }
 
@@ -2397,7 +2397,7 @@ static int vfs_ceph_close(struct vfs_handle_struct 
*handle, files_struct *fsp)
        int result;
        struct vfs_ceph_fh *cfh = NULL;
 
-       START_PROFILE(syscall_close);
+       START_PROFILE_X(SNUM(handle->conn), syscall_close);
        result = vfs_ceph_fetch_fh(handle, fsp, &cfh);
        if (result != 0) {
                goto out;
@@ -2408,7 +2408,7 @@ static int vfs_ceph_close(struct vfs_handle_struct 
*handle, files_struct *fsp)
 out:
        DBG_DEBUG("[CEPH] close: handle=%p name=%s result=%d\n",
                  handle, fsp->fsp_name->base_name, result);
-       END_PROFILE(syscall_close);
+       END_PROFILE_X(syscall_close);
        return status_code(result);


-- 
Samba Shared Repository

Reply via email to