Как удалить/обрезать диапазон в открытом файле?

Как удалить/обрезать диапазон в открытом файле?

Для 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, так что, надеюсь, все в порядке.]

Связанный контент