From a75684d6ea835d6c5c92e494dd29cf3c65e6cb9c Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Fri, 20 Oct 2006 23:01:59 +0000 Subject: Enable an fts optimization (call lstat only for directories, on some file system types) also with the --preserve-root option of chown or chgrp. * src/chown-core.c (change_file_owner): Compare fts_statp-based dev/ino against root dev/ino only for directories. (chown_files): Don't let the root_dev_ino setting influence whether we use FTS_NOSTAT: fts always sets *fts_statp for a directory. --- src/chown-core.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/chown-core.c') diff --git a/src/chown-core.c b/src/chown-core.c index 8a0d51dfa..69345ccf8 100644 --- a/src/chown-core.c +++ b/src/chown-core.c @@ -337,7 +337,12 @@ change_file_owner (FTS *fts, FTSENT *ent, || required_gid == file_stats->st_gid)); } - if (do_chown && ROOT_DEV_INO_CHECK (chopt->root_dev_ino, file_stats)) + if (do_chown + /* With FTS_NOSTAT, file_stats is valid only for directories. + Don't need to check for FTS_D, since it is handled above, + and same for FTS_DNR, since then do_chown is false. */ + && (ent->fts_info == FTS_DP || ent->fts_info == FTS_DC) + && ROOT_DEV_INO_CHECK (chopt->root_dev_ino, file_stats)) { ROOT_DEV_INO_WARN (file_full_name); ok = do_chown = false; @@ -457,7 +462,7 @@ chown_files (char **files, int bit_flags, /* Use lstat and stat only if they're needed. */ int stat_flags = ((required_uid != (uid_t) -1 || required_gid != (gid_t) -1 || chopt->affect_symlink_referent - || chopt->verbosity != V_off || chopt->root_dev_ino) + || chopt->verbosity != V_off) ? 0 : FTS_NOSTAT); -- cgit v1.2.3-54-g00ecf