diff options
author | Mark H Weaver <mhw@netris.org> | 2018-01-09 21:09:22 -0500 |
---|---|---|
committer | Mark H Weaver <mhw@netris.org> | 2018-03-16 09:31:00 -0400 |
commit | 45413064c9db1712c845e5a1065aa81f66667abe (patch) | |
tree | 0cb84865b06f563fb8816ab834c50668af7ce420 /gnu | |
parent | 60ff6ec48f9177416c9ed3f98e0a6fb134b7f3e5 (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.mk | 1 | ||||
-rw-r--r-- | gnu/packages/base.scm | 3 | ||||
-rw-r--r-- | gnu/packages/patches/tar-remove-wholesparse-check.patch | 68 |
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 + |