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
29 #include "smbd/smbd.h"
31 #include "lib/util/tevent_unix.h"
34 #define DBGC_CLASS DBGC_VFS
36 static double audit_timeout;
38 static void smb_time_audit_log(const char *syscallname, double elapsed)
40 DEBUG(0, ("WARNING: System call \"%s\" took unexpectedly long "
41 "(%.2f seconds) -- Validate that file and storage "
42 "subsystems are operating normally\n", syscallname,
46 static int smb_time_audit_connect(vfs_handle_struct *handle,
47 const char *svc, const char *user)
50 struct timespec ts1,ts2;
57 clock_gettime_mono(&ts1);
58 result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
59 clock_gettime_mono(&ts2);
60 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
61 if (timediff > audit_timeout) {
62 smb_time_audit_log("connect", timediff);
67 static void smb_time_audit_disconnect(vfs_handle_struct *handle)
69 struct timespec ts1,ts2;
72 clock_gettime_mono(&ts1);
73 SMB_VFS_NEXT_DISCONNECT(handle);
74 clock_gettime_mono(&ts2);
75 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
77 if (timediff > audit_timeout) {
78 smb_time_audit_log("disconnect", timediff);
84 static uint64_t smb_time_audit_disk_free(vfs_handle_struct *handle,
86 bool small_query, uint64_t *bsize,
87 uint64_t *dfree, uint64_t *dsize)
90 struct timespec ts1,ts2;
93 clock_gettime_mono(&ts1);
94 result = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize,
96 clock_gettime_mono(&ts2);
97 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
99 /* Don't have a reasonable notion of failure here */
100 if (timediff > audit_timeout) {
101 smb_time_audit_log("disk_free", timediff);
107 static int smb_time_audit_get_quota(struct vfs_handle_struct *handle,
108 enum SMB_QUOTA_TYPE qtype, unid_t id,
112 struct timespec ts1,ts2;
115 clock_gettime_mono(&ts1);
116 result = SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, qt);
117 clock_gettime_mono(&ts2);
118 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
120 if (timediff > audit_timeout) {
121 smb_time_audit_log("get_quota", timediff);
126 static int smb_time_audit_set_quota(struct vfs_handle_struct *handle,
127 enum SMB_QUOTA_TYPE qtype, unid_t id,
131 struct timespec ts1,ts2;
134 clock_gettime_mono(&ts1);
135 result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
136 clock_gettime_mono(&ts2);
137 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
139 if (timediff > audit_timeout) {
140 smb_time_audit_log("set_quota", timediff);
146 static int smb_time_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
147 struct files_struct *fsp,
148 struct shadow_copy_data *shadow_copy_data,
152 struct timespec ts1,ts2;
155 clock_gettime_mono(&ts1);
156 result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp,
157 shadow_copy_data, labels);
158 clock_gettime_mono(&ts2);
159 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
161 if (timediff > audit_timeout) {
162 smb_time_audit_log("get_shadow_copy_data", timediff);
168 static int smb_time_audit_statvfs(struct vfs_handle_struct *handle,
170 struct vfs_statvfs_struct *statbuf)
173 struct timespec ts1,ts2;
176 clock_gettime_mono(&ts1);
177 result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
178 clock_gettime_mono(&ts2);
179 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
181 if (timediff > audit_timeout) {
182 smb_time_audit_log("statvfs", timediff);
188 static uint32_t smb_time_audit_fs_capabilities(struct vfs_handle_struct *handle,
189 enum timestamp_set_resolution *p_ts_res)
192 struct timespec ts1,ts2;
195 clock_gettime_mono(&ts1);
196 result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
197 clock_gettime_mono(&ts2);
198 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
200 if (timediff > audit_timeout) {
201 smb_time_audit_log("fs_capabilities", timediff);
207 static DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
209 const char *mask, uint32 attr)
212 struct timespec ts1,ts2;
215 clock_gettime_mono(&ts1);
216 result = SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr);
217 clock_gettime_mono(&ts2);
218 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
220 if (timediff > audit_timeout) {
221 smb_time_audit_log("opendir", timediff);
227 static DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
229 const char *mask, uint32 attr)
232 struct timespec ts1,ts2;
235 clock_gettime_mono(&ts1);
236 result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
237 clock_gettime_mono(&ts2);
238 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
240 if (timediff > audit_timeout) {
241 smb_time_audit_log("fdopendir", timediff);
247 static struct dirent *smb_time_audit_readdir(vfs_handle_struct *handle,
249 SMB_STRUCT_STAT *sbuf)
251 struct dirent *result;
252 struct timespec ts1,ts2;
255 clock_gettime_mono(&ts1);
256 result = SMB_VFS_NEXT_READDIR(handle, dirp, sbuf);
257 clock_gettime_mono(&ts2);
258 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
260 if (timediff > audit_timeout) {
261 smb_time_audit_log("readdir", timediff);
267 static void smb_time_audit_seekdir(vfs_handle_struct *handle,
268 DIR *dirp, long offset)
270 struct timespec ts1,ts2;
273 clock_gettime_mono(&ts1);
274 SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
275 clock_gettime_mono(&ts2);
276 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
278 if (timediff > audit_timeout) {
279 smb_time_audit_log("seekdir", timediff);
285 static long smb_time_audit_telldir(vfs_handle_struct *handle,
289 struct timespec ts1,ts2;
292 clock_gettime_mono(&ts1);
293 result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
294 clock_gettime_mono(&ts2);
295 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
297 if (timediff > audit_timeout) {
298 smb_time_audit_log("telldir", timediff);
304 static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
307 struct timespec ts1,ts2;
310 clock_gettime_mono(&ts1);
311 SMB_VFS_NEXT_REWINDDIR(handle, dirp);
312 clock_gettime_mono(&ts2);
313 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
315 if (timediff > audit_timeout) {
316 smb_time_audit_log("rewinddir", timediff);
322 static int smb_time_audit_mkdir(vfs_handle_struct *handle,
323 const char *path, mode_t mode)
326 struct timespec ts1,ts2;
329 clock_gettime_mono(&ts1);
330 result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
331 clock_gettime_mono(&ts2);
332 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
334 if (timediff > audit_timeout) {
335 smb_time_audit_log("mkdir", timediff);
341 static int smb_time_audit_rmdir(vfs_handle_struct *handle,
345 struct timespec ts1,ts2;
348 clock_gettime_mono(&ts1);
349 result = SMB_VFS_NEXT_RMDIR(handle, path);
350 clock_gettime_mono(&ts2);
351 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
353 if (timediff > audit_timeout) {
354 smb_time_audit_log("rmdir", timediff);
360 static int smb_time_audit_closedir(vfs_handle_struct *handle,
364 struct timespec ts1,ts2;
367 clock_gettime_mono(&ts1);
368 result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
369 clock_gettime_mono(&ts2);
370 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
372 if (timediff > audit_timeout) {
373 smb_time_audit_log("closedir", timediff);
379 static void smb_time_audit_init_search_op(vfs_handle_struct *handle,
382 struct timespec ts1,ts2;
385 clock_gettime_mono(&ts1);
386 SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
387 clock_gettime_mono(&ts2);
388 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
390 if (timediff > audit_timeout) {
391 smb_time_audit_log("init_search_op", timediff);
396 static int smb_time_audit_open(vfs_handle_struct *handle,
397 struct smb_filename *fname,
399 int flags, mode_t mode)
402 struct timespec ts1,ts2;
405 clock_gettime_mono(&ts1);
406 result = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode);
407 clock_gettime_mono(&ts2);
408 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
410 if (timediff > audit_timeout) {
411 smb_time_audit_log("open", timediff);
417 static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
418 struct smb_request *req,
419 uint16_t root_dir_fid,
420 struct smb_filename *fname,
421 uint32_t access_mask,
422 uint32_t share_access,
423 uint32_t create_disposition,
424 uint32_t create_options,
425 uint32_t file_attributes,
426 uint32_t oplock_request,
427 uint64_t allocation_size,
428 uint32_t private_flags,
429 struct security_descriptor *sd,
430 struct ea_list *ea_list,
431 files_struct **result_fsp,
435 struct timespec ts1,ts2;
438 clock_gettime_mono(&ts1);
439 result = SMB_VFS_NEXT_CREATE_FILE(
442 root_dir_fid, /* root_dir_fid */
444 access_mask, /* access_mask */
445 share_access, /* share_access */
446 create_disposition, /* create_disposition*/
447 create_options, /* create_options */
448 file_attributes, /* file_attributes */
449 oplock_request, /* oplock_request */
450 allocation_size, /* allocation_size */
453 ea_list, /* ea_list */
454 result_fsp, /* result */
456 clock_gettime_mono(&ts2);
457 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
459 if (timediff > audit_timeout) {
460 smb_time_audit_log("create_file", timediff);
466 static int smb_time_audit_close(vfs_handle_struct *handle, files_struct *fsp)
469 struct timespec ts1,ts2;
472 clock_gettime_mono(&ts1);
473 result = SMB_VFS_NEXT_CLOSE(handle, fsp);
474 clock_gettime_mono(&ts2);
475 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
477 if (timediff > audit_timeout) {
478 smb_time_audit_log("close", timediff);
484 static ssize_t smb_time_audit_read(vfs_handle_struct *handle,
485 files_struct *fsp, void *data, size_t n)
488 struct timespec ts1,ts2;
491 clock_gettime_mono(&ts1);
492 result = SMB_VFS_NEXT_READ(handle, fsp, data, n);
493 clock_gettime_mono(&ts2);
494 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
496 if (timediff > audit_timeout) {
497 smb_time_audit_log("read", timediff);
503 static ssize_t smb_time_audit_pread(vfs_handle_struct *handle,
505 void *data, size_t n, off_t offset)
508 struct timespec ts1,ts2;
511 clock_gettime_mono(&ts1);
512 result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
513 clock_gettime_mono(&ts2);
514 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
516 if (timediff > audit_timeout) {
517 smb_time_audit_log("pread", timediff);
523 struct smb_time_audit_pread_state {
529 static void smb_time_audit_pread_done(struct tevent_req *subreq);
531 static struct tevent_req *smb_time_audit_pread_send(
532 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
533 struct tevent_context *ev, struct files_struct *fsp,
534 void *data, size_t n, off_t offset)
536 struct tevent_req *req, *subreq;
537 struct smb_time_audit_pread_state *state;
539 req = tevent_req_create(mem_ctx, &state,
540 struct smb_time_audit_pread_state);
544 clock_gettime_mono(&state->ts1);
546 subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
548 if (tevent_req_nomem(subreq, req)) {
549 return tevent_req_post(req, ev);
551 tevent_req_set_callback(subreq, smb_time_audit_pread_done, req);
555 static void smb_time_audit_pread_done(struct tevent_req *subreq)
557 struct tevent_req *req = tevent_req_callback_data(
558 subreq, struct tevent_req);
559 struct smb_time_audit_pread_state *state = tevent_req_data(
560 req, struct smb_time_audit_pread_state);
562 state->ret = SMB_VFS_PREAD_RECV(subreq, &state->err);
564 tevent_req_done(req);
567 static ssize_t smb_time_audit_pread_recv(struct tevent_req *req, int *err)
569 struct smb_time_audit_pread_state *state = tevent_req_data(
570 req, struct smb_time_audit_pread_state);
574 clock_gettime_mono(&ts2);
575 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
577 if (timediff > audit_timeout) {
578 smb_time_audit_log("pread", timediff);
581 if (tevent_req_is_unix_error(req, err)) {
588 static ssize_t smb_time_audit_write(vfs_handle_struct *handle,
590 const void *data, size_t n)
593 struct timespec ts1,ts2;
596 clock_gettime_mono(&ts1);
597 result = SMB_VFS_NEXT_WRITE(handle, fsp, data, n);
598 clock_gettime_mono(&ts2);
599 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
601 if (timediff > audit_timeout) {
602 smb_time_audit_log("write", timediff);
608 static ssize_t smb_time_audit_pwrite(vfs_handle_struct *handle,
610 const void *data, size_t n,
614 struct timespec ts1,ts2;
617 clock_gettime_mono(&ts1);
618 result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
619 clock_gettime_mono(&ts2);
620 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
622 if (timediff > audit_timeout) {
623 smb_time_audit_log("pwrite", timediff);
629 struct smb_time_audit_pwrite_state {
635 static void smb_time_audit_pwrite_done(struct tevent_req *subreq);
637 static struct tevent_req *smb_time_audit_pwrite_send(
638 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
639 struct tevent_context *ev, struct files_struct *fsp,
640 const void *data, size_t n, off_t offset)
642 struct tevent_req *req, *subreq;
643 struct smb_time_audit_pwrite_state *state;
645 req = tevent_req_create(mem_ctx, &state,
646 struct smb_time_audit_pwrite_state);
650 clock_gettime_mono(&state->ts1);
652 subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
654 if (tevent_req_nomem(subreq, req)) {
655 return tevent_req_post(req, ev);
657 tevent_req_set_callback(subreq, smb_time_audit_pwrite_done, req);
661 static void smb_time_audit_pwrite_done(struct tevent_req *subreq)
663 struct tevent_req *req = tevent_req_callback_data(
664 subreq, struct tevent_req);
665 struct smb_time_audit_pwrite_state *state = tevent_req_data(
666 req, struct smb_time_audit_pwrite_state);
668 state->ret = SMB_VFS_PWRITE_RECV(subreq, &state->err);
670 tevent_req_done(req);
673 static ssize_t smb_time_audit_pwrite_recv(struct tevent_req *req, int *err)
675 struct smb_time_audit_pwrite_state *state = tevent_req_data(
676 req, struct smb_time_audit_pwrite_state);
680 clock_gettime_mono(&ts2);
681 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
683 if (timediff > audit_timeout) {
684 smb_time_audit_log("pwrite", timediff);
687 if (tevent_req_is_unix_error(req, err)) {
694 static off_t smb_time_audit_lseek(vfs_handle_struct *handle,
696 off_t offset, int whence)
699 struct timespec ts1,ts2;
702 clock_gettime_mono(&ts1);
703 result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
704 clock_gettime_mono(&ts2);
705 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
707 if (timediff > audit_timeout) {
708 smb_time_audit_log("lseek", timediff);
714 static ssize_t smb_time_audit_sendfile(vfs_handle_struct *handle, int tofd,
715 files_struct *fromfsp,
716 const DATA_BLOB *hdr, off_t offset,
720 struct timespec ts1,ts2;
723 clock_gettime_mono(&ts1);
724 result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
725 clock_gettime_mono(&ts2);
726 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
728 if (timediff > audit_timeout) {
729 smb_time_audit_log("sendfile", timediff);
735 static ssize_t smb_time_audit_recvfile(vfs_handle_struct *handle, int fromfd,
741 struct timespec ts1,ts2;
744 clock_gettime_mono(&ts1);
745 result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
746 clock_gettime_mono(&ts2);
747 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
749 if (timediff > audit_timeout) {
750 smb_time_audit_log("recvfile", timediff);
756 static int smb_time_audit_rename(vfs_handle_struct *handle,
757 const struct smb_filename *oldname,
758 const struct smb_filename *newname)
761 struct timespec ts1,ts2;
764 clock_gettime_mono(&ts1);
765 result = SMB_VFS_NEXT_RENAME(handle, oldname, newname);
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("rename", timediff);
776 static int smb_time_audit_fsync(vfs_handle_struct *handle, files_struct *fsp)
779 struct timespec ts1,ts2;
782 clock_gettime_mono(&ts1);
783 result = SMB_VFS_NEXT_FSYNC(handle, fsp);
784 clock_gettime_mono(&ts2);
785 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
787 if (timediff > audit_timeout) {
788 smb_time_audit_log("fsync", timediff);
794 static int smb_time_audit_stat(vfs_handle_struct *handle,
795 struct smb_filename *fname)
798 struct timespec ts1,ts2;
801 clock_gettime_mono(&ts1);
802 result = SMB_VFS_NEXT_STAT(handle, fname);
803 clock_gettime_mono(&ts2);
804 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
806 if (timediff > audit_timeout) {
807 smb_time_audit_log("stat", timediff);
813 static int smb_time_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
814 SMB_STRUCT_STAT *sbuf)
817 struct timespec ts1,ts2;
820 clock_gettime_mono(&ts1);
821 result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
822 clock_gettime_mono(&ts2);
823 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
825 if (timediff > audit_timeout) {
826 smb_time_audit_log("fstat", timediff);
832 static int smb_time_audit_lstat(vfs_handle_struct *handle,
833 struct smb_filename *path)
836 struct timespec ts1,ts2;
839 clock_gettime_mono(&ts1);
840 result = SMB_VFS_NEXT_LSTAT(handle, path);
841 clock_gettime_mono(&ts2);
842 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
844 if (timediff > audit_timeout) {
845 smb_time_audit_log("lstat", timediff);
851 static uint64_t smb_time_audit_get_alloc_size(vfs_handle_struct *handle,
853 const SMB_STRUCT_STAT *sbuf)
856 struct timespec ts1,ts2;
859 clock_gettime_mono(&ts1);
860 result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
861 clock_gettime_mono(&ts2);
862 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
864 if (timediff > audit_timeout) {
865 smb_time_audit_log("get_alloc_size", timediff);
871 static int smb_time_audit_unlink(vfs_handle_struct *handle,
872 const struct smb_filename *path)
875 struct timespec ts1,ts2;
878 clock_gettime_mono(&ts1);
879 result = SMB_VFS_NEXT_UNLINK(handle, path);
880 clock_gettime_mono(&ts2);
881 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
883 if (timediff > audit_timeout) {
884 smb_time_audit_log("unlink", timediff);
890 static int smb_time_audit_chmod(vfs_handle_struct *handle,
891 const char *path, mode_t mode)
894 struct timespec ts1,ts2;
897 clock_gettime_mono(&ts1);
898 result = SMB_VFS_NEXT_CHMOD(handle, path, mode);
899 clock_gettime_mono(&ts2);
900 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
902 if (timediff > audit_timeout) {
903 smb_time_audit_log("chmod", timediff);
909 static int smb_time_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
913 struct timespec ts1,ts2;
916 clock_gettime_mono(&ts1);
917 result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
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("fchmod", timediff);
928 static int smb_time_audit_chown(vfs_handle_struct *handle,
929 const char *path, uid_t uid, gid_t gid)
932 struct timespec ts1,ts2;
935 clock_gettime_mono(&ts1);
936 result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid);
937 clock_gettime_mono(&ts2);
938 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
940 if (timediff > audit_timeout) {
941 smb_time_audit_log("chown", timediff);
947 static int smb_time_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
948 uid_t uid, gid_t gid)
951 struct timespec ts1,ts2;
954 clock_gettime_mono(&ts1);
955 result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
956 clock_gettime_mono(&ts2);
957 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
959 if (timediff > audit_timeout) {
960 smb_time_audit_log("fchown", timediff);
966 static int smb_time_audit_lchown(vfs_handle_struct *handle,
967 const char *path, uid_t uid, gid_t gid)
970 struct timespec ts1,ts2;
973 clock_gettime_mono(&ts1);
974 result = SMB_VFS_NEXT_LCHOWN(handle, path, uid, gid);
975 clock_gettime_mono(&ts2);
976 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
978 if (timediff > audit_timeout) {
979 smb_time_audit_log("lchown", timediff);
985 static int smb_time_audit_chdir(vfs_handle_struct *handle, const char *path)
988 struct timespec ts1,ts2;
991 clock_gettime_mono(&ts1);
992 result = SMB_VFS_NEXT_CHDIR(handle, path);
993 clock_gettime_mono(&ts2);
994 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
996 if (timediff > audit_timeout) {
997 smb_time_audit_log("chdir", timediff);
1003 static char *smb_time_audit_getwd(vfs_handle_struct *handle)
1006 struct timespec ts1,ts2;
1009 clock_gettime_mono(&ts1);
1010 result = SMB_VFS_NEXT_GETWD(handle);
1011 clock_gettime_mono(&ts2);
1012 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1014 if (timediff > audit_timeout) {
1015 smb_time_audit_log("getwd", timediff);
1021 static int smb_time_audit_ntimes(vfs_handle_struct *handle,
1022 const struct smb_filename *path,
1023 struct smb_file_time *ft)
1026 struct timespec ts1,ts2;
1029 clock_gettime_mono(&ts1);
1030 result = SMB_VFS_NEXT_NTIMES(handle, path, ft);
1031 clock_gettime_mono(&ts2);
1032 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1034 if (timediff > audit_timeout) {
1035 smb_time_audit_log("ntimes", timediff);
1041 static int smb_time_audit_ftruncate(vfs_handle_struct *handle,
1046 struct timespec ts1,ts2;
1049 clock_gettime_mono(&ts1);
1050 result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
1051 clock_gettime_mono(&ts2);
1052 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1054 if (timediff > audit_timeout) {
1055 smb_time_audit_log("ftruncate", timediff);
1061 static int smb_time_audit_fallocate(vfs_handle_struct *handle,
1063 enum vfs_fallocate_mode mode,
1068 struct timespec ts1,ts2;
1071 clock_gettime_mono(&ts1);
1072 result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
1073 clock_gettime_mono(&ts2);
1074 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1076 if (timediff > audit_timeout) {
1077 smb_time_audit_log("fallocate", timediff);
1083 static bool smb_time_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
1084 int op, off_t offset, off_t count,
1088 struct timespec ts1,ts2;
1091 clock_gettime_mono(&ts1);
1092 result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
1093 clock_gettime_mono(&ts2);
1094 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1096 if (timediff > audit_timeout) {
1097 smb_time_audit_log("lock", timediff);
1103 static int smb_time_audit_kernel_flock(struct vfs_handle_struct *handle,
1104 struct files_struct *fsp,
1105 uint32 share_mode, uint32 access_mask)
1108 struct timespec ts1,ts2;
1111 clock_gettime_mono(&ts1);
1112 result = SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp, share_mode,
1114 clock_gettime_mono(&ts2);
1115 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1117 if (timediff > audit_timeout) {
1118 smb_time_audit_log("kernel_flock", timediff);
1124 static int smb_time_audit_linux_setlease(vfs_handle_struct *handle,
1129 struct timespec ts1,ts2;
1132 clock_gettime_mono(&ts1);
1133 result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
1134 clock_gettime_mono(&ts2);
1135 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1137 if (timediff > audit_timeout) {
1138 smb_time_audit_log("linux_setlease", timediff);
1144 static bool smb_time_audit_getlock(vfs_handle_struct *handle,
1146 off_t *poffset, off_t *pcount,
1147 int *ptype, pid_t *ppid)
1150 struct timespec ts1,ts2;
1153 clock_gettime_mono(&ts1);
1154 result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype,
1156 clock_gettime_mono(&ts2);
1157 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1159 if (timediff > audit_timeout) {
1160 smb_time_audit_log("getlock", timediff);
1166 static int smb_time_audit_symlink(vfs_handle_struct *handle,
1167 const char *oldpath, const char *newpath)
1170 struct timespec ts1,ts2;
1173 clock_gettime_mono(&ts1);
1174 result = SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath);
1175 clock_gettime_mono(&ts2);
1176 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1178 if (timediff > audit_timeout) {
1179 smb_time_audit_log("symlink", timediff);
1185 static int smb_time_audit_readlink(vfs_handle_struct *handle,
1186 const char *path, char *buf, size_t bufsiz)
1189 struct timespec ts1,ts2;
1192 clock_gettime_mono(&ts1);
1193 result = SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz);
1194 clock_gettime_mono(&ts2);
1195 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1197 if (timediff > audit_timeout) {
1198 smb_time_audit_log("readlink", timediff);
1204 static int smb_time_audit_link(vfs_handle_struct *handle,
1205 const char *oldpath, const char *newpath)
1208 struct timespec ts1,ts2;
1211 clock_gettime_mono(&ts1);
1212 result = SMB_VFS_NEXT_LINK(handle, oldpath, newpath);
1213 clock_gettime_mono(&ts2);
1214 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1216 if (timediff > audit_timeout) {
1217 smb_time_audit_log("link", timediff);
1223 static int smb_time_audit_mknod(vfs_handle_struct *handle,
1224 const char *pathname, mode_t mode,
1228 struct timespec ts1,ts2;
1231 clock_gettime_mono(&ts1);
1232 result = SMB_VFS_NEXT_MKNOD(handle, pathname, mode, dev);
1233 clock_gettime_mono(&ts2);
1234 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1236 if (timediff > audit_timeout) {
1237 smb_time_audit_log("mknod", timediff);
1243 static char *smb_time_audit_realpath(vfs_handle_struct *handle,
1247 struct timespec ts1,ts2;
1250 clock_gettime_mono(&ts1);
1251 result = SMB_VFS_NEXT_REALPATH(handle, path);
1252 clock_gettime_mono(&ts2);
1253 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1255 if (timediff > audit_timeout) {
1256 smb_time_audit_log("realpath", timediff);
1262 static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle,
1263 struct sys_notify_context *ctx,
1266 uint32_t *subdir_filter,
1267 void (*callback)(struct sys_notify_context *ctx,
1269 struct notify_event *ev),
1270 void *private_data, void *handle_p)
1273 struct timespec ts1,ts2;
1276 clock_gettime_mono(&ts1);
1277 result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path,
1278 filter, subdir_filter, callback,
1279 private_data, handle_p);
1280 clock_gettime_mono(&ts2);
1281 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1283 if (timediff > audit_timeout) {
1284 smb_time_audit_log("notify_watch", timediff);
1290 static int smb_time_audit_chflags(vfs_handle_struct *handle,
1291 const char *path, unsigned int flags)
1294 struct timespec ts1,ts2;
1297 clock_gettime_mono(&ts1);
1298 result = SMB_VFS_NEXT_CHFLAGS(handle, path, flags);
1299 clock_gettime_mono(&ts2);
1300 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1302 if (timediff > audit_timeout) {
1303 smb_time_audit_log("chflags", timediff);
1309 static struct file_id smb_time_audit_file_id_create(struct vfs_handle_struct *handle,
1310 const SMB_STRUCT_STAT *sbuf)
1312 struct file_id id_zero;
1313 struct file_id result;
1314 struct timespec ts1,ts2;
1317 ZERO_STRUCT(id_zero);
1319 clock_gettime_mono(&ts1);
1320 result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
1321 clock_gettime_mono(&ts2);
1322 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1324 if (timediff > audit_timeout) {
1325 smb_time_audit_log("file_id_create", timediff);
1331 static NTSTATUS smb_time_audit_streaminfo(vfs_handle_struct *handle,
1332 struct files_struct *fsp,
1334 TALLOC_CTX *mem_ctx,
1335 unsigned int *pnum_streams,
1336 struct stream_struct **pstreams)
1339 struct timespec ts1,ts2;
1342 clock_gettime_mono(&ts1);
1343 result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx,
1344 pnum_streams, pstreams);
1345 clock_gettime_mono(&ts2);
1346 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1348 if (timediff > audit_timeout) {
1349 smb_time_audit_log("streaminfo", timediff);
1355 static int smb_time_audit_get_real_filename(struct vfs_handle_struct *handle,
1358 TALLOC_CTX *mem_ctx,
1362 struct timespec ts1,ts2;
1365 clock_gettime_mono(&ts1);
1366 result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
1368 clock_gettime_mono(&ts2);
1369 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1371 if (timediff > audit_timeout) {
1372 smb_time_audit_log("get_real_filename", timediff);
1378 static const char *smb_time_audit_connectpath(vfs_handle_struct *handle,
1382 struct timespec ts1,ts2;
1385 clock_gettime_mono(&ts1);
1386 result = SMB_VFS_NEXT_CONNECTPATH(handle, fname);
1387 clock_gettime_mono(&ts2);
1388 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1390 if (timediff > audit_timeout) {
1391 smb_time_audit_log("connectpath", timediff);
1397 static NTSTATUS smb_time_audit_brl_lock_windows(struct vfs_handle_struct *handle,
1398 struct byte_range_lock *br_lck,
1399 struct lock_struct *plock,
1401 struct blocking_lock_record *blr)
1404 struct timespec ts1,ts2;
1407 clock_gettime_mono(&ts1);
1408 result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock,
1409 blocking_lock, blr);
1410 clock_gettime_mono(&ts2);
1411 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1413 if (timediff > audit_timeout) {
1414 smb_time_audit_log("brl_lock_windows", timediff);
1420 static bool smb_time_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
1421 struct messaging_context *msg_ctx,
1422 struct byte_range_lock *br_lck,
1423 const struct lock_struct *plock)
1426 struct timespec ts1,ts2;
1429 clock_gettime_mono(&ts1);
1430 result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck,
1432 clock_gettime_mono(&ts2);
1433 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1435 if (timediff > audit_timeout) {
1436 smb_time_audit_log("brl_unlock_windows", timediff);
1442 static bool smb_time_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
1443 struct byte_range_lock *br_lck,
1444 struct lock_struct *plock,
1445 struct blocking_lock_record *blr)
1448 struct timespec ts1,ts2;
1451 clock_gettime_mono(&ts1);
1452 result = SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock, blr);
1453 clock_gettime_mono(&ts2);
1454 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1456 if (timediff > audit_timeout) {
1457 smb_time_audit_log("brl_cancel_windows", timediff);
1463 static bool smb_time_audit_strict_lock(struct vfs_handle_struct *handle,
1464 struct files_struct *fsp,
1465 struct lock_struct *plock)
1468 struct timespec ts1,ts2;
1471 clock_gettime_mono(&ts1);
1472 result = SMB_VFS_NEXT_STRICT_LOCK(handle, fsp, plock);
1473 clock_gettime_mono(&ts2);
1474 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1476 if (timediff > audit_timeout) {
1477 smb_time_audit_log("strict_lock", timediff);
1483 static void smb_time_audit_strict_unlock(struct vfs_handle_struct *handle,
1484 struct files_struct *fsp,
1485 struct lock_struct *plock)
1487 struct timespec ts1,ts2;
1490 clock_gettime_mono(&ts1);
1491 SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock);
1492 clock_gettime_mono(&ts2);
1493 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1495 if (timediff > audit_timeout) {
1496 smb_time_audit_log("strict_unlock", timediff);
1502 static NTSTATUS smb_time_audit_translate_name(struct vfs_handle_struct *handle,
1504 enum vfs_translate_direction direction,
1505 TALLOC_CTX *mem_ctx,
1509 struct timespec ts1,ts2;
1512 clock_gettime_mono(&ts1);
1513 result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
1515 clock_gettime_mono(&ts2);
1516 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1518 if (timediff > audit_timeout) {
1519 smb_time_audit_log("translate_name", timediff);
1525 static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
1527 uint32 security_info,
1528 struct security_descriptor **ppdesc)
1531 struct timespec ts1,ts2;
1534 clock_gettime_mono(&ts1);
1535 result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info, ppdesc);
1536 clock_gettime_mono(&ts2);
1537 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1539 if (timediff > audit_timeout) {
1540 smb_time_audit_log("fget_nt_acl", timediff);
1546 static NTSTATUS smb_time_audit_get_nt_acl(vfs_handle_struct *handle,
1548 uint32 security_info,
1549 struct security_descriptor **ppdesc)
1552 struct timespec ts1,ts2;
1555 clock_gettime_mono(&ts1);
1556 result = SMB_VFS_NEXT_GET_NT_ACL(handle, name, security_info, ppdesc);
1557 clock_gettime_mono(&ts2);
1558 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1560 if (timediff > audit_timeout) {
1561 smb_time_audit_log("get_nt_acl", timediff);
1567 static NTSTATUS smb_time_audit_fset_nt_acl(vfs_handle_struct *handle,
1569 uint32 security_info_sent,
1570 const struct security_descriptor *psd)
1573 struct timespec ts1,ts2;
1576 clock_gettime_mono(&ts1);
1577 result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent,
1579 clock_gettime_mono(&ts2);
1580 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1582 if (timediff > audit_timeout) {
1583 smb_time_audit_log("fset_nt_acl", timediff);
1589 static int smb_time_audit_chmod_acl(vfs_handle_struct *handle,
1590 const char *path, mode_t mode)
1593 struct timespec ts1,ts2;
1596 clock_gettime_mono(&ts1);
1597 result = SMB_VFS_NEXT_CHMOD_ACL(handle, path, mode);
1598 clock_gettime_mono(&ts2);
1599 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1601 if (timediff > audit_timeout) {
1602 smb_time_audit_log("chmod_acl", timediff);
1608 static int smb_time_audit_fchmod_acl(vfs_handle_struct *handle,
1609 files_struct *fsp, mode_t mode)
1612 struct timespec ts1,ts2;
1615 clock_gettime_mono(&ts1);
1616 result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
1617 clock_gettime_mono(&ts2);
1618 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1620 if (timediff > audit_timeout) {
1621 smb_time_audit_log("fchmod_acl", timediff);
1627 static int smb_time_audit_sys_acl_get_entry(vfs_handle_struct *handle,
1628 SMB_ACL_T theacl, int entry_id,
1629 SMB_ACL_ENTRY_T *entry_p)
1632 struct timespec ts1,ts2;
1635 clock_gettime_mono(&ts1);
1636 result = SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, theacl, entry_id,
1638 clock_gettime_mono(&ts2);
1639 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1641 if (timediff > audit_timeout) {
1642 smb_time_audit_log("sys_acl_get_entry", timediff);
1648 static int smb_time_audit_sys_acl_get_tag_type(vfs_handle_struct *handle,
1649 SMB_ACL_ENTRY_T entry_d,
1650 SMB_ACL_TAG_T *tag_type_p)
1653 struct timespec ts1,ts2;
1656 clock_gettime_mono(&ts1);
1657 result = SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, entry_d,
1659 clock_gettime_mono(&ts2);
1660 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1662 if (timediff > audit_timeout) {
1663 smb_time_audit_log("sys_acl_get_tag_type", timediff);
1669 static int smb_time_audit_sys_acl_get_permset(vfs_handle_struct *handle,
1670 SMB_ACL_ENTRY_T entry_d,
1671 SMB_ACL_PERMSET_T *permset_p)
1674 struct timespec ts1,ts2;
1677 clock_gettime_mono(&ts1);
1678 result = SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, entry_d,
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_get_permset", timediff);
1690 static void * smb_time_audit_sys_acl_get_qualifier(vfs_handle_struct *handle,
1691 SMB_ACL_ENTRY_T entry_d)
1694 struct timespec ts1,ts2;
1697 clock_gettime_mono(&ts1);
1698 result = SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, entry_d);
1699 clock_gettime_mono(&ts2);
1700 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1702 if (timediff > audit_timeout) {
1703 smb_time_audit_log("sys_acl_get_qualifier", timediff);
1709 static SMB_ACL_T smb_time_audit_sys_acl_get_file(vfs_handle_struct *handle,
1711 SMB_ACL_TYPE_T type)
1714 struct timespec ts1,ts2;
1717 clock_gettime_mono(&ts1);
1718 result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type);
1719 clock_gettime_mono(&ts2);
1720 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1722 if (timediff > audit_timeout) {
1723 smb_time_audit_log("sys_acl_get_file", timediff);
1729 static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
1733 struct timespec ts1,ts2;
1736 clock_gettime_mono(&ts1);
1737 result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp);
1738 clock_gettime_mono(&ts2);
1739 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1741 if (timediff > audit_timeout) {
1742 smb_time_audit_log("sys_acl_get_fd", timediff);
1748 static int smb_time_audit_sys_acl_clear_perms(vfs_handle_struct *handle,
1749 SMB_ACL_PERMSET_T permset)
1752 struct timespec ts1,ts2;
1755 clock_gettime_mono(&ts1);
1756 result = SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, permset);
1757 clock_gettime_mono(&ts2);
1758 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1760 if (timediff > audit_timeout) {
1761 smb_time_audit_log("sys_acl_clear_perms", timediff);
1767 static int smb_time_audit_sys_acl_add_perm(vfs_handle_struct *handle,
1768 SMB_ACL_PERMSET_T permset,
1769 SMB_ACL_PERM_T perm)
1772 struct timespec ts1,ts2;
1775 clock_gettime_mono(&ts1);
1776 result = SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, permset, perm);
1777 clock_gettime_mono(&ts2);
1778 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1780 if (timediff > audit_timeout) {
1781 smb_time_audit_log("sys_acl_add_perm", timediff);
1787 static char * smb_time_audit_sys_acl_to_text(vfs_handle_struct *handle,
1792 struct timespec ts1,ts2;
1795 clock_gettime_mono(&ts1);
1796 result = SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, theacl, plen);
1797 clock_gettime_mono(&ts2);
1798 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1800 if (timediff > audit_timeout) {
1801 smb_time_audit_log("sys_acl_to_text", timediff);
1807 static SMB_ACL_T smb_time_audit_sys_acl_init(vfs_handle_struct *handle,
1811 struct timespec ts1,ts2;
1814 clock_gettime_mono(&ts1);
1815 result = SMB_VFS_NEXT_SYS_ACL_INIT(handle, count);
1816 clock_gettime_mono(&ts2);
1817 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1819 if (timediff > audit_timeout) {
1820 smb_time_audit_log("sys_acl_init", timediff);
1826 static int smb_time_audit_sys_acl_create_entry(vfs_handle_struct *handle,
1828 SMB_ACL_ENTRY_T *pentry)
1831 struct timespec ts1,ts2;
1834 clock_gettime_mono(&ts1);
1835 result = SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, pacl, pentry);
1836 clock_gettime_mono(&ts2);
1837 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1839 if (timediff > audit_timeout) {
1840 smb_time_audit_log("sys_acl_create_entry", timediff);
1846 static int smb_time_audit_sys_acl_set_tag_type(vfs_handle_struct *handle,
1847 SMB_ACL_ENTRY_T entry,
1848 SMB_ACL_TAG_T tagtype)
1851 struct timespec ts1,ts2;
1854 clock_gettime_mono(&ts1);
1855 result = SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, entry,
1857 clock_gettime_mono(&ts2);
1858 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1860 if (timediff > audit_timeout) {
1861 smb_time_audit_log("sys_acl_set_tag_type", timediff);
1867 static int smb_time_audit_sys_acl_set_qualifier(vfs_handle_struct *handle,
1868 SMB_ACL_ENTRY_T entry,
1872 struct timespec ts1,ts2;
1875 clock_gettime_mono(&ts1);
1876 result = SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, entry, qual);
1877 clock_gettime_mono(&ts2);
1878 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1880 if (timediff > audit_timeout) {
1881 smb_time_audit_log("sys_acl_set_qualifier", timediff);
1887 static int smb_time_audit_sys_acl_set_permset(vfs_handle_struct *handle,
1888 SMB_ACL_ENTRY_T entry,
1889 SMB_ACL_PERMSET_T permset)
1892 struct timespec ts1,ts2;
1895 clock_gettime_mono(&ts1);
1896 result = SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, entry, permset);
1897 clock_gettime_mono(&ts2);
1898 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1900 if (timediff > audit_timeout) {
1901 smb_time_audit_log("sys_acl_set_permset", timediff);
1907 static int smb_time_audit_sys_acl_valid(vfs_handle_struct *handle,
1911 struct timespec ts1,ts2;
1914 clock_gettime_mono(&ts1);
1915 result = SMB_VFS_NEXT_SYS_ACL_VALID(handle, theacl);
1916 clock_gettime_mono(&ts2);
1917 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1919 if (timediff > audit_timeout) {
1920 smb_time_audit_log("sys_acl_valid", timediff);
1926 static int smb_time_audit_sys_acl_set_file(vfs_handle_struct *handle,
1928 SMB_ACL_TYPE_T acltype,
1932 struct timespec ts1,ts2;
1935 clock_gettime_mono(&ts1);
1936 result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype,
1938 clock_gettime_mono(&ts2);
1939 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1941 if (timediff > audit_timeout) {
1942 smb_time_audit_log("sys_acl_set_file", timediff);
1948 static int smb_time_audit_sys_acl_set_fd(vfs_handle_struct *handle,
1953 struct timespec ts1,ts2;
1956 clock_gettime_mono(&ts1);
1957 result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, theacl);
1958 clock_gettime_mono(&ts2);
1959 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1961 if (timediff > audit_timeout) {
1962 smb_time_audit_log("sys_acl_set_fd", timediff);
1968 static int smb_time_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
1972 struct timespec ts1,ts2;
1975 clock_gettime_mono(&ts1);
1976 result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path);
1977 clock_gettime_mono(&ts2);
1978 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1980 if (timediff > audit_timeout) {
1981 smb_time_audit_log("sys_acl_delete_def_file", timediff);
1987 static int smb_time_audit_sys_acl_get_perm(vfs_handle_struct *handle,
1988 SMB_ACL_PERMSET_T permset,
1989 SMB_ACL_PERM_T perm)
1992 struct timespec ts1,ts2;
1995 clock_gettime_mono(&ts1);
1996 result = SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, permset, perm);
1997 clock_gettime_mono(&ts2);
1998 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2000 if (timediff > audit_timeout) {
2001 smb_time_audit_log("sys_acl_get_perm", timediff);
2007 static int smb_time_audit_sys_acl_free_text(vfs_handle_struct *handle,
2011 struct timespec ts1,ts2;
2014 clock_gettime_mono(&ts1);
2015 result = SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, text);
2016 clock_gettime_mono(&ts2);
2017 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2019 if (timediff > audit_timeout) {
2020 smb_time_audit_log("sys_acl_free_text", timediff);
2026 static int smb_time_audit_sys_acl_free_acl(vfs_handle_struct *handle,
2027 SMB_ACL_T posix_acl)
2030 struct timespec ts1,ts2;
2033 clock_gettime_mono(&ts1);
2034 result = SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, posix_acl);
2035 clock_gettime_mono(&ts2);
2036 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2038 if (timediff > audit_timeout) {
2039 smb_time_audit_log("sys_acl_free_acl", timediff);
2045 static int smb_time_audit_sys_acl_free_qualifier(vfs_handle_struct *handle,
2047 SMB_ACL_TAG_T tagtype)
2050 struct timespec ts1,ts2;
2053 clock_gettime_mono(&ts1);
2054 result = SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, qualifier,
2056 clock_gettime_mono(&ts2);
2057 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2059 if (timediff > audit_timeout) {
2060 smb_time_audit_log("sys_acl_free_qualifier", timediff);
2066 static ssize_t smb_time_audit_getxattr(struct vfs_handle_struct *handle,
2067 const char *path, const char *name,
2068 void *value, size_t size)
2071 struct timespec ts1,ts2;
2074 clock_gettime_mono(&ts1);
2075 result = SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size);
2076 clock_gettime_mono(&ts2);
2077 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2079 if (timediff > audit_timeout) {
2080 smb_time_audit_log("getxattr", timediff);
2086 static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle,
2087 struct files_struct *fsp,
2088 const char *name, void *value,
2092 struct timespec ts1,ts2;
2095 clock_gettime_mono(&ts1);
2096 result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
2097 clock_gettime_mono(&ts2);
2098 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2100 if (timediff > audit_timeout) {
2101 smb_time_audit_log("fgetxattr", timediff);
2107 static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle,
2108 const char *path, char *list,
2112 struct timespec ts1,ts2;
2115 clock_gettime_mono(&ts1);
2116 result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
2117 clock_gettime_mono(&ts2);
2118 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2120 if (timediff > audit_timeout) {
2121 smb_time_audit_log("listxattr", timediff);
2127 static ssize_t smb_time_audit_flistxattr(struct vfs_handle_struct *handle,
2128 struct files_struct *fsp, char *list,
2132 struct timespec ts1,ts2;
2135 clock_gettime_mono(&ts1);
2136 result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
2137 clock_gettime_mono(&ts2);
2138 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2140 if (timediff > audit_timeout) {
2141 smb_time_audit_log("flistxattr", timediff);
2147 static int smb_time_audit_removexattr(struct vfs_handle_struct *handle,
2148 const char *path, const char *name)
2151 struct timespec ts1,ts2;
2154 clock_gettime_mono(&ts1);
2155 result = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name);
2156 clock_gettime_mono(&ts2);
2157 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2159 if (timediff > audit_timeout) {
2160 smb_time_audit_log("removexattr", timediff);
2166 static int smb_time_audit_fremovexattr(struct vfs_handle_struct *handle,
2167 struct files_struct *fsp,
2171 struct timespec ts1,ts2;
2174 clock_gettime_mono(&ts1);
2175 result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
2176 clock_gettime_mono(&ts2);
2177 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2179 if (timediff > audit_timeout) {
2180 smb_time_audit_log("fremovexattr", timediff);
2186 static int smb_time_audit_setxattr(struct vfs_handle_struct *handle,
2187 const char *path, const char *name,
2188 const void *value, size_t size,
2192 struct timespec ts1,ts2;
2195 clock_gettime_mono(&ts1);
2196 result = SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size,
2198 clock_gettime_mono(&ts2);
2199 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2201 if (timediff > audit_timeout) {
2202 smb_time_audit_log("setxattr", timediff);
2208 static int smb_time_audit_fsetxattr(struct vfs_handle_struct *handle,
2209 struct files_struct *fsp, const char *name,
2210 const void *value, size_t size, int flags)
2213 struct timespec ts1,ts2;
2216 clock_gettime_mono(&ts1);
2217 result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
2218 clock_gettime_mono(&ts2);
2219 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2221 if (timediff > audit_timeout) {
2222 smb_time_audit_log("fsetxattr", timediff);
2228 static int smb_time_audit_aio_read(struct vfs_handle_struct *handle,
2229 struct files_struct *fsp,
2230 SMB_STRUCT_AIOCB *aiocb)
2233 struct timespec ts1,ts2;
2236 clock_gettime_mono(&ts1);
2237 result = SMB_VFS_NEXT_AIO_READ(handle, fsp, aiocb);
2238 clock_gettime_mono(&ts2);
2239 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2241 if (timediff > audit_timeout) {
2242 smb_time_audit_log("aio_read", timediff);
2248 static int smb_time_audit_aio_write(struct vfs_handle_struct *handle,
2249 struct files_struct *fsp,
2250 SMB_STRUCT_AIOCB *aiocb)
2253 struct timespec ts1,ts2;
2256 clock_gettime_mono(&ts1);
2257 result = SMB_VFS_NEXT_AIO_WRITE(handle, fsp, aiocb);
2258 clock_gettime_mono(&ts2);
2259 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2261 if (timediff > audit_timeout) {
2262 smb_time_audit_log("aio_write", timediff);
2268 static ssize_t smb_time_audit_aio_return(struct vfs_handle_struct *handle,
2269 struct files_struct *fsp,
2270 SMB_STRUCT_AIOCB *aiocb)
2273 struct timespec ts1,ts2;
2276 clock_gettime_mono(&ts1);
2277 result = SMB_VFS_NEXT_AIO_RETURN(handle, fsp, aiocb);
2278 clock_gettime_mono(&ts2);
2279 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2281 if (timediff > audit_timeout) {
2282 smb_time_audit_log("aio_return", timediff);
2288 static int smb_time_audit_aio_cancel(struct vfs_handle_struct *handle,
2289 struct files_struct *fsp,
2290 SMB_STRUCT_AIOCB *aiocb)
2293 struct timespec ts1,ts2;
2296 clock_gettime_mono(&ts1);
2297 result = SMB_VFS_NEXT_AIO_CANCEL(handle, fsp, aiocb);
2298 clock_gettime_mono(&ts2);
2299 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2301 if (timediff > audit_timeout) {
2302 smb_time_audit_log("aio_cancel", timediff);
2308 static int smb_time_audit_aio_error(struct vfs_handle_struct *handle,
2309 struct files_struct *fsp,
2310 SMB_STRUCT_AIOCB *aiocb)
2313 struct timespec ts1,ts2;
2316 clock_gettime_mono(&ts1);
2317 result = SMB_VFS_NEXT_AIO_ERROR(handle, fsp, aiocb);
2318 clock_gettime_mono(&ts2);
2319 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2321 if (timediff > audit_timeout) {
2322 smb_time_audit_log("aio_error", timediff);
2328 static int smb_time_audit_aio_fsync(struct vfs_handle_struct *handle,
2329 struct files_struct *fsp, int op,
2330 SMB_STRUCT_AIOCB *aiocb)
2333 struct timespec ts1,ts2;
2336 clock_gettime_mono(&ts1);
2337 result = SMB_VFS_NEXT_AIO_FSYNC(handle, fsp, op, aiocb);
2338 clock_gettime_mono(&ts2);
2339 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2341 if (timediff > audit_timeout) {
2342 smb_time_audit_log("aio_fsync", timediff);
2348 static int smb_time_audit_aio_suspend(struct vfs_handle_struct *handle,
2349 struct files_struct *fsp,
2350 const SMB_STRUCT_AIOCB * const aiocb[],
2351 int n, const struct timespec *ts)
2354 struct timespec ts1,ts2;
2357 clock_gettime_mono(&ts1);
2358 result = SMB_VFS_NEXT_AIO_SUSPEND(handle, fsp, aiocb, n, ts);
2359 clock_gettime_mono(&ts2);
2360 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2362 if (timediff > audit_timeout) {
2363 smb_time_audit_log("aio_suspend", timediff);
2369 static bool smb_time_audit_aio_force(struct vfs_handle_struct *handle,
2370 struct files_struct *fsp)
2373 struct timespec ts1,ts2;
2376 clock_gettime_mono(&ts1);
2377 result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
2378 clock_gettime_mono(&ts2);
2379 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2381 if (timediff > audit_timeout) {
2382 smb_time_audit_log("aio_force", timediff);
2390 /* VFS operations */
2392 static struct vfs_fn_pointers vfs_time_audit_fns = {
2393 .connect_fn = smb_time_audit_connect,
2394 .disconnect_fn = smb_time_audit_disconnect,
2395 .disk_free_fn = smb_time_audit_disk_free,
2396 .get_quota_fn = smb_time_audit_get_quota,
2397 .set_quota_fn = smb_time_audit_set_quota,
2398 .get_shadow_copy_data_fn = smb_time_audit_get_shadow_copy_data,
2399 .statvfs_fn = smb_time_audit_statvfs,
2400 .fs_capabilities_fn = smb_time_audit_fs_capabilities,
2401 .opendir_fn = smb_time_audit_opendir,
2402 .fdopendir_fn = smb_time_audit_fdopendir,
2403 .readdir_fn = smb_time_audit_readdir,
2404 .seekdir_fn = smb_time_audit_seekdir,
2405 .telldir_fn = smb_time_audit_telldir,
2406 .rewind_dir_fn = smb_time_audit_rewinddir,
2407 .mkdir_fn = smb_time_audit_mkdir,
2408 .rmdir_fn = smb_time_audit_rmdir,
2409 .closedir_fn = smb_time_audit_closedir,
2410 .init_search_op_fn = smb_time_audit_init_search_op,
2411 .open_fn = smb_time_audit_open,
2412 .create_file_fn = smb_time_audit_create_file,
2413 .close_fn = smb_time_audit_close,
2414 .read_fn = smb_time_audit_read,
2415 .pread_fn = smb_time_audit_pread,
2416 .pread_send_fn = smb_time_audit_pread_send,
2417 .pread_recv_fn = smb_time_audit_pread_recv,
2418 .write_fn = smb_time_audit_write,
2419 .pwrite_fn = smb_time_audit_pwrite,
2420 .pwrite_send_fn = smb_time_audit_pwrite_send,
2421 .pwrite_recv_fn = smb_time_audit_pwrite_recv,
2422 .lseek_fn = smb_time_audit_lseek,
2423 .sendfile_fn = smb_time_audit_sendfile,
2424 .recvfile_fn = smb_time_audit_recvfile,
2425 .rename_fn = smb_time_audit_rename,
2426 .fsync_fn = smb_time_audit_fsync,
2427 .stat_fn = smb_time_audit_stat,
2428 .fstat_fn = smb_time_audit_fstat,
2429 .lstat_fn = smb_time_audit_lstat,
2430 .get_alloc_size_fn = smb_time_audit_get_alloc_size,
2431 .unlink_fn = smb_time_audit_unlink,
2432 .chmod_fn = smb_time_audit_chmod,
2433 .fchmod_fn = smb_time_audit_fchmod,
2434 .chown_fn = smb_time_audit_chown,
2435 .fchown_fn = smb_time_audit_fchown,
2436 .lchown_fn = smb_time_audit_lchown,
2437 .chdir_fn = smb_time_audit_chdir,
2438 .getwd_fn = smb_time_audit_getwd,
2439 .ntimes_fn = smb_time_audit_ntimes,
2440 .ftruncate_fn = smb_time_audit_ftruncate,
2441 .fallocate_fn = smb_time_audit_fallocate,
2442 .lock_fn = smb_time_audit_lock,
2443 .kernel_flock_fn = smb_time_audit_kernel_flock,
2444 .linux_setlease_fn = smb_time_audit_linux_setlease,
2445 .getlock_fn = smb_time_audit_getlock,
2446 .symlink_fn = smb_time_audit_symlink,
2447 .readlink_fn = smb_time_audit_readlink,
2448 .link_fn = smb_time_audit_link,
2449 .mknod_fn = smb_time_audit_mknod,
2450 .realpath_fn = smb_time_audit_realpath,
2451 .notify_watch_fn = smb_time_audit_notify_watch,
2452 .chflags_fn = smb_time_audit_chflags,
2453 .file_id_create_fn = smb_time_audit_file_id_create,
2454 .streaminfo_fn = smb_time_audit_streaminfo,
2455 .get_real_filename_fn = smb_time_audit_get_real_filename,
2456 .connectpath_fn = smb_time_audit_connectpath,
2457 .brl_lock_windows_fn = smb_time_audit_brl_lock_windows,
2458 .brl_unlock_windows_fn = smb_time_audit_brl_unlock_windows,
2459 .brl_cancel_windows_fn = smb_time_audit_brl_cancel_windows,
2460 .strict_lock_fn = smb_time_audit_strict_lock,
2461 .strict_unlock_fn = smb_time_audit_strict_unlock,
2462 .translate_name_fn = smb_time_audit_translate_name,
2463 .fget_nt_acl_fn = smb_time_audit_fget_nt_acl,
2464 .get_nt_acl_fn = smb_time_audit_get_nt_acl,
2465 .fset_nt_acl_fn = smb_time_audit_fset_nt_acl,
2466 .chmod_acl_fn = smb_time_audit_chmod_acl,
2467 .fchmod_acl_fn = smb_time_audit_fchmod_acl,
2468 .sys_acl_get_entry_fn = smb_time_audit_sys_acl_get_entry,
2469 .sys_acl_get_tag_type_fn = smb_time_audit_sys_acl_get_tag_type,
2470 .sys_acl_get_permset_fn = smb_time_audit_sys_acl_get_permset,
2471 .sys_acl_get_qualifier_fn = smb_time_audit_sys_acl_get_qualifier,
2472 .sys_acl_get_file_fn = smb_time_audit_sys_acl_get_file,
2473 .sys_acl_get_fd_fn = smb_time_audit_sys_acl_get_fd,
2474 .sys_acl_clear_perms_fn = smb_time_audit_sys_acl_clear_perms,
2475 .sys_acl_add_perm_fn = smb_time_audit_sys_acl_add_perm,
2476 .sys_acl_to_text_fn = smb_time_audit_sys_acl_to_text,
2477 .sys_acl_init_fn = smb_time_audit_sys_acl_init,
2478 .sys_acl_create_entry_fn = smb_time_audit_sys_acl_create_entry,
2479 .sys_acl_set_tag_type_fn = smb_time_audit_sys_acl_set_tag_type,
2480 .sys_acl_set_qualifier_fn = smb_time_audit_sys_acl_set_qualifier,
2481 .sys_acl_set_permset_fn = smb_time_audit_sys_acl_set_permset,
2482 .sys_acl_valid_fn = smb_time_audit_sys_acl_valid,
2483 .sys_acl_set_file_fn = smb_time_audit_sys_acl_set_file,
2484 .sys_acl_set_fd_fn = smb_time_audit_sys_acl_set_fd,
2485 .sys_acl_delete_def_file_fn = smb_time_audit_sys_acl_delete_def_file,
2486 .sys_acl_get_perm_fn = smb_time_audit_sys_acl_get_perm,
2487 .sys_acl_free_text_fn = smb_time_audit_sys_acl_free_text,
2488 .sys_acl_free_acl_fn = smb_time_audit_sys_acl_free_acl,
2489 .sys_acl_free_qualifier_fn = smb_time_audit_sys_acl_free_qualifier,
2490 .getxattr_fn = smb_time_audit_getxattr,
2491 .fgetxattr_fn = smb_time_audit_fgetxattr,
2492 .listxattr_fn = smb_time_audit_listxattr,
2493 .flistxattr_fn = smb_time_audit_flistxattr,
2494 .removexattr_fn = smb_time_audit_removexattr,
2495 .fremovexattr_fn = smb_time_audit_fremovexattr,
2496 .setxattr_fn = smb_time_audit_setxattr,
2497 .fsetxattr_fn = smb_time_audit_fsetxattr,
2498 .aio_read_fn = smb_time_audit_aio_read,
2499 .aio_write_fn = smb_time_audit_aio_write,
2500 .aio_return_fn = smb_time_audit_aio_return,
2501 .aio_cancel_fn = smb_time_audit_aio_cancel,
2502 .aio_error_fn = smb_time_audit_aio_error,
2503 .aio_fsync_fn = smb_time_audit_aio_fsync,
2504 .aio_suspend_fn = smb_time_audit_aio_suspend,
2505 .aio_force_fn = smb_time_audit_aio_force,
2509 NTSTATUS vfs_time_audit_init(void);
2510 NTSTATUS vfs_time_audit_init(void)
2512 audit_timeout = (double)lp_parm_int(-1, "time_audit", "timeout",
2514 return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "time_audit",
2515 &vfs_time_audit_fns);