]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cp: make --attributes-only override --reflink completely
authorPádraig Brady <P@draigBrady.com>
Tue, 26 Oct 2010 16:55:10 +0000 (17:55 +0100)
committerPádraig Brady <P@draigBrady.com>
Wed, 27 Oct 2010 10:18:51 +0000 (11:18 +0100)
* doc/coreutils.texi (cp invocation): Change the description slightly
so as users might not immediately discount using this option.
Mention that --reflink is overridden by the other linking options and
--attributes-only, and give an example where this might be useful.
* src/copy.c (copy_internal): Bypass the reflink if
--attributes-only is specifed.
* tests/cp/reflink-perm: Ensure both --reflink modes are
overridden by --attributes-only.
* NEWS: Mention the change in behavior.
Reported by Jim Meyering.

NEWS
doc/coreutils.texi
src/copy.c
tests/cp/reflink-perm

diff --git a/NEWS b/NEWS
index 7dbbf1f2c7887f7b7dabcc6d530ed3a035ec0fdf..dcb974528a9470da85bcd2c1231d30f79c5a2cca 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,11 @@ GNU coreutils NEWS                                    -*- outline -*-
   tail -F once again notices changes in a currently unavailable
   remote directory [bug introduced in coreutils-7.5]
 
+** Changes in behavior
+
+  cp --attributes-only now completely overrides --reflink.
+  Previously a reflink was needlessly attempted.
+
 
 * Noteworthy changes in release 8.6 (2010-10-15) [stable]
 
index 4d17ed18b4d87d79ef38e489bbab4ce85e01151e..0b5a3d3410c05cd9743515064926abae71ca2c7b 100644 (file)
@@ -7614,12 +7614,11 @@ implementations that dereference symbolic links by default.
 @cindex COW
 @cindex clone
 @cindex copy on write
-Perform a lightweight, copy-on-write (COW) copy.
-Copying with this option can succeed only on some file systems.
-Once it has succeeded, beware that the source and destination files
-share the same disk data blocks as long as they remain unmodified.
+Perform a lightweight, copy-on-write (COW) copy, if supported by the
+file system. Once it has succeeded, beware that the source and destination
+files share the same disk data blocks as long as they remain unmodified.
 Thus, if a disk I/O error affects data blocks of one of the files,
-the other suffers the exact same fate.
+the other suffers the same fate.
 
 The @var{when} value can be one of the following:
 
@@ -7633,6 +7632,15 @@ If the copy-on-write operation is not supported then fall back
 to the standard copy behaviour.
 @end table
 
+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
index df31592db5a20ead7ed125ab3af5597ccea0e551..07501dfd4c98fd9c79c32f4d7d6945028a070248 100644 (file)
@@ -622,7 +622,8 @@ copy_reg (char const *src_name, char const *dst_name,
       goto close_src_and_dst_desc;
     }
 
-  if (x->reflink_mode)
+  /* --attributes-only overrides --reflink.  */
+  if (data_copy_required && x->reflink_mode)
     {
       bool clone_ok = clone_file (dest_desc, source_desc) == 0;
       if (clone_ok || x->reflink_mode == REFLINK_ALWAYS)
index 77f119f4ab91229ffd30935a7502ace114b94942..e1c12aa5ad8db5d2c56bcb683bb66712fa9239ef 100755 (executable)
@@ -39,8 +39,11 @@ test "$mode" = "-rwxrwxrwx" || fail=1
 
 test copy -nt file && fail=1
 
+# Ensure that --attributes-only overrides --reflink completely
 echo > file2 # file with data
 cp --reflink=auto --preserve --attributes-only file2 empty_copy || fail=1
 test -s empty_copy && fail=1
+cp --reflink=always --preserve --attributes-only file2 empty_copy || fail=1
+test -s empty_copy && fail=1
 
 Exit $fail