Cente FileSystem

エラーコードが正しく更新されない問題について

発行番号: Cente101-0122
Rev: 第1版
発行日: 2024/03/21

【題名】
エラーコードが正しく更新されない問題について

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

【影響API】
fopen, fopen_uni, rename, rename_uni, move, move_uni, mkdir, mkdir_uni, ct_vdivide, ct_vdivide_uni

【現象】
FileSystemエラーコードにエラーコード(0未満)が格納されている状態で、
影響APIを実行すると、エラーコードを更新せずそのまま返却してしまう可能性があります。

《発生条件について》
以下の全ての条件を満たした場合に発生します。
①「2.影響API」を実行した時に、その直前で他のAPIで異常のエラーコードが戻されていた場合
②「2.影響API」を実行した時に、対象ファイルの情報がディレクトリエントリ領域に新規で書き込まれる場合
③「2.影響API」を実行した時に、対象のディレクトリエントリ領域が複数のクラスタ領域に跨る場合
“(FAT12/16の場合はサブディレクトリ領域のみ、FAT32の場合はルート/サブの両方)”

[例] ①remove()を実行し、存在しないファイルを指定する。
CT_NO_FILE(-3)。
②fopen()をアペンドモードで実行し、存在しないファイルを指定する。
アペンドモードの為、ファイルを作成しようとするが、
①のエラーコードを更新せずそのまま返却してしまい、ファイルの作成が行われない。

【原因】
Cente FileSystemに実装されている関数について、エラーコード返却処理は以下の2パターンがあります。

①returnでエラーコードを上位の関数に戻す。
 [例] return CT_DISK_FULL,

②FSYSER変数にセットし、上位の関数はその変数からエラーコードをゲットする。
 [例] セット: fs_er(CT_DISK_FULL, NULL) ※fs_erp 関数を使用する場合もあります。
   ゲット: er = ct_get_api_fsyser()

ct_get_api_fsyser()を使用する場合は、事前にFSYSER変数にセットする処理が呼ばれている必要がありますが、
ディレクトリエントリにアクセスする関数において、セットする処理を通らずゲットが実行される場合がありました。その結果、以前FSYSERにセットされているエラーコードを上位の関数に戻してしまいます。

【回避方法】
ありません。

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

FAT領域が1面の場合にフォーマットを行うと、キャッシュ領域を初期化できない不具合について

発行番号: Cente101-0121
Rev: 第1版
発行日: 2023/03/31

【題名】
FAT領域が1面の場合にフォーマットを行うと、キャッシュ領域を初期化できない不具合について

【適用製品】
Cente FileSystem Ver4.02 ~ Ver6.42

【影響API】
q_format, q_format_uni

【現象】
FAT領域が1面で、キャッシュ機能を有効にした状態で、
フォーマットを行うと、キャッシュ領域の初期化が出来ず、
古い情報を読み出してしまいます。(FAT領域、ディレクトリエントリ領域)

※FAT領域が2面以上ある場合は該当しません。

【原因】
クイックフォーマットでは、FAT領域、ディレクトリエントリ領域、キャッシュ領域の初期化を行います。
本来ならFAT領域の面数に関わらず、キャッシュ領域を初期化するのが正しいですが、
FAT領域が2面以上の場合に、キャッシュ領域を初期化する形になっておりました。
FAT領域の面数に関わらず、キャッシュ領域を初期化するように修正いたしました。

※FAT領域は通常2面でフォーマットされるため、キャッシュ領域の初期化は行われます。

【回避方法】
ありません。

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

メタデータ保護機能使用時 ディスクフル直前の書き込みでの無限ループが発生する不具合について

発行番号: Cente101-0120
Rev: 第1版
発行日: 2023/03/31

【題名】
メタデータ保護機能使用時 ディスクフル直前の書き込みでの無限ループが発生する不具合について

【適用製品】
Cente FileSystem Ver6.42

【影響API】
fwrite, chg_filelen

【現象】
FAT32かつメタデータ保護機能有効時、
空き容量が160KByteの時に256KByteまとめてfwriteすると、fwriteから返って来なくなる。

【原因】
メタデータ保護機能有効時のFATチェーン更新処理は、FAT領域書き込み前に以下の処理を実行します。
①FAT「全領域」から空きクラスタ位置を検索
②空きクラスタ番号を取得
③保護管理テーブルをチェックし、以前登録済みのクラスタか確認
→ 以前登録済みの場合は、再度①の空きクラスタ検索を実施(※処理を繰り返す)
→ 登録済みで無い場合は、テーブルにクラスタ番号をセット

上記の処理では実際にFAT領域の書き込み処理までは実施しないため、
以下2つの条件を満たした場合に同じ位置のクラスタを繰り返し検索してしまい、
CT_DISK_FULL(-11)を戻さずに無限ループの状態になってしまいます。
・空きクラスタがある状態から書き込みを実施
・空きクラスタ以上のクラスタを書き込み

【回避方法】
1クラスタずつ書込みをおこなう。

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

