Você está procurando fallocate
' FALLOC_FL_PUNCH_HOLE
. Cabe então ao sistema de arquivos descartar / aparar / desmapear esses blocos. Eu acredito que o ext4 fará isso.
Por exemplo, você faria algo assim para descartar 2MiB iniciando 1MiB em:
err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
/* handle error */
}
No sucesso, leituras futuras desses bytes devem dar 0s.
[Nota: POSIX não tem como fazer isso. O fallocate acima é específico do Linux. Mas você marcou sua pergunta no Linux, então espero que esteja tudo bem.]