diff options
author | Jim Meyering <jim@meyering.net> | 2006-10-20 23:01:59 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2006-10-20 23:01:59 +0000 |
commit | a75684d6ea835d6c5c92e494dd29cf3c65e6cb9c (patch) | |
tree | bdb022a3324201037ed765f8a4191914c9f188f6 | |
parent | 86719b3cd8ac24b4e0c673c4e5d9b16da06721e6 (diff) | |
download | coreutils-a75684d6ea835d6c5c92e494dd29cf3c65e6cb9c.tar.xz |
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.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | src/chown-core.c | 9 |
2 files changed, 17 insertions, 2 deletions
@@ -1,3 +1,13 @@ +2006-10-21 Jim Meyering <jim@meyering.net> + + 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 <jim@meyering.net> * src/od.c (usage): Change description of default to use "-w16", 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); |