s3:smbd: let SMB_VFS_GETXATTRAT_SEND() do explicit impersonation
[kamenim/samba-autobuild/.git] / source3 / modules / vfs_full_audit.c
index d29064b00d1dd7eabb547e8173169afa33b4d1f9..7dbb6e1e6281671d7ee607513189a1b723d92843 100644 (file)
@@ -69,6 +69,7 @@
 #include "lib/util/tevent_unix.h"
 #include "libcli/security/sddl.h"
 #include "passdb/machine_sid.h"
+#include "lib/util/tevent_ntstatus.h"
 
 static int vfs_full_audit_debug_level = DBGC_VFS;
 
@@ -97,9 +98,7 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_GET_SHADOW_COPY_DATA,
        SMB_VFS_OP_STATVFS,
        SMB_VFS_OP_FS_CAPABILITIES,
-       SMB_VFS_OP_SNAP_CHECK_PATH,
-       SMB_VFS_OP_SNAP_CREATE,
-       SMB_VFS_OP_SNAP_DELETE,
+       SMB_VFS_OP_GET_DFS_REFERRALS,
 
        /* Directory operations */
 
@@ -112,7 +111,6 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_MKDIR,
        SMB_VFS_OP_RMDIR,
        SMB_VFS_OP_CLOSEDIR,
-       SMB_VFS_OP_INIT_SEARCH_OP,
 
        /* File operations */
 
@@ -166,26 +164,36 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_BRL_LOCK_WINDOWS,
        SMB_VFS_OP_BRL_UNLOCK_WINDOWS,
        SMB_VFS_OP_BRL_CANCEL_WINDOWS,
-       SMB_VFS_OP_STRICT_LOCK,
-       SMB_VFS_OP_STRICT_UNLOCK,
+       SMB_VFS_OP_STRICT_LOCK_CHECK,
        SMB_VFS_OP_TRANSLATE_NAME,
-       SMB_VFS_OP_COPY_CHUNK_SEND,
-       SMB_VFS_OP_COPY_CHUNK_RECV,
+       SMB_VFS_OP_FSCTL,
+       SMB_VFS_OP_OFFLOAD_READ_SEND,
+       SMB_VFS_OP_OFFLOAD_READ_RECV,
+       SMB_VFS_OP_OFFLOAD_WRITE_SEND,
+       SMB_VFS_OP_OFFLOAD_WRITE_RECV,
        SMB_VFS_OP_GET_COMPRESSION,
        SMB_VFS_OP_SET_COMPRESSION,
-       SMB_VFS_OP_READDIR_ATTR,
+       SMB_VFS_OP_SNAP_CHECK_PATH,
+       SMB_VFS_OP_SNAP_CREATE,
+       SMB_VFS_OP_SNAP_DELETE,
+
+       /* DOS attribute operations. */
+       SMB_VFS_OP_GET_DOS_ATTRIBUTES,
+       SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
+       SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
+       SMB_VFS_OP_FGET_DOS_ATTRIBUTES,
+       SMB_VFS_OP_SET_DOS_ATTRIBUTES,
+       SMB_VFS_OP_FSET_DOS_ATTRIBUTES,
 
        /* NT ACL operations. */
 
        SMB_VFS_OP_FGET_NT_ACL,
        SMB_VFS_OP_GET_NT_ACL,
        SMB_VFS_OP_FSET_NT_ACL,
+       SMB_VFS_OP_AUDIT_FILE,
 
        /* POSIX ACL operations. */
 
-       SMB_VFS_OP_CHMOD_ACL,
-       SMB_VFS_OP_FCHMOD_ACL,
-
        SMB_VFS_OP_SYS_ACL_GET_FILE,
        SMB_VFS_OP_SYS_ACL_GET_FD,
        SMB_VFS_OP_SYS_ACL_BLOB_GET_FILE,
