Cente FileSystem

ディレクトリキャッシュ機能使用時にディレクトリの作成/拡張を行うと、キャッシュ内の古い情報を参照してしまう不具合について

発行番号: Cente101-0112
Rev: 第1版
発行日: 2021/05/28

【題名】
ディレクトリキャッシュ機能使用時にディレクトリの作成/拡張を行うと、キャッシュ内の古い情報を参照してしまう不具合について

【適用製品】
Cente FileSystem Ver5.50 ~ Ver6.41

【影響API】
open, fopen_uni, rename, rename_uni, move, move_uni, mkdir, mkdir_uni, ct_divide, ct_divide_uni

【現象】
mkdir, mkdir_uni で作成したディレクトリ下に fopen や mkdir によって、ファイル/ディレクトリを作成しようとすると「CT_ENTRY_ERR -71(ディレクトリエントリの情報異常)」エラーが発生します。

【原因】
ディレクトリキャッシュ機能を使用した際の、mkdir の処理に問題がありました。
ディレクトリキャッシュ機能を使用した場合は、基本的にキャッシュメモリのアクセスを行い、キャッシュの情報が常に最新の情報である必要がありますが、実メモリの情報よりキャッシュの情報が古い情報になってしまう場合があります。

以下の条件を全て満たした場合に発生いたします。
①ini_blk_cache_dir によるディレクトリキャッシュ機能を有効にした場合
②remove、rmdir によってファイル、ディレクトリを削除した場合
③ ②で使用していたクラスタを mkdir によるディレクトリの作成時や、「影響API」にてディレクトリ領域の拡張が行われた際に再利用した場合
④ ②で使用していたセクタ情報がキャッシュに残っていた場合
⑤メディアの使用状況がフラグメンテーションが発生している、FAT領域の空き検索において検索が1巡をした、などの状況だった場合

※Cente FileSystemでは空きクラスタをポインタで管理しており、その情報インクリメントしていくため、一度使用(削除)されたクラスタは、空きがすぐに見つからなかった場合のみに使用されます。

mkdir を実行した場合は、取得したクラスタ(セクタ)を初期化しますが、実メモリへの書き込みと同時にキャッシュ情報の更新を行っておりませんでした。すでに対象のセクタ情報がキャッシュに取り込まれていた場合には、最新の情報に更新する必要がありました。

「影響API」にてディレクトリ領域の拡張が行われるケースにおいても同様の問題がありました。このケースでは誤ったエントリ情報をディレクトリエントリに書き込んでしまう可能性があります。

《参照してしまう古い情報が別ディレクトリのディレクトリエントリ領域情報だった場合》
・ディレクトリエントリ領域の開始セクタ情報であれば、その情報をそのまま使用します。初期化はされていませんが、削除済みの情報のため表面上、問題にはなりません。(Centeで使用していないdotエントリ内のクラスタ番号情報が不一致になる可能性はあります)

・ディレクトリエントリ領域の途中のセクタ情報であれば、その領域にfopen, mkdir を実行すると、ドット(.)、ドットドット(..)エントリが存在しないため、異常と検出され「-71」エラーを戻します。readdir では表面上問題なく、読み出すエントリ情報が存在しないということでNULLを戻します。

【回避方法】
メタデータ保護機能を”無効”にした状態で運用する。

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

メタデータ保護機能有効時、move()を実行すると誤った領域への書き込みと破損クラスタが発生する不具合について

発行番号: Cente101-0111
Rev: 第1版
発行日: 2021/05/28

【題名】
メタデータ保護機能有効時、move()を実行すると誤った領域への書き込みと破損クラスタが発生する不具合について

【適用製品】
Cente FileSystem Ver6.10 ~ Ver6.41

【影響API】
move, move_uni

【現象】
以下の全ての条件を満たした場合に破損クラスタが発生し、誤った領域への書き込みが発生します。
①メタデータ保護機能を”有効”にした場合。
②move, move_uniに指定した移動先のディレクトリエントリ領域の拡張が行われる場合。
(ディレクトリエントリはクラスタ単位で拡張されます)

■破損クラスタについて
どのファイル/ディレクトリにも属さない、FATチェーン情報がFAT領域に作成されてしまう事象。
通常のメディアアクセスにおいては特に問題はありませんが、不要なゴミ情報として領域を消費してしまうため、早期ディスクフルにつながります。

■誤った領域への書き込みについて
誤った領域への書き込みとは、本来DIR領域へ書き込むエントリ情報を、DIR領域内の別領域、若しくはFAT領域、DATA領域に書き込んでしまう事象。書き込まれる領域は使用するメディア容量によって異なり、症状は次の通りです。
(1)誤ってDIR領域内の別領域に書き込んだ場合
– ファイルの読み出しに失敗する。
– ディレクトリ上からファイルが見えなくなる。
– 誤った場所に作成されてしまう。
(2)誤ってFAT領域に書き込んだ場合
– ファイルの読み出しに失敗する。
– ディレクトリ上からファイルが見えなくなる。
– ファイル内のデータがおかしくなる。
(3)誤ってDATA領域に書き込んだ場合
– ファイル内のデータがおかしくなる。

【原因】
Ver6.10 のリリースにて、ディレクトリエントリ領域内のエントリ情報を移動するシーケンスを以下のように変更しました。
・変更前:「移動元のエントリ削除 ⇒ 移動先のエントリ作成」
・変更後:「移動先に空きエントリがあるか確認 ⇒ 移動元のエントリ削除 ⇒ 移動先のエントリ作成」
変更後は、空き領域を事前に確保するようにしておりますが、この対応に不備がありました。

具体的には、移動先エントリ作成に伴い、領域の拡張を行う場合には、作成時にFATチェーンの取得を行いますが、Ver6.10の変更後、新しく追加した空きエントリの確認時とエントリの作成時でFATチェーンを二重で取得しておりました。
その結果、空きエントリの確認時に取得したFATチェーン情報が破損クラスタ(終端コード:0x0FFFFFFF)として残ってしまい、また、その終端コードが次の空きセクタ情報を算出する際の演算で使用されてしまい、本来DIR領域書き込まれるエントリ情報をDIR領域の別領域、FAT領域、DATA領域に書き込んでいました。

【回避方法】
メタデータ保護機能を”無効”にした状態で運用する。

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

Page 2 of 13