From: Gero Treuner Date: Thu, 10 Sep 2020 19:43:03 +0000 (+0200) Subject: fallocate: fix --dig-holes at end of files X-Git-Tag: v2.36.1~51 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ed423e56ec43e6cdd5a8475e698f693b56512a63;p=thirdparty%2Futil-linux.git fallocate: fix --dig-holes at end of files 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 --- diff --git a/sys-utils/fallocate.c b/sys-utils/fallocate.c index 014b946247..ba97092fcf 100644 --- a/sys-utils/fallocate.c +++ b/sys-utils/fallocate.c @@ -264,8 +264,11 @@ static void dig_holes(int fd, off_t file_off, off_t len) 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;