@@ -196,6 +204,8 @@ typedef enum _vfs_op_type {
 
        /* EA operations. */
        SMB_VFS_OP_GETXATTR,
+       SMB_VFS_OP_GETXATTRAT_SEND,
+       SMB_VFS_OP_GETXATTRAT_RECV,
        SMB_VFS_OP_FGETXATTR,
        SMB_VFS_OP_LISTXATTR,
        SMB_VFS_OP_FLISTXATTR,
@@ -211,6 +221,13 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_IS_OFFLINE,
        SMB_VFS_OP_SET_OFFLINE,
 
+       /* Durable handle operations. */
+       SMB_VFS_OP_DURABLE_COOKIE,
+       SMB_VFS_OP_DURABLE_DISCONNECT,
+       SMB_VFS_OP_DURABLE_RECONNECT,
+
+       SMB_VFS_OP_READDIR_ATTR,
+
        /* This should always be last enum value */
 
        SMB_VFS_OP_LAST
@@ -230,9 +247,7 @@ static struct {
        { SMB_VFS_OP_GET_SHADOW_COPY_DATA,      "get_shadow_copy_data" },
        { SMB_VFS_OP_STATVFS,   "statvfs" },
        { SMB_VFS_OP_FS_CAPABILITIES,   "fs_capabilities" },
-       { SMB_VFS_OP_SNAP_CHECK_PATH, "snap_check_path" },
-       { SMB_VFS_OP_SNAP_CREATE, "snap_create" },
-       { SMB_VFS_OP_SNAP_DELETE, "snap_delete" },
+       { SMB_VFS_OP_GET_DFS_REFERRALS, "get_dfs_referrals" },
        { SMB_VFS_OP_OPENDIR,   "opendir" },
        { SMB_VFS_OP_FDOPENDIR, "fdopendir" },
        { SMB_VFS_OP_READDIR,   "readdir" },
@@ -242,7 +257,6 @@ static struct {
        { SMB_VFS_OP_MKDIR,     "mkdir" },
        { SMB_VFS_OP_RMDIR,     "rmdir" },
        { SMB_VFS_OP_CLOSEDIR,  "closedir" },
-       { SMB_VFS_OP_INIT_SEARCH_OP, "init_search_op" },
        { SMB_VFS_OP_OPEN,      "open" },
        { SMB_VFS_OP_CREATE_FILE, "create_file" },
        { SMB_VFS_OP_CLOSE,     "close" },
@@ -293,19 +307,28 @@ static struct {
        { SMB_VFS_OP_BRL_LOCK_WINDOWS,  "brl_lock_windows" },
        { SMB_VFS_OP_BRL_UNLOCK_WINDOWS, "brl_unlock_windows" },
        { SMB_VFS_OP_BRL_CANCEL_WINDOWS, "brl_cancel_windows" },
-       { SMB_VFS_OP_STRICT_LOCK, "strict_lock" },
-       { SMB_VFS_OP_STRICT_UNLOCK, "strict_unlock" },
+       { SMB_VFS_OP_STRICT_LOCK_CHECK, "strict_lock_check" },
        { SMB_VFS_OP_TRANSLATE_NAME,    "translate_name" },
-       { SMB_VFS_OP_COPY_CHUNK_SEND,   "copy_chunk_send" },
-       { SMB_VFS_OP_COPY_CHUNK_RECV,   "copy_chunk_recv" },
+       { SMB_VFS_OP_FSCTL,             "fsctl" },
+       { SMB_VFS_OP_OFFLOAD_READ_SEND, "offload_read_send" },
+       { SMB_VFS_OP_OFFLOAD_READ_RECV, "offload_read_recv" },
+       { SMB_VFS_OP_OFFLOAD_WRITE_SEND,        "offload_write_send" },
+       { SMB_VFS_OP_OFFLOAD_WRITE_RECV,        "offload_write_recv" },
        { SMB_VFS_OP_GET_COMPRESSION,   "get_compression" },
        { SMB_VFS_OP_SET_COMPRESSION,   "set_compression" },
-       { SMB_VFS_OP_READDIR_ATTR,      "readdir_attr" },
+       { SMB_VFS_OP_SNAP_CHECK_PATH, "snap_check_path" },
+       { SMB_VFS_OP_SNAP_CREATE, "snap_create" },
+       { SMB_VFS_OP_SNAP_DELETE, "snap_delete" },
+       { SMB_VFS_OP_GET_DOS_ATTRIBUTES, "get_dos_attributes" },
+       { SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND, "get_dos_attributes_send" },
+       { SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV, "get_dos_attributes_recv" },
+       { SMB_VFS_OP_FGET_DOS_ATTRIBUTES, "fget_dos_attributes" },
+       { SMB_VFS_OP_SET_DOS_ATTRIBUTES, "set_dos_attributes" },
+       { SMB_VFS_OP_FSET_DOS_ATTRIBUTES, "fset_dos_attributes" },
        { SMB_VFS_OP_FGET_NT_ACL,       "fget_nt_acl" },
        { SMB_VFS_OP_GET_NT_ACL,        "get_nt_acl" },
        { SMB_VFS_OP_FSET_NT_ACL,       "fset_nt_acl" },
-       { SMB_VFS_OP_CHMOD_ACL, "chmod_acl" },
-       { SMB_VFS_OP_FCHMOD_ACL,        "fchmod_acl" },
+       { SMB_VFS_OP_AUDIT_FILE,        "audit_file" },
        { SMB_VFS_OP_SYS_ACL_GET_FILE,  "sys_acl_get_file" },
        { SMB_VFS_OP_SYS_ACL_GET_FD,    "sys_acl_get_fd" },
        { SMB_VFS_OP_SYS_ACL_BLOB_GET_FILE,     "sys_acl_blob_get_file" },
@@ -314,6 +337,8 @@ static struct {
        { SMB_VFS_OP_SYS_ACL_SET_FD,    "sys_acl_set_fd" },
        { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,   "sys_acl_delete_def_file" },
        { SMB_VFS_OP_GETXATTR,  "getxattr" },
+       { SMB_VFS_OP_GETXATTRAT_SEND, "getxattrat_send" },
+       { SMB_VFS_OP_GETXATTRAT_RECV, "getxattrat_recv" },
        { SMB_VFS_OP_FGETXATTR, "fgetxattr" },
        { SMB_VFS_OP_LISTXATTR, "listxattr" },
        { SMB_VFS_OP_FLISTXATTR,        "flistxattr" },
@@ -324,22 +349,97 @@ static struct {
        { SMB_VFS_OP_AIO_FORCE, "aio_force" },
        { SMB_VFS_OP_IS_OFFLINE, "is_offline" },
        { SMB_VFS_OP_SET_OFFLINE, "set_offline" },
+       { SMB_VFS_OP_DURABLE_COOKIE, "durable_cookie" },
+       { SMB_VFS_OP_DURABLE_DISCONNECT, "durable_disconnect" },
+       { SMB_VFS_OP_DURABLE_RECONNECT, "durable_reconnect" },
+       { SMB_VFS_OP_READDIR_ATTR,      "readdir_attr" },
        { SMB_VFS_OP_LAST, NULL }
 };
 
 static int audit_syslog_facility(vfs_handle_struct *handle)
 {
        static const struct enum_list enum_log_facilities[] = {
-               { LOG_USER, "USER" },
-               { LOG_LOCAL0, "LOCAL0" },
-               { LOG_LOCAL1, "LOCAL1" },
-               { LOG_LOCAL2, "LOCAL2" },
-               { LOG_LOCAL3, "LOCAL3" },
-               { LOG_LOCAL4, "LOCAL4" },
-               { LOG_LOCAL5, "LOCAL5" },
-               { LOG_LOCAL6, "LOCAL6" },
-               { LOG_LOCAL7, "LOCAL7" },
-               { -1, NULL}
+#ifdef LOG_AUTH
+               { LOG_AUTH,             "AUTH" },
+#endif
+#ifdef LOG_AUTHPRIV
+               { LOG_AUTHPRIV,         "AUTHPRIV" },
+#endif
+#ifdef LOG_AUDIT
+               { LOG_AUDIT,            "AUDIT" },
+#endif
+#ifdef LOG_CONSOLE
+               { LOG_CONSOLE,          "CONSOLE" },
+#endif
+#ifdef LOG_CRON
+               { LOG_CRON,             "CRON" },
+#endif
+#ifdef LOG_DAEMON
+               { LOG_DAEMON,           "DAEMON" },
+#endif
+#ifdef LOG_FTP
+               { LOG_FTP,              "FTP" },
+#endif
+#ifdef LOG_INSTALL
+               { LOG_INSTALL,          "INSTALL" },
+#endif
+#ifdef LOG_KERN
+               { LOG_KERN,             "KERN" },
+#endif
+#ifdef LOG_LAUNCHD
+               { LOG_LAUNCHD,          "LAUNCHD" },
+#endif
+#ifdef LOG_LFMT
+               { LOG_LFMT,             "LFMT" },
+#endif
+#ifdef LOG_LPR
+               { LOG_LPR,              "LPR" },
+#endif
+#ifdef LOG_MAIL
+               { LOG_MAIL,             "MAIL" },
+#endif
+#ifdef LOG_MEGASAFE
+               { LOG_MEGASAFE,         "MEGASAFE" },
+#endif
+#ifdef LOG_NETINFO
+               { LOG_NETINFO,          "NETINFO" },
+#endif
+#ifdef LOG_NEWS
+               { LOG_NEWS,             "NEWS" },
+#endif
+#ifdef LOG_NFACILITIES
+               { LOG_NFACILITIES,      "NFACILITIES" },
+#endif
+#ifdef LOG_NTP
+               { LOG_NTP,              "NTP" },
+#endif
+#ifdef LOG_RAS
+               { LOG_RAS,              "RAS" },
+#endif
+#ifdef LOG_REMOTEAUTH
+               { LOG_REMOTEAUTH,       "REMOTEAUTH" },
+#endif
+#ifdef LOG_SECURITY
+               { LOG_SECURITY,         "SECURITY" },
+#endif
+#ifdef LOG_SYSLOG
+               { LOG_SYSLOG,           "SYSLOG" },
+#endif
+#ifdef LOG_USER
+               { LOG_USER,             "USER" },
+#endif
+#ifdef LOG_UUCP
+               { LOG_UUCP,             "UUCP" },
+#endif
+               { LOG_LOCAL0,           "LOCAL0" },
+               { LOG_LOCAL1,           "LOCAL1" },
+               { LOG_LOCAL2,           "LOCAL2" },
+               { LOG_LOCAL3,           "LOCAL3" },
+               { LOG_LOCAL4,           "LOCAL4" },
+               { LOG_LOCAL5,           "LOCAL5" },
+               { LOG_LOCAL6,           "LOCAL6" },
+               { LOG_LOCAL7,           "LOCAL7" },
+               { -1,                   NULL }
        };
 
        int facility;
@@ -360,7 +460,7 @@ static int audit_syslog_priority(vfs_handle_struct *handle)
                { LOG_NOTICE, "NOTICE" },
                { LOG_INFO, "INFO" },
                { LOG_DEBUG, "DEBUG" },
-               { -1, NULL}
+               { -1, NULL }
        };
 
        int priority;
@@ -495,6 +595,9 @@ static TALLOC_CTX *do_log_ctx(void)
         return tmp_do_log_ctx;
 }
 
+static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
+                  const char *format, ...) PRINTF_ATTRIBUTE(4, 5);
+
 static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
                   const char *format, ...)
 {
@@ -555,7 +658,8 @@ static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
 /**
  * Return a string using the do_log_ctx()
  */
-static const char *smb_fname_str_do_log(const struct smb_filename *smb_fname)
+static const char *smb_fname_str_do_log(const struct smb_filename *cwd,
+                               const struct smb_filename *smb_fname)
 {
        char *fname = NULL;
        NTSTATUS status;
@@ -563,6 +667,32 @@ static const char *smb_fname_str_do_log(const struct smb_filename *smb_fname)
        if (smb_fname == NULL) {
                return "";
        }
+
+       if (smb_fname->base_name[0] != '/') {
+               char *abs_name = NULL;
+               struct smb_filename *fname_copy = cp_smb_filename(
+                                                       do_log_ctx(),
+                                                       smb_fname);
+               if (fname_copy == NULL) {
+                       return "";
+               }
+
+               if (!ISDOT(smb_fname->base_name)) {
+                       abs_name = talloc_asprintf(do_log_ctx(),
+                                       "%s/%s",
+                                       cwd->base_name,
+                                       smb_fname->base_name);
+               } else {
+                       abs_name = talloc_strdup(do_log_ctx(),
+                                       cwd->base_name);
+               }
+               if (abs_name == NULL) {
+                       return "";
+               }
+               fname_copy->base_name = abs_name;
+               smb_fname = fname_copy;
+       }
+
        status = get_full_smb_filename(do_log_ctx(), smb_fname, &fname);
        if (!NT_STATUS_IS_OK(status)) {
                return "";
@@ -575,7 +705,7 @@ static const char *smb_fname_str_do_log(const struct smb_filename *smb_fname)
  */
 static const char *fsp_str_do_log(const struct files_struct *fsp)
 {
-       return smb_fname_str_do_log(fsp->fsp_name);
+       return smb_fname_str_do_log(fsp->conn->cwd_fname, fsp->fsp_name);
 }
 
 /* Implementation of vfs_ops.  Pass everything on to the default
@@ -585,6 +715,7 @@ static int smb_full_audit_connect(vfs_handle_struct *handle,
                         const char *svc, const char *user)
 {
        int result;
+       const char *none[] = { "none" };
        struct vfs_full_audit_private_data *pd = NULL;
 
        result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
@@ -624,10 +755,10 @@ static int smb_full_audit_connect(vfs_handle_struct *handle,
 
        pd->success_ops = init_bitmap(
                pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
-                                       "success", NULL));
+                                       "success", none));
        pd->failure_ops = init_bitmap(
                pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
-                                       "failure", NULL));
+                                       "failure", none));
 
        /* Store the private data. */
        SMB_VFS_HANDLE_SET_DATA(handle, pd, NULL,
@@ -651,29 +782,34 @@ static void smb_full_audit_disconnect(vfs_handle_struct *handle)
 }
 
 static uint64_t smb_full_audit_disk_free(vfs_handle_struct *handle,
-                                   const char *path, uint64_t *bsize,
-                                   uint64_t *dfree, uint64_t *dsize)
+                               const struct smb_filename *smb_fname,
+                               uint64_t *bsize,
+                               uint64_t *dfree,
+                               uint64_t *dsize)
 {
        uint64_t result;
 
-       result = SMB_VFS_NEXT_DISK_FREE(handle, path, bsize, dfree, dsize);
+       result = SMB_VFS_NEXT_DISK_FREE(handle, smb_fname, bsize, dfree, dsize);
 
        /* Don't have a reasonable notion of failure here */
 
-       do_log(SMB_VFS_OP_DISK_FREE, True, handle, "%s", path);
+       do_log(SMB_VFS_OP_DISK_FREE, True, handle, "%s", smb_fname->base_name);
 
        return result;
 }
 
 static int smb_full_audit_get_quota(struct vfs_handle_struct *handle,
-                                   const char *path, enum SMB_QUOTA_TYPE qtype,
-                                   unid_t id, SMB_DISK_QUOTA *qt)
+                               const struct smb_filename *smb_fname,
+                               enum SMB_QUOTA_TYPE qtype,
+                               unid_t id,
+                               SMB_DISK_QUOTA *qt)
 {
        int result;
 
-       result = SMB_VFS_NEXT_GET_QUOTA(handle, path, qtype, id, qt);
+       result = SMB_VFS_NEXT_GET_QUOTA(handle, smb_fname, qtype, id, qt);
 
-       do_log(SMB_VFS_OP_GET_QUOTA, (result >= 0), handle, "%s", path);
+       do_log(SMB_VFS_OP_GET_QUOTA, (result >= 0), handle, "%s",
+                       smb_fname->base_name);
 
        return result;
 }
@@ -706,12 +842,12 @@ static int smb_full_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
 }
 
 static int smb_full_audit_statvfs(struct vfs_handle_struct *handle,
-                               const char *path,
+                               const struct smb_filename *smb_fname,
                                struct vfs_statvfs_struct *statbuf)
 {
        int result;
 
-       result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
+       result = SMB_VFS_NEXT_STATVFS(handle, smb_fname, statbuf);
 
        do_log(SMB_VFS_OP_STATVFS, (result >= 0), handle, "");
 
@@ -729,6 +865,20 @@ static uint32_t smb_full_audit_fs_capabilities(struct vfs_handle_struct *handle,
        return result;
 }
 
+static NTSTATUS smb_full_audit_get_dfs_referrals(
+                               struct vfs_handle_struct *handle,
+                               struct dfs_GetDFSReferral *r)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_GET_DFS_REFERRALS(handle, r);
+
+       do_log(SMB_VFS_OP_GET_DFS_REFERRALS, NT_STATUS_IS_OK(status),
+              handle, "");
+
+       return status;
+}
+
 static NTSTATUS smb_full_audit_snap_check_path(struct vfs_handle_struct *handle,
                                               TALLOC_CTX *mem_ctx,
                                               const char *service_path,
@@ -884,14 +1034,6 @@ static int smb_full_audit_closedir(vfs_handle_struct *handle,
        return result;
 }
 
-static void smb_full_audit_init_search_op(vfs_handle_struct *handle,
-                       DIR *dirp)
-{
-       SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
-
-       do_log(SMB_VFS_OP_INIT_SEARCH_OP, True, handle, "");
-}
-
 static int smb_full_audit_open(vfs_handle_struct *handle,
                               struct smb_filename *smb_fname,
                               files_struct *fsp, int flags, mode_t mode)
@@ -902,7 +1044,7 @@ static int smb_full_audit_open(vfs_handle_struct *handle,
 
        do_log(SMB_VFS_OP_OPEN, (result >= 0), handle, "%s|%s",
               ((flags & O_WRONLY) || (flags & O_RDWR))?"w":"r",
-              smb_fname_str_do_log(smb_fname));
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
 
        return result;
 }
@@ -976,7 +1118,8 @@ static NTSTATUS smb_full_audit_create_file(vfs_handle_struct *handle,
        do_log(SMB_VFS_OP_CREATE_FILE, (NT_STATUS_IS_OK(result)), handle,
               "0x%x|%s|%s|%s", access_mask,
               create_options & FILE_DIRECTORY_FILE ? "dir" : "file",
-              str_create_disposition, smb_fname_str_do_log(smb_fname));
+              str_create_disposition,
+               smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
 
        return result;
 }
@@ -993,19 +1136,6 @@ static int smb_full_audit_close(vfs_handle_struct *handle, files_struct *fsp)
        return result;
 }
 
-static ssize_t smb_full_audit_read(vfs_handle_struct *handle, files_struct *fsp,
-                         void *data, size_t n)
-{
-       ssize_t result;
-
-       result = SMB_VFS_NEXT_READ(handle, fsp, data, n);
-
-       do_log(SMB_VFS_OP_READ, (result >= 0), handle, "%s",
-              fsp_str_do_log(fsp));
-
-       return result;
-}
-
 static ssize_t smb_full_audit_pread(vfs_handle_struct *handle, files_struct *fsp,
                           void *data, size_t n, off_t offset)
 {
@@ -1090,19 +1220,6 @@ static ssize_t smb_full_audit_pread_recv(struct tevent_req *req,
        return state->ret;
 }
 
-static ssize_t smb_full_audit_write(vfs_handle_struct *handle, files_struct *fsp,
-                          const void *data, size_t n)
-{
-       ssize_t result;
-
-       result = SMB_VFS_NEXT_WRITE(handle, fsp, data, n);
-
-       do_log(SMB_VFS_OP_WRITE, (result >= 0), handle, "%s",
-              fsp_str_do_log(fsp));
-
-       return result;
-}
-
 static ssize_t smb_full_audit_pwrite(vfs_handle_struct *handle, files_struct *fsp,
                            const void *data, size_t n,
                            off_t offset)
@@ -1241,20 +1358,8 @@ static int smb_full_audit_rename(vfs_handle_struct *handle,
        result = SMB_VFS_NEXT_RENAME(handle, smb_fname_src, smb_fname_dst);
 
        do_log(SMB_VFS_OP_RENAME, (result >= 0), handle, "%s|%s",
-              smb_fname_str_do_log(smb_fname_src),
-              smb_fname_str_do_log(smb_fname_dst));
-
-       return result;    
-}
-
-static int smb_full_audit_fsync(vfs_handle_struct *handle, files_struct *fsp)
-{
-       int result;
-       
-       result = SMB_VFS_NEXT_FSYNC(handle, fsp);
-
-       do_log(SMB_VFS_OP_FSYNC, (result >= 0), handle, "%s",
-              fsp_str_do_log(fsp));
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname_src),
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname_dst));
 
        return result;    
 }
