这是 typical and well-known approach对于原子 文件更新:
fd = open(“foo.new”, O_WRONLY);
write(fd, buf, bufsize);
fsync(fd);
close(fd);
rename(“foo.new”, “foo”);
一般来说,如果我们还需要持久性(即保证在发生崩溃时文件的新版本可用),那么我们还需要在父目录上调用 fsync
。
问题:UBIFS 也需要这个吗? documentation说:
fsync() may be called for directories - it synchronizes the directory inode meta-data. [...]
The fdatasync() call for directories is "no-op" in UBIFS and all UBIFS operations which change directory entries are synchronous.
如果我没看错的话,后者(“所有更改目录条目的 UBIFS 操作都是同步的”)似乎暗示在父目录上调用 fsync
是不必要的。然而,我的测试似乎表明并非如此。我是否误读了文档,或者此信息是否已过时?
最佳答案
我在 MTD 邮件列表上询问过;似乎文档含糊不清,calling fsync
on the parent dir is necessary与其他文件系统一样。
关于linux - 我们是否需要 fsync UBIFS 中的父目录以进行原子 * 和 * 持久文件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53702698/