From cce161dc05c05e1356e6e563e7628637cc54a134 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?=
Date: Mon, 6 Oct 2014 11:02:34 +0100 Subject: [PATCH] cp: read sparse files more efficiently with non regular destination * src.copy.c (copy_reg): Use fiemap to read sparse files, even if the output is not to a regular file. * NEWS: Mention the improvement. --- NEWS | 3 +++ src/copy.c | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index e7aef7725d..52332bd117 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,9 @@ GNU coreutils NEWS -*- outline -*- cp,install,mv will convert smaller runs of NULs in the input to holes, and cp --sparse=always avoids speculative preallocation on XFS for example. + cp will read sparse files more efficiently when the destination is a + non regular file. For example when copying a disk image to a device node. + mv will try a reflink before falling back to a standard copy, which is more efficient when moving files across BTRFS subvolume boundaries. diff --git a/src/copy.c b/src/copy.c index 85a4c59659..b8e12c2bdf 100644 --- a/src/copy.c +++ b/src/copy.c @@ -1214,7 +1214,7 @@ copy_reg (char const *src_name, char const *dst_name, /* Deal with sparse files. */ bool make_holes = false; - bool sparse_src = false; + bool sparse_src = is_probably_sparse (&src_open_sb); if (S_ISREG (sb.st_mode)) { @@ -1227,7 +1227,6 @@ copy_reg (char const *src_name, char const *dst_name, blocks. If the file has fewer blocks than would normally be needed for a file of its size, then at least one of the blocks in the file is a hole. */ - sparse_src = is_probably_sparse (&src_open_sb); if (x->sparse_mode == SPARSE_AUTO && sparse_src) make_holes = true; } @@ -1270,7 +1269,7 @@ copy_reg (char const *src_name, char const *dst_name, any extents to read more efficiently. */ if (extent_copy (source_desc, dest_desc, buf, buf_size, hole_size, src_open_sb.st_size, - S_ISREG (sb.st_mode) ? x->sparse_mode : SPARSE_NEVER, + make_holes ? x->sparse_mode : SPARSE_NEVER, src_name, dst_name, &normal_copy_required)) goto preserve_metadata; -- 2.47.2