Very interesting. There's certainly something there.
That said, there's a distracting bug which is visible when doing an strace
lseek(4, 140333890921392, SEEK_SET) = -1 EINVAL (Invalid argument)
write(4, "\0\0\0\0", 4) = 4
which is from that
lseek(newfd, mapbase + offset + size - 8, 0);
write(newfd, (char *) &zero, 4);
where the addition of "mapbase" is insane. So that will write zeroes to
the wrong part of the file (offset 64, to be exact). And that will get
overwritten by the next write, making it all look entirely insane.
That said, that bug may be distracting, but it seems to have nothign at
all to do with the actual problem. The bug seems to happen only when the
file is not pre-paged in.
Nick?
Linus
--