mirror of
https://github.com/samba-team/samba.git
synced 2025-01-13 13:18:06 +03:00
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 <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Mon Jun 10 20:14:12 CEST 2013 on sn-devel-104
This commit is contained in:
parent
da2cf8a947
commit
2a65e8befe
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user