[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:fsyncシステムコール
}}}
= fsyncシステムコール = #SECTION0310150000000000000000
fsyncシステムコールを用いてファイル単位でキャッシュされているデータをディスク上に書き込むことができる。vfs sys_fsync関数でファイルディスクリプタに対応するファイル構造体と、dentryを検索し、ファイル構造体に登録されているfsyncオペレーションを呼び出す。
ext2ファイルシステムでは、 ext2_fsync関数が呼び出される。ブロックの書き込みルーチンは2回づつ呼び出される。一度目のループは純粋にI/Oを発行し、2回目のループではバッファの状態をチェックしているだけで、特に何もしていない。
{{{
ext2_fsync(ファイル構造体、dentry)
for(待ち無し、待ちあり) {
直接ブロックの内容をディスクに書き込む(sync_direct関数)
間接ブロックと間接ブロックに登録されているデータブロックの内容を
ディスクに書き込む(sync_indirect関数)
二段間接ブロックに継っているすべて(間接ブロック、データブロック)の
内容をディスクに書き込む(sync_dindirect関数)
三段間接ブロックに継っているすべて(間接ブロック、データブロック)の
内容をディスクに書き込む(sync_tindirect関数)
}
iノードをディスクに書き込む(ext2_sync_inode関数)
}}}
'''問題点'''
1. ext2_fsync関数は全てのブロックとiノードに対してディスクへの 書き込み要求を出しているが、I/O完了を確認しているのは iノードの書き込みだけである。fsync完了時には ディスクへの書き込み処理の完了が保証できない。 (2回目のループでは、I/O完了を待つべきだと思われる)
1. 現在の調査対象の版(v2.2.5)では、sys_fdatasyncも完全に sys_fsyncと全く同じ動作をする。性能上のメリットは無い。
----
''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]