From 2a65e8befef004fd18d17853a1b72155752346c8 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 24 May 2013 10:33:38 -0700 Subject: [PATCH] Optimization on POSIX platforms that have fstatat. Tests show significant speedup in directory listings by using fstatat instead of a full pathname walk. Signed-off-by: Jeremy Allison Reviewed-by: Andreas Schneider Autobuild-User(master): Andreas Schneider Autobuild-Date(master): Mon Jun 10 20:14:12 CEST 2013 on sn-devel-104 --- source3/modules/vfs_default.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 8804e623acf..82d059c28fa 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -376,11 +376,30 @@ static struct dirent *vfswrap_readdir(vfs_handle_struct *handle, START_PROFILE(syscall_readdir); result = readdir(dirp); - /* Default Posix readdir() does not give us stat info. - * Set to invalid to indicate we didn't return this info. */ - if (sbuf) - SET_STAT_INVALID(*sbuf); END_PROFILE(syscall_readdir); + if (sbuf) { + /* Default Posix readdir() does not give us stat info. + * Set to invalid to indicate we didn't return this info. */ + SET_STAT_INVALID(*sbuf); +#if defined(HAVE_DIRFD) && defined(HAVE_FSTATAT) + if (result != NULL) { + /* See if we can efficiently return this. */ + struct stat st; + int flags = (lp_posix_pathnames() ? + AT_SYMLINK_NOFOLLOW : 0); + int ret = fstatat(dirfd(dirp), + result->d_name, + &st, + flags); + if (ret == 0) { + init_stat_ex_from_stat(sbuf, + &st, + lp_fake_dir_create_times( + SNUM(handle->conn))); + } + } +#endif + } return result; } -- 2.34.1