ioctl()
对于 SSD,我可以使用with命令打开行设备并丢弃一系列页面BLKDISCARD
。
我的问题是
对于一个打开的文件,如何丢弃一定范围的数据?这是否取决于底层文件系统的实现?
答案1
您正在寻找fallocate
的FALLOC_FL_PUNCH_HOLE
。然后由文件系统丢弃/修剪/取消映射这些块。我相信ext4会这样做。
例如,您可以执行以下操作来丢弃从 1MiB 开始的 2MiB:
err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
/* handle error */
}
如果成功,以后读取这些字节应该会返回 0。
[注意:POSIX 没有办法做到这一点。上面的fallocate是Linux特定的。但你把你的问题标记为 Linux,所以希望没问题。]