メタデータ保護機能使用時 残容量が必要以上に消費されてしまう不具合について

発行番号: Cente101-0119
Rev: 第1版
発行日: 2023/03/31

【題名】
メタデータ保護機能使用時 残容量が必要以上に消費されてしまう不具合について

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

【影響API】
fopen_uni, fputc, fputs, fwrite, rename_uni, move_uni, chg_filelen, mkdir_uni

【現象】
FAT32かつメタデータ保護機能が有効なメディアに対して、
2クラスタ分以上の長さのファイルを書き込むとファイルシステムの空き容量が化ける。
get_dev_free_uni()が返す残容量が renew_fsinfo_uni() の前後で変化する。

【原因】
FAT32の場合は、FAT領域を消費した場合にFSINFO領域内の「free cluster count」情報を更新しますが、
実際の消費より余計にカウンタ値を更新していました。

【回避方法】
FAT32またはメタデータ保護機能を使用しない

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

複数ドライブに対しメタデータ保護機能を有効にするとメモリ破壊が起きる不具合について

発行番号: Cente101-0118
Rev: 第1版
発行日: 2023/03/31

【題名】
複数ドライブに対しメタデータ保護機能を有効にするとメモリ破壊が起きる不具合について

【適用製品】
Cente FileSystem Ver6.00 ~ Ver6.42

【影響API】
ini_journal, ini_journal_uni

【現象】
メタデータ保護機能を複数ドライブで有効にした状態で、
書込みAPIを実行するとメモリ破壊が起きます。

【原因】
メタデータ保護用の管理領域はドライブ毎に確保する必要があります。
本来であれば、ini_journal() の第一引数に指定するdrv_name(ドライブ名)
をもとに領域を確保するのが正しいですが、第3引数の feram_no の値によって
領域を確保する形になっておりました。
feram_no はVer6.00 以降未対応で 0 を指定する必要があるため、
drv_name ごとに領域を確保するように修正いたしました。

【回避方法】
・複数のドライブでメタデータ保護機能を有効にしない
・複数のドライブを使用する場合、feram_noの値をインクリメントする

Aドライブ feram_no = 0
Bドライブ feram_no = 1

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

独自ディレクトリ操作API実行時、ディレクトリの読出しに失敗する不具合について

発行番号: Cente101-0117
Rev: 第1版
発行日: 2023/03/31

【題名】
独自ディレクトリ操作API実行時、ディレクトリの読出しに失敗する不具合について

【適用製品】
Cente FileSystem Ver6.30 ~ Ver6.42

【影響API】
rmdir_all, rmdir_all_uni, dinfo, dinfo_uni, readdir_wc, readdir_wc_uni

【現象】
他のタスクと処理がぶつかった場合に、
独自ディレクトリ操作APIでディレクトリの読出しに失敗する。

【原因】
ディレクトリの読出し時、セマフォの資源を獲得した後にディレクトリの読出しを行うべきですが、
セマフォの資源を獲得せずディレクトリの読出しを行っていたため、誤動作する可能性があります。

【回避方法】
複数タスクから影響APIを同時に実行しない

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

ファイル及びディレクトリ検索にて大文字/小文字の区別をしていた処理について

発行番号: Cente101-0116
Rev: 第1版
発行日: 2022/11/14

【題名】
ファイル及びディレクトリ検索にて大文字/小文字の区別をしていた処理について

【適用製品】
Cente FileSystem Ver6.42

【影響API】
readdir_wc_uni, readdir_wc

【現象】
検索するファイル及びディレクトリ名に半角英字で検索した際、
大文字及び小文字は区別せず検索するべきですが、区別して検索を行っていました。

【原因】
半角英字の検索の際、完全一致するファイル及びディレクトリを検索するようになっていました。

【回避方法】
検索したいファイルまたはディレクトリを大文字または小文字の一致する半角英字で検索を行う

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

ログ管理チェックディスク機能の有効/無効設定組合せによる誤処理について

発行番号: Cente101-0115
Rev: 第1版
発行日: 2022/05/02

【題名】
ログ管理チェックディスク機能の有効/無効設定組合せによる誤処理について

【適用製品】
Cente FileSystem Ver6.40 ~ Ver6.42

【影響API】
ini_lmchkdsk、ini_lmchkdsk_uni、fclose、fflush、fputc、fputs、fwrite、rename、rename_uni、remove、remove_uni、move、move_uni、chg_attr、chg_attr_uni、chg_attrfp、chg_tstamp_uni、chg_tstampfp、chg_filelen

【現象】
LM_CHKDSK(LM_CHKDSK_UNI)マクロを有効(1)に設定した場合、
ini_lmchkdsk(ini_lmchkdsk_uni)を実行していないドライブは、
無効(0)に設定した際と同じ動作になるべきですが、
ログ管理チェックディスク機能の一部の処理が動作してしまい、APIの処理速度が遅くなることがあります。

