diff options
author | Volker Lendecke <vl@samba.org> | 2009-11-16 09:49:23 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2009-11-18 23:16:13 +0100 |
commit | f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0 (patch) | |
tree | 6091c37e17a96edaaab867094b99bfe8c5aa456d /source3/modules | |
parent | aea3a8f50131744f8393d0179cd04a1b97982028 (diff) | |
download | samba-f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0.tar.gz samba-f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0.tar.bz2 samba-f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0.zip |
s3: Do not talloc in readdir
This is a hot codepath (called from the stat cache)
Diffstat (limited to 'source3/modules')
-rw-r--r-- | source3/modules/vfs_catia.c | 23 | ||||
-rw-r--r-- | source3/modules/vfs_default.c | 16 | ||||
-rw-r--r-- | source3/modules/vfs_full_audit.c | 11 | ||||
-rw-r--r-- | source3/modules/vfs_streams_depot.c | 12 |
4 files changed, 37 insertions, 25 deletions
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c index 14e404f9f5..f1d0cadee7 100644 --- a/source3/modules/vfs_catia.c +++ b/source3/modules/vfs_catia.c @@ -286,11 +286,14 @@ static SMB_STRUCT_DIR *catia_opendir(vfs_handle_struct *handle, * TRANSLATE_NAME call which converts the given name to * "WINDOWS displayable" name */ -static NTSTATUS catia_translate_name(vfs_handle_struct *handle, - char **mapped_name, - enum vfs_translate_direction direction) +static NTSTATUS catia_translate_name(struct vfs_handle_struct *handle, + const char *orig_name, + enum vfs_translate_direction direction, + TALLOC_CTX *mem_ctx, + char **pmapped_name) { char *name = NULL; + char *mapped_name; NTSTATUS ret; /* @@ -299,21 +302,27 @@ static NTSTATUS catia_translate_name(vfs_handle_struct *handle, * We will be allocating new memory for mapped_name in * catia_string_replace_allocate */ - name = talloc_strdup(talloc_tos(), *mapped_name); + name = talloc_strdup(talloc_tos(), orig_name); if (!name) { errno = ENOMEM; return NT_STATUS_NO_MEMORY; } - TALLOC_FREE(*mapped_name); ret = catia_string_replace_allocate(handle->conn, name, - mapped_name, direction); + &mapped_name, direction); TALLOC_FREE(name); if (!NT_STATUS_IS_OK(ret)) { return ret; } - ret = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction); + ret = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction, + mem_ctx, pmapped_name); + + if (NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED)) { + *pmapped_name = talloc_move(mem_ctx, &mapped_name); + } else { + TALLOC_FREE(mapped_name); + } return ret; } diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 8fbea0c4f3..848440809c 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -649,17 +649,15 @@ static int vfswrap_lstat(vfs_handle_struct *handle, return result; } -static NTSTATUS vfswrap_translate_name(vfs_handle_struct *handle, - char **mapped_name, - enum vfs_translate_direction direction) +static NTSTATUS vfswrap_translate_name(struct vfs_handle_struct *handle, + const char *name, + enum vfs_translate_direction direction, + TALLOC_CTX *mem_ctx, + char **mapped_name) { - /* Default behavior is a NOOP */ - - if (*mapped_name != NULL) - return NT_STATUS_OK; - - return NT_STATUS_INVALID_PARAMETER; + return NT_STATUS_NONE_MAPPED; } + /******************************************************************** Given a stat buffer return the allocated size on disk, taking into account sparse files. diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index 5305af4832..d9d12a1d28 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -1517,13 +1517,16 @@ static void smb_full_audit_strict_unlock(struct vfs_handle_struct *handle, return; } -static NTSTATUS smb_full_audit_translate_name(vfs_handle_struct *handle, - char **mapped_name, - enum vfs_translate_direction direction) +static NTSTATUS smb_full_audit_translate_name(struct vfs_handle_struct *handle, + const char *name, + enum vfs_translate_direction direction, + TALLOC_CTX *mem_ctx, + char **mapped_name) { NTSTATUS result; - result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction); + result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx, + mapped_name); do_log(SMB_VFS_OP_TRANSLATE_NAME, NT_STATUS_IS_OK(result), handle, ""); diff --git a/source3/modules/vfs_streams_depot.c b/source3/modules/vfs_streams_depot.c index d7b878b882..853d7b4d98 100644 --- a/source3/modules/vfs_streams_depot.c +++ b/source3/modules/vfs_streams_depot.c @@ -382,7 +382,8 @@ static NTSTATUS walk_streams(vfs_handle_struct *handle, { char *dirname; SMB_STRUCT_DIR *dirhandle = NULL; - char *dirent = NULL; + const char *dirent = NULL; + char *talloced = NULL; dirname = stream_dir(handle, smb_fname_base, &smb_fname_base->st, false); @@ -406,20 +407,21 @@ static NTSTATUS walk_streams(vfs_handle_struct *handle, return map_nt_error_from_unix(errno); } - while ((dirent = vfs_readdirname(handle->conn, dirhandle, NULL)) != NULL) { + while ((dirent = vfs_readdirname(handle->conn, dirhandle, NULL, + &talloced)) != NULL) { if (ISDOT(dirent) || ISDOTDOT(dirent)) { - TALLOC_FREE(dirent); + TALLOC_FREE(talloced); continue; } DEBUG(10, ("walk_streams: dirent=%s\n", dirent)); if (!fn(dirname, dirent, private_data)) { - TALLOC_FREE(dirent); + TALLOC_FREE(talloced); break; } - TALLOC_FREE(dirent); + TALLOC_FREE(talloced); } SMB_VFS_NEXT_CLOSEDIR(handle, dirhandle); |