If we're using 'hole-detection=raw' then we're going to be manually
looking for sparseness in our files. We don't really care about
whether the OS thinks they're sparse, so don't do the check about the
number of blocks the OS thinks the file takes.

Without this change if I use "tar --hole-detection=raw -cf" to tar up
a file that's got lots of zeros (but isn't marked by the OS as
sparse), when I untar the file then it's still not sparse. With this
change then the zeros are correctly transformed into sparseness.

---
This is the same patch that was submitted via Savannah [1], but I'm
not terribly familiar with the process for submitting tar patches so I
thought I'd maybe post to this list too. Sorry if I've got this wrong.

[1] https://savannah.gnu.org/patch/index.php?10432
---
 src/create.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/create.c b/src/create.c
index bcb4a394aa40..b8c561ebfa97 100644
--- a/src/create.c
+++ b/src/create.c
@@ -1772,7 +1772,9 @@ dump_file0 (struct tar_stat_info *st, char const *name, 
char const *p)
        {
          enum dump_status status;
 
-         if (fd && sparse_option && ST_IS_SPARSE (st->stat))
+         if (fd && sparse_option
+             && (hole_detection == HOLE_DETECTION_RAW
+                 || ST_IS_SPARSE (st->stat)))
            {
              status = sparse_dump_file (fd, st);
              if (status == dump_status_not_implemented)

---
base-commit: fac2b4c11a8bb9720e34a8baa786613859a52d23
change-id: 20240226-fix_raw_hole_detection-027875748c92

Best regards,
-- 
Douglas Anderson <diand...@chromium.org>


Reply via email to