[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Thu Oct 28 02:57:02 MDT 2010


The branch, master has been updated
       via  2cfee00 s3: Add a vfs_time_audit module
       via  9759559 s3: Fix bug 7759
      from  b73a05e s4 net: rename to samba-tool in order to not clash with s3 net

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


- Log -----------------------------------------------------------------
commit 2cfee006e13d661c9aed68a104db62f487f3e889
Author: Abhidnya P Chirmule <achirmul at in.ibm.com>
Date:   Wed Jan 6 19:45:24 2010 +0100

    s3: Add a vfs_time_audit module
    
    This warns if a file system is slow
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Thu Oct 28 08:56:44 UTC 2010 on sn-devel-104

commit 97595597a32900aa064b88f7b5473df3064a6ee4
Author: Volodymyr Khomenko <Volodymyr_Khomenko at dell.com>
Date:   Thu Oct 28 09:34:05 2010 +0200

    s3: Fix bug 7759

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

Summary of changes:
 packaging/RHEL-CTDB/samba.spec.tmpl |    1 +
 source3/Makefile.in                 |    5 +
 source3/configure.in                |    2 +
 source3/modules/vfs_default.c       |   34 +-
 source3/modules/vfs_time_audit.c    | 2306 +++++++++++++++++++++++++++++++++++
 5 files changed, 2332 insertions(+), 16 deletions(-)
 create mode 100644 source3/modules/vfs_time_audit.c


Changeset truncated at 500 lines:

diff --git a/packaging/RHEL-CTDB/samba.spec.tmpl b/packaging/RHEL-CTDB/samba.spec.tmpl
index 2f32d3d..7ff37fb 100644
--- a/packaging/RHEL-CTDB/samba.spec.tmpl
+++ b/packaging/RHEL-CTDB/samba.spec.tmpl
@@ -495,6 +495,7 @@ exit 0
 %{_libarchdir}/samba/vfs/streams_depot.so
 %{_libarchdir}/samba/vfs/streams_xattr.so
 %{_libarchdir}/samba/vfs/syncops.so
+%{_libarchdir}/samba/vfs/time_audit.so
 %{_libarchdir}/samba/vfs/tsmsm.so
 %{_libarchdir}/samba/vfs/xattr_tdb.so
 
diff --git a/source3/Makefile.in b/source3/Makefile.in
index b287784..411a4c5 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -828,6 +828,7 @@ VFS_DIRSORT_OBJ = modules/vfs_dirsort.o
 VFS_SCANNEDONLY_OBJ = modules/vfs_scannedonly.o
 VFS_CROSSRENAME_OBJ = modules/vfs_crossrename.o
 VFS_LINUX_XFS_SGID_OBJ = modules/vfs_linux_xfs_sgid.o
+VFS_TIME_AUDIT_OBJ = modules/vfs_time_audit.o
 
 PLAINTEXT_AUTH_OBJ = auth/pampass.o auth/pass_check.o
 
@@ -3010,6 +3011,10 @@ bin/linux_xfs_sgid. at SHLIBEXT@: $(BINARY_PREREQS) $(VFS_LINUX_XFS_SGID_OBJ)
 	@echo "Building plugin $@"
 	@$(SHLD_MODULE) $(VFS_LINUX_XFS_SGID_OBJ)
 
+bin/time_audit. at SHLIBEXT@: $(BINARY_PREREQS) $(VFS_TIME_AUDIT_OBJ)
+	@echo "Building plugin $@"
+	@$(SHLD_MODULE) $(VFS_TIME_AUDIT_OBJ)
+
 #########################################################
 ## IdMap NSS plugins
 
diff --git a/source3/configure.in b/source3/configure.in
index 2db1b39..e67a262 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -459,6 +459,7 @@ default_shared_modules="$default_shared_modules vfs_catia"
 default_shared_modules="$default_shared_modules vfs_scannedonly"
 default_shared_modules="$default_shared_modules vfs_crossrename"
 default_shared_modules="$default_shared_modules vfs_linux_xfs_sgid"
+default_shared_modules="$default_shared_modules vfs_time_audit"
 
 if test "x$developer" = xyes; then
    default_static_modules="$default_static_modules rpc_rpcecho pdb_ads"
@@ -6763,6 +6764,7 @@ SMB_MODULE(vfs_dirsort, \$(VFS_DIRSORT_OBJ), "bin/dirsort.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_scannedonly, \$(VFS_SCANNEDONLY_OBJ), "bin/scannedonly.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_crossrename, \$(VFS_CROSSRENAME_OBJ), "bin/crossrename.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_linux_xfs_sgid, \$(VFS_LINUX_XFS_SGID_OBJ), "bin/linux_xfs_sgid.$SHLIBEXT", VFS)
+SMB_MODULE(vfs_time_audit, \$(VFS_TIME_AUDIT_OBJ), "bin/time_audit.$SHLIBEXT", VFS)
 
 SMB_SUBSYSTEM(VFS,smbd/vfs.o)
 
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 2cbb84c..6f5b09a 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -754,25 +754,27 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
 		goto out;
 	}
 
-	if (null_timespec(ft->atime)) {
-		ft->atime= smb_fname->st.st_ex_atime;
-	}
+	if (ft != NULL) {
+		if (null_timespec(ft->atime)) {
+			ft->atime= smb_fname->st.st_ex_atime;
+		}
 
-	if (null_timespec(ft->mtime)) {
-		ft->mtime = smb_fname->st.st_ex_mtime;
-	}
+		if (null_timespec(ft->mtime)) {
+			ft->mtime = smb_fname->st.st_ex_mtime;
+		}
 
-	if (!null_timespec(ft->create_time)) {
-		set_create_timespec_ea(handle->conn,
-				smb_fname,
-				ft->create_time);
-	}
+		if (!null_timespec(ft->create_time)) {
+			set_create_timespec_ea(handle->conn,
+					       smb_fname,
+					       ft->create_time);
+		}
 
-	if ((timespec_compare(&ft->atime,
-				&smb_fname->st.st_ex_atime) == 0) &&
-			(timespec_compare(&ft->mtime,
-				&smb_fname->st.st_ex_mtime) == 0)) {
-		return 0;
+		if ((timespec_compare(&ft->atime,
+				      &smb_fname->st.st_ex_atime) == 0) &&
+		    (timespec_compare(&ft->mtime,
+				      &smb_fname->st.st_ex_mtime) == 0)) {
+			return 0;
+		}
 	}
 
 #if defined(HAVE_UTIMENSAT)
diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c
new file mode 100644
index 0000000..b510edb
--- /dev/null
+++ b/source3/modules/vfs_time_audit.c
@@ -0,0 +1,2306 @@
+/*
+ * Time auditing VFS module for samba.  Log time taken for VFS call to syslog
+ * facility.
+ *
+ * Copyright (C) Abhidnya Chirmule <achirmul at in.ibm.com> 2009
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This module implements logging for time taken for all Samba VFS operations.
+ *
+ * vfs objects = time_audit
+ */
+
+
+#include "includes.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_VFS
+
+static double audit_timeout;
+
+static void smb_time_audit_log(const char *syscallname, double elapsed)
+{
+	DEBUG(0, ("WARNING: System call \"%s\" took unexpectedly long "
+		  "(%.2f seconds) -- Validate that file and storage "
+		  "subsystems are operating normally\n", syscallname,
+		  elapsed));
+}
+
+static int smb_time_audit_connect(vfs_handle_struct *handle,
+				  const char *svc, const char *user)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	if (!handle) {
+		return -1;
+	}
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
+	timediff = timeval_elapsed(&tv);
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("connect", timediff);
+	}
+	return result;
+}
+
+static void smb_time_audit_disconnect(vfs_handle_struct *handle)
+{
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	SMB_VFS_NEXT_DISCONNECT(handle);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("disconnect", timediff);
+	}
+
+	return;
+}
+
+static uint64_t smb_time_audit_disk_free(vfs_handle_struct *handle,
+					 const char *path,
+					 bool small_query, uint64_t *bsize,
+					 uint64_t *dfree, uint64_t *dsize)
+{
+	uint64_t result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize,
+					dfree, dsize);
+	timediff = timeval_elapsed(&tv);
+
+	/* Don't have a reasonable notion of failure here */
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("disk_free", timediff);
+	}
+
+	return result;
+}
+
+static int smb_time_audit_get_quota(struct vfs_handle_struct *handle,
+				    enum SMB_QUOTA_TYPE qtype, unid_t id,
+				    SMB_DISK_QUOTA *qt)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, qt);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("get_quota", timediff);
+	}
+	return result;
+}
+
+static int smb_time_audit_set_quota(struct vfs_handle_struct *handle,
+				    enum SMB_QUOTA_TYPE qtype, unid_t id,
+				    SMB_DISK_QUOTA *qt)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("set_quota", timediff);
+	}
+
+	return result;
+}
+
+static int smb_time_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
+					       struct files_struct *fsp,
+					       SHADOW_COPY_DATA *shadow_copy_data,
+					       bool labels)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp,
+						   shadow_copy_data, labels);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("get_shadow_copy_data", timediff);
+	}
+
+	return result;
+}
+
+static int smb_time_audit_statvfs(struct vfs_handle_struct *handle,
+				  const char *path,
+				  struct vfs_statvfs_struct *statbuf)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("statvfs", timediff);
+	}
+
+	return result;
+}
+
+static uint32_t smb_time_audit_fs_capabilities(struct vfs_handle_struct *handle,
+					       enum timestamp_set_resolution *p_ts_res)
+{
+	uint32_t result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("fs_capabilities", timediff);
+	}
+
+	return result;
+}
+
+static SMB_STRUCT_DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
+					      const char *fname,
+					      const char *mask, uint32 attr)
+{
+	SMB_STRUCT_DIR *result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("opendir", timediff);
+	}
+
+	return result;
+}
+
+static SMB_STRUCT_DIRENT *smb_time_audit_readdir(vfs_handle_struct *handle,
+						 SMB_STRUCT_DIR *dirp,
+						 SMB_STRUCT_STAT *sbuf)
+{
+	SMB_STRUCT_DIRENT *result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_READDIR(handle, dirp, sbuf);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("readdir", timediff);
+	}
+
+	return result;
+}
+
+static void smb_time_audit_seekdir(vfs_handle_struct *handle,
+				   SMB_STRUCT_DIR *dirp, long offset)
+{
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("seekdir", timediff);
+	}
+
+	return;
+}
+
+static long smb_time_audit_telldir(vfs_handle_struct *handle,
+				   SMB_STRUCT_DIR *dirp)
+{
+	long result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("telldir", timediff);
+	}
+
+	return result;
+}
+
+static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
+				     SMB_STRUCT_DIR *dirp)
+{
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	SMB_VFS_NEXT_REWINDDIR(handle, dirp);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("rewinddir", timediff);
+	}
+
+	return;
+}
+
+static int smb_time_audit_mkdir(vfs_handle_struct *handle,
+				const char *path, mode_t mode)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("mkdir", timediff);
+	}
+
+	return result;
+}
+
+static int smb_time_audit_rmdir(vfs_handle_struct *handle,
+				const char *path)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_RMDIR(handle, path);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("rmdir", timediff);
+	}
+
+	return result;
+}
+
+static int smb_time_audit_closedir(vfs_handle_struct *handle,
+				   SMB_STRUCT_DIR *dirp)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("closedir", timediff);
+	}
+
+	return result;
+}
+
+static void smb_time_audit_init_search_op(vfs_handle_struct *handle,
+					  SMB_STRUCT_DIR *dirp)
+{
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("init_search_op", timediff);
+	}
+	return;
+}
+
+static int smb_time_audit_open(vfs_handle_struct *handle,
+			       struct smb_filename *fname,
+			       files_struct *fsp,
+			       int flags, mode_t mode)
+{
+	int result;
+	struct timeval tv;
+	double timediff;
+
+	GetTimeOfDay(&tv);
+	result = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode);
+	timediff = timeval_elapsed(&tv);
+
+	if (timediff > audit_timeout) {
+		smb_time_audit_log("open", timediff);
+	}
+
+	return result;
+}
+
+static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
+					   struct smb_request *req,
+					   uint16_t root_dir_fid,
+					   struct smb_filename *fname,
+					   uint32_t access_mask,
+					   uint32_t share_access,
+					   uint32_t create_disposition,
+					   uint32_t create_options,
+					   uint32_t file_attributes,
+					   uint32_t oplock_request,
+					   uint64_t allocation_size,
+					   uint32_t private_flags,
+					   struct security_descriptor *sd,
+					   struct ea_list *ea_list,
+					   files_struct **result_fsp,
+					   int *pinfo)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list