@@ -1336,7 +1441,7 @@ static int smb_full_audit_stat(vfs_handle_struct *handle,
        result = SMB_VFS_NEXT_STAT(handle, smb_fname);
 
        do_log(SMB_VFS_OP_STAT, (result >= 0), handle, "%s",
-              smb_fname_str_do_log(smb_fname));
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
 
        return result;    
 }
@@ -1362,7 +1467,7 @@ static int smb_full_audit_lstat(vfs_handle_struct *handle,
        result = SMB_VFS_NEXT_LSTAT(handle, smb_fname);
 
        do_log(SMB_VFS_OP_LSTAT, (result >= 0), handle, "%s",
-              smb_fname_str_do_log(smb_fname));
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
 
        return result;    
 }
@@ -1375,7 +1480,7 @@ static uint64_t smb_full_audit_get_alloc_size(vfs_handle_struct *handle,
        result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
 
        do_log(SMB_VFS_OP_GET_ALLOC_SIZE, (result != (uint64_t)-1), handle,
-                       "%llu", result);
+                       "%llu", (unsigned long long)result);
 
        return result;
 }
@@ -1388,7 +1493,7 @@ static int smb_full_audit_unlink(vfs_handle_struct *handle,
        result = SMB_VFS_NEXT_UNLINK(handle, smb_fname);
 
        do_log(SMB_VFS_OP_UNLINK, (result >= 0), handle, "%s",
-              smb_fname_str_do_log(smb_fname));
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
 
        return result;
 }
@@ -1465,25 +1570,27 @@ static int smb_full_audit_lchown(vfs_handle_struct *handle,
 }
 
 static int smb_full_audit_chdir(vfs_handle_struct *handle,
-                      const char *path)
+                       const struct smb_filename *smb_fname)
 {
        int result;
 
-       result = SMB_VFS_NEXT_CHDIR(handle, path);
+       result = SMB_VFS_NEXT_CHDIR(handle, smb_fname);
 
-       do_log(SMB_VFS_OP_CHDIR, (result >= 0), handle, "chdir|%s", path);
+       do_log(SMB_VFS_OP_CHDIR, (result >= 0), handle, "chdir|%s",
+               smb_fname->base_name);
 
        return result;
 }
 
