From a75684d6ea835d6c5c92e494dd29cf3c65e6cb9c Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Fri, 20 Oct 2006 23:01:59 +0000 Subject: [PATCH] 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. --- ChangeLog | 10 ++++++++++ src/chown-core.c | 9 +++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d4c23e0..fee7654 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-10-21 Jim Meyering + + 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. + 2006-10-20 Jim Meyering * src/od.c (usage): Change description of default to use "-w16", diff --git a/src/chown-core.c b/src/chown-core.c index 8a0d51d..69345cc 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); -- 2.7.4