summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2018-01-09 21:09:22 -0500
committerMark H Weaver <mhw@netris.org>2018-03-16 09:31:00 -0400
commit45413064c9db1712c845e5a1065aa81f66667abe (patch)
tree0cb84865b06f563fb8816ab834c50668af7ce420 /gnu
parent60ff6ec48f9177416c9ed3f98e0a6fb134b7f3e5 (diff)
gnu: tar: Fix sparse file detection on Btrfs file systems.
* gnu/packages/patches/tar-remove-wholesparse-check.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/base.scm (tar)[source]: Add patch.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/base.scm3
-rw-r--r--gnu/packages/patches/tar-remove-wholesparse-check.patch68
3 files changed, 71 insertions, 1 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index fe20dddbbe..c1df236ac4 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1091,6 +1091,7 @@ dist_patch_DATA = \
%D%/packages/patches/t1lib-CVE-2010-2642.patch \
%D%/packages/patches/t1lib-CVE-2011-0764.patch \
%D%/packages/patches/t1lib-CVE-2011-1552+.patch \
+ %D%/packages/patches/tar-remove-wholesparse-check.patch \
%D%/packages/patches/tar-skip-unreliable-tests.patch \
%D%/packages/patches/tclxml-3.2-install.patch \
%D%/packages/patches/tcsh-fix-autotest.patch \
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 7dd9474d57..892a41601b 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -177,7 +177,8 @@ implementation offers several extensions over the standard utility.")
(sha256
(base32
"1lyjyk8z8hdddsxw0ikchrsfg3i0x3fsh7l63a8jgaz1n7dr5gzi"))
- (patches (search-patches "tar-skip-unreliable-tests.patch"))))
+ (patches (search-patches "tar-skip-unreliable-tests.patch"
+ "tar-remove-wholesparse-check.patch"))))
(build-system gnu-build-system)
;; Note: test suite requires ~1GiB of disk space.
(arguments
diff --git a/gnu/packages/patches/tar-remove-wholesparse-check.patch b/gnu/packages/patches/tar-remove-wholesparse-check.patch
new file mode 100644
index 0000000000..41f53e86aa
--- /dev/null
+++ b/gnu/packages/patches/tar-remove-wholesparse-check.patch
@@ -0,0 +1,68 @@
+This patch is needed in order to build Guix on a Btrfs file system.
+
+
+From da922703282b0d3b8837a99a9c7fdd32f1d20d49 Mon Sep 17 00:00:00 2001
+From: Mark H Weaver <mhw@netris.org>
+Date: Tue, 9 Jan 2018 20:16:14 -0500
+Subject: [PATCH] Remove nonportable check for files containing only zeroes.
+
+This check benefitted only one unlikely case (large files containing
+only zeroes, on systems that do not support SEEK_HOLE) and was based
+on an assumption about file system behavior that is not mandated by
+POSIX and no longer holds in practice, namely that for sufficiently
+large files, (st_blocks == 0) implies that the file contains only
+zeroes. Examples of file systems that violate this assumption include
+Linux's /proc file system and Btrfs.
+
+* src/sparse.c (sparse_scan_file_wholesparse): Remove this function.
+(sparse_scan_file_seek): Remove the initial check for files containing
+only zeroes.
+---
+ src/sparse.c | 24 ------------------------
+ 1 file changed, 24 deletions(-)
+
+diff --git a/src/sparse.c b/src/sparse.c
+index d41c0ea..3de6560 100644
+--- a/src/sparse.c
++++ b/src/sparse.c
+@@ -261,26 +261,6 @@ sparse_scan_file_raw (struct tar_sparse_file *file)
+ return tar_sparse_scan (file, scan_end, NULL);
+ }
+
+-static bool
+-sparse_scan_file_wholesparse (struct tar_sparse_file *file)
+-{
+- struct tar_stat_info *st = file->stat_info;
+- struct sp_array sp = {0, 0};
+-
+- /* Note that this function is called only for truly sparse files of size >= 1
+- block size (checked via ST_IS_SPARSE before). See the thread
+- http://www.mail-archive.com/bug-tar@gnu.org/msg04209.html for more info */
+- if (ST_NBLOCKS (st->stat) == 0)
+- {
+- st->archive_file_size = 0;
+- sp.offset = st->stat.st_size;
+- sparse_add_map (st, &sp);
+- return true;
+- }
+-
+- return false;
+-}
+-
+ #ifdef SEEK_HOLE
+ /* Try to engage SEEK_HOLE/SEEK_DATA feature. */
+ static bool
+@@ -343,10 +323,6 @@ sparse_scan_file_seek (struct tar_sparse_file *file)
+ static bool
+ sparse_scan_file (struct tar_sparse_file *file)
+ {
+- /* always check for completely sparse files */
+- if (sparse_scan_file_wholesparse (file))
+- return true;
+-
+ switch (hole_detection)
+ {
+ case HOLE_DETECTION_DEFAULT:
+--
+2.15.1
+