また合わせてキャッシュ機能有効で且つSAVE_CACHEマクロを無効(0)に設定した場合は、
ini_lmchkdsk(ini_lmchkdsk_uni)を実行したドライブにおいて、
API内部でエラーを検出できずにAPIから正常(0)が戻されてしまうことや、
「-301 管理領域破損エラー」が戻される可能性があります。

【原因】
ログ管理チェックディスク機能有効時は、FileSystem内部で管理しているフラグ情報により
ドライブ毎に機能が有効/無効かを判断していますが、フラグ情報を参照する処理が抜けている箇所があり、
無効ドライブに対してもログ管理チェックディスクの処理が一部動作しておりました。

またSAVE_CACHEマクロを無効(0)に設定した場合の処理において、エラー判定処理が抜けている箇所があり、
正常/異常を正しく戻すことができておりませんでした。またセーブキャッシュが行われず、
メモリデバイスに「LMREPAIR」のログ管理ファイルを正しく作成することができておりませんでした。

【回避方法】
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

独自APIでのディレクトリ検索時、エラーコード「CT_NOT_INI_D」が戻される不具合について

発行番号: Cente101-0114
Rev: 第1版
発行日: 2021/10/15

【題名】
独自APIでのディレクトリ検索時、エラーコード「CT_NOT_INI_D」が戻される不具合について

【適用製品】
Cente FileSystem Ver6.42

【影響API】
rmdir_all, rmdir_all_uni, dinfo, dinfo_uni

【現象】
以下全ての条件を満たした状態で【影響API】を実行した場合、『CT_NOT_INI_D:-17 初期化(ini_disk)されていない』エラーが発生します。
(1)fs_cfg.h内の FS_DINFO、FS_DINFO_UNI、FS_RMDIR_ALL、FS_RMDIR_ALL_UNIマクロの何れかを有効
(2)fs_cfg.h内の FS_READDIR_WC、FS_READDIR_WC_UNIマクロを無効
 ※(1)がS-JIS用のマクロの場合はFS_READDIR_WCマクロを、UNICODE用の場合はFS_READDIR_WC_UNIマクロを
  無効にした場合に発生
(3)メディア内のディレクトリに対して【影響API】を実行

【原因】
【影響API】では内部的に opendir() を実行する事でST_DIR構造体の情報を取得し、
ファイル又はディレクトリを参照する流れになっていますが、opendir()内での処理に問題がありました。
具体的には、opendir()の内部関数 DT_opendir()でディレクトリパス名を取得する必要がありますが、
FS_READDIR_WCマクロ、又はFS_READDIR_WC_UNIマクロが有効の時にしか取得できておらず、
【影響API】のマクロのみ有効にした場合は取得できておりませんでした。

ディレクトリパス名の取得に失敗した場合、その後の処理において本来アクセスしたいディレクトリでなく、
APIがサポートしていないドライブ自体を読み出す処理として動作してしまい(A:\, B:\, C:…)、その結果、
ドライブを全て読み出した後に「CT_NOT_INI_D」エラーが戻されていました。

【回避方法】
fs_cfg.h の以下のマクロを有効にする事で、本不具合を回避する事が出来ます。
・FS_READDIR_WCマクロ
・FS_READDIR_WC_UNIマクロ

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

メディア挿抜時、書き込み処理を実行するとディスクフルエラーが発生する不具合について

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

【題名】
メディア挿抜後の書き込み処理でディスクフルエラーが発生する不具合について

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

【影響API】
fopen, fopen_uni, remove, remove_uni, rmdir, rmdir_uni, chg_filelen, chk_dsk, chk_dsk_uni

【現象】
メディアを抜去し、以下の何れかのパターンを実行した後に再挿入すると、書き込みAPIでディスクフルエラーが発生する可能性があります。

<パターン1>
別の環境にてメディアを書き換えて戻した場合。

<パターン2>
別のメディアを挿入した場合。

【原因】
Ver6.20リリース時に空きFAT検索開始位置の仕様改善を行いましたが、その際に追加した内部変数 nullfat2 情報をマウント処理時にクリアする処理が抜けておりました。誤った古い情報にアクセスしてしまうことで不具合が発生します。

具体的な発生のメカニズムについてですが、nullfat2 にはFAT領域の空き位置情報(クラスタ番号)が格納されます。
nullfat2 に格納されているクラスタ番号は必ず空いている必要がありますが、クリア処理が抜けていたことで、抜去後に別の環境でメディアの書き換えを行って戻した場合や、別のメディアを挿入した場合(nullfat2のクラスタ位置が
既に使用されている状態)にて発生する可能性があります。
また空き位置情報としては nullfat と nullfat2 の2つの情報がありますが、nullfatの情報で検索した後、空きが無かった場合に nullfat2 の情報を参照するようになっております。
このため nullfat 情報にて空き検索に成功した場合にはエラーは発生いたしません。

空き領域が少ない環境で発生する確率が高くなります。
本不具合はFAT種には依存せず、FAT12/16/32の環境で発生いたします。

【回避方法】
メディア抜去後、再挿入をする場合は一旦組込み機器を再起動してください。

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

Page 1 of 13