¿Cómo descartar/RECORTAR un rango en un archivo abierto?

¿Cómo descartar/RECORTAR un rango en un archivo abierto?

Para un SSD, puedo abrir el dispositivo de fila y descartar un rango de páginas usando ioctl()el BLKDISCARDcomando.

Mi pregunta es

para un archivo abierto, ¿cómo descartar un rango de datos? ¿Eso depende de la implementación del sistema de archivos subyacente?

Respuesta1

Estas buscandofallocate'sFALLOC_FL_PUNCH_HOLE. Luego depende del sistema de archivos descartar/recortar/desasignar esos bloques. Creo que ext4 lo hará.

Por ejemplo, harías algo como esto para descartar 2MiB comenzando con 1MiB en:

err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
    /* handle error */
}

En caso de éxito, las lecturas futuras de esos bytes deberían dar 0.

[Nota: POSIX no tiene una manera de hacer esto. La falacia anterior es específica de Linux. Pero etiquetó su pregunta como Linux, así que espero que esté bien.]

información relacionada