-static char *smb_full_audit_getwd(vfs_handle_struct *handle)
+static struct smb_filename *smb_full_audit_getwd(vfs_handle_struct *handle,
+                               TALLOC_CTX *ctx)
 {
-       char *result;
+       struct smb_filename *result;
 
-       result = SMB_VFS_NEXT_GETWD(handle);
+       result = SMB_VFS_NEXT_GETWD(handle, ctx);
        
        do_log(SMB_VFS_OP_GETWD, (result != NULL), handle, "%s",
-               result == NULL? "" : result);
+               result == NULL? "" : result->base_name);
 
        return result;
 }
@@ -1493,11 +1600,42 @@ static int smb_full_audit_ntimes(vfs_handle_struct *handle,
                                 struct smb_file_time *ft)
 {
        int result;
+       time_t create_time = convert_timespec_to_time_t(ft->create_time);
+       time_t atime = convert_timespec_to_time_t(ft->atime);
+       time_t mtime = convert_timespec_to_time_t(ft->mtime);
+       time_t ctime = convert_timespec_to_time_t(ft->ctime);
+       const char *create_time_str = "";
+       const char *atime_str = "";
+       const char *mtime_str = "";
+       const char *ctime_str = "";
+       TALLOC_CTX *frame = talloc_stackframe();
 
        result = SMB_VFS_NEXT_NTIMES(handle, smb_fname, ft);
 
-       do_log(SMB_VFS_OP_NTIMES, (result >= 0), handle, "%s",
-              smb_fname_str_do_log(smb_fname));
+       if (create_time > 0) {
+               create_time_str = timestring(frame, create_time);
+       }
+       if (atime > 0) {
+               atime_str = timestring(frame, atime);
+       }
+       if (mtime > 0) {
+               mtime_str = timestring(frame, mtime);
+       }
+       if (ctime > 0) {
+               ctime_str = timestring(frame, ctime);
+       }
+
+       do_log(SMB_VFS_OP_NTIMES,
+              (result >= 0),
+              handle,
+              "%s|%s|%s|%s|%s",
+              smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname),
+              create_time_str,
+              atime_str,
+              mtime_str,
+              ctime_str);
+
+       TALLOC_FREE(frame);
 
        return result;
 }
@@ -1582,75 +1720,87 @@ static bool smb_full_audit_getlock(vfs_handle_struct *handle, files_struct *fsp,
 }
 
 static int smb_full_audit_symlink(vfs_handle_struct *handle,
-                        const char *oldpath, const char *newpath)
+                       const char *link_contents,
+                       const struct smb_filename *new_smb_fname)
 {
        int result;
 
-       result = SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath);
+       result = SMB_VFS_NEXT_SYMLINK(handle, link_contents, new_smb_fname);
 
        do_log(SMB_VFS_OP_SYMLINK, (result >= 0), handle,
-              "%s|%s", oldpath, newpath);
+              "%s|%s", link_contents, new_smb_fname->base_name);
 
        return result;
 }
 
 static int smb_full_audit_readlink(vfs_handle_struct *handle,
-                         const char *path, char *buf, size_t bufsiz)
+                       const struct smb_filename *smb_fname,
+                       char *buf,
+                       size_t bufsiz)
 {
        int result;
 
-       result = SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz);
+       result = SMB_VFS_NEXT_READLINK(handle, smb_fname, buf, bufsiz);
 
-       do_log(SMB_VFS_OP_READLINK, (result >= 0), handle, "%s", path);
+       do_log(SMB_VFS_OP_READLINK, (result >= 0), handle, "%s",
+                       smb_fname->base_name);
 
        return result;
 }
 
 static int smb_full_audit_link(vfs_handle_struct *handle,
-                     const char *oldpath, const char *newpath)
+                       const struct smb_filename *old_smb_fname,
+                       const struct smb_filename *new_smb_fname)
 {
        int result;
 
-       result = SMB_VFS_NEXT_LINK(handle, oldpath, newpath);
+       result = SMB_VFS_NEXT_LINK(handle, old_smb_fname, new_smb_fname);
 
        do_log(SMB_VFS_OP_LINK, (result >= 0), handle,
-              "%s|%s", oldpath, newpath);
+              "%s|%s", old_smb_fname->base_name, new_smb_fname->base_name);
 
        return result;
 }
 
 static int smb_full_audit_mknod(vfs_handle_struct *handle,
-                      const char *pathname, mode_t mode, SMB_DEV_T dev)
+                       const struct smb_filename *smb_fname,
+                       mode_t mode,
+                       SMB_DEV_T dev)
 {
        int result;
 
-       result = SMB_VFS_NEXT_MKNOD(handle, pathname, mode, dev);
+       result = SMB_VFS_NEXT_MKNOD(handle, smb_fname, mode, dev);
 
-       do_log(SMB_VFS_OP_MKNOD, (result >= 0), handle, "%s", pathname);
+       do_log(SMB_VFS_OP_MKNOD, (result >= 0), handle, "%s",
+               smb_fname->base_name);
 
        return result;
 }
 
-static char *smb_full_audit_realpath(vfs_handle_struct *handle,
-                           const char *path)
+static struct smb_filename *smb_full_audit_realpath(vfs_handle_struct *handle,
+                               TALLOC_CTX *ctx,
+                               const struct smb_filename *smb_fname)
 {
-       char *result;
+       struct smb_filename *result_fname = NULL;
 
-       result = SMB_VFS_NEXT_REALPATH(handle, path);
+       result_fname = SMB_VFS_NEXT_REALPATH(handle, ctx, smb_fname);
 
-       do_log(SMB_VFS_OP_REALPATH, (result != NULL), handle, "%s", path);
+       do_log(SMB_VFS_OP_REALPATH, (result_fname != NULL), handle, "%s",
+                       smb_fname->base_name);
 
-       return result;
+       return result_fname;
 }
 
 static int smb_full_audit_chflags(vfs_handle_struct *handle,
-                           const char *path, unsigned int flags)
+                       const struct smb_filename *smb_fname,
+                       unsigned int flags)
 {
        int result;
 
-       result = SMB_VFS_NEXT_CHFLAGS(handle, path, flags);
+       result = SMB_VFS_NEXT_CHFLAGS(handle, smb_fname, flags);
 
-       do_log(SMB_VFS_OP_CHFLAGS, (result != 0), handle, "%s", path);
+       do_log(SMB_VFS_OP_CHFLAGS, (result != 0), handle, "%s",
+               smb_fname->base_name);
 
        return result;
 }
@@ -1674,18 +1824,18 @@ static struct file_id smb_full_audit_file_id_create(struct vfs_handle_struct *ha
 
 static NTSTATUS smb_full_audit_streaminfo(vfs_handle_struct *handle,
                                          struct files_struct *fsp,
-                                         const char *fname,
+                                         const struct smb_filename *smb_fname,
                                          TALLOC_CTX *mem_ctx,
                                          unsigned int *pnum_streams,
                                          struct stream_struct **pstreams)
 {
        NTSTATUS result;
 
-       result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx,
+       result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, smb_fname, mem_ctx,
                                         pnum_streams, pstreams);
 
        do_log(SMB_VFS_OP_STREAMINFO, NT_STATUS_IS_OK(result), handle,
-              "%s", fname);
+              "%s", smb_fname->base_name);
 
        return result;
 }
@@ -1708,14 +1858,14 @@ static int smb_full_audit_get_real_filename(struct vfs_handle_struct *handle,
 }
 
 static const char *smb_full_audit_connectpath(vfs_handle_struct *handle,
-                                             const char *fname)
+                                       const struct smb_filename *smb_fname)
 {
        const char *result;
 
-       result = SMB_VFS_NEXT_CONNECTPATH(handle, fname);
+       result = SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname);
 
        do_log(SMB_VFS_OP_CONNECTPATH, result != NULL, handle,
-              "%s", fname);
+              "%s", smb_fname->base_name);
 
        return result;
 }
@@ -1733,7 +1883,10 @@ static NTSTATUS smb_full_audit_brl_lock_windows(struct vfs_handle_struct *handle
        do_log(SMB_VFS_OP_BRL_LOCK_WINDOWS, NT_STATUS_IS_OK(result), handle,
            "%s:%llu-%llu. type=%d. blocking=%d",
               fsp_str_do_log(brl_fsp(br_lck)),
-           plock->start, plock->size, plock->lock_type, blocking_lock);
+              (unsigned long long)plock->start,
+              (unsigned long long)plock->size,
+              plock->lock_type,
+              blocking_lock);
 
        return result;
 }
