【文献】
長澤 恒也,「組み込み向けストレージ・デバイスとして注目されるフラッシュ・メモリの基礎と電源障害に強いファイル・システムの構築」,Interface 第30巻 第12号,日本,CQ出版株式会社,2004年12月 1日,第30巻 第12号
(58)【調査した分野】(Int.Cl.,DB名)
前記受け付け手段は第1ファイル操作指示と第2ファイル操作指示を受け付け、前記制御手段は前記第1ファイル操作指示と前記第2ファイル操作指示について、異なる順番で前記データと、前記管理情報と、前記インデックス情報と、の少なくとも2つ以上について更新するように制御することを特徴とする請求項1に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルの作成処理に対応する場合、前記制御手段は前記記憶装置のインデックス情報を更新してから前記記憶装置の管理情報を更新するように制御することを特徴とする請求項1または2に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルへのデータ書き込み処理に対応する場合、前記制御手段は前記記憶装置について、前記データを更新してから前記管理情報を更新し、次に前記インデックス情報を更新するように制御することを特徴とする請求項1乃至3のいずれか1項に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルの削除処理に対応する場合、前記制御手段は前記記憶装置のインデックス情報を更新してから前記記憶装置の管理情報を更新するように制御することを特徴とする請求項1乃至4のいずれか1項に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルの伸長処理に対応する場合、前記制御手段は前記記憶装置の管理情報を更新してから前記記憶装置のインデックス情報を更新するように制御することを特徴とする請求項1乃至5のいずれか1項に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルの作成処理に対応する場合、前記制御手段は、前記作成処理により作成するファイルについて前記記憶装置に記憶されているファイル末尾の管理情報の更新を、前記作成処理に関する他の管理情報を前記記憶装置へ書き出した後にするように制御することを特徴とする請求項1乃至7のいずれか1項に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルへの書き込み処理に対応する場合、前記制御手段は、前記記憶装置に記憶されているファイル末尾の管理情報の更新を、前記書き込み処理に関して他の管理情報を前記書き出した後にするように制御することを特徴とする請求項7または8に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルの伸長処理に対応する場合、前記制御手段は、前記記憶装置に記憶されているファイル末尾の管理情報の更新を、前記伸長処理に関して他の管理情報を前記記憶装置へ書き出した後にするように制御することを特徴とする請求項1乃至9のいずれか1項に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がファイルの短縮処理に対応する場合、前記制御手段は、前記短縮処理で短縮するファイルに関するFATチェーンの終端を含むキャッシュ情報を、前記管理情報に関する他のキャッシュ情報を書き出す前に前記記憶装置へ書き出すように制御することを特徴とする請求項1乃至10のいずれか1項に記載のファイル管理装置。
前記受け付け手段の受け付けたファイル操作指示の種類がディレクトリの削除処理に対応する場合、前記制御手段は前記記憶装置のインデックス情報を更新してから前記記憶装置の管理情報を更新するように制御することを特徴とする請求項1乃至11のいずれか1項に記載のファイル管理装置。
前記ディレクトリエントリはファイル又はディレクトリの名前、およびファイル又はディレクトリのサイズ、タイムスタンプを示す情報を含んでいることを特徴とする請求項1に記載のファイル管理装置。
ファイルに含まれるデータを格納する複数のブロックと、前記複数のブロックの使用状態および連結状態を示す管理情報を格納するファイルアロケーションテーブルと、前記ファイルのサイズを示すインデックス情報を格納するディレクトリエントリと、を有する記憶装置を管理するファイル管理方法であって、
操作指示を受け付ける受け付け工程と、
前記受け付け工程で受け付けたファイル操作指示の種類がディレクトリの作成処理に対
応する場合、前記ディレクトリエントリを作成するデータ領域に関するFATのキャッシュをリプレイスから保護し、インデックス情報と他のFATに関するキャッシュ情報とを書き出した後に保護したFATのキャッシュ情報を書き出すように制御し、前記記憶装置の管理情報を更新してから前記記憶装置のインデックス情報を更新し、作成するファイルについて前記記憶装置に記憶されているファイル末尾の管理情報の更新を、前記作成処理に関する他の管理情報を前記記憶装置へ書き出した後にするように制御する更新工程と、を有することを特徴とするファイル管理方法。
【発明を実施するための形態】
【0013】
<実施形態1>
本発明の一実施形態である実施形態1を、FATファイルシステムを例に用いて説明する。なお、FATファイルシステムをFATとして呼称されることも多いが、本実施形態の説明ではFATはファイルアロケーションテーブルそのものとして説明する。
【0014】
本実施形態におけるファイルシステムの構成を、
図1および
図2を参照して説明する。
【0015】
図1は本実施形態のハードウェア構成の概略であり、組み込みコンピュータ101は、バス102、CPU103、ROM104、RAM105、記憶装置106を有している。ここで、記憶装置106は組み込みコンピュータ101に対して着脱可能であってもよい。
【0016】
図2は本実施形態のファイル管理装置の機能構成を示し、アプリケーションプログラム201、オペレーティングシステム202、ファイルシステム203、バッファキャッシュ204、記憶装置205、データブロック206を備えている。
【0017】
組み込みコンピュータ101においてCPU103は、バス102によって相互に接続されたROM104、RAM105、記憶装置106の制御を行う。CPU103はROM104などに格納されたアプリケーションプログラム、ファイルシステムプログラムを実行することにより、記憶装置106に記録された論理ファイルの操作を行う。その際、RAM105は作業領域として利用される。
【0018】
アプリケーションプログラム201は、記憶装置205に対してアクセスを行う際、オペレーティングシステム202を通してファイルシステム203の各種API(Application−Programming−Interface)を呼び出す。代表的なAPIの一覧を
図13に示す。
図13では代表的なファイルシステムAPI、そのAPIの機能の説明と、そのAPIによって更新される領域との対応付けを図示している。
【0019】
ファイルシステム203はアプリケーションプログラム201から呼び出されたAPIに応じて記憶装置205に対するアクセスを行うが、その際、記憶装置205のデータブロック206の内アクセスのあったブロックをキャッシュ情報としてファイルシステム203のバッファキャッシュ204に一時的にキャッシュしておく。すると、次回、同じブロックにアクセスする際のI/O処理を省略し高速な動作を実現することができる。また、記憶装置に書き込む際も、同じブロックへの変更をまとめて処理することで効率化を図ることができる。このような機能は特に書き換え頻度の高いFATやディレクトリエントリの領域において有効である。ちなみに、
図2においては一つのデータブロックの内容をキャッシュ情報として保持するために一つのバッファキャッシュを使用しているが、一つのデータブロックの内容を複数のバッファキャッシュを使用して記憶する形態にしてもよい。なお、バッファキャッシュはキャッシュ情報を複数保持できることが好ましい。
【0020】
バッファキャッシュ204は従来の方式では、LRU(Least−Recently−Used)アルゴリズムで管理され、バッファキャッシュが不足した場合は、最も昔にアクセスしたブロックのキャッシュから記憶装置205に書き出され(フラッシュされ)、そのキャッシュが新たな領域のバッファリングに使用される。また、LRUにより自動的にフラッシュされる以外にもアプリケーション201が明示的に同期を発行することで、全てのキャッシュを一度に記録装置205にフラッシュする場合もある。
【0021】
前述のようなファイルシステムにおいてメタデータの整合性を維持させる場合、API実行ごとに記憶装置へのフラッシュを管理する必要がある。例えば、一度もキャッシュのフラッシュを行うことなく複数のAPIを実行すると、それまでの操作によりアクセスのあった様々な領域に渡るキャッシュが混在する可能性がある。そして、混在したキャッシュをファイルシステムの整合性が維持されるように同期して一度にフラッシュすることは困難である。
【0022】
本実施形態では、記憶装置へのフラッシュを実施するに当たって、書き込みAPI毎に適した更新領域の順序で記録する。
図13のAPI一覧に示す通り、書き込みAPIはAPI毎に更新する領域が決まっている。図中のDATAはデータ領域、DIRはディレクトリエントリ領域、FATはFAT領域を表す。
【0023】
ここで、一覧にあるAPIのうち「Truncate()(伸長):ファイルの伸長」と「Truncate()(短縮):ファイルの短縮」に着目すると、どちらもディレクトリエントリ領域およびFAT領域を更新するが、本実施形態では、「ファイルの伸長」においてはFATの更新を先に実施し、「ファイルの短縮」においてはディレクトリエントリの更新を先に実施する。これは、それぞれの場合において、ディレクトリエントリのサイズが実際より大きい状態になりリンクされていないデータブロックを指し示す現象が発生することを防ぐためである。(なお、以降の説明ではファイル操作を単にカギ括弧で表記する。)
図4を用いて、「ファイルの伸長」処理を具体的に説明する。「ファイルの伸長」においてバッファキャッシュのフラッシュを実施する前の状態の例をバッファキャッシュ404として図示する。そして、データブロック4075がディレクトリエントリ領域として更新され、データブロック4061、4063、4064、4065がFAT領域として更新される。これらはバッファキャッシュ4041〜4045にキャッシュされているが、記憶装置へのフラッシュは、DIR領域のバッファキャッシュ4043より先にFAT領域のバッファキャッシュである4041、4042、4044、4045から実施する。
【0024】
この時のディレクトリエントリ、FAT、データブロックの状態について
図5を用いて説明する。
図5の初期状態501はエントリのファイルサイズが1ブロック分であるのに対して、5番のデータブロックのみが割り当たっている。この状態から51番、91番のデータブロックを割り当て、ファイルサイズを3ブロック分に伸長する処理を行う。
【0025】
この時、点線で示すFAT領域・DIR領域がフラッシュされる必要がある。ここで、FAT領域からフラッシュした場合は途中状態502を通過する。なお、以降の説明で登場する途中状態とは、正常なファイル操作をした場合にも遷移すると考えられる状態であるが、電源断や記憶装置へのアクセス不能の発生などの不慮の事態が生じない限りこの途中状態が露呈する可能性は低い。この途中状態502では、エントリのファイルサイズが1ブロック分であるのに対して、5番、51番、91番のデータブロックが割り当たっている。エントリのファイルサイズと実際のファイルサイズに不整合が生じているが、実際にアクセスする領域であるエントリのサイズ(1ブロック分)に相当するデータブロックは割り当たっているため問題とならない。この状態から更にDIR領域をフラッシュすることで、安全にファイルサイズと実際のデータブロック数の整合性をとることができるためである。
【0026】
一方で、初期状態501からDIR領域を先にフラッシュすると途中状態503を通過する。この途中状態503ではエントリのファイルサイズが3ブロック分であるのに対して、5番のデータブロックのみが割り当たっている。すると、実際にアクセスするエントリのサイズ(3ブロック分)に相当するデータブロックに存在しない領域が含まれるため問題になる。例えば、ファイルの読み込みなどにおける特定のサイズに対応するデータブロックの検索を行うような処理においてエラーを引き起こす恐れがある。
【0027】
また、「ファイルの短縮」の場合、DIR領域のバッファキャッシュからフラッシュして先にファイルサイズを小さくしておくことで、「ファイルの伸長」の場合と同様に実際にリンクされていない領域を指し示す状態を防ぐことができる。
【0028】
このように、記憶装置に対する各領域の記録順序はファイル操作の種類(例えば、上述のファイル伸長とファイル短縮)もしくはAPIごとに異なるので、APIごとに正しい更新領域の記録順序を定義することで、より安全なファイルシステムを実現することができる。
【0029】
さらに本実施形態では、特定領域のフラッシュ制御も実施する。例えば、「ファイルの伸長」では、(1)FAT領域のフラッシュ(2)ディレクトリエントリ領域のフラッシュという順序で記憶装置への記録処理を行うことになっている。このとき、(1)でフラッシュするFAT領域は複数個所にまたがることも多い。これらが不規則な順番でフラッシュされていくと一時的にFATクラスタチェーンが断裂した状態になり、その状態で電源断などに陥るとファイルシステムに矛盾が発生する可能性がある。
【0030】
従って、本実施形態ではこのような状況を防ぐために、「ファイルの伸長」においては、記憶装置に元々記憶されているFATクラスタチェーン(ファイルの連結状態)の終端(末尾)を含むバッファキャッシュは保護することでフラッシュ対象から除外し、(1)FAT領域のフラッシュの最後で保護を解除しフラッシュするようにしておく。すると、保護した領域以外の箇所を先にフラッシュすることで、延長する部分のFATクラスタチェーンを完成させてから、FATクラスタチェーンの終端をフラッシュし完成したチェーンに接続することができるため、より安全に「ファイルの伸長」処理を実行することができる。なお、FATクラスタチェーンの終端とは、FATの中でファイル末尾(第1の情報、第3の情報)を示す情報に相当し、それ以外のFATに含まれる情報(第2の情報)と区別している。
【0031】
具体的に
図4を用いて、「ファイルの伸長」においてバッファキャッシュのフラッシュを実施する前の状態がバッファキャッシュ404だとする。このとき、ディレクトリエントリ領域として更新があったのがデータブロック4075でFAT領域として更新があったのがデータブロック4061、4063、4064、4065である。FAT領域はバッファキャッシュ4041、4042、4044、4045にキャッシュされ、FATクラスタチェーンの終端を含むバッファキャッシュが4041であるとする。本実施形態ではバッファキャッシュ4041に変更が加えられた時点でこのバッファキャッシュを保護し、FAT領域の更新は4042、4044、4045から実施する。
【0032】
この時のディレクトリエントリ、FAT、データブロックの状態について
図6を用いて説明する。
図6の初期状態601はエントリのファイルサイズが1ブロック分であるのに対して、5番のデータブロックのみが割り当たっている。この状態から51番、91番のデータブロックを割り当て、ファイルサイズを3ブロック分に伸長する処理を行う。この時、FATのフラッシュは点線で示す単位で3箇所に渡って行われる。
【0033】
元々のFATの末尾(5番を含むFAT領域)を保護した状態でフラッシュすると記憶装置に元々記憶されているファイルの末尾(FATクラスタチェーンの終端)を保護した場合は途中状態602のようになる。この途中状態602状態では、エントリのファイルサイズが1ブロック分であるのに対して、5番のデータブロックが割り当たっている。さらに、51番と91番のデータブロックがチェーン(連結)しているが、これらのブロックはアクセスされる領域として残っていないため問題とならない。この途中状態602から元々のFATの末尾の保護を解除しフラッシュすることで、5番と51番を正常にチェーンすることができる。
【0034】
一方で、無秩序にフラッシュされた場合途中状態603のようになることがある。この途中状態603では、エントリのファイルサイズが1ブロック分であるのに対して、5番、51番のデータブロックのみが割り当たっている。一見、実際にアクセスする領域であるエントリのサイズ(1ブロック分)に相当するデータブロックは存在するので問題ないように見えるが、51番のデータブロックはFAT上では未使用状態(FATの値が0)であるため、例えばファイルの削除などにおける順次FATを辿るような処理においてエラーを引き起こす恐れがある。
【0035】
また、前述のように「ファイルの延長」においてはバッファキャッシュのフラッシュを一時的に保留させることでファイルシステムの安全性を高めることができるが、逆に「ファイルの短縮」においてはバッファキャッシュのフラッシュを即座に実施することでそれが可能となる(詳細は後述する)。このように、バッファキャッシュのフラッシュを一時的に保留させる(もしくは即座にフラッシュする)ことで、より安全なファイルシステムを実現することができる。
【0036】
次に、
図3に本実施形態のファイルシステム(ファイル管理装置)の概念的な機能構成を示す。
【0037】
図3に示す様にファイルシステム300はAPI制御部301、フラッシュ順序制御部302、バッファキャッシュ制御部303を有する。記憶装置310は予め本実施形態のファイルシステムを利用できるようにフォーマットされ、インデックス情報を含むディレクトリエントリを格納するDIR領域(第2メタデータ領域)311、データ領域の使用状態と連結状態を示す管理情報を含むファイルアロケーションテーブルを格納するFAT領域(第1メタデータ領域)312、DATA領域313を設けられている。
【0038】
バッファキャッシュ制御部303のバッファキャッシュ(不図示)はファイルシステムが管理するRAM105の記憶領域であればよい。記憶装置310のDIR領域311、FAT領域312、DATA領域313に記録すべき内容をキャッシュする。バッファキャッシュはバッファとしても機能し、詳細には、API制御部301が判別した記憶装置のアクセス対象の内容をバッファキャッシュに読み出し、その内容をAPI301のファイル操作に応じて更新し、アクセス対象に更新した内容を書き戻す。
【0039】
フラッシュ順序制御部302は
図14に示すテーブルのように各APIのフラッシュ順序(FAT内のフラッシュ順序含む)を規定する情報を有している。ただし、実際にテーブルとして保持する必要はなく、ライブラリとしてファイルシステムから参照できるように構成してもよいし、ファイルシステム内の各APIのコードの中に埋め込んでしまってもよい。
【0040】
API制御部301はアプリケーションやオペレーションプログラム側からAPI呼び出し(第1ファイル操作指示、第2ファイル操作指示)を受けると、フラッシュ順序制御部302にアクセスしフラッシュ順序が保持されているAPIであれば、そのフラッシュ順序に従ってバッファキャッシュ303のバッファしているデータを記憶装置310に書き出す。なお、フラッシュ順序が保持されていないAPIについて簡易的にDATA、ディレクトリ、FATなどの固定順にフラッシュするようにしてもよいし、無秩序にフラッシュしてもよい。また、本実施形態ではバッファキャッシュを用いて説明しているが、バッファキャッシュを用いなくても、ファイル操作指示の種類に応じた順序で、DIR領域311、FAT領域312、DATA領域313のうちの少なくとも2つ以上を更新できればよい。
【0041】
また、API制御部301は、FAT領域の中のフラッシュ順序として、「保留」が示されていればデータブロックを他のFAT領域を全て書き出してから最後に書き出すように制御する。一方で、「即時」がしめされていればデータブロックを他のFAT領域よりも最初に(優先的に)書き出すように制御する。
【0042】
以降の説明では、
図3に示す本実施形態のファイル管理装置が
図14に示すフラッシュ順序(およびFAT末尾保護の有無)に基づいて、ファイル操作種類ごと(以下の説明ではAPIごと)に適する順序でバッファキャッシュを記録するためのAPI制御部301による制御フローについて具体的に説明する。
【0043】
<ファイルの作成:Open(),Creat()>
通常、ファイルを作成するときに書込みが発生する領域は、新たに作成されるディレクトリエントリを書き込む領域のみである。しかし、ディレクトリエントリを書き込むディレクトリに空き領域がない場合はディレクトリの拡張が行われる。この場合、ディレクトリエントリの領域に加えてFAT領域にも書込みが発生する。本実施形態のファイル管理装置によるファイルの作成処理にについて、同期制御の手順を
図7のフローチャートを基に説明する。
【0044】
まず、ステップS701においてファイルを作成するディレクトリに十分な空き領域があるか確認する。空きがある場合はステップS703に飛んでディレクトリエントリの作成を行う。空きがない場合はディレクトリの拡張を行うためにステップS702に進む。
【0045】
ステップS702では空きデータブロックを元々のディレクトリと連結するために、FAT領域をバッファキャッシュのみ更新する。不定な領域にディレクトリがリンクするのを防ぐため、ディレクトリエントリ領域がフラッシュされるまで記憶装置へのフラッシュは行わないようにする。さらに、最終的なフラッシュより前に元々のFATチェーンの終端が記憶装置へ書き込まれないよう、元々のFATチェーンの終端を含むキャッシュをリプレイスから保護してフラッシュを保留させる。
【0046】
ステップS703では新たに獲得したデータブロックのゼロクリアおよびディレクトリエントリの作成を行う。データブロックのゼロクリアはたくさんのバッファキャッシュを消費するためキャッシュのリプレイスが頻発することがあるが、ステップS702で保護したキャッシュだけはリプレイス対象から外れフラッシュされずに残るため、不定な領域がリンクされることはない。ステップS701からこのステップに飛んだ場合、ゼロクリアは不要で、ディレクトリエントリの作成のみ行う。
【0047】
ステップS704ではディレクトリエントリ領域のみフラッシュを行う。ステップS703において発生したバッファキャッシュのリプレイスにより既にいくつかのキャッシュはフラッシュされている可能性があるため、残りの領域が対象となる。
【0048】
最後に、ステップS705でFAT領域のフラッシュを行う。このとき、ステップS702で保護したバッファキャッシュはそのままでFAT領域のフラッシュを行う。その後でステップS702で保護したキャッシュの保護を解除しフラッシュする。ステップS701からステップS703に飛んだ後このステップに到達した場合、このステップで実施する処理は不要である。
【0049】
<ファイルへのデータ書き込み:Write()>
ファイルへのデータの書込みにおいても新たに領域を確保する場合はデータ領域、ディレクトリエントリ領域に加えてFAT領域への書き込みが必要となる。「ファイルへのデータ書き込み」における最適な同期制御の手順を
図8のフローチャートを基に説明する。
まず、ステップS801においてデータを書き込む領域に十分な空き領域があるか確認する。空きがある場合はステップS803に飛んでデータの書き込みを行う。空きがない場合はファイルの拡張を行うためにステップS802に進む。
【0050】
ステップS802では空きデータブロックを元々のファイルと連結するために、FAT領域をバッファキャッシュのみ更新する。不定な領域にファイルがリンクするのを防ぐため、データ領域がフラッシュされるまで記憶装置へのフラッシュは行うことはできない。さらに、最終的なフラッシュより前に元々のFATチェーンの終端が記憶装置へ書き込まれないよう、元々のFATチェーンの終端を含むキャッシュをリプレイスから保護してフラッシュを保留させる。
【0051】
ステップS803ではデータの書き込みを行う。データの書き込みはたくさんのバッファキャッシュを消費するためキャッシュのリプレイスが頻発することがあるが、ステップS802で保護したキャッシュだけはリプレイス対象から外れフラッシュされずに残るため、不定な領域がリンクされることはない。ちなみに、データ領域はアクセス頻度が低く、かつ、「ファイルへのデータ書き込み」において最初に記憶装置にフラッシュされる領域であるため、この時点でバッファを通さず直接記憶装置にフラッシュしても良い。
【0052】
ステップS804ではファイルのサイズを変更するために、ディレクトリエントリ領域をバッファキャッシュのみ更新する。リンクされていない領域をディレクトリエントリが指し示すのを防ぐため、FAT領域がフラッシュされるまで記憶装置へのフラッシュは行うことはできない。ここでも、ステップS802で保護したキャッシュだけはリプレイス対象から外れフラッシュされずに残るため、不定な領域がリンクされることはない。
【0053】
ステップS805ではデータ領域のみフラッシュを行う。ステップS803でデータ領域を直接記憶装置に書き込んでいる場合はこのステップは不要である。
ステップS806ではFAT領域のみフラッシュを行う。このとき、ステップS802で保護したバッファキャッシュはそのままでFAT領域のフラッシュを行う。その後でステップS802で保護したキャッシュの保護を解除しフラッシュする。ステップS801からステップS803に飛んだ後このステップに到達した場合、このステップで実施する処理は不要である。
【0054】
最後に、ステップS807でディレクトリ領域のフラッシュを行う。
【0055】
<ファイルの削除:Unlink()>
データブロックが割り当てられているファイルを削除する場合は、ディレクトリエントリ領域とFAT領域への書込みが必要となる。データブロックの割り当てがないファイルではディレクトリエントリ領域への書き込みのみである。本実施形態のファイル管理装置によるファイルの削除処理における同期制御の手順を
図9のフローチャートを基に説明する。
【0056】
まず、ステップS901においてディレクトリエントリの削除を行う。解放されるデータブロックへの参照を防ぐため、更新したディレクトリエントリ領域は即座に記憶装置へフラッシュする。
【0057】
次に、ステップS902において削除するファイルにデータブロックの割り当てがあるか確認する。割り当てがない場合はそこで「ファイルの削除」は完了である。割り当てがある場合はデータブロックの解放を行うためにステップS903に進む。
【0058】
ステップS903ではファイルに割り当てられたデータブロックを解放するために、FAT領域のバッファキャッシュを更新する。既にディレクトリエントリが削除され、割り当てられたデータブロックを参照するものはないので、キャッシュのリプレイスによる不測のタイミングにおけるフラッシュを心配する必要もない。
【0059】
最後に、ステップS904でFAT領域のフラッシュを行う。ステップS903においてバッファキャッシュのリプレイスにより既にいくつかのキャッシュはフラッシュされている可能性があるため、残りの領域が対象となる。
【0060】
<ファイルの伸長:Truncate()(伸長)>
データの書き込みが発生しない点以外は「ファイルへのデータ書き込み」と同じである。よって、更新領域はディレクトリエントリ領域およびFAT領域である。ただし、伸長した領域にゼロを書き込む実装においては「ファイルへのデータ書き込みと」全く同じ記録手順となる。本実施形態のファイル管理装置による伸長処理について同期制御の手順を
図10のフローチャートを基に説明する。
【0061】
まず、ステップS1001において指定されたファイルサイズが新たなデータブロックの連結を必要とするか確認する。必要がない場合はステップS1003に飛んでディレクトリエントリの更新を行う。必要がある場合はファイルの拡張を行うためにステップS1002に進む。
【0062】
ステップS1002では空きデータブロックを元々のファイルと連結するために、FAT領域をバッファキャッシュのみ更新する。最終的なフラッシュより前に元々のFATチェーンの終端に対する更新が記憶装置へフラッシュされないよう、元々のFATチェーンの終端を含むキャッシュをリプレイスから保護してフラッシュを保留させる。
【0063】
ステップS1003ではファイルのサイズを変更するために、ディレクトリエントリ領域をバッファキャッシュのみ更新する。リンクされていない領域をディレクトリエントリが指し示すのを防ぐため、FAT領域がフラッシュされるまで記憶装置へのフラッシュは行うことはできない。ステップS1002で保護したキャッシュだけはリプレイス対象から外れフラッシュされずに残るため、キャッシュのリプレイスが発生しても不定な領域がリンクされることはない。
【0064】
ステップS1004ではFAT領域のみフラッシュを行う。このとき、ステップS1002で保護したバッファキャッシュはそのままでFAT領域のフラッシュを行う。その後、ステップS1002で保護したキャッシュの保護を解除しフラッシュする。ステップS1001からステップS1003に飛んだ後このステップに到達した場合、このステップで実施する処理は不要である。
【0065】
最後に、ステップS1005でディレクトリ領域のフラッシュを行う。
【0066】
<ファイルの短縮:Truncate()(短縮)>
基本的には「ファイルの伸長」の逆順である。ただし、短縮という性質上、ディレクトリエントリ領域のゼロクリアはないので、その点も伸長の場合と異なる。本実施形態のファイル管理装置によるファイルの短縮処理について、同期制御の手順を
図11のフローチャートを基に説明する。
【0067】
まず、ステップS1101においてディレクトリエントリのファイルサイズの変更を行う。解放されるデータブロックへの参照を防ぐため、更新したディレクトリエントリ領域は即座に記憶装置へフラッシュする。
【0068】
次に、ステップS1102において指定されたファイルサイズが既存のデータブロックの解放を必要とするか確認する。必要がない場合はそこで「ファイルの短縮」は完了である。必要がある場合はファイルの解放を行うためにステップS1103に進む。
【0069】
ステップS1103では空きデータブロックを元々のファイルから解放するために、FAT領域をバッファキャッシュのみ更新する。最終的なフラッシュより前にFATチェーンの任意の箇所に対する更新が記憶装置へフラッシュされても良いように、短縮後のFATチェーンの終端を含むキャッシュだけは即時フラッシュする。
【0070】
最後に、ステップS1104でFAT領域のフラッシュを行う。このとき、ステップS1103で短縮後のFATチェーンの終端を含むキャッシュは既にフラッシュされているため、残りのFATチェーンに対する更新がどのように記憶装置に書き込まれても問題が発生することはない。
【0071】
<ディレクトリの作成:Midir()>
「ディレクトリの作成」は新たなデータブロックの確保とディレクトリエントリの作成の2段階の手順から成り立つ。このような特性から、「ディレクトリの作成」においてはディレクトリエントリ領域およびFAT領域の領域単位でのフラッシュがそれぞれ2度発生することに注意が必要である。ディレクトリエントリの作成については「ファイルの作成」の場合とおなじステップを踏めば良いので、ここではデータブロックの確保を主眼とする。「ディレクトリの作成」における最適な同期制御の手順を
図12のフローチャートを基に説明する。
【0072】
まず、ステップS1201において空きデータブロックを確保するために、FAT領域をバッファキャッシュのみ更新する。この領域はディレクトリエントリが作成されない限りどこからも参照されないため、ディレクトリエントリの作成より前であればいつフラッシュされても良いが、できるだけ領域を無駄にしないために、確保したFATを含むキャッシュをリプレイスから保護してフラッシュを保留させる。
【0073】
次にステップS1202では新たに獲得したデータブロックのゼロクリアを行う。データブロックのゼロクリアはたくさんのバッファキャッシュを消費するためキャッシュのリプレイスが頻発することがあるが、ステップS1201で保護したキャッシュだけはリプレイス対象から外れフラッシュされずに残るため、不定な領域が使用済みとなることはない。
【0074】
ステップS1203ではディレクトリエントリ領域のフラッシュを行う。
【0075】
ステップS1204ではFAT領域のフラッシュを行う。このステップでフラッシュされるのはステップS1202で確保したデータブロックの分だけであるが、S1204に到達した時点では保護されているので、その保護を解除してからフラッシュする。
最後にステップS1205では「ファイルの作成」と同じ記録手順でディレクトリエントリの作成処理を実施する。
【0076】
<ディレクトリの削除:Rmdir()>
削除対象のデータブロックがファイルであるかディレクトリであるかという点が異なるだけで、「ファイルの削除」と同様の処理であるためここではその詳細を省略する。
【0077】
<ファイル・ディレクトリの名前・アクセス権・タイムスタンプの変更:Rename(),Chmod(),Utime()>
これらのAPIについては更新する領域がディレクトリエントリ領域のみであるため、複雑な同期制御は不要である。
【0078】
<その他の実施形態>
前述した実施形態はFATファイルシステムを前提として説明を行ったが、本発明はFATのようなデータ領域、ディレクトリエントリ領域、FAT領域(ここでは、データブロックのチェ−ンを表現する領域とする)を持つファイルシステムにも適用することができる。また、本発明はバッファキャッシュを管理する際のアルゴリズムもLRUに限定されない。
【0079】
また、前述した実施形態では代表的なファイルシステムAPIについて説明したが、「ファイルの連結」や「ファイルの分割」などのAPIにおいても本発明を適用してファイルシステムの安全性を向上させることができる。
【0080】
また、前述した実施形態では代表的なファイルシステムのAPIの其々について、対応する処理(対応する、領域の更新順序に従って更新する処理)を示したが、少なくとも2つ以上の領域の更新順序が異なる2つ以上のAPIを実施する構成であれば、本発明を適用することでファイルシステムの堅牢性を高めることができる。
【0081】
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。