fsyncはディレクトリリンクをどのように処理しますか?

fsyncはディレクトリリンクをどのように処理しますか?

次の文の意味は何ですか?fsync のマニュアルページ

fsync() を呼び出すとしても、ファイルを含むディレクトリのエントリもディスクに到達したかどうかを確認することはできません。これには、ディレクトリ内のファイル記述子の明示的なfsync()も必要です。

これは、ファイルに対してfsyncを呼び出すときにfsyncがディレクトリメタデータを更新しないことを意味しますか?

同じ問題に関する別の引用は次のとおりです(Robert LoveのLinuxシステムプログラミングブックから抜粋)。

どちらの機能も、ファイルを含む更新されたディレクトリエントリがディスクに同期されることを保証しません。これは、ファイル内のリンクが最近更新された場合、ファイル内のデータがディスクに正常に到達する可能性があるが、関連するディレクトリエントリに到達できず、ファイルにアクセスできなくなることを意味します。

ファイルのデータがディレクトリリンクに到達する必要があるのはなぜですか?私が間違っている場合は訂正してください。ただし、ディレクトリにはファイル名とファイルのinode番号のみが含まれています。実際のデータはファイルにあります。 「データはファイルには到達しますが、ディレクトリリンクには到達しません」とはどういう意味ですか?

ベストアンサー1

その意味は:

ファイルリンクが最近更新された場合

ファイルのデータはディスクに正常に到達できますが、

リンクされたディレクトリエントリがディスクに正常に到達できない可能性があります。

ファイルにアクセスできないようにします。

新しいファイルを作成すると問題になる可能性があります。

ハードリンクが生成されることを知らない場合は、「ファイルリンク」の一般化を無視します。

これは、ファイルに対してfsyncを呼び出すときにfsyncがディレクトリメタデータを更新しないことを意味しますか?

はい。それともむしろ頼ることはできません。 (一部の実装では、fsyncが返される前に常に更新できます。)

おすすめ記事