DSS ファイルシステムでは、F_SETFL 指定の fcntl(2) を使用して、O_DIRECT フラグの設定と解除を行わないでください。この操作を行った場合、ダイレクト I/O のオープン情報を正常に管理できないため、以下の問題が発生します。
O_DIRECT 指定で open(2) していないファイルに対して、fcntl(2) により O_DIRECT を設定した場合、そのファイルへの I/O はダイレクト I/O になりますが、mmap(2) を使用してマッピングしたページへの書き込みと write(2) との排他は行われません。このため、書き込みが競合した範囲でファイルデータの不整合が発生することがあります。
O_DIRECT 指定で open(2) していないファイルへの I/O をダイレクト I/O に変更したい場合は、一旦ファイルを close(2) し、O_DIRECT を指定して再度 open(2) してください。
O_DIRECT 指定で open(2) しているファイルに対して、fcntl(2) により O_DIRECT を解除した場合、そのファイルへの I/O は通常 I/O になりますが、そのファイルを mmap(2) することはできません。
O_DIRECT 指定で open(2) しているファイルへの I/O を通常 I/O に変更したい場合は、一旦ファイルを close(2) し、O_DIRECT を指定しないで再度 open(2) してください。