From: Jeremy Allison Date: Fri, 24 May 2013 17:33:38 +0000 (-0700) Subject: Optimization on POSIX platforms that have fstatat. X-Git-Url: http://git.samba.org/?p=obnox%2Fsamba%2Fsamba-obnox.git;a=commitdiff_plain;h=2a65e8befef004fd18d17853a1b72155752346c8 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 --- 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; }