I discovered that making a file sparse with "fallocate -d filename"
fails on the last block of a file, because - usually being partial -
the system call only zeroes that part instead of deallocating the
block. See man fallocate(2) - section "Deallocating file space".
The expected call is punching the whole block beyond eof, which
doesn't change the file length because of flag FALLOC_FL_KEEP_SIZE.
Signed-off-by: Karel Zak <kzak@redhat.com>
off += rsz;
}
if (hole_sz) {
+ off_t alloc_sz = hole_sz;
+ if (off >= end)
+ alloc_sz += st.st_blksize; /* meet block boundary */
xfallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE,
- hole_start, hole_sz);
+ hole_start, alloc_sz);
ct += hole_sz;
}
file_off = off;