@@ -1750,8 +1903,9 @@ static bool smb_full_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
 
        do_log(SMB_VFS_OP_BRL_UNLOCK_WINDOWS, (result == 0), handle,
               "%s:%llu-%llu:%d", fsp_str_do_log(brl_fsp(br_lck)),
-              plock->start,
-           plock->size, plock->lock_type);
+              (unsigned long long)plock->start,
+              (unsigned long long)plock->size,
+              plock->lock_type);
 
        return result;
 }
@@ -1766,38 +1920,30 @@ static bool smb_full_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
 
        do_log(SMB_VFS_OP_BRL_CANCEL_WINDOWS, (result == 0), handle,
               "%s:%llu-%llu:%d", fsp_str_do_log(brl_fsp(br_lck)),
-              plock->start,
-           plock->size, plock->lock_type);
+              (unsigned long long)plock->start,
+              (unsigned long long)plock->size,
+              plock->lock_type);
 
        return result;
 }
 
-static bool smb_full_audit_strict_lock(struct vfs_handle_struct *handle,
-                                      struct files_struct *fsp,
-                                      struct lock_struct *plock)
+static bool smb_full_audit_strict_lock_check(struct vfs_handle_struct *handle,
+                                            struct files_struct *fsp,
+                                            struct lock_struct *plock)
 {
        bool result;
 
-       result = SMB_VFS_NEXT_STRICT_LOCK(handle, fsp, plock);
+       result = SMB_VFS_NEXT_STRICT_LOCK_CHECK(handle, fsp, plock);
 
-       do_log(SMB_VFS_OP_STRICT_LOCK, result, handle,
-           "%s:%llu-%llu:%d", fsp_str_do_log(fsp), plock->start,
-           plock->size, plock->lock_type);
+       do_log(SMB_VFS_OP_STRICT_LOCK_CHECK, result, handle,
+              "%s:%llu-%llu:%d", fsp_str_do_log(fsp),
+              (unsigned long long)plock->start,
+              (unsigned long long)plock->size,
+              plock->lock_type);
 
        return result;
 }
 
-static void smb_full_audit_strict_unlock(struct vfs_handle_struct *handle,
-                                        struct files_struct *fsp,
-                                        struct lock_struct *plock)
-{
-       SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock);
-
-       do_log(SMB_VFS_OP_STRICT_UNLOCK, true, handle,
-           "%s:%llu-%llu:%d", fsp_str_do_log(fsp), plock->start,
-           plock->size, plock->lock_type);
-}
-
 static NTSTATUS smb_full_audit_translate_name(struct vfs_handle_struct *handle,
                                              const char *name,
                                              enum vfs_translate_direction direction,
@@ -1814,34 +1960,101 @@ static NTSTATUS smb_full_audit_translate_name(struct vfs_handle_struct *handle,
        return result;
 }
 
-static struct tevent_req *smb_full_audit_copy_chunk_send(struct vfs_handle_struct *handle,
+static NTSTATUS smb_full_audit_fsctl(struct vfs_handle_struct *handle,
+                               struct files_struct *fsp,
+                               TALLOC_CTX *ctx,
+                               uint32_t function,
+                               uint16_t req_flags,
+                               const uint8_t *_in_data,
+                               uint32_t in_len,
+                               uint8_t **_out_data,
+                               uint32_t max_out_len,
+                               uint32_t *out_len)
+{
+       NTSTATUS result;
+
+       result = SMB_VFS_NEXT_FSCTL(handle,
+                               fsp,
+                               ctx,
+                               function,
+                               req_flags,
+                               _in_data,
+                               in_len,
+                               _out_data,
+                               max_out_len,
+                               out_len);
+
+       do_log(SMB_VFS_OP_FSCTL, NT_STATUS_IS_OK(result), handle, "");
+
+       return result;
+}
+
+static struct tevent_req *smb_full_audit_offload_read_send(
+       TALLOC_CTX *mem_ctx,
+       struct tevent_context *ev,
+       struct vfs_handle_struct *handle,
+       struct files_struct *fsp,
+       uint32_t fsctl,
+       uint32_t ttl,
+       off_t offset,
+       size_t to_copy)
+{
+       struct tevent_req *req = NULL;
+
+       req = SMB_VFS_NEXT_OFFLOAD_READ_SEND(mem_ctx, ev, handle, fsp,
+                                            fsctl, ttl, offset, to_copy);
+
+       do_log(SMB_VFS_OP_OFFLOAD_READ_SEND, req, handle, "");
+
+       return req;
+}
+
+static NTSTATUS smb_full_audit_offload_read_recv(
+       struct tevent_req *req,
+       struct vfs_handle_struct *handle,
+       TALLOC_CTX *mem_ctx,
+       DATA_BLOB *_token_blob)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_OFFLOAD_READ_RECV(req, handle, mem_ctx,
+                                               _token_blob);
+
+       do_log(SMB_VFS_OP_OFFLOAD_READ_RECV, NT_STATUS_IS_OK(status), handle, "");
+
+       return status;
+}
+
+static struct tevent_req *smb_full_audit_offload_write_send(struct vfs_handle_struct *handle,
                                                         TALLOC_CTX *mem_ctx,
                                                         struct tevent_context *ev,
-                                                        struct files_struct *src_fsp,
-                                                        off_t src_off,
+                                                        uint32_t fsctl,
+                                                        DATA_BLOB *token,
+                                                        off_t transfer_offset,
                                                         struct files_struct *dest_fsp,
                                                         off_t dest_off,
-                                                        off_t num)
+                                                           off_t num)
 {
        struct tevent_req *req;
 
-       req = SMB_VFS_NEXT_COPY_CHUNK_SEND(handle, mem_ctx, ev, src_fsp,
-                                          src_off, dest_fsp, dest_off, num);
+       req = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle, mem_ctx, ev,
+                                          fsctl, token, transfer_offset,
+                                          dest_fsp, dest_off, num);
 
-       do_log(SMB_VFS_OP_COPY_CHUNK_SEND, req, handle, "");
+       do_log(SMB_VFS_OP_OFFLOAD_WRITE_SEND, req, handle, "");
 
        return req;
 }
 
-static NTSTATUS smb_full_audit_copy_chunk_recv(struct vfs_handle_struct *handle,
+static NTSTATUS smb_full_audit_offload_write_recv(struct vfs_handle_struct *handle,
                                               struct tevent_req *req,
                                               off_t *copied)
 {
        NTSTATUS result;
 
-       result = SMB_VFS_NEXT_COPY_CHUNK_RECV(handle, req, copied);
+       result = SMB_VFS_NEXT_OFFLOAD_WRITE_RECV(handle, req, copied);
 
-       do_log(SMB_VFS_OP_COPY_CHUNK_RECV, NT_STATUS_IS_OK(result), handle, "");
+       do_log(SMB_VFS_OP_OFFLOAD_WRITE_RECV, NT_STATUS_IS_OK(result), handle, "");
 
        return result;
 }
@@ -1859,7 +2072,8 @@ static NTSTATUS smb_full_audit_get_compression(vfs_handle_struct *handle,
 
        do_log(SMB_VFS_OP_GET_COMPRESSION, NT_STATUS_IS_OK(result), handle,
               "%s",
-              (fsp ? fsp_str_do_log(fsp) : smb_fname_str_do_log(smb_fname)));
+              (fsp ? fsp_str_do_log(fsp) :
+               smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname)));
 
        return result;
 }
