如何丢弃/修剪打开文件中的范围?

wux*_*uxb 4 linux filesystems ssd trim

对于 SSD,我可以打开行设备并使用ioctl()withBLKDISCARD命令丢弃一系列页面。

我的问题是

对于打开的文件,如何丢弃一系列数据?这是否取决于底层文件系统的实现?

der*_*ert 7

您正在寻找fallocateFALLOC_FL_PUNCH_HOLE. 然后由文件系统来丢弃/修剪/取消映射这些块。我相信 ext4 会这样做。

例如,您可以执行以下操作以丢弃从 1MiB 开始的 2MiB:

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

成功后,这些字节的未来读取应为 0。

[注意:POSIX 没有办法做到这一点。上面的 fallocate 是 Linux 特有的。但是你标记了你的问题 Linux,所以希望没问题。]