Enable an fts optimization (call lstat only for directories,
authorJim Meyering <jim@meyering.net>
Fri, 20 Oct 2006 23:01:59 +0000 (23:01 +0000)
committerJim Meyering <jim@meyering.net>
Fri, 20 Oct 2006 23:01:59 +0000 (23:01 +0000)
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
src/chown-core.c

index d4c23e0..fee7654 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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",
index 8a0d51d..69345cc 100644 (file)
@@ -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);