@@ -1890,7 +2104,209 @@ static NTSTATUS smb_full_audit_readdir_attr(struct vfs_handle_struct *handle,
        status = SMB_VFS_NEXT_READDIR_ATTR(handle, fname, mem_ctx, pattr_data);
 
        do_log(SMB_VFS_OP_READDIR_ATTR, NT_STATUS_IS_OK(status), handle, "%s",
-              smb_fname_str_do_log(fname));
+              smb_fname_str_do_log(handle->conn->cwd_fname, fname));
+
+       return status;
+}
+
+static NTSTATUS smb_full_audit_get_dos_attributes(
+                               struct vfs_handle_struct *handle,
+                               struct smb_filename *smb_fname,
+                               uint32_t *dosmode)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES(handle,
+                               smb_fname,
+                               dosmode);
+
+       do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES,
+               NT_STATUS_IS_OK(status),
+               handle,
+               "%s",
+               smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
+
+       return status;
+}
+
+struct smb_full_audit_get_dos_attributes_state {
+       struct vfs_aio_state aio_state;
+       vfs_handle_struct *handle;
+       files_struct *dir_fsp;
+       const struct smb_filename *smb_fname;
+       uint32_t dosmode;
+};
+
+static void smb_full_audit_get_dos_attributes_done(struct tevent_req *subreq);
+
+static struct tevent_req *smb_full_audit_get_dos_attributes_send(
+               TALLOC_CTX *mem_ctx,
+               const struct smb_vfs_ev_glue *evg,
+               struct vfs_handle_struct *handle,
+               files_struct *dir_fsp,
+               struct smb_filename *smb_fname)
+{
+       struct tevent_context *ev = smb_vfs_ev_glue_ev_ctx(evg);
+       struct tevent_req *req = NULL;
+       struct smb_full_audit_get_dos_attributes_state *state = NULL;
+       struct tevent_req *subreq = NULL;
+
+       req = tevent_req_create(mem_ctx, &state,
+                               struct smb_full_audit_get_dos_attributes_state);
+       if (req == NULL) {
+               do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
+                      false,
+                      handle,
+                      "%s/%s",
+                      fsp_str_do_log(dir_fsp),
+                      smb_fname->base_name);
+               return NULL;
+       }
+       *state = (struct smb_full_audit_get_dos_attributes_state) {
+               .handle = handle,
+               .dir_fsp = dir_fsp,
+               .smb_fname = smb_fname,
+       };
+
+       subreq = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES_SEND(mem_ctx,
+                                                     evg,
+                                                     handle,
+                                                     dir_fsp,
+                                                     smb_fname);
+       if (tevent_req_nomem(subreq, req)) {
+               do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
+                      false,
+                      handle,
+                      "%s/%s",
+                      fsp_str_do_log(dir_fsp),
+                      smb_fname->base_name);
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(subreq,
+                               smb_full_audit_get_dos_attributes_done,
+                               req);
+
+       do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
+              true,
+              handle,
+              "%s/%s",
+              fsp_str_do_log(dir_fsp),
+              smb_fname->base_name);
+
+       return req;
+}
+
+static void smb_full_audit_get_dos_attributes_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req =
+               tevent_req_callback_data(subreq,
+               struct tevent_req);
+       struct smb_full_audit_get_dos_attributes_state *state =
+               tevent_req_data(req,
+               struct smb_full_audit_get_dos_attributes_state);
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES_RECV(subreq,
+                                                     &state->aio_state,
+                                                     &state->dosmode);
+       TALLOC_FREE(subreq);
+       if (tevent_req_nterror(req, status)) {
+               return;
+       }
+
+       tevent_req_done(req);
+       return;
+}
+
+static NTSTATUS smb_full_audit_get_dos_attributes_recv(struct tevent_req *req,
+                                               struct vfs_aio_state *aio_state,
+                                               uint32_t *dosmode)
+{
+       struct smb_full_audit_get_dos_attributes_state *state =
+               tevent_req_data(req,
+               struct smb_full_audit_get_dos_attributes_state);
+       NTSTATUS status;
+
+       if (tevent_req_is_nterror(req, &status)) {
+               do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
+                      false,
+                      state->handle,
+                      "%s/%s",
+                      fsp_str_do_log(state->dir_fsp),
+                      state->smb_fname->base_name);
+               tevent_req_received(req);
+               return status;
+       }
+
+       do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
+              true,
+              state->handle,
+              "%s/%s",
+              fsp_str_do_log(state->dir_fsp),
+              state->smb_fname->base_name);
+
+       *aio_state = state->aio_state;
+       *dosmode = state->dosmode;
+       tevent_req_received(req);
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS smb_full_audit_fget_dos_attributes(
+                               struct vfs_handle_struct *handle,
+                               struct files_struct *fsp,
+                               uint32_t *dosmode)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_FGET_DOS_ATTRIBUTES(handle,
+                               fsp,
+                               dosmode);
+
+       do_log(SMB_VFS_OP_FGET_DOS_ATTRIBUTES,
+               NT_STATUS_IS_OK(status),
+               handle,
+               "%s",
+               fsp_str_do_log(fsp));
+
+       return status;
+}
+
+static NTSTATUS smb_full_audit_set_dos_attributes(
+                               struct vfs_handle_struct *handle,
+                               const struct smb_filename *smb_fname,
+                               uint32_t dosmode)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_SET_DOS_ATTRIBUTES(handle,
+                               smb_fname,
+                               dosmode);
+
+       do_log(SMB_VFS_OP_SET_DOS_ATTRIBUTES,
+               NT_STATUS_IS_OK(status),
+               handle,
+               "%s",
+               smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
+
+       return status;
+}
+
+static NTSTATUS smb_full_audit_fset_dos_attributes(
+                               struct vfs_handle_struct *handle,
+                               struct files_struct *fsp,
+                               uint32_t dosmode)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_FSET_DOS_ATTRIBUTES(handle,
+                               fsp,
+                               dosmode);
+
+       do_log(SMB_VFS_OP_FSET_DOS_ATTRIBUTES,
+               NT_STATUS_IS_OK(status),
+               handle,
+               "%s",
+               fsp_str_do_log(fsp));
 
        return status;
 }
@@ -1923,7 +2339,7 @@ static NTSTATUS smb_full_audit_get_nt_acl(vfs_handle_struct *handle,
                                         mem_ctx, ppdesc);
 
        do_log(SMB_VFS_OP_GET_NT_ACL, NT_STATUS_IS_OK(result), handle,
-              "%s", smb_fname_str_do_log(smb_fname));
+              "%s", smb_fname_str_do_log(handle->conn->cwd_fname, smb_fname));
 
        return result;
 }
@@ -1954,44 +2370,39 @@ static NTSTATUS smb_full_audit_fset_nt_acl(vfs_handle_struct *handle, files_stru
        return result;
 }
 
-static int smb_full_audit_chmod_acl(vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname,
-                               mode_t mode)
+static NTSTATUS smb_full_audit_audit_file(struct vfs_handle_struct *handle,
+                               struct smb_filename *file,
+                               struct security_acl *sacl,
+                               uint32_t access_requested,
+                               uint32_t access_denied)
 {
-       int result;
-       
-       result = SMB_VFS_NEXT_CHMOD_ACL(handle, smb_fname, mode);
-
-       do_log(SMB_VFS_OP_CHMOD_ACL, (result >= 0), handle,
-              "%s|%o", smb_fname->base_name, mode);
-
-       return result;
-}
+       NTSTATUS result;
 
-static int smb_full_audit_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp,
-                                    mode_t mode)
-{
-       int result;
-       
-       result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
+       result = SMB_VFS_NEXT_AUDIT_FILE(handle,
+                                       file,
+                                       sacl,
+                                       access_requested,
+                                       access_denied);
 
-       do_log(SMB_VFS_OP_FCHMOD_ACL, (result >= 0), handle,
-              "%s|%o", fsp_str_do_log(fsp), mode);
+       do_log(SMB_VFS_OP_AUDIT_FILE, NT_STATUS_IS_OK(result), handle,
+                       "%s",
+                       smb_fname_str_do_log(handle->conn->cwd_fname, file));
 
        return result;
 }
 
 static SMB_ACL_T smb_full_audit_sys_acl_get_file(vfs_handle_struct *handle,
-                                       const char *path_p,
-                                                SMB_ACL_TYPE_T type,
-                                                TALLOC_CTX *mem_ctx)
+                               const struct smb_filename *smb_fname,
+                               SMB_ACL_TYPE_T type,
+                               TALLOC_CTX *mem_ctx)
 {
        SMB_ACL_T result;
 
-       result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type, mem_ctx);
+       result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, smb_fname,
+                               type, mem_ctx);
 
        do_log(SMB_VFS_OP_SYS_ACL_GET_FILE, (result != NULL), handle,
-              "%s", path_p);
+              "%s", smb_fname->base_name);
 
        return result;
 }
@@ -2010,17 +2421,18 @@ static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
 }
 
 static int smb_full_audit_sys_acl_blob_get_file(vfs_handle_struct *handle,
-                                               const char *path_p,
-                                               TALLOC_CTX *mem_ctx,
-                                               char **blob_description,
-                                               DATA_BLOB *blob)
+                               const struct smb_filename *smb_fname,
+                               TALLOC_CTX *mem_ctx,
+                               char **blob_description,
+                               DATA_BLOB *blob)
 {
        int result;
 
-       result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FILE(handle, path_p, mem_ctx, blob_description, blob);
+       result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FILE(handle, smb_fname,
+                       mem_ctx, blob_description, blob);
 
        do_log(SMB_VFS_OP_SYS_ACL_BLOB_GET_FILE, (result >= 0), handle,
-              "%s", path_p);
+              "%s", smb_fname->base_name);
 
        return result;
 }
@@ -2042,17 +2454,17 @@ static int smb_full_audit_sys_acl_blob_get_fd(vfs_handle_struct *handle,
 }
 
 static int smb_full_audit_sys_acl_set_file(vfs_handle_struct *handle,
-
-                                 const char *name, SMB_ACL_TYPE_T acltype,
-                                 SMB_ACL_T theacl)
+                               const struct smb_filename *smb_fname,
+                               SMB_ACL_TYPE_T acltype,
+                               SMB_ACL_T theacl)
 {
        int result;
 
-       result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype,
+       result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, smb_fname, acltype,
                                               theacl);
 
        do_log(SMB_VFS_OP_SYS_ACL_SET_FILE, (result >= 0), handle,
-              "%s", name);
+              "%s", smb_fname->base_name);
 
        return result;
 }
