Para um SSD, posso abrir o dispositivo de linha e descartar um intervalo de páginas usando ioctl()
o BLKDISCARD
comando.
Minha pergunta é
para um arquivo aberto, como descartar um intervalo de dados? e isso depende da implementação do sistema de arquivos subjacente?
Responder1
Você está procurandofallocate
deFALLOC_FL_PUNCH_HOLE
. Cabe então ao sistema de arquivos descartar/cortar/desmapear esses blocos. Eu acredito que o ext4 fará isso.
Por exemplo, você faria algo assim para descartar 2MiB começando com 1MiB em:
err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
/* handle error */
}
Em caso de sucesso, as leituras futuras desses bytes deverão fornecer 0s.
[Nota: POSIX não tem como fazer isso. O fallocate acima é específico do Linux. Mas você marcou sua pergunta como Linux, então espero que esteja tudo bem.]