Для SSD я могу открыть строковое устройство и удалить диапазон страниц с помощью команды ioctl()
with BLKDISCARD
.
Мой вопрос:
для открытого файла, как удалить диапазон данных? и зависит ли это от реализации базовой файловой системы?
решение1
Вы ищетеfallocate
'sFALLOC_FL_PUNCH_HOLE
. Затем файловая система должна отбросить/обрезать/отменить отображение этих блоков. Я думаю, что ext4 так и сделает.
Например, чтобы сбросить 2 МБ, начиная с 1 МБ, нужно сделать что-то вроде этого:
err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
/* handle error */
}
В случае успеха последующие чтения этих байтов должны возвращать нули.
[Примечание: в POSIX нет способа сделать это. Вышеуказанный fallocate специфичен для Linux. Но вы отметили свой вопрос как Linux, так что, надеюсь, все в порядке.]