GNU bug report logs - #8411
due to missing sync even on 2.6.39, cp fails to copy an odd file

Previous Next

Package: coreutils;

Reported by: Jim Meyering <jim <at> meyering.net>

Date: Sat, 2 Apr 2011 11:17:02 UTC

Severity: normal

Tags: fixed

Done: Assaf Gordon <assafgordon <at> gmail.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Jim Meyering <jim <at> meyering.net>
To: Pádraig Brady <P <at> draigBrady.com>
Cc: 8411 <at> debbugs.gnu.org
Subject: bug#8411: due to missing sync even on 2.6.39, cp fails to copy an odd file
Date: Sat, 02 Apr 2011 13:16:39 +0200
Hi Pádraig,

As of this change,

    copy: with fiemap copy, only sync when needed
    http://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=f69876e55

fiemap copy with extents beyond EOF can fail on ext4 even with
Fedora 15 (2.6.38) and rawhide's 2.6.39 kernel.

Here we construct an odd file.  First, preallocate 10MB of space,
and then write 5KiB of random data into the beginning of that:

    $ fallocate -l 10000000 -n k
    $ dd count=10 if=/dev/urandom conv=notrunc iflag=fullblock of=k

However, when we try to copy "k", we get a file, "k2" of the
expected size, but with only NUL bytes for contents:

    $ strace -o log ./cp k k2
    $ cmp -l k k2|head -2
       1  60   0
       2 164   0
    $ uname -r
    2.6.39-0.rc0.git11.0.fc16.x86_64

The strace showed no reads were required, so to make that test succeed,
we would have to sync k's metadata to disk before invoking cp.

This change (to make cp require FIEMAP sync for kernels before 2.6.40)
solves the problem, but I hope there's a better way...

diff --git a/src/extent-scan.c b/src/extent-scan.c
index c0a5de6..1d9d06b 100644
--- a/src/extent-scan.c
+++ b/src/extent-scan.c
@@ -50,7 +50,7 @@ extent_need_sync (void)
            unsigned long val;
            if (xstrtoul (name.release + 4, NULL, 10, &val, NULL) == LONGINT_OK)
              {
-               if (val < 38)
+               if (val < 40)
                  need_sync = 1;
              }
         }


--------------------------------
The above is part of Pádraig's new fiemap-empty test,
which fails on both F15 and rawhide:

  FAIL: cp/fiemap-empty (exit: 1)
  ...
  + fallocate -l 10000000 -n unwritten.withdata
  + dd count=10 if=/dev/urandom conv=notrunc iflag=fullblock of=unwritten.withdata
  10+0 records in
  10+0 records out
  5120 bytes (5.1 kB) copied, 0.00248136 s, 2.1 MB/s
  + cp unwritten.withdata cp.test
  ++ stat -c %s unwritten.withdata
  ++ stat -c %s cp.test
  + test 5120 = 5120
  + cmp unwritten.withdata cp.test
  unwritten.withdata cp.test differ: char 1, line 1
  + fail=1




This bug report was last modified 6 years and 223 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.