2 * Time auditing VFS module for samba. Log time taken for VFS call to syslog
5 * Copyright (C) Abhidnya Chirmule <achirmul@in.ibm.com> 2009
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 * This module implements logging for time taken for all Samba VFS operations.
24 * vfs objects = time_audit
31 #define DBGC_CLASS DBGC_VFS
33 static double audit_timeout;
35 static void smb_time_audit_log(const char *syscallname, double elapsed)
37 DEBUG(0, ("WARNING: System call \"%s\" took unexpectedly long "
38 "(%.2f seconds) -- Validate that file and storage "
39 "subsystems are operating normally\n", syscallname,
43 static int smb_time_audit_connect(vfs_handle_struct *handle,
44 const char *svc, const char *user)
47 struct timespec ts1,ts2;
54 clock_gettime_mono(&ts1);
55 result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
56 clock_gettime_mono(&ts2);
57 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
58 if (timediff > audit_timeout) {
59 smb_time_audit_log("connect", timediff);
64 static void smb_time_audit_disconnect(vfs_handle_struct *handle)
66 struct timespec ts1,ts2;
69 clock_gettime_mono(&ts1);
70 SMB_VFS_NEXT_DISCONNECT(handle);
71 clock_gettime_mono(&ts2);
72 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
74 if (timediff > audit_timeout) {
75 smb_time_audit_log("disconnect", timediff);
81 static uint64_t smb_time_audit_disk_free(vfs_handle_struct *handle,
83 bool small_query, uint64_t *bsize,
84 uint64_t *dfree, uint64_t *dsize)
87 struct timespec ts1,ts2;
90 clock_gettime_mono(&ts1);
91 result = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize,
93 clock_gettime_mono(&ts2);
94 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
96 /* Don't have a reasonable notion of failure here */
97 if (timediff > audit_timeout) {
98 smb_time_audit_log("disk_free", timediff);
104 static int smb_time_audit_get_quota(struct vfs_handle_struct *handle,
105 enum SMB_QUOTA_TYPE qtype, unid_t id,
109 struct timespec ts1,ts2;
112 clock_gettime_mono(&ts1);
113 result = SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, qt);
114 clock_gettime_mono(&ts2);
115 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
117 if (timediff > audit_timeout) {
118 smb_time_audit_log("get_quota", timediff);
123 static int smb_time_audit_set_quota(struct vfs_handle_struct *handle,
124 enum SMB_QUOTA_TYPE qtype, unid_t id,
128 struct timespec ts1,ts2;
131 clock_gettime_mono(&ts1);
132 result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
133 clock_gettime_mono(&ts2);
134 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
136 if (timediff > audit_timeout) {
137 smb_time_audit_log("set_quota", timediff);
143 static int smb_time_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
144 struct files_struct *fsp,
145 SHADOW_COPY_DATA *shadow_copy_data,
149 struct timespec ts1,ts2;
152 clock_gettime_mono(&ts1);
153 result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp,
154 shadow_copy_data, labels);
155 clock_gettime_mono(&ts2);
156 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
158 if (timediff > audit_timeout) {
159 smb_time_audit_log("get_shadow_copy_data", timediff);
165 static int smb_time_audit_statvfs(struct vfs_handle_struct *handle,
167 struct vfs_statvfs_struct *statbuf)
170 struct timespec ts1,ts2;
173 clock_gettime_mono(&ts1);
174 result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
175 clock_gettime_mono(&ts2);
176 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
178 if (timediff > audit_timeout) {
179 smb_time_audit_log("statvfs", timediff);
185 static uint32_t smb_time_audit_fs_capabilities(struct vfs_handle_struct *handle,
186 enum timestamp_set_resolution *p_ts_res)
189 struct timespec ts1,ts2;
192 clock_gettime_mono(&ts1);
193 result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
194 clock_gettime_mono(&ts2);
195 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
197 if (timediff > audit_timeout) {
198 smb_time_audit_log("fs_capabilities", timediff);
204 static SMB_STRUCT_DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
206 const char *mask, uint32 attr)
208 SMB_STRUCT_DIR *result;
209 struct timespec ts1,ts2;
212 clock_gettime_mono(&ts1);
213 result = SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr);
214 clock_gettime_mono(&ts2);
215 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
217 if (timediff > audit_timeout) {
218 smb_time_audit_log("opendir", timediff);
224 static SMB_STRUCT_DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
226 const char *mask, uint32 attr)
228 SMB_STRUCT_DIR *result;
229 struct timespec ts1,ts2;
232 clock_gettime_mono(&ts1);
233 result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
234 clock_gettime_mono(&ts2);
235 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
237 if (timediff > audit_timeout) {
238 smb_time_audit_log("fdopendir", timediff);
244 static SMB_STRUCT_DIRENT *smb_time_audit_readdir(vfs_handle_struct *handle,
245 SMB_STRUCT_DIR *dirp,
246 SMB_STRUCT_STAT *sbuf)
248 SMB_STRUCT_DIRENT *result;
249 struct timespec ts1,ts2;
252 clock_gettime_mono(&ts1);
253 result = SMB_VFS_NEXT_READDIR(handle, dirp, sbuf);
254 clock_gettime_mono(&ts2);
255 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
257 if (timediff > audit_timeout) {
258 smb_time_audit_log("readdir", timediff);
264 static void smb_time_audit_seekdir(vfs_handle_struct *handle,
265 SMB_STRUCT_DIR *dirp, long offset)
267 struct timespec ts1,ts2;
270 clock_gettime_mono(&ts1);
271 SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
272 clock_gettime_mono(&ts2);
273 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
275 if (timediff > audit_timeout) {
276 smb_time_audit_log("seekdir", timediff);
282 static long smb_time_audit_telldir(vfs_handle_struct *handle,
283 SMB_STRUCT_DIR *dirp)
286 struct timespec ts1,ts2;
289 clock_gettime_mono(&ts1);
290 result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
291 clock_gettime_mono(&ts2);
292 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
294 if (timediff > audit_timeout) {
295 smb_time_audit_log("telldir", timediff);
301 static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
302 SMB_STRUCT_DIR *dirp)
304 struct timespec ts1,ts2;
307 clock_gettime_mono(&ts1);
308 SMB_VFS_NEXT_REWINDDIR(handle, dirp);
309 clock_gettime_mono(&ts2);
310 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
312 if (timediff > audit_timeout) {
313 smb_time_audit_log("rewinddir", timediff);
319 static int smb_time_audit_mkdir(vfs_handle_struct *handle,
320 const char *path, mode_t mode)
323 struct timespec ts1,ts2;
326 clock_gettime_mono(&ts1);
327 result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
328 clock_gettime_mono(&ts2);
329 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
331 if (timediff > audit_timeout) {
332 smb_time_audit_log("mkdir", timediff);
338 static int smb_time_audit_rmdir(vfs_handle_struct *handle,
342 struct timespec ts1,ts2;
345 clock_gettime_mono(&ts1);
346 result = SMB_VFS_NEXT_RMDIR(handle, path);
347 clock_gettime_mono(&ts2);
348 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
350 if (timediff > audit_timeout) {
351 smb_time_audit_log("rmdir", timediff);
357 static int smb_time_audit_closedir(vfs_handle_struct *handle,
358 SMB_STRUCT_DIR *dirp)
361 struct timespec ts1,ts2;
364 clock_gettime_mono(&ts1);
365 result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
366 clock_gettime_mono(&ts2);
367 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
369 if (timediff > audit_timeout) {
370 smb_time_audit_log("closedir", timediff);
376 static void smb_time_audit_init_search_op(vfs_handle_struct *handle,
377 SMB_STRUCT_DIR *dirp)
379 struct timespec ts1,ts2;
382 clock_gettime_mono(&ts1);
383 SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
384 clock_gettime_mono(&ts2);
385 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
387 if (timediff > audit_timeout) {
388 smb_time_audit_log("init_search_op", timediff);
393 static int smb_time_audit_open(vfs_handle_struct *handle,
394 struct smb_filename *fname,
396 int flags, mode_t mode)
399 struct timespec ts1,ts2;
402 clock_gettime_mono(&ts1);
403 result = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode);
404 clock_gettime_mono(&ts2);
405 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
407 if (timediff > audit_timeout) {
408 smb_time_audit_log("open", timediff);
414 static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
415 struct smb_request *req,
416 uint16_t root_dir_fid,
417 struct smb_filename *fname,
418 uint32_t access_mask,
419 uint32_t share_access,
420 uint32_t create_disposition,
421 uint32_t create_options,
422 uint32_t file_attributes,
423 uint32_t oplock_request,
424 uint64_t allocation_size,
425 uint32_t private_flags,
426 struct security_descriptor *sd,
427 struct ea_list *ea_list,
428 files_struct **result_fsp,
432 struct timespec ts1,ts2;
435 clock_gettime_mono(&ts1);
436 result = SMB_VFS_NEXT_CREATE_FILE(
439 root_dir_fid, /* root_dir_fid */
441 access_mask, /* access_mask */
442 share_access, /* share_access */
443 create_disposition, /* create_disposition*/
444 create_options, /* create_options */
445 file_attributes, /* file_attributes */
446 oplock_request, /* oplock_request */
447 allocation_size, /* allocation_size */
450 ea_list, /* ea_list */
451 result_fsp, /* result */
453 clock_gettime_mono(&ts2);
454 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
456 if (timediff > audit_timeout) {
457 smb_time_audit_log("create_file", timediff);
463 static int smb_time_audit_close(vfs_handle_struct *handle, files_struct *fsp)
466 struct timespec ts1,ts2;
469 clock_gettime_mono(&ts1);
470 result = SMB_VFS_NEXT_CLOSE(handle, fsp);
471 clock_gettime_mono(&ts2);
472 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
474 if (timediff > audit_timeout) {
475 smb_time_audit_log("close", timediff);
481 static ssize_t smb_time_audit_read(vfs_handle_struct *handle,
482 files_struct *fsp, void *data, size_t n)
485 struct timespec ts1,ts2;
488 clock_gettime_mono(&ts1);
489 result = SMB_VFS_NEXT_READ(handle, fsp, data, n);
490 clock_gettime_mono(&ts2);
491 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
493 if (timediff > audit_timeout) {
494 smb_time_audit_log("read", timediff);
500 static ssize_t smb_time_audit_pread(vfs_handle_struct *handle,
502 void *data, size_t n, SMB_OFF_T offset)
505 struct timespec ts1,ts2;
508 clock_gettime_mono(&ts1);
509 result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
510 clock_gettime_mono(&ts2);
511 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
513 if (timediff > audit_timeout) {
514 smb_time_audit_log("pread", timediff);
520 static ssize_t smb_time_audit_write(vfs_handle_struct *handle,
522 const void *data, size_t n)
525 struct timespec ts1,ts2;
528 clock_gettime_mono(&ts1);
529 result = SMB_VFS_NEXT_WRITE(handle, fsp, data, n);
530 clock_gettime_mono(&ts2);
531 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
533 if (timediff > audit_timeout) {
534 smb_time_audit_log("write", timediff);
540 static ssize_t smb_time_audit_pwrite(vfs_handle_struct *handle,
542 const void *data, size_t n,
546 struct timespec ts1,ts2;
549 clock_gettime_mono(&ts1);
550 result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
551 clock_gettime_mono(&ts2);
552 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
554 if (timediff > audit_timeout) {
555 smb_time_audit_log("pwrite", timediff);
561 static SMB_OFF_T smb_time_audit_lseek(vfs_handle_struct *handle,
563 SMB_OFF_T offset, int whence)
566 struct timespec ts1,ts2;
569 clock_gettime_mono(&ts1);
570 result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
571 clock_gettime_mono(&ts2);
572 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
574 if (timediff > audit_timeout) {
575 smb_time_audit_log("lseek", timediff);
581 static ssize_t smb_time_audit_sendfile(vfs_handle_struct *handle, int tofd,
582 files_struct *fromfsp,
583 const DATA_BLOB *hdr, SMB_OFF_T offset,
587 struct timespec ts1,ts2;
590 clock_gettime_mono(&ts1);
591 result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
592 clock_gettime_mono(&ts2);
593 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
595 if (timediff > audit_timeout) {
596 smb_time_audit_log("sendfile", timediff);
602 static ssize_t smb_time_audit_recvfile(vfs_handle_struct *handle, int fromfd,
608 struct timespec ts1,ts2;
611 clock_gettime_mono(&ts1);
612 result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
613 clock_gettime_mono(&ts2);
614 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
616 if (timediff > audit_timeout) {
617 smb_time_audit_log("recvfile", timediff);
623 static int smb_time_audit_rename(vfs_handle_struct *handle,
624 const struct smb_filename *oldname,
625 const struct smb_filename *newname)
628 struct timespec ts1,ts2;
631 clock_gettime_mono(&ts1);
632 result = SMB_VFS_NEXT_RENAME(handle, oldname, newname);
633 clock_gettime_mono(&ts2);
634 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
636 if (timediff > audit_timeout) {
637 smb_time_audit_log("rename", timediff);
643 static int smb_time_audit_fsync(vfs_handle_struct *handle, files_struct *fsp)
646 struct timespec ts1,ts2;
649 clock_gettime_mono(&ts1);
650 result = SMB_VFS_NEXT_FSYNC(handle, fsp);
651 clock_gettime_mono(&ts2);
652 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
654 if (timediff > audit_timeout) {
655 smb_time_audit_log("fsync", timediff);
661 static int smb_time_audit_stat(vfs_handle_struct *handle,
662 struct smb_filename *fname)
665 struct timespec ts1,ts2;
668 clock_gettime_mono(&ts1);
669 result = SMB_VFS_NEXT_STAT(handle, fname);
670 clock_gettime_mono(&ts2);
671 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
673 if (timediff > audit_timeout) {
674 smb_time_audit_log("stat", timediff);
680 static int smb_time_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
681 SMB_STRUCT_STAT *sbuf)
684 struct timespec ts1,ts2;
687 clock_gettime_mono(&ts1);
688 result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
689 clock_gettime_mono(&ts2);
690 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
692 if (timediff > audit_timeout) {
693 smb_time_audit_log("fstat", timediff);
699 static int smb_time_audit_lstat(vfs_handle_struct *handle,
700 struct smb_filename *path)
703 struct timespec ts1,ts2;
706 clock_gettime_mono(&ts1);
707 result = SMB_VFS_NEXT_LSTAT(handle, path);
708 clock_gettime_mono(&ts2);
709 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
711 if (timediff > audit_timeout) {
712 smb_time_audit_log("lstat", timediff);
718 static uint64_t smb_time_audit_get_alloc_size(vfs_handle_struct *handle,
720 const SMB_STRUCT_STAT *sbuf)
723 struct timespec ts1,ts2;
726 clock_gettime_mono(&ts1);
727 result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
728 clock_gettime_mono(&ts2);
729 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
731 if (timediff > audit_timeout) {
732 smb_time_audit_log("get_alloc_size", timediff);
738 static int smb_time_audit_unlink(vfs_handle_struct *handle,
739 const struct smb_filename *path)
742 struct timespec ts1,ts2;
745 clock_gettime_mono(&ts1);
746 result = SMB_VFS_NEXT_UNLINK(handle, path);
747 clock_gettime_mono(&ts2);
748 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
750 if (timediff > audit_timeout) {
751 smb_time_audit_log("unlink", timediff);
757 static int smb_time_audit_chmod(vfs_handle_struct *handle,
758 const char *path, mode_t mode)
761 struct timespec ts1,ts2;
764 clock_gettime_mono(&ts1);
765 result = SMB_VFS_NEXT_CHMOD(handle, path, mode);
766 clock_gettime_mono(&ts2);
767 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
769 if (timediff > audit_timeout) {
770 smb_time_audit_log("chmod", timediff);
776 static int smb_time_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
780 struct timespec ts1,ts2;
783 clock_gettime_mono(&ts1);
784 result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
785 clock_gettime_mono(&ts2);
786 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
788 if (timediff > audit_timeout) {
789 smb_time_audit_log("fchmod", timediff);
795 static int smb_time_audit_chown(vfs_handle_struct *handle,
796 const char *path, uid_t uid, gid_t gid)
799 struct timespec ts1,ts2;
802 clock_gettime_mono(&ts1);
803 result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid);
804 clock_gettime_mono(&ts2);
805 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
807 if (timediff > audit_timeout) {
808 smb_time_audit_log("chown", timediff);
814 static int smb_time_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
815 uid_t uid, gid_t gid)
818 struct timespec ts1,ts2;
821 clock_gettime_mono(&ts1);
822 result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
823 clock_gettime_mono(&ts2);
824 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
826 if (timediff > audit_timeout) {
827 smb_time_audit_log("fchown", timediff);
833 static int smb_time_audit_lchown(vfs_handle_struct *handle,
834 const char *path, uid_t uid, gid_t gid)
837 struct timespec ts1,ts2;
840 clock_gettime_mono(&ts1);
841 result = SMB_VFS_NEXT_LCHOWN(handle, path, uid, gid);
842 clock_gettime_mono(&ts2);
843 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
845 if (timediff > audit_timeout) {
846 smb_time_audit_log("lchown", timediff);
852 static int smb_time_audit_chdir(vfs_handle_struct *handle, const char *path)
855 struct timespec ts1,ts2;
858 clock_gettime_mono(&ts1);
859 result = SMB_VFS_NEXT_CHDIR(handle, path);
860 clock_gettime_mono(&ts2);
861 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
863 if (timediff > audit_timeout) {
864 smb_time_audit_log("chdir", timediff);
870 static char *smb_time_audit_getwd(vfs_handle_struct *handle, char *path)
873 struct timespec ts1,ts2;
876 clock_gettime_mono(&ts1);
877 result = SMB_VFS_NEXT_GETWD(handle, path);
878 clock_gettime_mono(&ts2);
879 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
881 if (timediff > audit_timeout) {
882 smb_time_audit_log("getwd", timediff);
888 static int smb_time_audit_ntimes(vfs_handle_struct *handle,
889 const struct smb_filename *path,
890 struct smb_file_time *ft)
893 struct timespec ts1,ts2;
896 clock_gettime_mono(&ts1);
897 result = SMB_VFS_NEXT_NTIMES(handle, path, ft);
898 clock_gettime_mono(&ts2);
899 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
901 if (timediff > audit_timeout) {
902 smb_time_audit_log("ntimes", timediff);
908 static int smb_time_audit_ftruncate(vfs_handle_struct *handle,
913 struct timespec ts1,ts2;
916 clock_gettime_mono(&ts1);
917 result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
918 clock_gettime_mono(&ts2);
919 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
921 if (timediff > audit_timeout) {
922 smb_time_audit_log("ftruncate", timediff);
928 static int smb_time_audit_fallocate(vfs_handle_struct *handle,
930 enum vfs_fallocate_mode mode,
935 struct timespec ts1,ts2;
938 clock_gettime_mono(&ts1);
939 result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
940 clock_gettime_mono(&ts2);
941 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
943 if (timediff > audit_timeout) {
944 smb_time_audit_log("fallocate", timediff);
950 static bool smb_time_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
951 int op, SMB_OFF_T offset, SMB_OFF_T count,
955 struct timespec ts1,ts2;
958 clock_gettime_mono(&ts1);
959 result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
960 clock_gettime_mono(&ts2);
961 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
963 if (timediff > audit_timeout) {
964 smb_time_audit_log("lock", timediff);
970 static int smb_time_audit_kernel_flock(struct vfs_handle_struct *handle,
971 struct files_struct *fsp,
972 uint32 share_mode, uint32 access_mask)
975 struct timespec ts1,ts2;
978 clock_gettime_mono(&ts1);
979 result = SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp, share_mode,
981 clock_gettime_mono(&ts2);
982 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
984 if (timediff > audit_timeout) {
985 smb_time_audit_log("kernel_flock", timediff);
991 static int smb_time_audit_linux_setlease(vfs_handle_struct *handle,
996 struct timespec ts1,ts2;
999 clock_gettime_mono(&ts1);
1000 result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
1001 clock_gettime_mono(&ts2);
1002 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1004 if (timediff > audit_timeout) {
1005 smb_time_audit_log("linux_setlease", timediff);
1011 static bool smb_time_audit_getlock(vfs_handle_struct *handle,
1013 SMB_OFF_T *poffset, SMB_OFF_T *pcount,
1014 int *ptype, pid_t *ppid)
1017 struct timespec ts1,ts2;
1020 clock_gettime_mono(&ts1);
1021 result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype,
1023 clock_gettime_mono(&ts2);
1024 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1026 if (timediff > audit_timeout) {
1027 smb_time_audit_log("getlock", timediff);
1033 static int smb_time_audit_symlink(vfs_handle_struct *handle,
1034 const char *oldpath, const char *newpath)
1037 struct timespec ts1,ts2;
1040 clock_gettime_mono(&ts1);
1041 result = SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath);
1042 clock_gettime_mono(&ts2);
1043 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1045 if (timediff > audit_timeout) {
1046 smb_time_audit_log("symlink", timediff);
1052 static int smb_time_audit_readlink(vfs_handle_struct *handle,
1053 const char *path, char *buf, size_t bufsiz)
1056 struct timespec ts1,ts2;
1059 clock_gettime_mono(&ts1);
1060 result = SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz);
1061 clock_gettime_mono(&ts2);
1062 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1064 if (timediff > audit_timeout) {
1065 smb_time_audit_log("readlink", timediff);
1071 static int smb_time_audit_link(vfs_handle_struct *handle,
1072 const char *oldpath, const char *newpath)
1075 struct timespec ts1,ts2;
1078 clock_gettime_mono(&ts1);
1079 result = SMB_VFS_NEXT_LINK(handle, oldpath, newpath);
1080 clock_gettime_mono(&ts2);
1081 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1083 if (timediff > audit_timeout) {
1084 smb_time_audit_log("link", timediff);
1090 static int smb_time_audit_mknod(vfs_handle_struct *handle,
1091 const char *pathname, mode_t mode,
1095 struct timespec ts1,ts2;
1098 clock_gettime_mono(&ts1);
1099 result = SMB_VFS_NEXT_MKNOD(handle, pathname, mode, dev);
1100 clock_gettime_mono(&ts2);
1101 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1103 if (timediff > audit_timeout) {
1104 smb_time_audit_log("mknod", timediff);
1110 static char *smb_time_audit_realpath(vfs_handle_struct *handle,
1114 struct timespec ts1,ts2;
1117 clock_gettime_mono(&ts1);
1118 result = SMB_VFS_NEXT_REALPATH(handle, path);
1119 clock_gettime_mono(&ts2);
1120 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1122 if (timediff > audit_timeout) {
1123 smb_time_audit_log("realpath", timediff);
1129 static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle,
1130 struct sys_notify_context *ctx,
1131 struct notify_entry *e,
1132 void (*callback)(struct sys_notify_context *ctx,
1134 struct notify_event *ev),
1135 void *private_data, void *handle_p)
1138 struct timespec ts1,ts2;
1141 clock_gettime_mono(&ts1);
1142 result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, callback,
1143 private_data, handle_p);
1144 clock_gettime_mono(&ts2);
1145 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1147 if (timediff > audit_timeout) {
1148 smb_time_audit_log("notify_watch", timediff);
1154 static int smb_time_audit_chflags(vfs_handle_struct *handle,
1155 const char *path, unsigned int flags)
1158 struct timespec ts1,ts2;
1161 clock_gettime_mono(&ts1);
1162 result = SMB_VFS_NEXT_CHFLAGS(handle, path, flags);
1163 clock_gettime_mono(&ts2);
1164 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1166 if (timediff > audit_timeout) {
1167 smb_time_audit_log("chflags", timediff);
1173 static struct file_id smb_time_audit_file_id_create(struct vfs_handle_struct *handle,
1174 const SMB_STRUCT_STAT *sbuf)
1176 struct file_id id_zero;
1177 struct file_id result;
1178 struct timespec ts1,ts2;
1181 ZERO_STRUCT(id_zero);
1183 clock_gettime_mono(&ts1);
1184 result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
1185 clock_gettime_mono(&ts2);
1186 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1188 if (timediff > audit_timeout) {
1189 smb_time_audit_log("file_id_create", timediff);
1195 static NTSTATUS smb_time_audit_streaminfo(vfs_handle_struct *handle,
1196 struct files_struct *fsp,
1198 TALLOC_CTX *mem_ctx,
1199 unsigned int *pnum_streams,
1200 struct stream_struct **pstreams)
1203 struct timespec ts1,ts2;
1206 clock_gettime_mono(&ts1);
1207 result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx,
1208 pnum_streams, pstreams);
1209 clock_gettime_mono(&ts2);
1210 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1212 if (timediff > audit_timeout) {
1213 smb_time_audit_log("streaminfo", timediff);
1219 static int smb_time_audit_get_real_filename(struct vfs_handle_struct *handle,
1222 TALLOC_CTX *mem_ctx,
1226 struct timespec ts1,ts2;
1229 clock_gettime_mono(&ts1);
1230 result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
1232 clock_gettime_mono(&ts2);
1233 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1235 if (timediff > audit_timeout) {
1236 smb_time_audit_log("get_real_filename", timediff);
1242 static const char *smb_time_audit_connectpath(vfs_handle_struct *handle,
1246 struct timespec ts1,ts2;
1249 clock_gettime_mono(&ts1);
1250 result = SMB_VFS_NEXT_CONNECTPATH(handle, fname);
1251 clock_gettime_mono(&ts2);
1252 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1254 if (timediff > audit_timeout) {
1255 smb_time_audit_log("connectpath", timediff);
1261 static NTSTATUS smb_time_audit_brl_lock_windows(struct vfs_handle_struct *handle,
1262 struct byte_range_lock *br_lck,
1263 struct lock_struct *plock,
1265 struct blocking_lock_record *blr)
1268 struct timespec ts1,ts2;
1271 clock_gettime_mono(&ts1);
1272 result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock,
1273 blocking_lock, blr);
1274 clock_gettime_mono(&ts2);
1275 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1277 if (timediff > audit_timeout) {
1278 smb_time_audit_log("brl_lock_windows", timediff);
1284 static bool smb_time_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
1285 struct messaging_context *msg_ctx,
1286 struct byte_range_lock *br_lck,
1287 const struct lock_struct *plock)
1290 struct timespec ts1,ts2;
1293 clock_gettime_mono(&ts1);
1294 result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck,
1296 clock_gettime_mono(&ts2);
1297 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1299 if (timediff > audit_timeout) {
1300 smb_time_audit_log("brl_unlock_windows", timediff);
1306 static bool smb_time_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
1307 struct byte_range_lock *br_lck,
1308 struct lock_struct *plock,
1309 struct blocking_lock_record *blr)
1312 struct timespec ts1,ts2;
1315 clock_gettime_mono(&ts1);
1316 result = SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock, blr);
1317 clock_gettime_mono(&ts2);
1318 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1320 if (timediff > audit_timeout) {
1321 smb_time_audit_log("brl_cancel_windows", timediff);
1327 static bool smb_time_audit_strict_lock(struct vfs_handle_struct *handle,
1328 struct files_struct *fsp,
1329 struct lock_struct *plock)
1332 struct timespec ts1,ts2;
1335 clock_gettime_mono(&ts1);
1336 result = SMB_VFS_NEXT_STRICT_LOCK(handle, fsp, plock);
1337 clock_gettime_mono(&ts2);
1338 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1340 if (timediff > audit_timeout) {
1341 smb_time_audit_log("strict_lock", timediff);
1347 static void smb_time_audit_strict_unlock(struct vfs_handle_struct *handle,
1348 struct files_struct *fsp,
1349 struct lock_struct *plock)
1351 struct timespec ts1,ts2;
1354 clock_gettime_mono(&ts1);
1355 SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock);
1356 clock_gettime_mono(&ts2);
1357 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1359 if (timediff > audit_timeout) {
1360 smb_time_audit_log("strict_unlock", timediff);
1366 static NTSTATUS smb_time_audit_translate_name(struct vfs_handle_struct *handle,
1368 enum vfs_translate_direction direction,
1369 TALLOC_CTX *mem_ctx,
1373 struct timespec ts1,ts2;
1376 clock_gettime_mono(&ts1);
1377 result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
1379 clock_gettime_mono(&ts2);
1380 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1382 if (timediff > audit_timeout) {
1383 smb_time_audit_log("translate_name", timediff);
1389 static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
1391 uint32 security_info,
1392 struct security_descriptor **ppdesc)
1395 struct timespec ts1,ts2;
1398 clock_gettime_mono(&ts1);
1399 result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info, ppdesc);
1400 clock_gettime_mono(&ts2);
1401 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1403 if (timediff > audit_timeout) {
1404 smb_time_audit_log("fget_nt_acl", timediff);
1410 static NTSTATUS smb_time_audit_get_nt_acl(vfs_handle_struct *handle,
1412 uint32 security_info,
1413 struct security_descriptor **ppdesc)
1416 struct timespec ts1,ts2;
1419 clock_gettime_mono(&ts1);
1420 result = SMB_VFS_NEXT_GET_NT_ACL(handle, name, security_info, ppdesc);
1421 clock_gettime_mono(&ts2);
1422 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1424 if (timediff > audit_timeout) {
1425 smb_time_audit_log("get_nt_acl", timediff);
1431 static NTSTATUS smb_time_audit_fset_nt_acl(vfs_handle_struct *handle,
1433 uint32 security_info_sent,
1434 const struct security_descriptor *psd)
1437 struct timespec ts1,ts2;
1440 clock_gettime_mono(&ts1);
1441 result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent,
1443 clock_gettime_mono(&ts2);
1444 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1446 if (timediff > audit_timeout) {
1447 smb_time_audit_log("fset_nt_acl", timediff);
1453 static int smb_time_audit_chmod_acl(vfs_handle_struct *handle,
1454 const char *path, mode_t mode)
1457 struct timespec ts1,ts2;
1460 clock_gettime_mono(&ts1);
1461 result = SMB_VFS_NEXT_CHMOD_ACL(handle, path, mode);
1462 clock_gettime_mono(&ts2);
1463 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1465 if (timediff > audit_timeout) {
1466 smb_time_audit_log("chmod_acl", timediff);
1472 static int smb_time_audit_fchmod_acl(vfs_handle_struct *handle,
1473 files_struct *fsp, mode_t mode)
1476 struct timespec ts1,ts2;
1479 clock_gettime_mono(&ts1);
1480 result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
1481 clock_gettime_mono(&ts2);
1482 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1484 if (timediff > audit_timeout) {
1485 smb_time_audit_log("fchmod_acl", timediff);
1491 static int smb_time_audit_sys_acl_get_entry(vfs_handle_struct *handle,
1492 SMB_ACL_T theacl, int entry_id,
1493 SMB_ACL_ENTRY_T *entry_p)
1496 struct timespec ts1,ts2;
1499 clock_gettime_mono(&ts1);
1500 result = SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, theacl, entry_id,
1502 clock_gettime_mono(&ts2);
1503 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1505 if (timediff > audit_timeout) {
1506 smb_time_audit_log("sys_acl_get_entry", timediff);
1512 static int smb_time_audit_sys_acl_get_tag_type(vfs_handle_struct *handle,
1513 SMB_ACL_ENTRY_T entry_d,
1514 SMB_ACL_TAG_T *tag_type_p)
1517 struct timespec ts1,ts2;
1520 clock_gettime_mono(&ts1);
1521 result = SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, entry_d,
1523 clock_gettime_mono(&ts2);
1524 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1526 if (timediff > audit_timeout) {
1527 smb_time_audit_log("sys_acl_get_tag_type", timediff);
1533 static int smb_time_audit_sys_acl_get_permset(vfs_handle_struct *handle,
1534 SMB_ACL_ENTRY_T entry_d,
1535 SMB_ACL_PERMSET_T *permset_p)
1538 struct timespec ts1,ts2;
1541 clock_gettime_mono(&ts1);
1542 result = SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, entry_d,
1544 clock_gettime_mono(&ts2);
1545 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1547 if (timediff > audit_timeout) {
1548 smb_time_audit_log("sys_acl_get_permset", timediff);
1554 static void * smb_time_audit_sys_acl_get_qualifier(vfs_handle_struct *handle,
1555 SMB_ACL_ENTRY_T entry_d)
1558 struct timespec ts1,ts2;
1561 clock_gettime_mono(&ts1);
1562 result = SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, entry_d);
1563 clock_gettime_mono(&ts2);
1564 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1566 if (timediff > audit_timeout) {
1567 smb_time_audit_log("sys_acl_get_qualifier", timediff);
1573 static SMB_ACL_T smb_time_audit_sys_acl_get_file(vfs_handle_struct *handle,
1575 SMB_ACL_TYPE_T type)
1578 struct timespec ts1,ts2;
1581 clock_gettime_mono(&ts1);
1582 result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type);
1583 clock_gettime_mono(&ts2);
1584 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1586 if (timediff > audit_timeout) {
1587 smb_time_audit_log("sys_acl_get_file", timediff);
1593 static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
1597 struct timespec ts1,ts2;
1600 clock_gettime_mono(&ts1);
1601 result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp);
1602 clock_gettime_mono(&ts2);
1603 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1605 if (timediff > audit_timeout) {
1606 smb_time_audit_log("sys_acl_get_fd", timediff);
1612 static int smb_time_audit_sys_acl_clear_perms(vfs_handle_struct *handle,
1613 SMB_ACL_PERMSET_T permset)
1616 struct timespec ts1,ts2;
1619 clock_gettime_mono(&ts1);
1620 result = SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, permset);
1621 clock_gettime_mono(&ts2);
1622 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1624 if (timediff > audit_timeout) {
1625 smb_time_audit_log("sys_acl_clear_perms", timediff);
1631 static int smb_time_audit_sys_acl_add_perm(vfs_handle_struct *handle,
1632 SMB_ACL_PERMSET_T permset,
1633 SMB_ACL_PERM_T perm)
1636 struct timespec ts1,ts2;
1639 clock_gettime_mono(&ts1);
1640 result = SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, permset, perm);
1641 clock_gettime_mono(&ts2);
1642 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1644 if (timediff > audit_timeout) {
1645 smb_time_audit_log("sys_acl_add_perm", timediff);
1651 static char * smb_time_audit_sys_acl_to_text(vfs_handle_struct *handle,
1656 struct timespec ts1,ts2;
1659 clock_gettime_mono(&ts1);
1660 result = SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, theacl, plen);
1661 clock_gettime_mono(&ts2);
1662 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1664 if (timediff > audit_timeout) {
1665 smb_time_audit_log("sys_acl_to_text", timediff);
1671 static SMB_ACL_T smb_time_audit_sys_acl_init(vfs_handle_struct *handle,
1675 struct timespec ts1,ts2;
1678 clock_gettime_mono(&ts1);
1679 result = SMB_VFS_NEXT_SYS_ACL_INIT(handle, count);
1680 clock_gettime_mono(&ts2);
1681 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1683 if (timediff > audit_timeout) {
1684 smb_time_audit_log("sys_acl_init", timediff);
1690 static int smb_time_audit_sys_acl_create_entry(vfs_handle_struct *handle,
1692 SMB_ACL_ENTRY_T *pentry)
1695 struct timespec ts1,ts2;
1698 clock_gettime_mono(&ts1);
1699 result = SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, pacl, pentry);
1700 clock_gettime_mono(&ts2);
1701 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1703 if (timediff > audit_timeout) {
1704 smb_time_audit_log("sys_acl_create_entry", timediff);
1710 static int smb_time_audit_sys_acl_set_tag_type(vfs_handle_struct *handle,
1711 SMB_ACL_ENTRY_T entry,
1712 SMB_ACL_TAG_T tagtype)
1715 struct timespec ts1,ts2;
1718 clock_gettime_mono(&ts1);
1719 result = SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, entry,
1721 clock_gettime_mono(&ts2);
1722 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1724 if (timediff > audit_timeout) {
1725 smb_time_audit_log("sys_acl_set_tag_type", timediff);
1731 static int smb_time_audit_sys_acl_set_qualifier(vfs_handle_struct *handle,
1732 SMB_ACL_ENTRY_T entry,
1736 struct timespec ts1,ts2;
1739 clock_gettime_mono(&ts1);
1740 result = SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, entry, qual);
1741 clock_gettime_mono(&ts2);
1742 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1744 if (timediff > audit_timeout) {
1745 smb_time_audit_log("sys_acl_set_qualifier", timediff);
1751 static int smb_time_audit_sys_acl_set_permset(vfs_handle_struct *handle,
1752 SMB_ACL_ENTRY_T entry,
1753 SMB_ACL_PERMSET_T permset)
1756 struct timespec ts1,ts2;
1759 clock_gettime_mono(&ts1);
1760 result = SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, entry, permset);
1761 clock_gettime_mono(&ts2);
1762 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1764 if (timediff > audit_timeout) {
1765 smb_time_audit_log("sys_acl_set_permset", timediff);
1771 static int smb_time_audit_sys_acl_valid(vfs_handle_struct *handle,
1775 struct timespec ts1,ts2;
1778 clock_gettime_mono(&ts1);
1779 result = SMB_VFS_NEXT_SYS_ACL_VALID(handle, theacl);
1780 clock_gettime_mono(&ts2);
1781 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1783 if (timediff > audit_timeout) {
1784 smb_time_audit_log("sys_acl_valid", timediff);
1790 static int smb_time_audit_sys_acl_set_file(vfs_handle_struct *handle,
1792 SMB_ACL_TYPE_T acltype,
1796 struct timespec ts1,ts2;
1799 clock_gettime_mono(&ts1);
1800 result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype,
1802 clock_gettime_mono(&ts2);
1803 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1805 if (timediff > audit_timeout) {
1806 smb_time_audit_log("sys_acl_set_file", timediff);
1812 static int smb_time_audit_sys_acl_set_fd(vfs_handle_struct *handle,
1817 struct timespec ts1,ts2;
1820 clock_gettime_mono(&ts1);
1821 result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, theacl);
1822 clock_gettime_mono(&ts2);
1823 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1825 if (timediff > audit_timeout) {
1826 smb_time_audit_log("sys_acl_set_fd", timediff);
1832 static int smb_time_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
1836 struct timespec ts1,ts2;
1839 clock_gettime_mono(&ts1);
1840 result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path);
1841 clock_gettime_mono(&ts2);
1842 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1844 if (timediff > audit_timeout) {
1845 smb_time_audit_log("sys_acl_delete_def_file", timediff);
1851 static int smb_time_audit_sys_acl_get_perm(vfs_handle_struct *handle,
1852 SMB_ACL_PERMSET_T permset,
1853 SMB_ACL_PERM_T perm)
1856 struct timespec ts1,ts2;
1859 clock_gettime_mono(&ts1);
1860 result = SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, permset, perm);
1861 clock_gettime_mono(&ts2);
1862 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1864 if (timediff > audit_timeout) {
1865 smb_time_audit_log("sys_acl_get_perm", timediff);
1871 static int smb_time_audit_sys_acl_free_text(vfs_handle_struct *handle,
1875 struct timespec ts1,ts2;
1878 clock_gettime_mono(&ts1);
1879 result = SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, text);
1880 clock_gettime_mono(&ts2);
1881 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1883 if (timediff > audit_timeout) {
1884 smb_time_audit_log("sys_acl_free_text", timediff);
1890 static int smb_time_audit_sys_acl_free_acl(vfs_handle_struct *handle,
1891 SMB_ACL_T posix_acl)
1894 struct timespec ts1,ts2;
1897 clock_gettime_mono(&ts1);
1898 result = SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, posix_acl);
1899 clock_gettime_mono(&ts2);
1900 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1902 if (timediff > audit_timeout) {
1903 smb_time_audit_log("sys_acl_free_acl", timediff);
1909 static int smb_time_audit_sys_acl_free_qualifier(vfs_handle_struct *handle,
1911 SMB_ACL_TAG_T tagtype)
1914 struct timespec ts1,ts2;
1917 clock_gettime_mono(&ts1);
1918 result = SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, qualifier,
1920 clock_gettime_mono(&ts2);
1921 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1923 if (timediff > audit_timeout) {
1924 smb_time_audit_log("sys_acl_free_qualifier", timediff);
1930 static ssize_t smb_time_audit_getxattr(struct vfs_handle_struct *handle,
1931 const char *path, const char *name,
1932 void *value, size_t size)
1935 struct timespec ts1,ts2;
1938 clock_gettime_mono(&ts1);
1939 result = SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size);
1940 clock_gettime_mono(&ts2);
1941 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1943 if (timediff > audit_timeout) {
1944 smb_time_audit_log("getxattr", timediff);
1950 static ssize_t smb_time_audit_lgetxattr(struct vfs_handle_struct *handle,
1951 const char *path, const char *name,
1952 void *value, size_t size)
1955 struct timespec ts1,ts2;
1958 clock_gettime_mono(&ts1);
1959 result = SMB_VFS_NEXT_LGETXATTR(handle, path, name, value, size);
1960 clock_gettime_mono(&ts2);
1961 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1963 if (timediff > audit_timeout) {
1964 smb_time_audit_log("lgetxattr", timediff);
1970 static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle,
1971 struct files_struct *fsp,
1972 const char *name, void *value,
1976 struct timespec ts1,ts2;
1979 clock_gettime_mono(&ts1);
1980 result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
1981 clock_gettime_mono(&ts2);
1982 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1984 if (timediff > audit_timeout) {
1985 smb_time_audit_log("fgetxattr", timediff);
1991 static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle,
1992 const char *path, char *list,
1996 struct timespec ts1,ts2;
1999 clock_gettime_mono(&ts1);
2000 result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
2001 clock_gettime_mono(&ts2);
2002 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2004 if (timediff > audit_timeout) {
2005 smb_time_audit_log("listxattr", timediff);
2011 static ssize_t smb_time_audit_llistxattr(struct vfs_handle_struct *handle,
2012 const char *path, char *list,
2016 struct timespec ts1,ts2;
2019 clock_gettime_mono(&ts1);
2020 result = SMB_VFS_NEXT_LLISTXATTR(handle, path, list, size);
2021 clock_gettime_mono(&ts2);
2022 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2024 if (timediff > audit_timeout) {
2025 smb_time_audit_log("llistxattr", timediff);
2031 static ssize_t smb_time_audit_flistxattr(struct vfs_handle_struct *handle,
2032 struct files_struct *fsp, char *list,
2036 struct timespec ts1,ts2;
2039 clock_gettime_mono(&ts1);
2040 result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
2041 clock_gettime_mono(&ts2);
2042 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2044 if (timediff > audit_timeout) {
2045 smb_time_audit_log("flistxattr", timediff);
2051 static int smb_time_audit_removexattr(struct vfs_handle_struct *handle,
2052 const char *path, const char *name)
2055 struct timespec ts1,ts2;
2058 clock_gettime_mono(&ts1);
2059 result = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name);
2060 clock_gettime_mono(&ts2);
2061 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2063 if (timediff > audit_timeout) {
2064 smb_time_audit_log("removexattr", timediff);
2070 static int smb_time_audit_lremovexattr(struct vfs_handle_struct *handle,
2071 const char *path, const char *name)
2074 struct timespec ts1,ts2;
2077 clock_gettime_mono(&ts1);
2078 result = SMB_VFS_NEXT_LREMOVEXATTR(handle, path, name);
2079 clock_gettime_mono(&ts2);
2080 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2082 if (timediff > audit_timeout) {
2083 smb_time_audit_log("lremovexattr", timediff);
2089 static int smb_time_audit_fremovexattr(struct vfs_handle_struct *handle,
2090 struct files_struct *fsp,
2094 struct timespec ts1,ts2;
2097 clock_gettime_mono(&ts1);
2098 result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
2099 clock_gettime_mono(&ts2);
2100 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2102 if (timediff > audit_timeout) {
2103 smb_time_audit_log("fremovexattr", timediff);
2109 static int smb_time_audit_setxattr(struct vfs_handle_struct *handle,
2110 const char *path, const char *name,
2111 const void *value, size_t size,
2115 struct timespec ts1,ts2;
2118 clock_gettime_mono(&ts1);
2119 result = SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size,
2121 clock_gettime_mono(&ts2);
2122 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2124 if (timediff > audit_timeout) {
2125 smb_time_audit_log("setxattr", timediff);
2131 static int smb_time_audit_lsetxattr(struct vfs_handle_struct *handle,
2132 const char *path, const char *name,
2133 const void *value, size_t size,
2137 struct timespec ts1,ts2;
2140 clock_gettime_mono(&ts1);
2141 result = SMB_VFS_NEXT_LSETXATTR(handle, path, name, value, size,
2143 clock_gettime_mono(&ts2);
2144 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2146 if (timediff > audit_timeout) {
2147 smb_time_audit_log("lsetxattr", timediff);
2153 static int smb_time_audit_fsetxattr(struct vfs_handle_struct *handle,
2154 struct files_struct *fsp, const char *name,
2155 const void *value, size_t size, int flags)
2158 struct timespec ts1,ts2;
2161 clock_gettime_mono(&ts1);
2162 result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
2163 clock_gettime_mono(&ts2);
2164 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2166 if (timediff > audit_timeout) {
2167 smb_time_audit_log("fsetxattr", timediff);
2173 static int smb_time_audit_aio_read(struct vfs_handle_struct *handle,
2174 struct files_struct *fsp,
2175 SMB_STRUCT_AIOCB *aiocb)
2178 struct timespec ts1,ts2;
2181 clock_gettime_mono(&ts1);
2182 result = SMB_VFS_NEXT_AIO_READ(handle, fsp, aiocb);
2183 clock_gettime_mono(&ts2);
2184 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2186 if (timediff > audit_timeout) {
2187 smb_time_audit_log("aio_read", timediff);
2193 static int smb_time_audit_aio_write(struct vfs_handle_struct *handle,
2194 struct files_struct *fsp,
2195 SMB_STRUCT_AIOCB *aiocb)
2198 struct timespec ts1,ts2;
2201 clock_gettime_mono(&ts1);
2202 result = SMB_VFS_NEXT_AIO_WRITE(handle, fsp, aiocb);
2203 clock_gettime_mono(&ts2);
2204 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2206 if (timediff > audit_timeout) {
2207 smb_time_audit_log("aio_write", timediff);
2213 static ssize_t smb_time_audit_aio_return(struct vfs_handle_struct *handle,
2214 struct files_struct *fsp,
2215 SMB_STRUCT_AIOCB *aiocb)
2218 struct timespec ts1,ts2;
2221 clock_gettime_mono(&ts1);
2222 result = SMB_VFS_NEXT_AIO_RETURN(handle, fsp, aiocb);
2223 clock_gettime_mono(&ts2);
2224 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2226 if (timediff > audit_timeout) {
2227 smb_time_audit_log("aio_return", timediff);
2233 static int smb_time_audit_aio_cancel(struct vfs_handle_struct *handle,
2234 struct files_struct *fsp,
2235 SMB_STRUCT_AIOCB *aiocb)
2238 struct timespec ts1,ts2;
2241 clock_gettime_mono(&ts1);
2242 result = SMB_VFS_NEXT_AIO_CANCEL(handle, fsp, aiocb);
2243 clock_gettime_mono(&ts2);
2244 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2246 if (timediff > audit_timeout) {
2247 smb_time_audit_log("aio_cancel", timediff);
2253 static int smb_time_audit_aio_error(struct vfs_handle_struct *handle,
2254 struct files_struct *fsp,
2255 SMB_STRUCT_AIOCB *aiocb)
2258 struct timespec ts1,ts2;
2261 clock_gettime_mono(&ts1);
2262 result = SMB_VFS_NEXT_AIO_ERROR(handle, fsp, aiocb);
2263 clock_gettime_mono(&ts2);
2264 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2266 if (timediff > audit_timeout) {
2267 smb_time_audit_log("aio_error", timediff);
2273 static int smb_time_audit_aio_fsync(struct vfs_handle_struct *handle,
2274 struct files_struct *fsp, int op,
2275 SMB_STRUCT_AIOCB *aiocb)
2278 struct timespec ts1,ts2;
2281 clock_gettime_mono(&ts1);
2282 result = SMB_VFS_NEXT_AIO_FSYNC(handle, fsp, op, aiocb);
2283 clock_gettime_mono(&ts2);
2284 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2286 if (timediff > audit_timeout) {
2287 smb_time_audit_log("aio_fsync", timediff);
2293 static int smb_time_audit_aio_suspend(struct vfs_handle_struct *handle,
2294 struct files_struct *fsp,
2295 const SMB_STRUCT_AIOCB * const aiocb[],
2296 int n, const struct timespec *ts)
2299 struct timespec ts1,ts2;
2302 clock_gettime_mono(&ts1);
2303 result = SMB_VFS_NEXT_AIO_SUSPEND(handle, fsp, aiocb, n, ts);
2304 clock_gettime_mono(&ts2);
2305 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2307 if (timediff > audit_timeout) {
2308 smb_time_audit_log("aio_suspend", timediff);
2314 static bool smb_time_audit_aio_force(struct vfs_handle_struct *handle,
2315 struct files_struct *fsp)
2318 struct timespec ts1,ts2;
2321 clock_gettime_mono(&ts1);
2322 result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
2323 clock_gettime_mono(&ts2);
2324 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2326 if (timediff > audit_timeout) {
2327 smb_time_audit_log("aio_force", timediff);
2335 /* VFS operations */
2337 static struct vfs_fn_pointers vfs_time_audit_fns = {
2338 .connect_fn = smb_time_audit_connect,
2339 .disconnect = smb_time_audit_disconnect,
2340 .disk_free = smb_time_audit_disk_free,
2341 .get_quota = smb_time_audit_get_quota,
2342 .set_quota = smb_time_audit_set_quota,
2343 .get_shadow_copy_data = smb_time_audit_get_shadow_copy_data,
2344 .statvfs = smb_time_audit_statvfs,
2345 .fs_capabilities = smb_time_audit_fs_capabilities,
2346 .opendir = smb_time_audit_opendir,
2347 .fdopendir = smb_time_audit_fdopendir,
2348 .readdir = smb_time_audit_readdir,
2349 .seekdir = smb_time_audit_seekdir,
2350 .telldir = smb_time_audit_telldir,
2351 .rewind_dir = smb_time_audit_rewinddir,
2352 .mkdir = smb_time_audit_mkdir,
2353 .rmdir = smb_time_audit_rmdir,
2354 .closedir = smb_time_audit_closedir,
2355 .init_search_op = smb_time_audit_init_search_op,
2356 .open = smb_time_audit_open,
2357 .create_file = smb_time_audit_create_file,
2358 .close_fn = smb_time_audit_close,
2359 .vfs_read = smb_time_audit_read,
2360 .pread = smb_time_audit_pread,
2361 .write = smb_time_audit_write,
2362 .pwrite = smb_time_audit_pwrite,
2363 .lseek = smb_time_audit_lseek,
2364 .sendfile = smb_time_audit_sendfile,
2365 .recvfile = smb_time_audit_recvfile,
2366 .rename = smb_time_audit_rename,
2367 .fsync = smb_time_audit_fsync,
2368 .stat = smb_time_audit_stat,
2369 .fstat = smb_time_audit_fstat,
2370 .lstat = smb_time_audit_lstat,
2371 .get_alloc_size = smb_time_audit_get_alloc_size,
2372 .unlink = smb_time_audit_unlink,
2373 .chmod = smb_time_audit_chmod,
2374 .fchmod = smb_time_audit_fchmod,
2375 .chown = smb_time_audit_chown,
2376 .fchown = smb_time_audit_fchown,
2377 .lchown = smb_time_audit_lchown,
2378 .chdir = smb_time_audit_chdir,
2379 .getwd = smb_time_audit_getwd,
2380 .ntimes = smb_time_audit_ntimes,
2381 .ftruncate = smb_time_audit_ftruncate,
2382 .fallocate = smb_time_audit_fallocate,
2383 .lock = smb_time_audit_lock,
2384 .kernel_flock = smb_time_audit_kernel_flock,
2385 .linux_setlease = smb_time_audit_linux_setlease,
2386 .getlock = smb_time_audit_getlock,
2387 .symlink = smb_time_audit_symlink,
2388 .vfs_readlink = smb_time_audit_readlink,
2389 .link = smb_time_audit_link,
2390 .mknod = smb_time_audit_mknod,
2391 .realpath = smb_time_audit_realpath,
2392 .notify_watch = smb_time_audit_notify_watch,
2393 .chflags = smb_time_audit_chflags,
2394 .file_id_create = smb_time_audit_file_id_create,
2395 .streaminfo = smb_time_audit_streaminfo,
2396 .get_real_filename = smb_time_audit_get_real_filename,
2397 .connectpath = smb_time_audit_connectpath,
2398 .brl_lock_windows = smb_time_audit_brl_lock_windows,
2399 .brl_unlock_windows = smb_time_audit_brl_unlock_windows,
2400 .brl_cancel_windows = smb_time_audit_brl_cancel_windows,
2401 .strict_lock = smb_time_audit_strict_lock,
2402 .strict_unlock = smb_time_audit_strict_unlock,
2403 .translate_name = smb_time_audit_translate_name,
2404 .fget_nt_acl = smb_time_audit_fget_nt_acl,
2405 .get_nt_acl = smb_time_audit_get_nt_acl,
2406 .fset_nt_acl = smb_time_audit_fset_nt_acl,
2407 .chmod_acl = smb_time_audit_chmod_acl,
2408 .fchmod_acl = smb_time_audit_fchmod_acl,
2409 .sys_acl_get_entry = smb_time_audit_sys_acl_get_entry,
2410 .sys_acl_get_tag_type = smb_time_audit_sys_acl_get_tag_type,
2411 .sys_acl_get_permset = smb_time_audit_sys_acl_get_permset,
2412 .sys_acl_get_qualifier = smb_time_audit_sys_acl_get_qualifier,
2413 .sys_acl_get_file = smb_time_audit_sys_acl_get_file,
2414 .sys_acl_get_fd = smb_time_audit_sys_acl_get_fd,
2415 .sys_acl_clear_perms = smb_time_audit_sys_acl_clear_perms,
2416 .sys_acl_add_perm = smb_time_audit_sys_acl_add_perm,
2417 .sys_acl_to_text = smb_time_audit_sys_acl_to_text,
2418 .sys_acl_init = smb_time_audit_sys_acl_init,
2419 .sys_acl_create_entry = smb_time_audit_sys_acl_create_entry,
2420 .sys_acl_set_tag_type = smb_time_audit_sys_acl_set_tag_type,
2421 .sys_acl_set_qualifier = smb_time_audit_sys_acl_set_qualifier,
2422 .sys_acl_set_permset = smb_time_audit_sys_acl_set_permset,
2423 .sys_acl_valid = smb_time_audit_sys_acl_valid,
2424 .sys_acl_set_file = smb_time_audit_sys_acl_set_file,
2425 .sys_acl_set_fd = smb_time_audit_sys_acl_set_fd,
2426 .sys_acl_delete_def_file = smb_time_audit_sys_acl_delete_def_file,
2427 .sys_acl_get_perm = smb_time_audit_sys_acl_get_perm,
2428 .sys_acl_free_text = smb_time_audit_sys_acl_free_text,
2429 .sys_acl_free_acl = smb_time_audit_sys_acl_free_acl,
2430 .sys_acl_free_qualifier = smb_time_audit_sys_acl_free_qualifier,
2431 .getxattr = smb_time_audit_getxattr,
2432 .lgetxattr = smb_time_audit_lgetxattr,
2433 .fgetxattr = smb_time_audit_fgetxattr,
2434 .listxattr = smb_time_audit_listxattr,
2435 .llistxattr = smb_time_audit_llistxattr,
2436 .flistxattr = smb_time_audit_flistxattr,
2437 .removexattr = smb_time_audit_removexattr,
2438 .lremovexattr = smb_time_audit_lremovexattr,
2439 .fremovexattr = smb_time_audit_fremovexattr,
2440 .setxattr = smb_time_audit_setxattr,
2441 .lsetxattr = smb_time_audit_lsetxattr,
2442 .fsetxattr = smb_time_audit_fsetxattr,
2443 .aio_read = smb_time_audit_aio_read,
2444 .aio_write = smb_time_audit_aio_write,
2445 .aio_return_fn = smb_time_audit_aio_return,
2446 .aio_cancel = smb_time_audit_aio_cancel,
2447 .aio_error_fn = smb_time_audit_aio_error,
2448 .aio_fsync = smb_time_audit_aio_fsync,
2449 .aio_suspend = smb_time_audit_aio_suspend,
2450 .aio_force = smb_time_audit_aio_force,
2454 NTSTATUS vfs_time_audit_init(void);
2455 NTSTATUS vfs_time_audit_init(void)
2457 audit_timeout = (double)lp_parm_int(-1, "time_audit", "timeout",
2459 return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "time_audit",
2460 &vfs_time_audit_fns);