summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-06-18 22:16:24 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2020-06-18 22:38:06 -0700
commit25725f9d41735d176d73a757430739fb71c7d043 (patch)
treee4df3c3da0aa989125a2b2002fb4cedf7530d691
parent0fe9fdece735234819ead2cad7902ba9a6cd8487 (diff)
downloadcoreutils-25725f9d41735d176d73a757430739fb71c7d043.tar.gz
cp: default to COW
Likewise for ‘install’. Proposed in Bug#24400, and long past due. * NEWS: * doc/coreutils.texi (cp invocation): * src/copy.h (enum Reflink_type): Document this. * src/cp.c (cp_option_init): * src/install.c (cp_option_init): Implement this.
-rw-r--r--NEWS2
-rw-r--r--doc/coreutils.texi19
-rw-r--r--src/copy.h4
-rw-r--r--src/cp.c2
-rw-r--r--src/install.c2
5 files changed, 18 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index 8ddd0e2..655ff77 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,8 @@ GNU coreutils NEWS -*- outline -*-
** Changes in behavior
+ cp and install now default to copy-on-write (COW) if available.
+
On GNU/Linux systems, ls no longer issues an error message on
directory merely because it was removed. This reverts a change
that was made in release 8.32.
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 3432fb2..4bbb960 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -8864,12 +8864,14 @@ The @var{when} value can be one of the following:
@table @samp
@item always
-The default behavior: if the copy-on-write operation is not supported
+If the copy-on-write operation is not supported
then report the failure for each file and exit with a failure status.
+Plain @option{--reflink} is equivalent to @option{--reflink=when}.
@item auto
If the copy-on-write operation is not supported then fall back
to the standard copy behavior.
+This is the default if no @option{--reflink} option is given.
@item never
Disable copy-on-write operation and use the standard copy behavior.
@@ -8878,12 +8880,6 @@ Disable copy-on-write operation and use the standard copy behavior.
This option is overridden by the @option{--link}, @option{--symbolic-link}
and @option{--attributes-only} options, thus allowing it to be used
to configure the default data copying behavior for @command{cp}.
-For example, with the following alias, @command{cp} will use the
-minimum amount of space supported by the file system.
-
-@example
-alias cp='cp --reflink=auto --sparse=always'
-@end example
@item --remove-destination
@opindex --remove-destination
@@ -8928,6 +8924,15 @@ This is useful in creating a file for use with the @command{mkswap} command,
since such a file must not have any holes.
@end table
+For example, with the following alias, @command{cp} will use the
+minimum amount of space supported by the file system.
+(Older versions of @command{cp} can also benefit from
+@option{--reflink=auto} here.)
+
+@example
+alias cp='cp --sparse=always'
+@end example
+
@optStripTrailingSlashes
@item -s
diff --git a/src/copy.h b/src/copy.h
index 874d6f7..a0ad494 100644
--- a/src/copy.h
+++ b/src/copy.h
@@ -46,10 +46,10 @@ enum Sparse_type
/* Control creation of COW files. */
enum Reflink_type
{
- /* Default to a standard copy. */
+ /* Do a standard copy. */
REFLINK_NEVER,
- /* Try a COW copy and fall back to a standard copy. */
+ /* Try a COW copy and fall back to a standard copy; this is the default. */
REFLINK_AUTO,
/* Require a COW copy and fail if not available. */
diff --git a/src/cp.c b/src/cp.c
index 8db2c4b..a4ecbbc 100644
--- a/src/cp.c
+++ b/src/cp.c
@@ -793,7 +793,7 @@ cp_option_init (struct cp_options *x)
x->move_mode = false;
x->install_mode = false;
x->one_file_system = false;
- x->reflink_mode = REFLINK_NEVER;
+ x->reflink_mode = REFLINK_AUTO;
x->preserve_ownership = false;
x->preserve_links = false;
diff --git a/src/install.c b/src/install.c
index 22124d5..a94053f 100644
--- a/src/install.c
+++ b/src/install.c
@@ -264,7 +264,7 @@ cp_option_init (struct cp_options *x)
{
cp_options_default (x);
x->copy_as_regular = true;
- x->reflink_mode = REFLINK_NEVER;
+ x->reflink_mode = REFLINK_AUTO;
x->dereference = DEREF_ALWAYS;
x->unlink_dest_before_opening = true;
x->unlink_dest_after_failed_open = false;