Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 May 2015 10:46:21 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r282890 - stable/10/bin/cp
Message-ID:  <201505141046.t4EAkLCr045100@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Thu May 14 10:46:20 2015
New Revision: 282890
URL: https://svnweb.freebsd.org/changeset/base/282890

Log:
  MFC r282482: cp: Remove fts sorting.
  
  In an attempt to improve performance, cp reordered directories first
  (although the comment says directories last). This is not effective with new
  UFS layout policies.
  
  The sorting reorders multiple arguments passed to cp, which may be
  undesirable.
  
  Additionally, the comparison function does not induce a total order. Per
  POSIX, this causes undefined behaviour in qsort().
  
  NetBSD removed the sorting in 2009.
  
  On filesystems that return directory entries in hash/btree order, sorting by
  d_fileno before statting improves performance on large directories. However,
  this can only be implemented in fts(3).
  
  PR:		53475
  Reviewed by:	bde (in 2004)

Modified:
  stable/10/bin/cp/cp.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/bin/cp/cp.c
==============================================================================
--- stable/10/bin/cp/cp.c	Thu May 14 10:33:51 2015	(r282889)
+++ stable/10/bin/cp/cp.c	Thu May 14 10:46:20 2015	(r282890)
@@ -90,7 +90,6 @@ volatile sig_atomic_t info;
 enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE };
 
 static int copy(char *[], enum op, int);
-static int mastercmp(const FTSENT * const *, const FTSENT * const *);
 static void siginfo(int __unused);
 
 int
@@ -274,7 +273,7 @@ copy(char *argv[], enum op type, int fts
 	mask = ~umask(0777);
 	umask(~mask);
 
-	if ((ftsp = fts_open(argv, fts_options, mastercmp)) == NULL)
+	if ((ftsp = fts_open(argv, fts_options, NULL)) == NULL)
 		err(1, "fts_open");
 	for (badcp = rval = 0; (curr = fts_read(ftsp)) != NULL; badcp = 0) {
 		switch (curr->fts_info) {
@@ -488,32 +487,6 @@ copy(char *argv[], enum op type, int fts
 	return (rval);
 }
 
-/*
- * mastercmp --
- *	The comparison function for the copy order.  The order is to copy
- *	non-directory files before directory files.  The reason for this
- *	is because files tend to be in the same cylinder group as their
- *	parent directory, whereas directories tend not to be.  Copying the
- *	files first reduces seeking.
- */
-static int
-mastercmp(const FTSENT * const *a, const FTSENT * const *b)
-{
-	int a_info, b_info;
-
-	a_info = (*a)->fts_info;
-	if (a_info == FTS_ERR || a_info == FTS_NS || a_info == FTS_DNR)
-		return (0);
-	b_info = (*b)->fts_info;
-	if (b_info == FTS_ERR || b_info == FTS_NS || b_info == FTS_DNR)
-		return (0);
-	if (a_info == FTS_D)
-		return (-1);
-	if (b_info == FTS_D)
-		return (1);
-	return (0);
-}
-
 static void
 siginfo(int sig __unused)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505141046.t4EAkLCr045100>