最近,我正在测试 ext4 文件系统的正确用法。我的专家是:
当系统崩溃时,数据已经写入返回 ok 不会丢失,但 metadate 可以。
下面是我的用法:
1. 调用 fallocate 来分配 centain 空间 fallocate(fd, 0, 0, 4*1024*1024); //4MB
2. 调用 fsync(fd) 让数据和元数据写入磁盘
3. 然后我调用函数随机写入 4k 大小的文件(随机数据但不是 0)。带有 O_DRICT 标志,但不调用 fsync。我用 return write ok 记录偏移量。
4.检查记录的偏移量。但我发现在一些偏移量中,读取 4k 数据是 0。这似乎意味着偏移量不像孔文件那样使用。
我的问题是:
<1。为什么在调用 fallocate 和 fsync 后,文件的元数据似乎仍然表明某些块没有被使用,所以当读取它时返回 null。这是我的理解。
<2。有其他api可以调用,可以确保在分配文件空间时没有空洞,之后写入数据时返回ok,用O_DIRECT可以确保即使系统崩溃数据也不会丢失。
Thanks.