fsync(fd) 是否适用于外部程序创建的文件?

Does fsync(fd) work on a file created by external program?

我有一个禁用了写入缓存的 SATA 硬盘:

hdparm -W0 /dev/foo

我在 ext4 分区上使用这些安装选项(以及其他):

data=ordered
auto_da_alloc

Linux内核版本为2.6.32-5-686.

现在,我有一个无法修改的外部程序,但我知道它会按以下方式创建一个文件:

int fd = open(path);
write(fd, data, data_size);
close(fd);

即它在关闭前不同步。所以在这一点上,数据可能在 RAM 中,在 kernel/fs 缓存中的某个地方。

注意:元数据还不是问题:最终的元数据将在之后被写入并 fsynced 我已经确定数据已经到达磁盘盘片。数据本身就是问题。

所以问题是,我怎样才能帮助数据到达实际的磁盘盘片?

后来想到了运行这个单独的程序:

int fd = open(path);
fsync(fd);
close(fd);

这是否有助于刷新数据,还是我应该使用不同的方法?

Will that help flush the data,

是的,fsync 并不重要。

请注意,您可能还想 fsync 文件所在的目录,以便同步文件的元数据。

来自man fsync

Calling fsync() does not necessarily ensure that the entry in the
directory containing the file has also reached disk.  For that an
explicit fsync() on a file descriptor for the directory is also
needed.