From 23fcac045711da524682c0f23ea8f5ba4d15ad15 Mon Sep 17 00:00:00 2001 From: Gero Treuner Date: Thu, 10 Sep 2020 21:43:03 +0200 Subject: [PATCH] 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 --- sys-utils/fallocate.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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; -- 2.47.3