@@ -2071,33 +2483,165 @@ static int smb_full_audit_sys_acl_set_fd(vfs_handle_struct *handle, files_struct
 }
 
 static int smb_full_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
-
-                                        const char *path)
+                               const struct smb_filename *smb_fname)
 {
        int result;
 
-       result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path);
+       result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, smb_fname);
 
        do_log(SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, (result >= 0), handle,
-              "%s", path);
+              "%s", smb_fname->base_name);
 
        return result;
 }
 
 static ssize_t smb_full_audit_getxattr(struct vfs_handle_struct *handle,
-                             const char *path,
+                             const struct smb_filename *smb_fname,
                              const char *name, void *value, size_t size)
 {
        ssize_t result;
 
-       result = SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size);
+       result = SMB_VFS_NEXT_GETXATTR(handle, smb_fname, name, value, size);
 
        do_log(SMB_VFS_OP_GETXATTR, (result >= 0), handle,
-              "%s|%s", path, name);
+              "%s|%s", smb_fname->base_name, name);
 
        return result;
 }
 
+struct smb_full_audit_getxattrat_state {
+       struct vfs_aio_state aio_state;
+       vfs_handle_struct *handle;
+       files_struct *dir_fsp;
+       const struct smb_filename *smb_fname;
+       const char *xattr_name;
+       ssize_t xattr_size;
+       uint8_t *xattr_value;
+};
+
+static void smb_full_audit_getxattrat_done(struct tevent_req *subreq);
+
+static struct tevent_req *smb_full_audit_getxattrat_send(
+                       TALLOC_CTX *mem_ctx,
+                       struct tevent_context *ev,
+                       struct vfs_handle_struct *handle,
+                       files_struct *dir_fsp,
+                       const struct smb_filename *smb_fname,
+                       const char *xattr_name,
+                       size_t alloc_hint)
+{
+       struct tevent_req *req = NULL;
+       struct tevent_req *subreq = NULL;
+       struct smb_full_audit_getxattrat_state *state = NULL;
+
+       req = tevent_req_create(mem_ctx, &state,
+                               struct smb_full_audit_getxattrat_state);
+       if (req == NULL) {
+               do_log(SMB_VFS_OP_GETXATTRAT_SEND,
+                      false,
+                      handle,
+                      "%s/%s|%s",
+                      fsp_str_do_log(dir_fsp),
+                      smb_fname->base_name,
+                      xattr_name);
+               return NULL;
+       }
+       *state = (struct smb_full_audit_getxattrat_state) {
+               .handle = handle,
+               .dir_fsp = dir_fsp,
+               .smb_fname = smb_fname,
+               .xattr_name = xattr_name,
+       };
+
+       subreq = SMB_VFS_NEXT_GETXATTRAT_SEND(state,
+                                             ev,
+                                             handle,
+                                             dir_fsp,
+                                             smb_fname,
+                                             xattr_name,
+                                             alloc_hint);
+       if (tevent_req_nomem(subreq, req)) {
+               do_log(SMB_VFS_OP_GETXATTRAT_SEND,
+                      false,
+                      handle,
+                      "%s/%s|%s",
+                      fsp_str_do_log(dir_fsp),
+                      smb_fname->base_name,
+                      xattr_name);
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(subreq, smb_full_audit_getxattrat_done, req);
+
+       do_log(SMB_VFS_OP_GETXATTRAT_SEND,
+              true,
+              handle,
+              "%s/%s|%s",
+              fsp_str_do_log(dir_fsp),
+              smb_fname->base_name,
+              xattr_name);
+
+       return req;
+}
+
+static void smb_full_audit_getxattrat_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct smb_full_audit_getxattrat_state *state = tevent_req_data(
+               req, struct smb_full_audit_getxattrat_state);
+
+       state->xattr_size = SMB_VFS_NEXT_GETXATTRAT_RECV(subreq,
+                                                        &state->aio_state,
+                                                        state,
+                                                        &state->xattr_value);
+       TALLOC_FREE(subreq);
+       if (state->xattr_size == -1) {
+               tevent_req_error(req, state->aio_state.error);
+               return;
+       }
+
+       tevent_req_done(req);
+}
+
+static ssize_t smb_full_audit_getxattrat_recv(struct tevent_req *req,
+                                             struct vfs_aio_state *aio_state,
+                                             TALLOC_CTX *mem_ctx,
+                                             uint8_t **xattr_value)
+{
+       struct smb_full_audit_getxattrat_state *state = tevent_req_data(
+               req, struct smb_full_audit_getxattrat_state);
+       ssize_t xattr_size;
+
+       if (tevent_req_is_unix_error(req, &aio_state->error)) {
+               do_log(SMB_VFS_OP_GETXATTRAT_RECV,
+                      false,
+                      state->handle,
+                      "%s/%s|%s",
+                      fsp_str_do_log(state->dir_fsp),
+                      state->smb_fname->base_name,
+                      state->xattr_name);
+               tevent_req_received(req);
+               return -1;
+       }
+
+       do_log(SMB_VFS_OP_GETXATTRAT_RECV,
+              true,
+              state->handle,
+              "%s/%s|%s",
+              fsp_str_do_log(state->dir_fsp),
+              state->smb_fname->base_name,
+              state->xattr_name);
+
+       *aio_state = state->aio_state;
+       xattr_size = state->xattr_size;
+       if (xattr_value != NULL) {
+               *xattr_value = talloc_move(mem_ctx, &state->xattr_value);
+       }
+
+       tevent_req_received(req);
+       return xattr_size;
+}
+
 static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
                               struct files_struct *fsp,
                               const char *name, void *value, size_t size)
@@ -2113,13 +2657,16 @@ static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
 }
 
 static ssize_t smb_full_audit_listxattr(struct vfs_handle_struct *handle,
-                              const char *path, char *list, size_t size)
+                               const struct smb_filename *smb_fname,
+                               char *list,
+                               size_t size)
 {
        ssize_t result;
 
-       result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
+       result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
 
-       do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s", path);
+       do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s",
+                       smb_fname->base_name);
 
        return result;
 }
@@ -2139,15 +2686,15 @@ static ssize_t smb_full_audit_flistxattr(struct vfs_handle_struct *handle,
 }
 
 static int smb_full_audit_removexattr(struct vfs_handle_struct *handle,
-                            const char *path,
+                            const struct smb_filename *smb_fname,
                             const char *name)
 {
        int result;
 
-       result = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name);
+       result = SMB_VFS_NEXT_REMOVEXATTR(handle, smb_fname, name);
 
        do_log(SMB_VFS_OP_REMOVEXATTR, (result >= 0), handle,
-              "%s|%s", path, name);
+              "%s|%s", smb_fname->base_name, name);
 
        return result;
 }
@@ -2167,17 +2714,17 @@ static int smb_full_audit_fremovexattr(struct vfs_handle_struct *handle,
 }
 
 static int smb_full_audit_setxattr(struct vfs_handle_struct *handle,
-                         const char *path,
+                         const struct smb_filename *smb_fname,
                          const char *name, const void *value, size_t size,
                          int flags)
 {
        int result;
 
-       result = SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size,
+       result = SMB_VFS_NEXT_SETXATTR(handle, smb_fname, name, value, size,
                                       flags);
 
        do_log(SMB_VFS_OP_SETXATTR, (result >= 0), handle,
-              "%s|%s", path, name);
+              "%s|%s", smb_fname->base_name, name);
 
        return result;
 }
@@ -2208,26 +2755,69 @@ static bool smb_full_audit_aio_force(struct vfs_handle_struct *handle,
        return result;
 }
 
-static bool smb_full_audit_is_offline(struct vfs_handle_struct *handle,
-                                     const struct smb_filename *fname,
-                                     SMB_STRUCT_STAT *sbuf)
+static NTSTATUS smb_full_audit_durable_cookie(struct vfs_handle_struct *handle,
+                               struct files_struct *fsp,
+                               TALLOC_CTX *mem_ctx,
+                               DATA_BLOB *cookie)
 {
-       bool result;
+       NTSTATUS result;
+
+       result = SMB_VFS_NEXT_DURABLE_COOKIE(handle,
+                                       fsp,
+                                       mem_ctx,
+                                       cookie);
+
+       do_log(SMB_VFS_OP_DURABLE_COOKIE, NT_STATUS_IS_OK(result), handle,
+                       "%s", fsp_str_do_log(fsp));
 
-       result = SMB_VFS_NEXT_IS_OFFLINE(handle, fname, sbuf);
-       do_log(SMB_VFS_OP_IS_OFFLINE, result, handle, "%s",
-              smb_fname_str_do_log(fname));
        return result;
 }
 
-static int smb_full_audit_set_offline(struct vfs_handle_struct *handle,
-                                     const struct smb_filename *fname)
+static NTSTATUS smb_full_audit_durable_disconnect(
+                               struct vfs_handle_struct *handle,
+                               struct files_struct *fsp,
+                               const DATA_BLOB old_cookie,
+                               TALLOC_CTX *mem_ctx,
+                               DATA_BLOB *new_cookie)
 {
-       int result;
+       NTSTATUS result;
+
+       result = SMB_VFS_NEXT_DURABLE_DISCONNECT(handle,
+                                       fsp,
+                                       old_cookie,
+                                       mem_ctx,
+                                       new_cookie);
+
+       do_log(SMB_VFS_OP_DURABLE_DISCONNECT, NT_STATUS_IS_OK(result), handle,
+                       "%s", fsp_str_do_log(fsp));
+
+       return result;
+}
+
+static NTSTATUS smb_full_audit_durable_reconnect(
+                               struct vfs_handle_struct *handle,
+                               struct smb_request *smb1req,
+                               struct smbXsrv_open *op,
+                               const DATA_BLOB old_cookie,
+                               TALLOC_CTX *mem_ctx,
+                               struct files_struct **fsp,
+                               DATA_BLOB *new_cookie)
+{
+       NTSTATUS result;
+
+       result = SMB_VFS_NEXT_DURABLE_RECONNECT(handle,
+                                       smb1req,
+                                       op,
+                                       old_cookie,
+                                       mem_ctx,
+                                       fsp,
+                                       new_cookie);
+
+       do_log(SMB_VFS_OP_DURABLE_RECONNECT,
+                       NT_STATUS_IS_OK(result),
+                       handle,
+                       "");
 
-       result = SMB_VFS_NEXT_SET_OFFLINE(handle, fname);
-       do_log(SMB_VFS_OP_SET_OFFLINE, result >= 0, handle, "%s",
-              smb_fname_str_do_log(fname));
        return result;
 }
 
@@ -2243,9 +2833,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .get_shadow_copy_data_fn = smb_full_audit_get_shadow_copy_data,
        .statvfs_fn = smb_full_audit_statvfs,
        .fs_capabilities_fn = smb_full_audit_fs_capabilities,
-       .snap_check_path_fn =  smb_full_audit_snap_check_path,
-       .snap_create_fn = smb_full_audit_snap_create,
-       .snap_delete_fn = smb_full_audit_snap_delete,
+       .get_dfs_referrals_fn = smb_full_audit_get_dfs_referrals,
        .opendir_fn = smb_full_audit_opendir,
        .fdopendir_fn = smb_full_audit_fdopendir,
        .readdir_fn = smb_full_audit_readdir,
@@ -2255,15 +2843,12 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .mkdir_fn = smb_full_audit_mkdir,
        .rmdir_fn = smb_full_audit_rmdir,
        .closedir_fn = smb_full_audit_closedir,
-       .init_search_op_fn = smb_full_audit_init_search_op,
        .open_fn = smb_full_audit_open,
        .create_file_fn = smb_full_audit_create_file,
        .close_fn = smb_full_audit_close,
-       .read_fn = smb_full_audit_read,
        .pread_fn = smb_full_audit_pread,
        .pread_send_fn = smb_full_audit_pread_send,
        .pread_recv_fn = smb_full_audit_pread_recv,
-       .write_fn = smb_full_audit_write,
        .pwrite_fn = smb_full_audit_pwrite,
        .pwrite_send_fn = smb_full_audit_pwrite_send,
        .pwrite_recv_fn = smb_full_audit_pwrite_recv,
@@ -2271,7 +2856,6 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .sendfile_fn = smb_full_audit_sendfile,
        .recvfile_fn = smb_full_audit_recvfile,
        .rename_fn = smb_full_audit_rename,
-       .fsync_fn = smb_full_audit_fsync,
        .fsync_send_fn = smb_full_audit_fsync_send,
        .fsync_recv_fn = smb_full_audit_fsync_recv,
        .stat_fn = smb_full_audit_stat,
@@ -2300,25 +2884,34 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .realpath_fn = smb_full_audit_realpath,
        .chflags_fn = smb_full_audit_chflags,
        .file_id_create_fn = smb_full_audit_file_id_create,
+       .offload_read_send_fn = smb_full_audit_offload_read_send,
+       .offload_read_recv_fn = smb_full_audit_offload_read_recv,
+       .offload_write_send_fn = smb_full_audit_offload_write_send,
+       .offload_write_recv_fn = smb_full_audit_offload_write_recv,
+       .get_compression_fn = smb_full_audit_get_compression,
+       .set_compression_fn = smb_full_audit_set_compression,
+       .snap_check_path_fn =  smb_full_audit_snap_check_path,
+       .snap_create_fn = smb_full_audit_snap_create,
+       .snap_delete_fn = smb_full_audit_snap_delete,
        .streaminfo_fn = smb_full_audit_streaminfo,
        .get_real_filename_fn = smb_full_audit_get_real_filename,
        .connectpath_fn = smb_full_audit_connectpath,
        .brl_lock_windows_fn = smb_full_audit_brl_lock_windows,
        .brl_unlock_windows_fn = smb_full_audit_brl_unlock_windows,
        .brl_cancel_windows_fn = smb_full_audit_brl_cancel_windows,
-       .strict_lock_fn = smb_full_audit_strict_lock,
-       .strict_unlock_fn = smb_full_audit_strict_unlock,
+       .strict_lock_check_fn = smb_full_audit_strict_lock_check,
        .translate_name_fn = smb_full_audit_translate_name,
-       .copy_chunk_send_fn = smb_full_audit_copy_chunk_send,
-       .copy_chunk_recv_fn = smb_full_audit_copy_chunk_recv,
-       .get_compression_fn = smb_full_audit_get_compression,
-       .set_compression_fn = smb_full_audit_set_compression,
-       .readdir_attr_fn = smb_full_audit_readdir_attr,
+       .fsctl_fn = smb_full_audit_fsctl,
+       .get_dos_attributes_fn = smb_full_audit_get_dos_attributes,
+       .get_dos_attributes_send_fn = smb_full_audit_get_dos_attributes_send,
+       .get_dos_attributes_recv_fn = smb_full_audit_get_dos_attributes_recv,
+       .fget_dos_attributes_fn = smb_full_audit_fget_dos_attributes,
+       .set_dos_attributes_fn = smb_full_audit_set_dos_attributes,
+       .fset_dos_attributes_fn = smb_full_audit_fset_dos_attributes,
        .fget_nt_acl_fn = smb_full_audit_fget_nt_acl,
        .get_nt_acl_fn = smb_full_audit_get_nt_acl,
        .fset_nt_acl_fn = smb_full_audit_fset_nt_acl,
-       .chmod_acl_fn = smb_full_audit_chmod_acl,
-       .fchmod_acl_fn = smb_full_audit_fchmod_acl,
+       .audit_file_fn = smb_full_audit_audit_file,
        .sys_acl_get_file_fn = smb_full_audit_sys_acl_get_file,
        .sys_acl_get_fd_fn = smb_full_audit_sys_acl_get_fd,
        .sys_acl_blob_get_file_fn = smb_full_audit_sys_acl_blob_get_file,
@@ -2327,6 +2920,8 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .sys_acl_set_fd_fn = smb_full_audit_sys_acl_set_fd,
        .sys_acl_delete_def_file_fn = smb_full_audit_sys_acl_delete_def_file,
        .getxattr_fn = smb_full_audit_getxattr,
+       .getxattrat_send_fn = smb_full_audit_getxattrat_send,
+       .getxattrat_recv_fn = smb_full_audit_getxattrat_recv,
        .fgetxattr_fn = smb_full_audit_fgetxattr,
        .listxattr_fn = smb_full_audit_listxattr,
        .flistxattr_fn = smb_full_audit_flistxattr,
@@ -2335,16 +2930,23 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .setxattr_fn = smb_full_audit_setxattr,
        .fsetxattr_fn = smb_full_audit_fsetxattr,
        .aio_force_fn = smb_full_audit_aio_force,
-       .is_offline_fn = smb_full_audit_is_offline,
-       .set_offline_fn = smb_full_audit_set_offline,
+       .durable_cookie_fn = smb_full_audit_durable_cookie,
+       .durable_disconnect_fn = smb_full_audit_durable_disconnect,
+       .durable_reconnect_fn = smb_full_audit_durable_reconnect,
+       .readdir_attr_fn = smb_full_audit_readdir_attr
+
 };
 
 static_decl_vfs;
-NTSTATUS vfs_full_audit_init(void)
+NTSTATUS vfs_full_audit_init(TALLOC_CTX *ctx)
 {
-       NTSTATUS ret = smb_register_vfs(SMB_VFS_INTERFACE_VERSION,
-                                       "full_audit", &vfs_full_audit_fns);
-       
+       NTSTATUS ret;
+
+       smb_vfs_assert_all_fns(&vfs_full_audit_fns, "full_audit");
+
+       ret = smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "full_audit",
+                              &vfs_full_audit_fns);
+
        if (!NT_STATUS_IS_OK(ret))
                return ret;