(57)【特許請求の範囲】
【請求項１】
階層化ストレージ装置と、
前記階層化ストレージ装置を利用するコンピュータと
を具備し、
前記階層化ストレージ装置は、
アクセス性能の異なる複数のストレージ装置と、
前記複数のストレージ装置へのアクセスを制御するストレージコントローラとを具備し、
前記ストレージコントローラは、前記複数のストレージ装置の記憶領域がブロック単位で割り当てられる論理ユニット内の論理ブロックを示す論理ブロックアドレスにそれぞれ対応付けて、前記論理ブロックへのアクセスのカウントを管理し、且つ前記論理ブロックアドレスにそれぞれ対応付けられたアクセスカウントに基づいて、前記論理ブロックに格納されるデータを前記複数のストレージ装置の１つに再配置し、
前記コンピュータは、
前記コンピュータ上で動作するアプリケーションからの、ファイル名と当該ファイル名で示されるファイル内のアクセスされるべきブロックの相対位置情報とを含むアクセス要求に応じて、前記アクセスされるべきブロックに対応付けられた論理ブロックアドレスを含むリード要求またはライト要求を発行するファイルシステムと、
前記ファイルシステムからのリード要求またはライト要求を前記ストレージコントローラに送出することにより、前記階層化ストレージ装置にアクセスするデバイスドライバと
を具備し、
前記コンピュータまたは前記階層化ストレージ装置は、前記ストレージコントローラによって管理されるアクセスカウントの補正を支援する補正支援部を更に具備し、
前記ファイルシステムは、前記アプリケーションから要求されたファイルを、当該ファイルを構成するブロックそれぞれの当該ファイル内の相対位置と、当該ファイルを構成するブロックのデータが格納される論理ブロックそれぞれの論理ブロックアドレスとを対応付けることによって管理し、前記アクセス要求がデータの上書きを要求するライト要求ＷＲである場合、上書きされるべきデータを、当該上書きされるべきデータが格納されている論理ブロックとは異なる論理ブロックにコピーした後、当該コピー先に前記ライト要求ＷＲで指定されたデータを書き込むためのコピーオンライト動作を、前記デバイスドライバを用いて実行し、
前記補正支援部は、前記ストレージコントローラによって管理されていて、且つ前記コピーオンライト動作におけるコピー元の論理ブロックアドレスに対応付けられたアクセスカウントを、前記コピーオンライト動作におけるコピー先の論理ブロックアドレスに対応付けられたアクセスカウントに引き継がせる
階層化ストレージシステム。
【請求項２】
前記補正支援部は、ファイル内の相対位置と対応付けられる論理ブロックアドレスが、前記コピーオンライト動作により変化したことを検出することにより、変化前の論理ブロックアドレス及び変化後の論理ブロックアドレスを、それぞれコピー元を示す旧論理ブロックアドレス及びコピー先を示す新論理ブロックアドレスとして前記ストレージコントローラに通知し、
前記ストレージコントローラは、前記通知された旧論理ブロックアドレスに対応付けられたアクセスカウントを、前記通知された新論理ブロックアドレスに対応付けられたアクセスカウントに引き継ぐ
請求項１記載の階層化ストレージシステム。
【請求項３】
前記ファイルシステムは、前記ライト要求ＷＲに従う前記コピーオンライト動作のために、前記コピー元からの読み出しを指定するリード要求ＲＲ、前記リード要求ＲＲに応じて読み出されるデータを、前記コピー先に書き込むことを指定するライト要求ＷＲ１、及び前記ライト要求ＷＲで指定されたデータを前記コピー先に書き込むことを指定するライト要求ＷＲ２を、前記デバイスドライバにより前記階層化ストレージ装置に順次送出させ、
前記補正支援部は、前記デバイスドライバから前記階層化ストレージ装置に対して、第１のリード要求、第１のライト要求及び第２のライト要求が順次送出され、前記第１のライト要求に応じて書き込まれるデータが前記第１のリード要求に応じて読み出されたデータに等しく、且つ前記第２のライト要求によって指定される論理ブロックアドレスが、前記第１のライト要求によって指定される論理ブロックアドレスに等しい場合に、コピーオンライト動作が実行されて、前記第１のリード要求に応じて読み出されたデータのファイル内の相対位置と対応付けられる論理ブロックアドレスが変化したことを検出する
請求項２記載の階層化ストレージシステム。
【請求項４】
前記デバイスドライバは、前記階層化ストレージ装置にリード要求またはライト要求を送出した場合、リードまたはライトを示す識別子、当該リード要求またはライト要求の指定する論理ブロックアドレス、及び当該リード要求に応じて読み出されるデータまたは当該ライト要求の指定するライトデータのハッシュ値を含む第１の入出力情報を前記補正支援部に渡し、
前記補正支援部は、前記デバイスドライバからの前記第１の入出力情報に基づいて前記コピーオンライト動作に伴う論理ブロックアドレスの変化を検出する
請求項３記載の階層化ストレージシステム。
【請求項５】
前記補正支援部は、
旧論理ブロックアドレスとして定義される、コピーオンライト動作におけるデータのコピー元の論理ブロックアドレスと、新論理ブロックアドレスとして定義される、当該データのコピー先の論理ブロックアドレスと、当該データのハッシュ値との対応を、データ管理テーブルのエントリを用いて管理し、
前記第１の入出力情報の受領に応じて前記第１の入出力情報中の識別子をチェックし、当該識別子がリードを示す場合、前記第１の入出力情報中の論理ブロックアドレスを旧論理ブロックアドレスとして有し、前記第１の入出力情報中のハッシュ値に等しいハッシュ値を有し、且つ新論理ブロックアドレスを欠いたエントリを前記データ管理テーブルに追加し、
前記第１の入出力情報中の識別子がライトを示す場合、前記第１の入出力情報中のハッシュ値に等しいハッシュ値を有し、且つ新論理ブロックアドレスを欠くエントリを前記データ管理テーブルから検索して、当該検索されたエントリに前記第１の入出力情報中の論理ブロックアドレスを新論理ブロックアドレスとして設定し、
前記第１の入出力情報中のハッシュ値に等しいハッシュ値を有し、且つ新論理ブロックアドレスを欠くエントリを検索できなかった場合、前記第１の入出力情報中の論理ブロックアドレスに等しい新論理ブロックアドレスを有するエントリを前記データ管理テーブルから検索して、当該検索されたエントリ中の旧論理ブロックアドレス及び新論理ブロックアドレスを、前記ストレージコントローラに通知する
請求項４記載の階層化ストレージシステム。
【請求項６】
前記補正支援部は、前記通知された旧論理ブロックアドレス及び新論理ブロックアドレスを有するエントリを前記データ管理テーブルから削除する請求項５記載の階層化ストレージシステム。
【請求項７】
前記補正支援部は、前記エントリが追加または更新されてから一定時間が経過した場合、前記エントリを前記データ管理テーブルから削除する請求項５記載の階層化ストレージシステム。
【請求項８】
前記コンピュータは、
前記階層化ストレージ装置から読み出されたリードデータ、及び前記階層化ストレージ装置に書かれるべきライトデータを格納するのに用いられるキャッシュバッファと、
前記キャッシュバッファへのアクセスを制御し、前記キャッシュバッファに格納されたデータのディレクトリを管理し、且つ前記ファイルシステムからのライト要求に基づく前記キャッシュバッファへのライトデータの書き込みに応じて、当該ライトデータの書き込み先を示すバッファアドレス及び当該ライトデータのハッシュ値を有する第２の入出力情報を前記補正支援部に渡すキャッシュコントローラと
を更に具備し、
前記補正支援部は、前記デバイスドライバからの前記第１の入出力情報及び前記キャッシュコントローラからの前記第２の入出力情報に基づいて前記コピーオンライト動作に伴う論理ブロックアドレスの変化を検出する
請求項４記載の階層化ストレージシステム。
【請求項９】
前記補正支援部は、
旧論理ブロックアドレスとして定義される、コピーオンライト動作におけるデータのコピー元の論理ブロックアドレスと、新論理ブロックアドレスとして定義される、当該データのコピー先の論理ブロックアドレスと、前記キャッシュバッファにおける当該データの格納先を示すバッファアドレスと、旧ハッシュ値として定義される、当該データのハッシュ値と、新ハッシュ値として定義される、当該コピー先に上書きされるデータのハッシュ値との対応を、データ管理テーブルのエントリを用いて管理し、
前記第１の入出力情報の受領に応じて前記第１の入出力情報中の識別子をチェックし、当該識別子がリードを示す場合、前記第１の入出力情報中の論理ブロックアドレス及びハッシュ値を、それぞれ旧論理ブロックアドレス及び旧ハッシュ値として有するエントリを前記データ管理テーブルに追加し、
前記第２の入出力情報の受領に応じて、当該第２の入出力情報中のバッファアドレスに等しいバッファアドレスを有するエントリを検索して、当該検索されたエントリに当該第２の入出力情報中のハッシュ値を新ハッシュ値として設定し、
前記第２の入出力情報中のバッファアドレスに等しいバッファアドレスを有するエントリを検索できなかった場合、前記第２の入出力情報中のハッシュ値に等しい旧ハッシュ値を有するエントリを前記データ管理テーブルから検索して、当該検索されたエントリに当該第２の入出力情報中のバッファアドレスを設定し、
前記識別子がライトを示し、且つ前記第１の入出力情報中の論理ブロックアドレスに等しい旧論理ブロックアドレスを有するエントリが前記データ管理テーブルに存在しない場合、前記第１の入出力情報中のハッシュ値に等しい新ハッシュ値を有するエントリを前記データ管理テーブルから検索して、当該検索されたエントリに当該第１の入出力情報中の論理ブロックアドレスを前記新論理ブロックアドレスとして設定し、しかる後に当該検索されたエントリ中の旧論理ブロックアドレス及び新論理ブロックアドレスを、前記ストレージコントローラに通知し、
前記第１の入出力情報中のハッシュ値に等しい新ハッシュ値を有するエントリを検索できなかった場合、前記第１の入出力情報中の論理ブロックアドレス及びハッシュ値を、それぞれ旧論理ブロックアドレス及び旧ハッシュ値として有するエントリを前記データ管理テーブルに追加する
請求項８記載の階層化ストレージシステム。
【請求項１０】
前記デバイスドライバは、前記階層化ストレージ装置にリード要求またはライト要求を送出した場合、当該リード要求またはライト要求の指定する論理ブロックアドレス、及び当該リード要求に応じて読み出されるデータまたは当該ライト要求の指定するライトデータのハッシュ値を含む第１の入出力情報を前記補正支援部に渡し、
前記アプリケーションは、前記アクセス要求の発行に応じて、ファイル名、相対位置情報、及び前記アクセス要求に応じて読み出されるまたは書き込まれるデータのハッシュ値を含む第２の入出力情報を前記補正支援部に渡し、
前記補正支援部は、
ファイルのファイル名と、当該ファイル内の相対位置を示す相対位置情報と、当該相対位置に対応付けられた論理ブロックアドレスの列を含む論理ブロックアドレスリストとの対応を、マッピングテーブルのエントリを用いて管理し、
前記マッピングテーブルの全てのエントリの論理ブロックアドレスリストに含まれているそれぞれの論理ブロックアドレスと、当該それぞれの論理ブロックアドレスで指定される論理ブロックへのアクセスのカウントと、当該論理ブロックへの最終アクセスの日時を示す最終アクセス日時情報との対応を、カウントテーブルのエントリを用いて管理し、
前記デバイスドライバからの前記第１の入出力情報及び前記アプリケーションからの前記第２の入出力情報に基づいて、前記マッピングテーブルにエントリを追加し、または前記マッピングテーブルのエントリの内容を更新し、
前記第１の入出力情報に基づいて、前記カウントテーブルにエントリを追加し、または前記カウントテーブルのエントリの内容を更新し、
前記マッピングテーブルのエントリ毎に、対応するエントリ中の論理ブロックリストに含まれるそれぞれの論理ブロックアドレスに基づいて、当該それぞれの論理ブロックアドレスに対応付けられたカウントテーブルのエントリを検索し、当該検索されたエントリに含まれている、最終アクセス日時が最新のエントリを除くエントリ中のカウントの合計を、前記ストレージコントローラによって管理されていて、且つ前記最新のエントリ中の論理ブロックアドレスに対応付けられたアクセスカウントに引き継がせる
請求項１記載の階層化ストレージシステム。
【請求項１１】
前記補正支援部は、前記最新のエントリ中のカウントを前記合計に変更し、且つ前記最新のエントリを除くエントリ中のカウントを負の値に変更し、前記変更されたカウントを含むエントリ中の論理ブロックアドレスと当該変更されたカウントとの組の列から構成されるカウント補正情報を前記ストレージコントローラに送出することにより、前記ストレージコントローラによって管理されているアクセスカウントのうち、前記カウント補正情報に含まれている論理ブロックアドレスに対応付けられたアクセスカウントを、前記カウント補正情報に含まれているカウントに基づいて補正させる請求項１０記載の階層化ストレージシステム。
【請求項１２】
前記コンピュータは、ファイルのスナップショットの作成及び削除を前記ファイルシステムに要求するスナップショット部を更に具備し、
前記カウントテーブルのエントリの各々は、前記論理ブロックアドレス、前記カウント及び前記最終アクセス日時情報に加えて、当該論理ブロックアドレスの示す論理ブロックに格納されているデータが、異なるスナップショットとして同時に参照されている数を表す被参照数を有し、
前記補正支援部は、
前記カウントテーブルから値が０の被参照数を持つ第１のエントリを検索し、
第１のエントリを検索できた場合、前記マッピングテーブルから、前記第１のエントリ中の第１の論理ブロックアドレスを含む複数の論理ブロックアドレスを持つ第１の論理ブロックアドレスリストを抽出し、
前記第１の論理ブロックアドレスリスト中の前記複数の論理ブロックアドレスにそれぞれ対応付けられた、前記カウントテーブルの複数のエントリのうちの、最新の最終アクセス日時を示す最終アクセス日時情報を持つ第２のエントリ中の第２のカウントに、前記第１のエントリ中の第１のカウントを加算し、且つ前記第１のカウントを０に変更する
請求項１１記載の階層化ストレージシステム。
【請求項１３】
前記スナップショット部は、前記ファイルシステムへの前記スナップショット作成要求または前記スナップショット削除要求に応じて、作成または削除されるべきスナップショットを示すスナップショット名、及び作成または削除されるべきスナップショットに対応するファイルを示すファイル名を含む第３の入出力情報を前記補正支援部に渡し、
前記補正支援部は、
前記第３の入出力情報が前記スナップショット作成要求に対応する場合、前記マッピングテーブルから、前記第３の入出力情報中のファイル名に一致するファイル名を持つ全てのエントリを選択して、前記選択された全エントリから第２の論理ブロックアドレスリストを抽出し、
前記第２の論理ブロックアドレスリスト中の全ての論理ブロックアドレスに基づいて前記カウントテーブルを参照することにより、最新の最終アクセス日時を示す最終アクセス日時情報を持つ第３のエントリを特定して、当該第３のエントリ中の第３の論理ブロックアドレスを最新の論理ブロックアドレスとして抽出し、
前記第３の論理ブロックアドレスを含む論理ブロックアドレスリスト中の全論理ブロックアドレスにそれぞれ対応付けられた、前記カウントテーブルのエントリ中の被参照数をインクリメントし、
前記第３の入出力情報中のオフセット名に一致するファイル名、前記第３のエントリ中のオフセットに等しいオフセット、及び前記第３の論理ブロックアドレスを持つエントリを、前記マッピングテーブルに追加し、
前記第３の入出力情報が前記スナップショット削除要求に対応する場合、前記マッピングテーブルから、前記第３の入出力情報中のスナップショット名に一致するファイル名を持つ全てのエントリを選択して、前記選択された全エントリから第３の論理ブロックアドレスリストを抽出し、
前記第３の論理ブロックアドレスリスト中の全ての論理ブロックアドレスに基づいて前記カウントテーブルを参照することにより、最新の最終アクセス日時を示す最終アクセス日時情報を持つ第４のエントリを特定して、当該第４のエントリ中の第４の論理ブロックアドレスを最新の論理ブロックアドレスとして抽出し、
前記第４の論理ブロックアドレスを含む論理ブロックアドレスリスト中の全論理ブロックアドレスにそれぞれ対応付けられた、前記カウントテーブルのエントリ中の被参照数をディクリメントする
請求項１２記載の階層化ストレージシステム。
【請求項１４】
前記補正支援部は、前記ファイルシステムを含むオペレーティングシステムまたは前記ストレージコントローラのバックグラウンドで動作する請求項１記載の階層化ストレージシステム。
【請求項１５】
アクセス性能の異なる複数のストレージ装置と、前記複数のストレージ装置へのアクセスを制御し、前記複数のストレージ装置の記憶領域がブロック単位で割り当てられる論理ユニット内の論理ブロックを示す論理ブロックアドレスにそれぞれ対応付けて、前記論理ブロックへのアクセスのカウントを管理し、且つ前記論理ブロックアドレスにそれぞれ対応付けられたアクセスカウントに基づいて、前記論理ブロックに格納されるデータを前記複数のストレージ装置の１つに再配置するストレージコントローラとを具備する階層化ストレージ装置を利用するコンピュータにおいて、
前記コンピュータ上で動作するアプリケーションからの、ファイル名と当該ファイル名で示されるファイル内のアクセスされるべきブロックの相対位置情報とを含むアクセス要求に応じて、前記アクセスされるべきブロックに対応付けられた論理ブロックアドレスを含むリード要求またはライト要求を発行するファイルシステムと、
前記ファイルシステムからのリード要求またはライト要求を前記ストレージコントローラに送出することにより、前記階層化ストレージ装置にアクセスするデバイスドライバと、
前記ストレージコントローラによって管理されるアクセスカウントの補正を支援する補正支援部と
を具備し、
前記ファイルシステムは、前記アプリケーションから要求されたファイルを、当該ファイルを構成するブロックそれぞれの当該ファイル内の相対位置と、当該ファイルを構成するブロックのデータが格納される論理ブロックそれぞれの論理ブロックアドレスとを対応付けることによって管理し、前記アクセス要求がデータの上書きを要求するライト要求ＷＲである場合、上書きされるべきデータを、当該上書きされるべきデータが格納されている論理ブロックとは異なる論理ブロックにコピーした後、当該コピー先に前記ライト要求ＷＲで指定されたデータを書き込むためのコピーオンライト動作を、前記デバイスドライバを用いて実行し、
前記補正支援部は、前記ストレージコントローラによって管理されていて、且つ前記コピーオンライト動作におけるコピー元の論理ブロックアドレスに対応付けられたアクセスカウントを、前記コピーオンライト動作におけるコピー先の論理ブロックアドレスに対応付けられたアクセスカウントに引き継がせる
コンピュータ。
【請求項１６】
アクセス性能の異なる複数のストレージ装置と、前記複数のストレージ装置へのアクセスを制御し、前記複数のストレージ装置の記憶領域がブロック単位で割り当てられる論理ユニット内の論理ブロックを示す論理ブロックアドレスにそれぞれ対応付けて、前記論理ブロックへのアクセスのカウントを管理し、且つ前記論理ブロックアドレスにそれぞれ対応付けられたアクセスカウントに基づいて、前記論理ブロックに格納されるデータを前記複数のストレージ装置の１つに再配置するストレージコントローラとを具備する階層化ストレージ装置を利用するコンピュータにおいてファイルへのアクセスのカウントを補正する方法であって、
前記コンピュータ上で動作するアプリケーションから要求されたファイルを、当該ファイルを構成するブロックそれぞれの当該ファイル内の相対位置と、当該ファイルを構成するブロックのデータが格納される論理ブロックそれぞれの論理ブロックアドレスとを対応付けて管理するファイルシステムが、前記アプリケーションからデータの上書きを要求するライト要求ＷＲを受領した場合、上書きされるべきデータを、当該上書きされるべきデータが格納されている論理ブロックとは異なる論理ブロックにコピーした後、当該コピー先に前記ライト要求ＷＲで指定されたデータを書き込むためのコピーオンライト動作を、デバイスドライバを用いて実行し、
前記ストレージコントローラによって管理されていて、且つ前記コピーオンライト動作におけるコピー元の論理ブロックアドレスに対応付けられたアクセスカウントを、前記コピーオンライト動作におけるコピー先の論理ブロックアドレスに対応付けられたアクセスカウントに引き継がせる
ファイルへのアクセスのカウントを補正する方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、階層化ストレージシステム、階層化ストレージ装置を利用するコンピュータ、及びファイルへのアクセスのカウントを補正する方法に関する。
【背景技術】
【０００２】
近年、アクセス速度の異なる第１及び第２のストレージ装置を備えたストレージシステムが開発されている。ここで、第１のストレージ装置のアクセス速度及び記憶容量は高速で小容量であり、第２のストレージ装置のアクセス速度及び記憶容量は、第１のストレージ装置のそれと比較して低速で大容量であるものとする。ストレージシステムは、第１のストレージ装置（以下、高速ストレージ装置と称する）及び第２のストレージ装置（以下、低速ストレージ装置と称する）を階層的に組み合わせることにより実現される。そこで、このようなストレージシステムは、階層化ストレージシステムとも呼ばれる。【０００３】
階層化ストレージシステムでは、使用頻度の高いデータは高速ストレージ装置内の記憶領域に配置され、使用頻度の低いデータは低速ストレージ装置内の記憶領域に配置される。このような配置（つまり階層化）により、階層化ストレージシステムの高パフォーマンスと低コストを両立することができる。【０００４】
階層化が十分な効果を発揮するためには、データが配置されるべき領域（階層）が、例えば、当該データの使用頻度に基づいて適切に決定される必要がある。そこで従来技術では、階層化ストレージシステム内のストレージコントローラは、各領域（例えば論理領域）へのアクセスのカウントを、アクセスカウントテーブルを用いて管理する。ストレージコントローラは、アクセスカウントテーブルに基づいて、アクセスカウントの多い論理領域のデータを高速ストレージ装置に、アクセスカウントの少ない論理領域のデータを低速ストレージ装置に、それぞれ再配置する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−４４３８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ところで、階層化ストレージシステムを含む近年のストレージシステムは、コピーオンライト機能を有しているのが一般的である。コピーオンライト機能が有効な状態に設定された階層化ストレージシステムにおいて、コンピュータ上で動作するアプリケーションが、第１のファイルの第１の箇所（より詳細には、第１の相対位置）に新たなデータ（第２のデータ）を上書きするものとする。また、第１のファイルの第１の箇所は、第１の論理領域と対応付けられており、したがって当該第１の箇所のデータ（第１のデータ）は、第１の論理領域に格納されているものとする。【０００７】
この場合、ストレージコントローラはファイルシステムからのアクセス要求に応じて、第１の論理領域（旧領域）から第１のデータを読み出して、当該読み出された第１のデータを第１の論理領域とは別の空きの第２の論理領域（新領域）に書き込む（つまり、コピーする）。そしてストレージコントローラは、第２の論理領域に、第２のデータを書き込む（上書きする）。つまりストレージコントローラは、第１のデータのコピーを第２のデータで置き換える。以上の、読み出し、書き込み、及び書き込みから構成される一連の動作を、コピーオンライト動作と呼ぶ。【０００８】
アプリケーションはコピーオンライト動作に無関係に、第１のファイル内の第１の箇所のデータ（第１のデータ）に第２のデータを上書きしている（書き込んでいる）と認識している。しかしコピーオン動作では、第２のデータは、第１のデータのコピー先、つまり第１のデータが格納されている旧領域とは別の新領域に書き込まれる。この場合、ストレージコントローラでは、第１のファイルの第１の箇所へのアクセスに関するアクセスカウントは、旧領域へのアクセスのカウントと新領域へのアクセスのカウントとに分散されて記録される。この結果、例えば、ファイルアクセスの状況からは高速ストレージ装置に配置されるべきデータでも、低速ストレージ装置に配置される可能性があり、ユーザの利便性を損ねる可能性がある。【０００９】
本発明が解決しようとする課題は、ストレージコントローラが管理するアクセスカウントを、コピーオンライト機能が有効な場合でも、アプリケーションが認識するファイルアクセスの状況に合致するように補正することができ、ユーザの利便性の向上に寄与する階層化を実現することができる階層化ストレージシステム、階層化ストレージ装置を利用するコンピュータ、及びファイルへのアクセスのカウントを補正する方法を提供することにある。
【課題を解決するための手段】
【００１０】
実施形態によれば、階層化ストレージシステムは、階層化ストレージ装置と、前記階層化ストレージ装置を利用するコンピュータとを具備する。前記階層化ストレージ装置は、アクセス性能の異なる複数のストレージ装置と、前記複数のストレージ装置へのアクセスを制御するストレージコントローラとを具備する。前記ストレージコントローラは、前記複数のストレージ装置の記憶領域がブロック単位で割り当てられる論理ユニット内の論理ブロックを示す論理ブロックアドレスにそれぞれ対応付けて、前記論理ブロックへのアクセスのカウントを管理し、且つ前記論理ブロックアドレスにそれぞれ対応付けられたアクセスカウントに基づいて、前記論理ブロックに格納されるデータを前記複数のストレージ装置の１つに再配置する。前記コンピュータは、ファイルシステムと、デバイスドライバとを具備する。前記ファイルシステムは、前記コンピュータ上で動作するアプリケーションからの、ファイル名と当該ファイル名で示されるファイル内のアクセスされるべきブロックの相対位置情報とを含むアクセス要求に応じて、前記アクセスされるべきブロックに対応付けられた論理ブロックアドレスを含むリード要求またはライト要求を発行する。前記デバイスドライバは、前記ファイルシステムからのリード要求またはライト要求を前記ストレージコントローラに送出することにより、前記階層化ストレージ装置にアクセスする。前記コンピュータまたは前記階層化ストレージ装置は、前記ストレージコントローラによって管理されるアクセスカウントの補正を支援する補正支援部を更に具備する。前記ファイルシステムは、前記アプリケーションから要求されたファイルを、当該ファイルを構成するブロックそれぞれの当該ファイル内の相対位置と、当該ファイルを構成するブロックのデータが格納される論理ブロックそれぞれの論理ブロックアドレスとを対応付けることによって管理し、前記アクセス要求がデータの上書きを要求するライト要求ＷＲである場合、上書きされるべきデータを、当該上書きされるべきデータが格納されている論理ブロックとは異なる論理ブロックにコピーした後、当該コピー先に前記ライト要求ＷＲで指定されたデータを書き込むためのコピーオンライト動作を、前記デバイスドライバを用いて実行する。前記補正支援部は、前記ストレージコントローラによって管理されていて、且つ前記コピーオンライト動作におけるコピー元の論理ブロックアドレスに対応付けられたアクセスカウントを、前記コピーオンライト動作におけるコピー先の論理ブロックアドレスに対応付けられたアクセスカウントに引き継がせる。
【図面の簡単な説明】
【００１１】
【図１】図１は、第１の実施形態に係る階層化ストレージシステムの典型的なハードウェア構成を示すブロック図である。
【図２】図２は、図１に示される階層化ストレージシステムの典型的な機能構成を示すブロック図である。
【図３】図３は、図１及び図２に示されるデーモンの典型的な機能構成を示すブロック図である。
【図４】図４は、図２に示されるアクセスカウントテーブルのデータ構造例を示す図である。
【図５】図５は、図３に示されるデータ管理テーブルのデータ構造例を示す図である。
【図６】図６は、第１の実施形態におけるデーモン処理の典型的な手順を示すフローチャートである。
【図７】図７は、デーモン処理でエントリが追加されたデータ管理テーブルの例を示す図である。
【図８】図８は、デーモン処理でエントリ内容が更新されたデータ管理テーブルの例を示す図である。
【図９】図９は、第１の実施形態におけるアクセスカウントテーブルの内容の遷移の例を示す図である。
【図１０】図１０は、第２の実施形態に係る階層化ストレージシステムの典型的な機能構成を示すブロック図である。
【図１１】図１１は、図１０に示されるデーモンの典型的な機能構成を示すブロック図である。
【図１２】図１２は、図１１に示されるデータ管理テーブルのデータ構造例を示す図である。
【図１３】図１３は、第２の実施形態におけるデーモン処理の典型的な手順を示すフローチャートである。
【図１４】図１４は、図１３に示されるデーモン処理に含まれているエントリ・追加更新処理の典型的な手順を示すフローチャートである。
【図１５】図１５は、図１３に示されるデーモン処理に含まれているエントリ更新処理の典型的な手順を示すフローチャートである。
【図１６】図１６は、図１３に示されるデーモン処理でエントリが追加されたデータ管理テーブルの例を示す図である。
【図１７】図１７は、第２の実施形態におけるデータ管理テーブルの内容の遷移の例を示す図である。
【図１８】図１８は、第３の実施形態に係る階層化ストレージシステムの典型的な機能構成を示すブロック図である。
【図１９】図１９は、図１８に示されるデーモンの典型的な機能構成を示すブロック図である。
【図２０】図２０は、図１９に示されるファイル−ＬＢＡテーブルのデータ構造例を示図である。
【図２１】図２１は、図１９に示されるカウントテーブルのデータ構造例を示す図である。
【図２２】図２２は、第３の実施形態における第１のテーブル管理処理の典型的な手順を示すフローチャートである。
【図２３】図２３は、第３の実施形態における第２のテーブル管理処理の典型的な手順を示すフローチャートである。
【図２４】図２４は、第３の実施形態におけるカウント補正処理の典型的な手順を示すフローチャートである。
【図２５】図２５は、第１のテーブル管理処理でエントリが追加されたファイル−ＬＢＡテーブルの例を示す図である。
【図２６】図２６は、第２のテーブル管理処理でエントリが追加されたカウントテーブルの例を示す図である。
【図２７】図２７は、第３の実施形態におけるカウントテーブルの内容の遷移の例を示す図である。
【図２８】図２８は、第１のテーブル管理処理でエントリ中の論理ブロックアドレス（ＬＢＡ）リストの内容が更新されたファイル−ＬＢＡテーブルの例を示す図である。
【図２９】図２９は、カウント補正処理で作成されたカウント補正情報の例を示す図である。
【図３０】図３０は、第３の実施形態におけるアクセスカウントテーブルの内容の例を示す図である。
【図３１】図３１は、第３の実施形態における補正されたアクセスカウントテーブルの内容の例を示す図である。
【図３２】図３２は、第３の実施形態の変形例に係る階層化ストレージシステムの典型的な機能構成を示すブロック図である。
【図３３】図３３は、図３３に示されるデーモンの典型的な機能構成を示すブロック図である。
【図３４】図３４は、図３２に示されるカウントテーブルのデータ構造例を示す図である。
【図３５】図３５は、第３の実施形態の変形例における第１のスナップショット管理処理の典型的な手順を示すフローチャートである。
【図３６】図３６は、第３の実施形態の変形例における第２のスナップショット管理処理の典型的な手順を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下、種々の実施の形態につき図面を参照して説明する。  
＜第１の実施形態＞
図１は、第１の実施形態に係る階層化ストレージシステムの典型的なハードウェア構成を示すブロック図である。図１に示される階層化ストレージシステムは、ｎ台のコンピュータ１０＿１乃至１０＿ｎと階層化ストレージ装置２０とを含む。コンピュータ１０＿１乃至１０＿ｎは、階層化ストレージ装置２０を自身のストレージ装置として利用するホストコンピュータとして機能する。図１では、コンピュータ１０＿１乃至１０＿ｎのうちのコンピュータ１０＿１の構成のみが示されている。しかし、コンピュータ１０＿ｎを含む、他のｎ−１台のコンピュータも、コンピュータ１０＿１と同様の構成を有している。
【００１３】
コンピュータ１０＿１は、ＣＰＵ１１と、主メモリ１２と、ＨＤＤ１３と、ホストインタフェース（ＨＩ）コントローラ１４とを含む。ＣＰＵ１１、主メモリ１２、ＨＤＤ１３、及びＨＩコントローラ１４は、システムバス１５によって接続されている。なお、処理の高速化のために、コンピュータ１０＿１が、ＣＰＵ１１を含む複数のＣＰＵを含んでいても構わない。
【００１４】
主メモリ１２は、オペレーティングシステム（ＯＳ）１２１、アプリケーション１２２、デバイスドライバ１２３（より詳細には、デバイスドライバプログラム）及びデーモン１２４（より詳細には、デーモンプロセスプログラム）等を格納するのに用いられる。ＯＳ１２１、アプリケーション１２２、デバイスドライバ１２３及びデーモン１２４は、例えばＨＤＤ１３に格納されており、当該ＨＤＤ１３から主メモリ１２にロードされて用いられる。
【００１５】
ＨＩコントローラ１４は、コンピュータ１０＿１と階層化ストレージ装置２０のストレージコントローラ２３との間のデータ転送を制御する。ＨＩコントローラ１４は、アプリケーション１２２からのアクセス要求に基づくデバイスドライバ１２３からのアクセス要求を、ストレージコントローラ２３に送信する。ＨＩコントローラ１４はまた、デバイスドライバ１２３からのアクセス要求に対するストレージコントローラ２３からの応答（返り値）を受信して、当該応答をデバイスドライバ１２３に返す。
【００１６】
階層化ストレージ装置２０は、ホストインタフェースバス３０を介してコンピュータ１０＿１乃至１０＿ｎと接続されている。なお、階層化ストレージ装置２０が、ストレージエリアネットワーク（ＳＡＮ）のようなネットワークを介してコンピュータ１０＿１乃至１０＿ｎと接続されていても良い。また、階層化ストレージ装置２０がコンピュータ１０＿１のみと接続されていても構わない。つまり、階層化ストレージ装置２０が、コンピュータ１０＿１のみによって利用されても構わない。
【００１７】
階層化ストレージ装置２０は、アクセス性能の異なる複数のストレージ装置、例えば高速ストレージ装置２１及び低速ストレージ装置２２と、上述のストレージコントローラ２３とを含む。ストレージコントローラ２３は、ストレージインタフェースバス２４を介して高速ストレージ装置２１及び低速ストレージ装置２２と接続されている。
【００１８】
高速ストレージ装置２１は、例えば、フラッシュアレイのような、アクセス性能に優れた（つまり、アクセス速度が高速な）フラッシュストレージ装置から構成される。フラッシュストレージ装置は、複数のフラッシュメモリボードを用いて実現される。フラッシュメモリボードの各々は、フラッシュメモリの集合を含む。第１の実施形態では、複数のフラッシュメモリボードの各々はハードディスクドライブ（ＨＤＤ）との互換性を有していないものとする。しかし、複数のフラッシュメモリボードに代えて、ＨＤＤとの互換性を有する複数のソリッドステートドライブ（ＳＳＤ）が用いられても構わない。
【００１９】
一方、低速ストレージ装置２２は、例えば、高速ストレージ装置２１と比較してアクセス性能が低い（つまり、アクセス速度が低速な）ハードディスクドライブ（ＨＤＤ）アレイから構成される。ＨＤＤアレイは、例えば、複数のＨＤＤを備えたＲＡＩＤ（Redundant Arrays of Inexpensive DisksまたはRedundant Arrays of Independent Disks）構成のストレージ装置である。ＨＤＤアレイが、ファイバチャネル（ＦＣ）用のＨＤＤのような高速ＨＤＤから構成されていても、或いは、シリアルＡＴＡ（ＳＡＴＡ）用のＨＤＤのような低速ＨＤＤから構成されていても構わない。
【００２０】
なお、高速ストレージ装置２１及び低速ストレージ装置２２が必ずしもアレイ構成を有している必要はない。また、高速ストレージ装置２１が少なくとも１つの高速ＨＤＤから構成され、低速ストレージ装置２２が少なくとも１つの低速ＨＤＤから構成されていても良い。また、低速ストレージ装置２２が、ブルーレイディスク（登録商標）ドライブ、或いはＤＶＤ（登録商標）ドライブのような光学式ディスクドライブ、或いはテープ装置から構成されていても良い。また低速ストレージ装置２２がテープ装置から構成される場合、高速ストレージ装置２１が光学式ディスクドライブから構成されていても良い。
【００２１】
図２は、図１に示される階層化ストレージシステムの典型的な機能構成を示すブロック図である。図２に示されるように、ＯＳ１２１は、アプリケーション１２２からのリード要求またはライト要求に応じて発行されるリードシステムコールまたはライトシステムコールを受けて対応するサービスを実行する。このようなシステムコールを発行する機構は、ライブラリ（ライブラリ関数）またはジャケットライブラリと呼ばれる。ＯＳ１２１は、コピーオンライト（copy-on-write : COW）機能を有する。
【００２２】
ＯＳ１２１は、ファイルシステム１２１０を含む。ファイルシステム１２１０は、アプリケーション１２２を含むアプリケーション群によって利用されるファイルと、当該ファイルを構成する、一定サイズのブロック群の論理空間（以下、論理ユニットと称する）内の位置とを対応付ける。論理ユニットは、論理ディスク、或いは論理ボリュームとも呼ばれる。ブロックのサイズは、ファイルシステム１２１０が論理ユニットを管理するのに用いられる。即ちファイルシステム１２１０は、論理ユニットを複数のブロック（論理ブロック）に分割することで、当該論理ユニットの利用状況をブロック（ブロックサイズ）単位に管理する。また、ファイルシステム１２１０は、論理ユニット内の空きブロックを管理する。
【００２３】
論理ユニット内のブロックには、先頭ブロックから順に論理ブロックアドレスがシーケンシャルに割り当てられる。一方、ファイル内のブロックには、先頭ブロックから順にオフセットと呼ばれる数値がシーケンシャルに割り当てられる。つまり、ファイル内のブロックに割り当てられるオフセットは、当該ブロックのファイル内の相対位置を示す。
【００２４】
ここで、アプリケーション１２２によって利用されるファイルＦが２ｍ個のブロックＢＬＫ０乃至ＢＬＫ２ｍ−１から構成され、当該ブロックＢＬＫ０乃至ＢＬＫ２ｍ−１が、論理ユニット内において論理ブロックアドレスＬＢＡａ乃至ＬＢＡａ＋２ｍ−１で指定される範囲の領域（論理領域）に格納されているものとする。この場合、アプリケーション１２２は、ファイルＦを、当該ファイルＦの格納先に無関係に、当該ファイルＦのファイル名Ｆ１と、オフセットＯＦＳＴ０と、ファイルサイズＦＳとにより認識する。オフセットＯＦＳＴ０の値は０であり、ファイルＦの先頭ブロックＢＬＫ０を示す。ファイルサイズＦＳは、ファイルＦのブロックの数２ｍを示す。
【００２５】
一方、ファイルシステム１２１０は、ファイルＦを、ファイル名Ｆ１と、ブロックＢＬＫ０乃至ＢＬＫ２ｍ−１のオフセットＯＦＳＴ０（＝０）乃至ＯＦＳＴ２ｍ−１（＝２ｍ−１）と、論理ブロックアドレスＬＢＡａ乃至ＬＢＡａ＋２ｍ−１とを対応付けることによって管理する。なお、ファイルシステム１２１０が、ファイルＦを、ファイル名Ｆ１と、オフセットＯＦＳＴ０（＝０）と、ファイルサイズＦＳ（＝２ｍ）と、先頭ブロックＢＬＫ０の論理ブロックアドレスＬＢＡａとを対応付けることによって管理しても良い。
【００２６】
ここで、ファイルＦ内のｍ個のブロックＢＬＫ０乃至ＢＬＫｍ−１が、論理ユニット内において論理ブロックアドレスＬＢＡａ乃至ＬＢＡａ＋ｍ−１で指定される範囲の領域に格納されているものとする。また、ファイルＦ内の残りのｍ個のブロックＢＬＫｍ乃至ＢＬＫ２ｍ−１が、論理ユニット内において論理ブロックアドレスＬＢＡｂ乃至ＬＢＡｂ＋ｍ−１で指定される範囲の領域に格納されているものとする。
【００２７】
この場合、ファイルシステム１２１０が、ファイルＦを、ブロックＢＬＫ０乃至ＢＬＫｍ−１の集合（以下、エクステントＥＸＴ０と称する）とブロックＢＬＫｍ乃至ＢＬＫ２ｍ−１の集合（以下、エクステントＥＸＴ１と称する）とに分けて管理しても良い。即ち、ファイルシステム１２１０が、エクステントＥＸＴ０を、ファイル名Ｆ１と、エクステントＥＸＴ０の先頭ブロックＢＬＫ０のオフセットＯＦＳＴ０（＝０）と、エクステントＥＸＴ０のサイズＥＳ０（＝ｍ）と、ブロックＢＬＫ０の論理ブロックアドレスＬＢＡａとを対応付けることによって管理しても良い。同様に、ファイルシステム１２１０が、エクステントＥＸＴ１を、ファイル名Ｆ１と、エクステントＥＸＴ１の先頭ブロックＢＬＫｍのオフセットＯＦＳＴｍ（＝ｍ）と、エクステントＥＸＴ１のサイズＥＳ１（＝ｍ）と、ブロックＢＬＫｍの論理ブロックアドレスＬＢＡｂとを対応付けることによって管理しても良い。
【００２８】
デバイスドライバ１２３は、ＣＰＵ１１がデバイスドライバプログラムを実行することにより実現される。デバイスドライバ１２３は、ＯＳ１２１の制御の下で、当該ＯＳ１２１と周辺装置との間の通信（データ転送）を実行する。デバイスドライバ１２３は特に、ＯＳ１２１内のファイルシステム１２１０からの要求に従い、図１に示されるＨＩコントローラ１４を介して、階層化ストレージ装置２０にリード要求またはライト要求を送出することにより、階層化ストレージ装置２０へのアクセスを実行する。第１の実施形態では、リード要求またはライト要求で指定されるデータの長さが１ブロックであるものとする。つまり第１の実施形態では、１ブロック単位でのリード要求またはライト要求を想定している。
【００２９】
デバイスドライバ１２３は更に、階層化ストレージ装置２０へのアクセス（１ブロック単位でのアクセス）に関する入出力（input and output : IO）情報を、当該アクセスに応じてデーモン１２４に渡す。ＩＯ情報は、ＩＯ（アクセス）種別を示すＩＯ識別子、アクセス先の論理ブロックアドレス（ＬＢＡ）及びハッシュ値を含む。ハッシュ値は、アクセス先から読み出されたデータ、またはアクセス先に書き込まれるデータに基づいて算出される。このハッシュ値の算出には、例えばＳＨＡ−２５６のようなハッシュ関数が適用される。なお、リード要求またはライト要求によって任意の長さのデータが指定される場合、ＩＯ情報に、当該データの長さ（ブロック数）を示す情報を追加すれば良い。
【００３０】
デーモン１２４は、図１に示されるＣＰＵ１１が、デーモンプロセスプログラムを実行することにより実現され、ストレージコントローラ２３によって管理されるアクセスカウントの補正を支援する補正支援部として機能する。デーモン１２４の機能については、後述する。
【００３１】
ストレージコントローラ２３は、アクセスカウントテーブル２３０を含む。アクセスカウントテーブル２３０は、論理ブロックアドレスに対応付けられたエントリ群を含む。このエントリ群の各々は、対応する論理ブロックアドレスとカウント（アクセスカウント）とを保持するのに用いられる。カウントは、対応する論理ブロックアドレスで指定されるブロックへのアクセスの回数を示し、アクセス頻度またはアクセス統計値と称される。
【００３２】
ストレージコントローラ２３は、アクセスカウントテーブル２３０のエントリ群に保持されたカウントに基づいて、当該エントリ群に対応する論理ブロックアドレスで指定されるブロック（論理ブロック）に、高速ストレージ装置２１または低速ストレージ装置２２内のブロック（物理ブロック）を割り当てる。具体的には、ストレージコントローラ２３は、アクセス回数（カウント）が多い論理ユニット内のブロックに、高速ストレージ装置２１内のブロックを優先的に割り当てる。アクセス回数が多いブロックとは、例えば、アクセス回数が上位の一定数のブロックである。なお、アクセス回数が基準の回数（つまり、閾値）より多いブロックが一定数を超えていないならば、アクセス回数が多いブロックが、アクセス回数が基準の回数より多いブロックであっても構わない。また、ストレージコントローラ２３は、論理ユニット内の残りのブロック（つまり、アクセス回数が少ないブロック）に、低速ストレージ装置２２内のブロックを割り当てる。
【００３３】
ここで、論理ユニット内の第１の論理ブロックへのアクセスの状況が変化したために、当該第１の論理ブロックに割り当てられる物理ブロックが、高速ストレージ装置２１内の第１の物理ブロックから低速ストレージ装置２２内の空きの第２の物理ブロック、または低速ストレージ装置２２内の第３の物理ブロックから高速ストレージ装置２１内の空きの第４の物理ブロックに変更されるものとする。この場合、ストレージコントローラ２３は、第１の物理ブロックから第２の物理ブロックへのデータの再配置（移動）、または第３の物理ブロックから第４の物理ブロックへのデータの再配置を行う。この再配置により、階層化ストレージ装置２０は動的に階層化される。
【００３４】
図３は、図１及び図２に示されるデーモン１２４の典型的な機能構成を示すブロック図である。デーモン１２４は、データ管理テーブル１２４１、ＩＯ情報処理部１２４２及びエントリ削除部１２４３を含む。データ管理テーブル１２４１のエントリは、デバイスドライバ１２３からデーモン１２４に渡されたＩＯ情報中のＩＯ識別子がリードを示している場合に、ＩＯ情報処理部１２４２によって追加される。データ管理テーブル１２４１は、物理的には、デーモン１２４によってアクセス可能なメモリ領域に保持される。このメモリ領域が、主メモリ１２内に存在しても、或いは主メモリ１２とは別のメモリ内に存在しても構わない。データ管理テーブル１２４１のデータ構造については後述する。
【００３５】
ＩＯ情報処理部１２４２は、デバイスドライバ１２３から渡されたＩＯ情報に基づいて、データ管理テーブル１２４１のエントリの追加、データ管理テーブル１２４１からのエントリの検索、及び検索されたエントリの情報の更新を実行する。検索されたエントリの情報の更新とは、旧情報を新情報に変更することだけでなく、検索されたエントリのブランクフィールドへの新情報の設定（追記）をも含む。ＩＯ情報処理部１２４２はまた、デバイスドライバ１２３からのＩＯ情報及びデータ管理テーブル１２４１に基づいて、ＣＯＷ動作を検出する。この検出の概要は次の通りである。
【００３６】
まず、ＯＳ１２１が有するＣＯＷ機能が有効な状態で、アプリケーション１２２から当該ＯＳ１２１に、第１のファイルにデータＤ２を上書きすることを指示するライト要求ＷＲが発行されたものとする。この場合、ＯＳ１２１はライト要求ＷＲに従うＣＯＷ動作のために、このライト要求ＷＲを、リード要求ＲＲ、ライト要求（第１のライト要求）ＷＲ１及びライト要求（第２のライト要求）ＷＲ２に分解する。
【００３７】
リード要求ＲＲは、第１の論理領域（旧領域）からの第１のファイル内のデータの読み出しを指示する。第１の論理領域にはデータＤ１が格納されているものとする。この場合、ライト要求ＷＲ１は、第１の論理領域から読み出されたデータＤ１を第１の論理領域とは別の空きの第２の論理領域（新領域）に書き込む（コピーする）ことを指示する。ライト要求ＷＲ２は、第２の論理領域内のコピーに、ライト要求ＷＲで指定されたデータＤ２を上書きすることを指示する。
【００３８】
次にＯＳ１２１は、デバイスドライバ１２３により階層化ストレージ装置２０に対して、リード要求ＲＲ、第１のライト要求ＷＲ１及び第２のライト要求ＷＲ２によってそれぞれ指示されるリードアクセス、第１のライトアクセス及び第２のライトアクセスを、順に実行させる。ＩＯ情報処理部１２４２は、このような読み出し、書き込み及び書き込みから構成される一連の動作を、デバイスドライバ１２３からのＩＯ情報及びデータ管理テーブル１２４１に基づいて検出することで、ＣＯＷ動作を検出する。
【００３９】
ＩＯ情報処理部１２４２は、ＣＯＷ動作の検出に応じて、第１及び第２の論理領域のＬＢＡ（旧ＬＢＡ及び新ＬＢＡ）を階層化ストレージ装置２０に通知する。この通知をＣＯＷ通知と称する。
【００４０】
エントリ削除部１２４３は、データ管理テーブル１２４１から第１及び第２の条件のいずれかに合致したエントリを削除する。第１の条件に合致するエントリとは、データ管理テーブル１２４１に追加された時点から一定期間が経過したエントリを指す。第２の条件に合致するエントリとは、エントリ内容が更新された時点から一定期間が経過したエントリを指す。一定期間は、例えばコンピュータ１０＿１が、階層化ストレージ装置２０へのアクセスに関するＩＯ応答性能を測定するための特定のコマンドを実行することにより、その結果に基づいて決定されるものとする。
【００４１】
図４は、図２に示されるアクセスカウントテーブル２３０のデータ構造例を示す。図４の例では、アクセスカウントテーブル２３０はエントリ４００を含む。エントリ４００を含むアクセスカウントテーブル２３０のエントリ群の各々は、フィールド４１１及び４１２を含む。
【００４２】
フィールド４１１は、ＬＢＡを保持するのに用いられるＬＢＡフィールドである。フィールド４１２は、フィールド４１１に保持されているＬＢＡで示される領域（ブロック）へのアクセスのカウントを保持するのに用いられるカウントフィールドである。図４の例では、エントリ４００のフィールド４１１及び４１２には、１（ＬＢＡ＝１）及び１００（カウント＝１００）がそれぞれ保持されている。
【００４３】
図５は、図３に示されるデータ管理テーブル１２４１のデータ構造例を示す。データ管理テーブル１２４１の各エントリは、フィールド５１１乃至５１３を含む。フィールド５１１は、当該フィールド５１１を含むエントリがＩＯ情報に基づいてデータ管理テーブル１２４１に追加された場合に、当該ＩＯ情報中のＬＢＡを旧ＬＢＡとして保持するのに用いられる旧ＬＢＡフィールドである。
【００４４】
フィールド５１２は、フィールド５１１に保持されている旧ＬＢＡで示される領域から読み出されたデータのハッシュ値を保持するのに用いられるハッシュ値フィールドである。フィールド５１３は、旧ＬＢＡで示される領域から読み出されたデータのコピー先の領域のＬＢＡを新ＬＢＡとして保持するのに用いられる新ＬＢＡフィールドである。
【００４５】
次に、第１の実施形態においてデーモン１２４によって実行されるデーモン処理について、図６を参照して説明する。図６は、デーモン処理の典型的な手順を示すフローチャートである。
【００４６】
デバイスドライバ１２３は、ＯＳ１２１のからのアクセス要求（リード要求またはライト要求）に応じて、階層化ストレージ装置２０にリード要求またはライト要求を送出する。そしてデバイスドライバ１２３は、階層化ストレージ装置２０へのリード要求またはライト要求に対応するＩＯ情報をデーモン１２４に渡す。
【００４７】
するとデーモン１２のＩＯ情報処理部１２４２は、図６のフローチャートで示されるデーモン処理を開始する。まずＩＯ情報処理部１２４２は、デバイスドライバ１２３からのＩＯ情報を受け取る（ステップＳ１）。ＩＯ情報は、ＩＯ識別子、論理ブロックアドレス（ＬＢＡ）及びハッシュ値を含む。つまりＩＯ情報処理部１２４２は、ＩＯ識別子、ＬＢＡ及びハッシュ値を受け取る。
【００４８】
次にＩＯ情報処理部１２４２は、受領ＩＯ識別子がリードを示すかを判定する（ステップＳ２）。もし、受領ＩＯ識別子がリードを示すならば（ステップＳ２のＹｅｓ）、ＩＯ情報処理部１２４２はステップＳ３に進む。
【００４９】
ステップＳ３においてＩＯ情報処理部１２４２は、データ管理テーブル１２４１に１つのエントリを追加する（ステップＳ３）。エントリが追加された時点では、当該エントリのフィールド５１１乃至５１３はブランクであるものとする。次にＩＯ情報処理部１２４２は、受領ＬＢＡ及び受領ハッシュ値を、追加エントリのフィールド（旧ＬＢＡフィールド）５１１及びフィールド（ハッシュ値フィールド）５１２に、それぞれ設定する（ステップＳ４）。そしてＩＯ情報処理部１２４２は、デーモン処理を終了する。
【００５０】
なお、ステップＳ３においてＩＯ情報処理部１２４２が、受領ＬＢＡ及び受領ハッシュ値が設定されたフィールド５１１及び５１２を含むエントリ５００をデータ管理テーブル１２４１に追加しても良い。この場合、ステップＳ４は不要である。
【００５１】
一方、受領ＩＯ識別子がリードを示さないならば（ステップＳ２のＮｏ）、つまり、受領ＩＯ識別子がライトを示すならば、ＩＯ情報処理部１２４２はステップＳ５に進む。ステップＳ５においてＩＯ情報処理部１２４２は、フィールド５１３がブランクで、且つフィールド５１２の内容が受領ハッシュ値に等しいエントリを、目標とするエントリとしてデータ管理テーブル１２４１から検索する。そして、ＩＯ情報処理部１２４２は、目標とするエントリを検索できたかを判定する（ステップＳ６）。
【００５２】
もし、目標とするエントリを検索できたならば（ステップＳ６のＹｅｓ）、ＩＯ情報処理部１２４２は、検索されたエントリのフィールド５１３に、受領ＬＢＡを新ＬＢＡとして設定する（ステップＳ７）。そしてＩＯ情報処理部１２４２は、デーモン処理を終了する。
【００５３】
これに対し、目標とするエントリを検索できなかったならば（ステップＳ６のＮｏ）、ＩＯ情報処理部１２４２は、フィールド５１３の内容（新ＬＢＡ）が受領ＬＢＡに等しいエントリを、目標とするエントリとしてデータ管理テーブル１２４１から検索する（ステップＳ８）。そして、ＩＯ情報処理部１２４２は、目標とするエントリを検索できたかを判定する（ステップＳ９）。
【００５４】
もし、目標とするエントリを検索できたならば（ステップＳ９のＹｅｓ）、ＩＯ情報処理部１２４２は、ＣＯＷ通知を実行する。即ちＩＯ情報処理部１２４２は、検索されたエントリのフィールド５１１及び５１３の内容（つまり、旧ＬＢＡ及び新ＬＢＡ）を、階層化ストレージ装置２０に通知する（ステップＳ１０）。
【００５５】
次にＩＯ情報処理部１２４２は、検索されたエントリを、第３の条件に合致するエントリとしてデータ管理テーブル１２４１から削除する（ステップＳ１１）。第３の条件に合致するエントリとは、ＩＯ情報処理部１２４２から階層化ストレージ装置２０に通知された旧ＬＢＡ及び新ＬＢＡを含むエントリを指す。ＩＯ情報処理部１２４２はステップＳ１１を実行すると、デーモン処理を終了する。なお検索されたエントリを、エントリ削除部１２４３が削除しても良い。一方、目標とするエントリを検索できなかったならば（ステップＳ９のＮｏ）、ＩＯ情報処理部１２４２は直ちにデーモン処理を終了する。
【００５６】
次に、第１の実施形態におけるデーモン処理の具体例について、図６のフローチャートに加えて、図７乃至図９を参照して説明する。図７は、デーモン処理でエントリが追加されたデータ管理テーブル１２４１の例を示し、図８は、デーモン処理でエントリ内容が更新されたデータ管理テーブル１２４１の例を示す。図９は、アクセスカウントテーブル２３０の内容の遷移の例を示す。
【００５７】
まずアプリケーション１２２が、既に存在しているファイルＦ内のオフセットＯＦＳＴｉにデータＤ２を上書きすることを指定するライト要求ＷＲを発行したものとする。すると、ライト要求ＷＲに応じて、システムコール発行機構からＯＳ１２１にライトシステムコールが発行される。ライト要求ＷＲ及びライトシステムコールは、データＤ２（第１の実施形態では、１ブロックのデータ）がライトされるべきファイルＦ内の位置（ライト位置）に関するファイル情報を含む。
【００５８】
ファイル情報は、１ブロック単位でのリード要求またはライト要求が適用される第１の実施形態では、ファイルＦのファイル名Ｆ１と、オフセットＯＦＳＴｉとを含む。オフセットＯＦＳＴｉは、ｉ番目のオフセット（ＯＦＳＴｉ＝ｉ）を示す。この場合、ファイル情報は、ライト（アクセス）位置が、ファイル名Ｆ１によって示されるファイルＦにおけるｉ番目のオフセット（ブロックの位置）であることを示す。したがって、このようなファイル情報を含むライト要求ＷＲ及びライトシステムコールは、ファイルＦにおけるｉ番目のオフセットにデータを上書きすることを指定する。
【００５９】
なお、ファイル情報が、データサイズＤＳを示す情報を含んでいても良い。上述の例では、データサイズＤＳは１（１ブロック）である。もし、任意のブロック数ｊのデータの読み出しまたは書き込みが適用されるならば、データサイズＤＳはｊ（ｊブロック）である。この場合、ライト位置は、ファイルＦにおけるｉ番目のオフセットＯＦＳＴｉ（ブロックＢＬＫｉ）からｉ＋ｊ−１番目のオフセットＯＦＳＴｉ＋ｊ−１（ブロックＢＬＫｉ＋ｊ−１）までの範囲となる。
【００６０】
ライトシステムコールはＯＳ１２１のファイルシステム１２１０で受領される。ファイルシステム１２１０は、ライトシステムコール（ライト要求ＷＲ）に基づいて、ＣＯＷ動作を開始する。まずファイルシステム１２１０は、ライトシステムコール（ライト要求ＷＲ）を、リード要求ＲＲ、第１のライト要求ＷＲ１及び第２のライト要求ＷＲ２に分解する。そしてファイルシステム１２１０は、リード要求ＲＲをデバイスドライバ１２３により階層化ストレージ装置２０に送出させる。リード要求ＲＲは、ファイルＦにおけるオフセットＯＦＳＴｉの位置のブロックＢＬＫｉのデータ（ブロックデータ）が格納されている論理ブロックのアドレス（即ち論理ブロックアドレス）ＬＢＡｐを含む。つまりリード要求ＲＲは、論理ブロックアドレスＬＢＡｐで指定される論理ブロックからのデータの読み出しを指示する。ＬＢＡｐは例えば１である。
【００６１】
階層化ストレージ装置２０のストレージコントローラ２３は、デバイスドライバ１２３からのリード要求ＲＲに応じて、当該リード要求ＲＲによって指定されたデータを次のように読み出す。まず、ストレージコントローラ２３は、リード要求ＲＲによって指定された論理ブロックアドレスＬＢＡｐ（ＬＢＡ＝ＬＢＡｐ＝１）を、アドレス変換テーブルに基づいて、当該論理ブロックアドレスＬＢＡｐに割り当てられている物理アドレスＰＡｐに変換する。物理アドレスＰＡｐは、高速ストレージ装置２１または低速ストレージ装置２２を指定する階層識別子を含む。ストレージコントローラ２３は、物理アドレスＰＡｐに基づいて、高速ストレージ装置２１または低速ストレージ装置２２からデータＤ１を読み出す。
【００６２】
このデータＤ１の読み出しが実行される前において、アクセスカウントテーブル２３０は、図４に示される状態にあるものとする。つまり、アクセスカウントテーブル２３０のフィールド４１１及び４１２には、１（ＬＢＡ＝１）及び１００（カウント＝１００）がそれぞれ保持されているものとする。この場合、ストレージコントローラ２３は、物理アドレスＰＡｐが割り当てられた論理ブロックアドレスＬＢＡｐを含む、アクセスカウントテーブル２３０内のエントリ４００のフィールド４１２の内容（カウント）を、データＤ１の読み出しに応じて１インクリメントする。これにより、エントリ４００のフィールド４１２のカウント（アクセスカウント）は、図４に示される１００から、図９において矢印Ａ１で示されるように、１０１にインクリメントされる。
【００６３】
また、ストレージコントローラ２３は、読み出されたデータＤ１をデバイスドライバ１２３に返す。デバイスドライバ１２３は、ファイルシステム１２１０からのリード要求ＲＲに対する応答（返り値）として、読み出されたデータＤ１を当該ファイルシステム１２１０に返す。
【００６４】
またデバイスドライバ１２３は、データＤ１のハッシュ値Ｈ１を算出する。そしてデバイスドライバ１２３は、リード要求ＲＲに対応するＩＯ情報を生成する。リード要求ＲＲに対応するＩＯ情報は、リードを示すＩＯ識別子、論理ブロックアドレスＬＢＡｐ（ＬＢＡ＝ＬＢＡｐ）及びハッシュ値Ｈ１を含む。デバイスドライバ１２３は、このＩＯ情報［ＩＯ識別子＝リード，ＬＢＡｐ，Ｈ１］をデーモン１２４に渡す。
【００６５】
するとデーモン１２４のＩＯ情報処理部１２４２は、図６のフローチャートで示されるデーモン処理を、次のように実行する。まずＩＯ情報処理部１２４２はデバイスドライバ１２３から渡されたＩＯ情報［ＩＯ識別子＝リード，ＬＢＡｐ，Ｈ１］を受け取る（ステップＳ１）。ここで、ＩＯ情報中のＬＢＡｐ及びＨ１は、それぞれ、１及び０ｘ１２３４であるものとする。この０ｘ１２３４における記号０ｘは、後続の１２３４が１６進表記であることを示す。
【００６６】
上述のように受領ＩＯ識別子がリードを示す場合（ステップＳ２のＹｅｓ）、ＩＯ情報処理部１２４２は、データ管理テーブル１２４１に１つのエントリを追加する（ステップＳ３）。図７は、エントリ５００が追加されたデータ管理テーブル１２４１の例を示す。エントリ５００が追加された時点では、当該エントリ５００のフィールド５１１乃至５１３はブランクである。
【００６７】
次にＩＯ情報処理部１２４２は、受領ＩＯ情報中のＬＢＡｐ及びＨ１、つまり、受領ＬＢＡｐ（＝１）及び受領ハッシュ値Ｈ１（＝０ｘ１２３４）を、図７に示されるように、エントリ５００のフィールド（旧ＬＢＡフィールド）５１１及びフィールド（ハッシュ値フィールド）５１２に、それぞれ設定する（ステップＳ４）。そしてＩＯ情報処理部１２４２は、デーモン処理を終了する。
【００６８】
一方、ファイルシステム１２１０は、リード要求ＲＲに対する応答を受けて、ライト要求ＷＲ１をデバイスドライバ１２３により階層化ストレージ装置２０に送出させる。ライト要求ＷＲ１は、空きの論理ブロックの論理ブロックアドレスＬＢＡｑを含み、リード要求ＲＲに応じて読み出されたデータＤ１を、論理ブロックアドレスＬＢＡｑで指定される論理ブロックに書き込む（つまりコピーする）ことを指示する。
【００６９】
デバイスドライバ１２３は、ライト要求ＷＲ１を階層化ストレージ装置２０に送出する場合、当該ライト要求ＷＲ１に対応するＩＯ情報を生成する。ライト要求ＷＲ１に対応するＩＯ情報は、ライトを示すＩＯ識別子、論理ブロックアドレスＬＢＡｑ（ＬＢＡ＝ＬＢＡｑ）及びハッシュ値Ｈ２を含む。ＬＢＡｑは、例えば２である。ハッシュ値Ｈ２は、リード要求ＲＲに応じて読み出されたデータＤ１に基づいて算出される。したがって、ハッシュ値Ｈ２は、リード要求ＲＲに対応するＩＯ情報中のハッシュ値Ｈ１に一致する０ｘ１２３４である。デバイスドライバ１２３は、このＩＯ情報［ＩＯ識別子＝ライト，ＬＢＡｑ，Ｈ２］をデーモン１２４に渡す。
【００７０】
するとデーモン１２４のＩＯ情報処理部１２４２は、図６のフローチャートで示されるデーモン処理を、再び実行する。まずＩＯ情報処理部１２４２は、デバイスドライバ１２３から渡されたＩＯ情報［ＩＯ識別子＝ライト，ＬＢＡｑ，Ｈ２］を受け取る（ステップＳ１）。
【００７１】
上述のように受領ＩＯ識別子がライトを示す場合（ステップＳ２のＮｏ）、ＩＯ情報処理部１２４２はステップＳ５に進む。ステップＳ５においてＩＯ情報処理部１２４２は、フィールド５１３がブランクで、且つフィールド５１２の内容が受領ハッシュ値Ｈ２（＝０ｘ１２３４）に等しいエントリを、目標とするエントリとしてデータ管理テーブル１２４１から検索する。
【００７２】
受領ＩＯ情報が、ライト要求ＷＲ１に対応するＩＯ情報である場合、ＩＯ情報処理部１２４２は、図７に示されるエントリ５００を、目標とするエントリとして検索することができる（ステップＳ６のＹｅｓ）。この場合、ＩＯ情報処理部１２４２は、受領ＩＯ情報が、エントリ５００のフィールド５１１に設定されたＬＢＡ（旧ＬＢＡ＝ＬＢＡｐ＝１）で指定される第１の論理領域（ブロック）から読み出されたデータ（Ｄ１）を、受領ＩＯ情報中のＬＢＡｑで指定される第２の論理領域（ブロック）に書き込む（つまりコピーする）ことを指示するライト要求（ＷＲ１）に対応すると判断する。つまりＩＯ情報処理部１２４２は、受領ＩＯ情報が、ＣＯＷ動作におけるコピーのための１回目のライト要求（ＷＲ１）に対応すると判断する。
【００７３】
そこでＩＯ情報処理部１２４２は、図８に示されるように、検索されたエントリ５００のフィールド５１３に、受領ＬＢＡｑ（＝２）を新ＬＢＡとして設定する（ステップＳ７）。そしてＩＯ情報処理部１２４２は、デーモン処理を終了する。
【００７４】
一方、階層化ストレージ装置２０のストレージコントローラ２３は、デバイスドライバ１２３からのライト要求ＷＲ１に応じて、当該ライト要求ＷＲ１を次のように実行する。まず、ストレージコントローラ２３は、ライト要求ＷＲ１によって指定された論理ブロックアドレスＬＢＡｑ（ＬＢＡ＝ＬＢＡｑ＝２）を、当該論理ブロックアドレスＬＢＡｑに割り当てられる物理アドレスＰＡｑに変換する。物理アドレスＰＡｑは、高速ストレージ装置２１または低速ストレージ装置２２を指定する階層識別子を含む。ストレージコントローラ２３は、物理アドレスＰＡｑに基づいて、高速ストレージ装置２１または低速ストレージ装置２２にデータＤ１を書き込む（コピーする）。
【００７５】
このとき、アクセスカウントテーブル２３０は、フィールド４１１に論理ブロックアドレスＬＢＡｑ（＝２）が設定されたエントリ４０１を含んでいないものとする。この状態でストレージコントローラ２３は、図９において矢印Ａ２で示されるように、フィールド４１１及び４１２に、それぞれ論理ブロックアドレスＬＢＡｑ（＝２）及びカウント１が設定されたエントリ４０１をアクセスカウントテーブル２３０に追加する。なお、データＤ１の書き込みの前に、アクセスカウントテーブル２３０が、フィールド４１１の内容が論理ブロックアドレスＬＢＡｑ（＝２）に等しく、且つフィールド４１２がブランクまたはフィールド４１２の内容（カウント）がゼロのエントリ（つまりエントリ４０１に相当するエントリ）を含んでいても構わない。この場合、ストレージコントローラ２３は、このエントリのフィールド４１２に１を設定すれば良い。
【００７６】
また、ストレージコントローラ２３は、ライト要求ＷＲ１に対する応答（返り値）をデバイスドライバ１２３に返す。ファイルシステム１２１０は、ライト要求ＷＲ１に対する応答を受けて、ライト要求ＷＲ２をデバイスドライバ１２３により階層化ストレージ装置２０に送出させる。ライト要求ＷＲ２は、ライト要求ＷＲ１に応じてデータＤ１が書き込まれた（コピーされた）第２の論理ブロックの論理ブロックアドレスＬＢＡｑを含み、アプリケーション１２２からのライト要求ＷＲ（に対応するリードシステムコール）で指定されたデータＤ２を、論理ブロックアドレスＬＢＡｑで指定される論理ブロックに書き込む（つまり上書きする）ことを指示する。
【００７７】
デバイスドライバ１２３は、ライト要求ＷＲ２を階層化ストレージ装置２０に送出する場合、当該ライト要求ＷＲ２に対応するＩＯ情報を生成する。ライト要求ＷＲ２に対応するＩＯ情報は、ライトを示すＩＯ識別子、論理ブロックアドレスＬＢＡｑ（ＬＢＡ＝ＬＢＡｑ＝２）及びハッシュ値Ｈ３を含む。ハッシュ値Ｈ３は、ライト要求ＷＲ２で指定されたデータＤ２に基づいて算出される。したがって、ハッシュ値Ｈ３は、リード要求ＲＲに対応するＩＯ情報中のハッシュ値Ｈ１に一致しない。
【００７８】
デーモン１２４のＩＯ情報処理部１２４２は、上述のＩＯ情報［ＩＯ識別子＝ライト，ＬＢＡｑ，Ｈ３］をデバイスドライバ１２３から受け取る（ステップＳ１）。この場合、ステップＳ２の判定はＮｏとなるため、ＩＯ情報処理部１２４２は再びステップＳ５に進む。
【００７９】
受領ＩＯ情報が、ライト要求ＷＲ２に対応するＩＯ情報である場合、ＩＯ情報処理部１２４２は、フィールド５１３がブランクで、且つフィールド５１２の内容が受領ハッシュ値Ｈ３に等しいエントリを検索することができない（ステップＳ６のＮｏ）。しかしＩＯ情報処理部１２４２は、フィールド５１３の内容（新ＬＢＡ）が受領ＬＢＡ（＝ＬＢＡｑ＝２）に等しいエントリ５００（図８）を検索することができる（ステップＳ９のＹｅｓ）。この場合、ＩＯ情報処理部１２４２は、受領ＩＯ情報が、旧ＬＢＡ（＝ＬＢＡｐ＝１）で指定される第１の論理領域から、当該受領ＩＯ情報中のＬＢＡ（新ＬＢＡ＝ＬＢＡｑ＝２）で指定される第２の論理領域にコピーされたデータ（Ｄ１）に、新たなデータ（Ｄ２）を書き込む（上書きする）ことを指示するライト要求（ＷＲ２）に対応すると判断する。つまりＩＯ情報処理部１２４２は、受領ＩＯ情報が、ＣＯＷ動作における上書きのための２回目のライト要求（ＷＲ２）に対応しており、したがってＣＯＷ動作を検出したと判断する。
【００８０】
そこでＩＯ情報処理部１２４２は、ＣＯＷ通知を実行する。即ちＩＯ情報処理部１２４２は、旧ＬＢＡ（＝ＬＢＡｐ＝１）で指定される第１の論理領域のデータがＣＯＷ動作により新ＬＢＡ（＝ＬＢＡｑ＝２）で指定される第２の論理領域に移動したことを示す情報を、階層化ストレージ装置２０に通知する（ステップＳ１０）。具体的には、ＩＯ情報処理部１２４２は、エントリ５００（目標エントリ）のフィールド５１１及び５１３の内容を、旧ＬＢＡ及び新ＬＢＡの組を示す情報として、階層化ストレージ装置２０に通知する。次にＩＯ情報処理部１２４２は、エントリ５００をデータ管理テーブル１２４１から削除して（ステップＳ１１）、デーモン処理を終了する。
【００８１】
一方、階層化ストレージ装置２０のストレージコントローラ２３は、デバイスドライバ１２３からのライト要求ＷＲ２を受領した場合、当該ライト要求ＷＲ２を実行する。即ちストレージコントローラ２３は、ライト要求ＷＲ２によって指定された論理ブロックアドレスＬＢＡｑ（ＬＢＡ＝ＬＢＡｑ＝２）に割り当てられる物理アドレスＰＡｑに基づいて、高速ストレージ装置２１または低速ストレージ装置２２にデータＤ２を書き込む（上書きする）。つまりストレージコントローラ２３は、ＬＢＡｑで指定される第２の論理領域にコピーされた、ファイルＦのｉ番目のオフセットのデータＤ１を、新たなデータＤ２に更新する。
【００８２】
またストレージコントローラ２３は、ライト要求ＷＲ２の実行（データＤ２の上書き）に応じて、論理ブロックアドレスＬＢＡｑ（ＬＢＡ＝ＬＢＡｑ＝２）を含む、アクセスカウントテーブル２３０内のエントリ４０１を操作する。即ちストレージコントローラ２３は、エントリ４０１のフィールド４１２のカウントを、図９において矢印Ａ３で示されるように、１から２にインクリメントする。
【００８３】
ストレージコントローラ２３は更に、ライト要求ＷＲ２の実行の完了に応じて、ライト要求ＷＲ２に対する応答（正常完了応答）をデバイスドライバ１２３に返す。ファイルシステム１２１０は、この応答をデバイスドライバ１２３から受け取る。するとファイルシステム１２１０は、ライト要求ＷＲに従うＣＯＷ動作を終了し、当該ライト要求ＷＲに対する応答をアプリケーション１２２に返す。またファイルシステム１２１０は、ファイルＦのｉ番目のオフセットに対応付けられた論理ブロックアドレスを、ＬＢＡｐからＬＢＡｑに変更する。そして、ファイルシステム１２１０は、ＬＢＡｐで指定される第１の論理領域を空き領域として、ＬＢＡｑで指定される第２の論理領域を使用中領域として、それぞれ管理する。
【００８４】
ＣＯＷ動作では、データＤ２の上書きの実行中、元のデータＤ１はＬＢＡｐで指定される第１の論理領域に格納されている。このため、上述の上書きの実行中に電源遮断のような障害が発生しても、第１のファイルの内容をＣＯＷ動作の開始前の状態に復元することができる。つまりＣＯＷ動作は、障害が発生しても、データの一貫性を保つことを可能にする。
【００８５】
その後、階層化ストレージ装置２０のストレージコントローラ２３が、デバイスドライバ１２３から上述のＣＯＷ通知を受領したものとする。このＣＯＷ通知は、旧ＬＢＡ（＝ＬＢＡｐ＝１）及び新ＬＢＡ（＝ＬＢＡｑ＝２）の組を含む。この場合、ストレージコントローラ２３は、新ＬＢＡ（＝２）を含む、アクセスカウントテーブル２３０内のエントリ４０１のカウント（＝２）に、旧ＬＢＡ（＝１）を含む、アクセスカウントテーブル２３０内のエントリ４００のカウント（＝１０１）を加算する。つまりストレージコントローラ２３は、デバイスドライバ１２３からＣＯＷ通知に応じて、旧ＬＢＡ（＝１）に対応付けられたカウント（＝１０１）を、旧ＬＢＡのデータのコピー先の新ＬＢＡ（＝２）に対応付けられたカウントに引き継ぐ。そしてストレージコントローラ２３は、エントリ４００のカウントをクリアする。
【００８６】
これにより、アクセスカウントテーブル２３０内のエントリ４００及び４０１のカウントは、図９において矢印Ａ４で示されるように、１０１及び２から、それぞれ０及び１０３に更新される。この更新の結果、エントリ４０１は、ファイルＦのｉ番目のオフセットのデータが格納される（新ＬＢＡ＝２で指定される）論理領域へのアクセスのカウントが１０３であることを示す。即ち、エントリ４０１は、アプリケーション１２２が認識しているファイルＦのｉ番目のオフセットへのアクセスの回数を正しく示す。
【００８７】
第１の実施形態では、ファイルシステム１２１０からデバイスドライバ１２３に、ＣＯＷ動作に無関係のリード要求ＲＲｓが発行された場合にも、データ管理テーブル１２４１にエントリが追加される（ステップＳ３）。しかし、リード要求ＲＲｓに対応するコピーのためのライト要求はファイルシステム１２１０からデバイスドライバ１２３に発行されない。そこで、エントリ削除部１２４３は、リード要求ＲＲｓに対応するＩＯ情報に基づいてデータ管理テーブル１２４１に時刻ＴｓでエントリＥｓが追加された場合、時刻Ｔｓから一定期間の経過（第１の条件の成立）に応じて、当該エントリＥｓを削除する。
【００８８】
また第１の実施形態では、ファイルシステム１２１０からデバイスドライバ１２３に、ＣＯＷ動作に無関係のファイルのコピーのためのライト要求ＷＲｔが発行された場合にも、データ管理テーブル１２４１に追加されたエントリの内容（より詳細には、フィールド５１３の内容）が更新される（ステップＳ７）。しかし、ライト要求ＷＲｔに対応する上書きのためのライト要求はファイルシステム１２１０からデバイスドライバ１２３に発行されない。そこでエントリ削除部１２４３は、ライト要求ＷＲｔに対応するＩＯ情報に基づいてデータ管理テーブル１２４１内のエントリＥｔが時刻Ｔｔで更新された場合、時刻Ｔｔから一定期間の経過（第２の条件の成立）に応じて、当該エントリＥｔを削除する。
【００８９】
上述のエントリ削除のために、データ管理テーブル１２４１内の各エントリに時刻情報が設定されるフィールドを追加すると良い。時刻情報は、対応するエントリが追加された日時または当該対応するエントリの内容が更新された日時を示す。
【００９０】
次に、ファイルシステム１２１０からデバイスドライバ１２３に、ＣＯＷ動作に無関係の新規のデータ書き込みのためのライト要求ＷＲｕが発行されたものとする。このライト要求ＷＲｕに対応するリード要求は存在しない。この場合、ステップＳ２，Ｓ６及びＳ９の判定は全てＮｏとなり、ライト要求ＷＲｕに対応するＩＯ情報は破棄される。
【００９１】
第１の実施形態によれば、デーモン１２４（内のＩＯ情報処理部１２４２）は、デバイスドライバ１２３からのＩＯ情報を処理することで、ファイルシステム１２１０のＣＯＷ動作をリアルタイムに検出して、当該ＣＯＷ動作に関する旧ＬＢＡ及び新ＬＢＡの組を階層化ストレージ装置２０に通知することができる。これにより、階層化ストレージ装置２０のストレージコントローラ２３は、ファイルシステム１２１０のＣＯＷ機能が有効な場合でも、アプリケーション１２２により発行されるアクセス要求（特に、ファイルＦ内にデータを上書きするためのライト要求）の状況を正しく反映した階層化を実現することができる。つまり第１の実施形態によれば、ユーザの利便性の向上に寄与する階層化を実現することができる。しかも、この実現のために、ＯＳ１２１（ファイルシステム１２１０）及びアプリケーション１２２を変更する必要がない。
【００９２】
第１の実施形態では、デーモン１２４はコンピュータ１０＿１に含まれている。しかしデーモン１２４が、階層化ストレージ装置２０に含まれていても構わない。また第１の実施形態では、階層化ストレージ装置２０は、アクセス性能の異なる２つのストレージ装置、つまり高速ストレージ装置２１及び低速ストレージ装置２２を備えている。しかし、階層化ストレージ装置２０が、アクセス性能の異なる３つ以上のストレージ装置を備えていても良い。例えば階層化ストレージ装置２０が、高速ストレージ装置２１及び低速ストレージ装置２２に加えて、アクセス性能が高速ストレージ装置２１のそれより低く、低速ストレージ装置２２のそれよりも高いストレージ装置（中速ストレージ装置）を備えていても良い。
【００９３】
＜第２の実施形態＞
次に、第２の実施形態に係る階層化ストレージシステムについて説明する。第２の実施形態に係る階層化ストレージシステムは、第１の実施形態に係る階層化ストレージシステムと同様のハードウェア構成を有しているものとする。そこで、第２の実施形態に係る階層化ストレージシステムの構成に関する説明に、便宜的に図１を参照する。但し、第２の実施形態における階層化ストレージシステムでは、コンピュータ１０＿１（乃至１０−ｎ）の機能構成が、第１の実施形態におけるそれとは異なる。例えば、第２の実施形態におけるコンピュータ１０＿１は、第１の実施形態におけるコンピュータ１０＿１が有するデーモン１２４とは異なる機能のデーモン１２４ａ（図１０）を含む。したがって、第２の実施形態において必要ならば、図１に示されるデーモン１２４をデーモン１２４ａに読み替えられたい。
【００９４】
以下、第２の実施形態における階層化ストレージシステムの機能構成について、第１の実施形態におけるそれと異なる点を中心に、図１０を参照して説明する。図１０は、第２の実施形態に係る階層化ストレージシステムの典型的な機能構成を示すブロック図である。図１０においてコンピュータ１０＿１は、図２におけるそれとは異なって、キャッシュコントローラ１２５を含む。
【００９５】
キャッシュコントローラ１２５は、キャッシュバッファ１２５０を含む。キャッシュバッファ１２５０は、階層化ストレージ装置２０から読み出されたデータ（リードデータ）、及び階層化ストレージ装置２０に書かれるべきデータ（ライトデータ）を一時格納するのに用いられる。なお、キャッシュバッファ１２５０が、キャッシュコントローラ１２５の外部に設けられていても構わない。キャッシュバッファ１２５０に格納されたデータ（リードデータ及びライトデータ）は、キャッシュデータ（リードキャッシュデータ及びライトキャッシュデータ）と呼ばれる。
【００９６】
キャッシュコントローラ１２５は、キャッシュバッファ１２５０へのデータの格納（書き込み）及びキャッシュバッファ１２５０からのデータの読み出し（つまりキャッシュアクセス）を制御する。キャッシュコントローラ１２５はまた、キャッシュバッファ１２５０に格納されたデータのディレクトリを管理する。なお図１０では、ディレクトリ管理に用いられるディレクトリ管理テーブルは省略されている。
【００９７】
キャッシュコントローラ１２５は更に、ファイルシステム１２１０からのライト要求に基づくキャッシュバッファ１２５０へのライトデータの書き込みに応じて、当該書き込みに関するＩＯ情報をデーモン１２４ａに渡す。キャッシュコントローラ１２５からのＩＯ情報は、ライトデータのハッシュ値及びキャッシュバッファ１２５０における当該ライトデータの書き込み先のアドレス（つまり、バッファアドレス）を含む。
【００９８】
図１１は、図１０に示されるデーモン１２４ａの典型的な機能構成を示すブロック図である。デーモン１２４ａは、データ管理テーブル１２４１ａ、ＩＯ情報処理部１２４２ａ及びエントリ削除部１２４３を含む。データ管理テーブル１２４１ａ、ＩＯ情報処理部１２４２ａは、図３に示されるデータ管理テーブル１２４１及びＩＯ情報処理部１２４２にそれぞれ対応する。しかし、データ管理テーブル１２４１ａのデータ構造はデータ管理テーブル１２４１のそれと異なり、ＩＯ情報処理部１２４２ａの機能はＩＯ情報処理部１２４２のそれと異なる。
【００９９】
ＩＯ情報処理部１２４２ａは、デバイスドライバ１２３またはキャッシュコントローラ１２５から渡されたＩＯ情報に基づいて、データ管理テーブル１２４１ａのエントリの追加、データ管理テーブル１２４１からのエントリの検索、及び検索されたエントリの情報の更新（より詳細には、検索されたエントリへの情報の追記）を実行する。ＩＯ情報処理部１２４２ａはまた、検索されたエントリの情報の更新に基づいて、ＣＯＷ動作を検出する。
【０１００】
図１２は、図１１に示されるデータ管理テーブル１２４１ａのデータ構造例を示す。データ管理テーブル１２４１ａの各エントリは、フィールドＣ１乃至Ｃ４を含む。フィールドＣ１は、当該フィールドＣ１を含むエントリがキャッシュコントローラ１２５からのＩＯ情報に基づいて検索された場合に、当該ＩＯ情報中のバッファアドレスを保持するのに用いられるバッファアドレスフィールドである。
【０１０１】
フィールドＣ２は、当該フィールドＣ２を含むエントリがデバイスドライバ１２３からのＩＯ情報に基づいて追加された場合に、当該ＩＯ情報中のハッシュ値を旧ハッシュ値として保持するのに用いられる旧ハッシュ値フィールドである。フィールドＣ３は、当該フィールドＣ３を含むエントリがキャッシュコントローラ１２５からのＩＯ情報中のバッファアドレスに基づいて検索された場合に、当該ＩＯ情報中のハッシュ値を新ハッシュ値として保持するのに用いられる新ハッシュ値フィールドである。
【０１０２】
フィールドＣ４は、当該フィールドＣ４を含むエントリがデバイスドライバ１２３からのＩＯ情報に基づいて追加された場合に、当該ＩＯ情報中のＬＢＡを旧ＬＢＡとして保持するのに用いられる旧ＬＢＡフィールドである。フィールドＣ５は、当該フィールドＣ５を含むエントリがデバイスドライバ１２３からのＩＯ情報に基づいて検索された場合に、当該ＩＯ情報中のＬＢＡを新ＬＢＡとして保持するのに用いられる新ＬＢＡフィールドである。
【０１０３】
次に、第２の実施形態においてデーモン１２４ａによって実行されるデーモン処理について、図１３乃至図１５を参照して説明する。図１３は、デーモン処理の典型的な手順を示すフローチャートである。図１４は、図１３に示されるデーモン処理に含まれているエントリ・追加更新処理の典型的な手順を示すフローチャート、図１５は、図１３に示されるデーモン処理に含まれているエントリ更新処理の典型的な手順を示すフローチャートである。
【０１０４】
キャッシュコントローラ１２５は、ファイルシステム１２１０から当該キャッシュコントローラ１２５へのライト要求に基づくキャッシュバッファ１２５０へのライトデータの書き込みに応じて、当該書き込みに関するＩＯ情報［ハッシュ値，バッファアドレス］をデーモン１２４ａに渡す。デバイスドライバ１２３は、ファイルシステム１２１０からのアクセス要求（リード要求またはライト要求）に応じて、階層化ストレージ装置２０にリード要求またはライト要求を送出する。デバイスドライバ１２３は、階層化ストレージ装置２０にリード要求またはライト要求を送出した場合、当該リード要求またはライト要求に対応するＩＯ情報［ＩＯ識別子＝リード，ＬＢＡ，ハッシュ値］をデーモン１２４ａに渡す。
【０１０５】
デーモン１２４ａのＩＯ情報処理部１２４２ａは、デバイスドライバ１２３またはキャッシュコントローラ１２５からのＩＯ情報を受け取る（ステップＳ２１）。そしてＩＯ情報処理部１２４２ａは、受領ＩＯ情報が、例えばデバイスドライバ１２３からのＩＯ情報であるかを判定する（ステップＳ２２）。
【０１０６】
ステップＳ２２の判定がＹｅｓであるならば、受領ＩＯ情報は、ＩＯ識別子、ＬＢＡ及びハッシュ値を含む。この場合、ＩＯ情報処理部１２４２ａは、受領ＩＯ識別子がリードを示すかを判定する（ステップＳ２３）。
【０１０７】
もし、ステップＳ２３の判定がＹｅｓであるならば、ＩＯ情報処理部１２４２ａはエントリ追加処理（ステップＳ２４）を次のように実行する。まずＩＯ情報処理部１２４２ａは、受領ＬＢＡに等しいＬＢＡを旧ＬＢＡとして持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２４１）。そして、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できたかを判定する（ステップＳ２４２）。
【０１０８】
もし、ステップＳ２４２の判定がＮｏであるならば、ＩＯ情報処理部１２４２ａは、データ管理テーブル１２４１ａに１つのエントリを追加する（ステップＳ２４３）。エントリが追加された時点では、当該エントリのフィールドＣ１乃至Ｃ５はブランクである。次にＩＯ情報処理部１２４２ａは、受領ハッシュ値及び受領ＬＢＡを、それぞれ旧ハッシュ値及び旧ＬＢＡとして、追加エントリのフィールド（旧ハッシュ値フィールド）Ｃ２及びフィールド（旧ＬＢＡフィールド）Ｃ４に設定する（ステップＳ２４４）。これによりＩＯ情報処理部１２４２は、エントリ追加処理（ステップＳ２４）を終了して、デーモン処理を終了する。これに対してステップＳ２４２の判定がＹｅｓであるならば、ＩＯ情報処理部１２４２ａは、直ちにエントリ追加処理（ステップＳ２４）を終了して、デーモン処理を終了する。
【０１０９】
一方、ステップＳ２３の判定がＮｏであるならば、ＩＯ情報処理部１２４２ａは、エントリ追加・更新処理（ステップＳ２５）を、図１４に示されるフローチャートに従って次のように実行する。まずＩＯ情報処理部１２４２ａは、受領ＬＢＡに等しいＬＢＡを旧ＬＢＡとして持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２５１）。そして、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できたかを判定する（ステップＳ２５２）。
【０１１０】
もし、ステップＳ２５２の判定がＮｏであるならば、ＩＯ情報処理部１２４２ａは、受領ハッシュ値に等しいハッシュ値を新ハッシュ値として持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２５３）。そして、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できたかを判定する（ステップＳ２５４）。
【０１１１】
もし、ステップＳ２５４の判定がＮｏであるならば、ＩＯ情報処理部１２４２ａは、ステップＳ２４３と同様に、データ管理テーブル１２４１ａに１つのエントリを追加する（ステップＳ２５５）。エントリが追加された時点では、当該エントリのフィールドＣ１乃至Ｃ５はブランクである。次にＩＯ情報処理部１２４２ａは、ステップＳ２４４と同様に、受領ハッシュ値及び受領ＬＢＡを、それぞれ旧ハッシュ値及び旧ＬＢＡとして、追加エントリのフィールドＣ２及びＣ４に設定する（ステップＳ２５６）。これによりＩＯ情報処理部１２４２は、エントリ追加・更新処理（ステップＳ２５）を終了して、デーモン処理を終了する。
【０１１２】
これに対し、ステップＳ２５４の判定がＹｅｓであるならば、ＩＯ情報処理部１２４２ａは、ＣＯＷ動作を検出したと判断する。そこでＩＯ情報処理部１２４２ａは、検索されたエントリのフィールドＣ５に、受領ＬＢＡを新ＬＢＡとして設定する（ステップＳ２５７）。
【０１１３】
次にＩＯ情報処理部１２４２ａは、検索されたエントリのフィールドＣ４及びＣ５に設定されている旧ＬＢＡ及び新ＬＢＡの組を階層化ストレージ装置２０に通知する（ステップＳ２５８）。次にＩＯ情報処理部１２４２ａは、検索されたエントリをデータ管理テーブル１２４１ａから削除する（ステップＳ２５９）。これによりＩＯ情報処理部１２４２は、エントリ追加・更新処理（ステップＳ２５）を終了して、デーモン処理を終了する。なお、検索されたエントリを、エントリ削除部１２４３が削除しても良い。
【０１１４】
また、ステップＳ２２の判定がＮｏであるならば、受領ＩＯ情報はバッファアドレス及びハッシュ値を含む。この場合、ＩＯ情報処理部１２４２ａは、エントリ更新処理（ステップＳ２６）を、図１５に示されるフローチャートに従って次のように実行する。まずＩＯ情報処理部１２４２ａは、受領バッファアドレスに等しいバッファアドレスを持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２６１）。そして、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できたかを判定する（ステップＳ２６２）。
【０１１５】
もし、ステップＳ２６２の判定がＹｅｓであるならば、ＩＯ情報処理部１２４２ａは、検索されたエントリのフィールドＣ３に、受領ハッシュ値を新ハッシュ値として設定する（ステップＳ２６３）。これによりＩＯ情報処理部１２４２は、エントリ更新処理（ステップＳ２６）を終了して、デーモン処理を終了する。
【０１１６】
これに対し、ステップＳ２６２の判定がＮｏであるならば、ＩＯ情報処理部１２４２ａは、受領ハッシュ値に等しいハッシュ値を旧ハッシュ値として持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２６４）。そして、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できたかを判定する（ステップＳ２６５）。
【０１１７】
もし、ステップＳ２６５の判定がＹｅｓであるならば、ＩＯ情報処理部１２４２ａは、検索されたエントリのフィールドＣ１に、受領バッファアドレスを設定する（ステップＳ２６６）。そして、ＩＯ情報処理部１２４２ａは、エントリ更新処理（ステップＳ２６）を終了して、デーモン処理を終了する。これに対してステップＳ２６５の判定がＮｏであるならば、ＩＯ情報処理部１２４２ａは、直ちにエントリ追加処理（ステップＳ２６）を終了して、デーモン処理を終了する。
【０１１８】
次に、第２の実施形態におけるデーモン処理の具体例について、図１３乃至図１５のフローチャートに加えて、図１６及び図１７を参照して説明する。図１６は、デーモン処理でエントリが追加されたデータ管理テーブル１２４１ａの例を示し、図１７は、データ管理テーブル１２４１の内容の遷移の例を示す。
【０１１９】
まず、前記第１の実施形態と同様に、アプリケーション１２２が、既に存在しているファイルＦ内のオフセットＯＦＳＴｉにデータＤ２を上書きすることを指定するライト要求ＷＲを発行したものとする。すると、ライト要求ＷＲに応じて、システムコール発行機構からＯＳ１２１にライトシステムコールが発行される。ＯＳ１２１のファイルシステム１２１０は、ライトシステムコールに基づいて、ＣＯＷ動作を開始する。まずファイルシステム１２１０は、ライトシステムコール（ライト要求ＷＲ）を、第１の実施形態と同様に、リード要求ＲＲ、第１のライト要求ＷＲ１及び第２のライト要求ＷＲ２に分解する。そしてファイルシステム１２１０は、リード要求ＲＲを、第１の実施形態と異なって、キャッシュコントローラ１２５に発行する。
【０１２０】
キャッシュコントローラ１２５は、リード要求ＲＲに応じてディレクトリ管理テーブルを参照して、リード要求ＲＲの示すＬＢＡｐに格納されているデータＤ１が、キャッシュバッファ１２５０にも格納されているかを判定する。ここでは、データＤ１は、バッファアドレスＢＡ１で指定されるキャッシュバッファ１２５０内の領域に格納されているものとする。この場合、キャッシュコントローラ１２５は、キャッシュバッファ１２５０からデータＤ１を読み出す。そしてキャッシュコントローラ１２５は、読み出されたデータＤ１を、ファイルシステム１２１０からのリード要求ＲＲに対する応答として当該ファイルシステム１２１０に返す。
【０１２１】
するとファイルシステム１２１０は、次のライト要求ＷＲ１をキャッシュコントローラ１２５に発行する。このように、リード要求ＲＲの示すＬＢＡｐに格納されているデータＤ１がキャッシュバッファ１２５０にも格納されているキャッシュヒット状態（第１の状態）では、リード要求ＲＲは、ファイルシステム１２１０からデバイスドライバ１２３に発行されない。キャッシュヒット状態は、ライト要求ＷＲに基づくＣＯＷ動作が開始される前に、データＤ１のリードまたはライトが既に実行されていることを示す。
【０１２２】
キャッシュヒット状態では、図１６に示されるエントリ１６００が、エントリ追加処理（図１３のステップＳ２４）またはエントリ追加・更新処理（図１３のステップＳ２５）によってデータ管理テーブル１２４１ａに既に追加されている。データＤ１のハッシュ値Ｈ１及びＬＢＡｐが、第１の実施形態と同様に、それぞれ０ｘ１２３４及び１であるものとする。この場合、エントリ１６００のフィールドＣ２及びＣ４には、データＤ１のハッシュ値Ｈ１（＝０ｘ１２３４）及びＬＢＡｐ（＝１）が、それぞれ旧ハッシュ値及び旧ＬＢＡとして設定されている。
【０１２３】
これに対し、データＤ１がキャッシュバッファ１２５０に格納されていないミスヒット状態（第２の状態）の場合、ファイルシステム１２１０からデバイスドライバ１２３にもリード要求ＲＲが発行される。デバイスドライバ１２３は、このリード要求ＲＲを階層化ストレージ装置２０に送出する。階層化ストレージ装置２０のストレージコントローラ２３は、リード要求ＲＲによって指定されたデータＤ１を高速ストレージ装置２１または低速ストレージ装置２２から読み出して、当該データＤ１をデバイスドライバ１２３に返す。デバイスドライバ１２３は、ファイルシステム１２１０からのリード要求ＲＲに対する応答として、読み出されたデータＤ１を当該ファイルシステム１２１０に返す。またデバイスドライバ１２３は第１の実施形態と同様に、データＤ１のハッシュ値Ｈ１を算出し、リード要求ＲＲに対応するＩＯ情報［ＩＯ識別子＝リード，ＬＢＡｐ＝１，Ｈ１＝０ｘ１２３４］をデーモン１２４ａに渡す。一方、キャッシュコントローラ１２５は、リード要求ＲＲに応じてストレージコントローラ２３によって読み出されたデータＤ１を、キャッシュバッファ１２５０の内の空き領域に書き込む。
【０１２４】
デーモン１２４ａのＩＯ情報処理部１２４２ａは、デバイスドライバ１２３から渡されたＩＯ情報［ＩＯ識別子＝リード，ＬＢＡｐ＝１，Ｈ１＝０ｘ１２３４］を受け取る（ステップＳ２１）。この場合、ＩＯ情報処理部１２４２ａは、ステップＳ２２及びＳ２３を介して、エントリ追加処理（ステップＳ２４）を実行する。これにより、ＩＯ情報処理部１２４２ａは、図１６に示されるように、受領ハッシュ値Ｈ１（＝０ｘ１２３４）及び受領ＬＢＡｐ（＝１）を旧ハッシュ値及び旧ＬＢＡとして持つエントリ１６００を、データ管理テーブル１２４１ａに追加する。
【０１２５】
一方、ファイルシステム１２１０は、リード要求ＲＲに対するデバイスドライバ１２３またはキャッシュコントローラ１２５からの応答を受けて、ライト要求ＷＲ１をキャッシュコントローラ１２５に発行する。キャッシュコントローラ１２５は、ライト要求ＷＲ１に応じて、ＬＢＡｑで指定される論理ブロックに書かれるべき（コピーされるべき）データＤ１を、キャッシュバッファ１２５０内の空き領域に書き込む。この領域のバッファアドレスがＢＡ２（＝０ｘ０１）であるものとする。
【０１２６】
次にキャッシュコントローラ１２５は、ライト要求ＷＲ１に対する応答をファイルシステム１２１０に返す。また、キャッシュコントローラ１２５は、ライト要求ＷＲ１に対応するＩＯ情報［ハッシュ値Ｈ２（＝Ｈ１＝０ｘ１２３４），バッファアドレスＢＡ２（＝０ｘ０１）］を、デーモン１２４ａに渡す。
【０１２７】
デーモン１２４ａのＩＯ情報処理部１２４２ａは、キャッシュコントローラ１２５から渡されたＩＯ情報［ハッシュ値Ｈ２（＝Ｈ１＝０ｘ１２３４），バッファアドレスＢＡ２（＝０ｘ０１）］を受け取る（ステップＳ２１）。この場合、ＩＯ情報処理部１２４２ａは、ステップＳ２２を介して、エントリ更新処理（ステップＳ２６）を、次のように実行する。
【０１２８】
まずＩＯ情報処理部１２４２ａは、受領バッファアドレスＢＡ２（＝０ｘ０１）に等しいバッファアドレスを持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２６１）。ここでは、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できない（ステップＳ２６２のＮｏ）。
【０１２９】
そこでＩＯ情報処理部１２４２ａは、受領ハッシュ値Ｈ２（＝Ｈ１＝０ｘ１２３４）に等しいハッシュ値を旧ハッシュ値として持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２６４）。ここでは、ＩＯ情報処理部１２４２ａは、エントリ１６００（図１６）を、目標とするエントリとして検索することができる（ステップＳ２６５のＹｅｓ）。そこでＩＯ情報処理部１２４２ａは、図１７において矢印Ａ１１で示されるように、エントリ１６００のフィールドＣ１に、受領バッファアドレスＢＡ２（＝０ｘ０１）を設定する（ステップＳ２６６）。
【０１３０】
さてファイルシステム１２１０は、ライト要求ＷＲ１に対するキャッシュコントローラ１２５からの応答を受け取ると、次のライト要求ＷＲ２をキャッシュコントローラ１２５に発行する。するとキャッシュコントローラ１２５は、先行するライト要求ＷＲ１に応じてデータＤ１が書かれたキャッシュバッファ１２５０内の領域、つまり、バッファアドレスＢＡ２（＝０ｘ０１）で指定される領域に、ライト要求ＷＲ２によって指定されたデータＤ２を上書きする。
【０１３１】
次にキャッシュコントローラ１２５は、ライト要求ＷＲ２に対する応答をファイルシステム１２１０に返す。また、キャッシュコントローラ１２５は、ライト要求ＷＲ２に対応するＩＯ情報［ハッシュ値Ｈ３（＝０ｘ１３５７），バッファアドレスＢＡ２（＝０ｘ０１）］を、デーモン１２４ａに渡す。
【０１３２】
デーモン１２４ａのＩＯ情報処理部１２４２ａは、キャッシュコントローラ１２５から渡されたＩＯ情報［ハッシュ値Ｈ３（＝０ｘ１３５７），バッファアドレスＢＡ２（＝０ｘ０１）］を受け取る（ステップＳ２１）。この場合、ＩＯ情報処理部１２４２ａは、ステップＳ２２を介して、エントリ更新処理（ステップＳ２６）を、次のように実行する。
【０１３３】
まずＩＯ情報処理部１２４２ａは、受領バッファアドレスＢＡ２（＝０ｘ０１）に等しいバッファアドレスを持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２６１）。ここでは、ＩＯ情報処理部１２４２ａは、エントリ１６００（図１７）を目標とするエントリとして検索することができる（ステップＳ２６２のＹｅｓ）。そこでＩＯ情報処理部１２４２ａは、図１７において矢印Ａ１２で示されるように、エントリ１６００のフィールドＣ３に、受領ハッシュ値Ｈ３（＝０ｘ１３５７）を新ハッシュ値として設定する（ステップＳ２６３）。
【０１３４】
さてファイルシステム１２１０は、ライト要求ＷＲ２をキャッシュコントローラ１２５に発行した場合、ライト要求ＷＲ１の発行時とは異なり、当該ライト要求ＷＲ２をデバイスドライバ１２３により階層化ストレージ装置２０に送出させる。すると階層化ストレージ装置２０のストレージコントローラ２３は、ライト要求ＷＲ２によって指定された論理ブロックアドレスＬＢＡｑ（＝２）に割り当てられる物理アドレスＰＡｑに基づいて、高速ストレージ装置２１または低速ストレージ装置２２にデータＤ２を書き込む。そしてストレージコントローラ２３は、ライト要求ＷＲ２に対する応答をデバイスドライバ１２３に返す。ファイルシステム１２１０は、この応答をデバイスドライバ１２３から受け取る。するとファイルシステム１２１０は、ライト要求ＷＲに従うＣＯＷ動作を終了する。以降のファイルシステム１２１０の動作は、第１の実施形態と同様である。
【０１３５】
さてデバイスドライバ１２３は、ライト要求ＷＲ２を階層化ストレージ装置２０に送出する場合、第１の実施形態と同様に、当該ライト要求ＷＲ２に対応するＩＯ情報［ＩＯ識別子＝ライト，ＬＢＡｑ（＝２），Ｈ３（＝０ｘ１３５７）］を生成する。ＩＯ情報処理部１２４２ａは、このＩＯ情報［ＩＯ識別子＝ライト，ＬＢＡｑ（＝２），Ｈ３（＝０ｘ１３５７）］を受け取ると（ステップＳ２１）、ステップＳ２２及びＳ２３を介して、エントリ追加・更新処理（ステップＳ２５）を次のように実行する。
【０１３６】
まずＩＯ情報処理部１２４２ａは、受領ＬＢＡｑ（＝２）に等しいＬＢＡを旧ＬＢＡとして持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２５１）。ここでは、ＩＯ情報処理部１２４２ａは、目標とするエントリを検索できない（ステップＳ２５２のＮｏ）。
【０１３７】
そこでＩＯ情報処理部１２４２ａは、受領ハッシュ値Ｈ３（＝０ｘ１３５７）に等しいハッシュ値を新ハッシュ値として持つエントリを、目標とするエントリとしてデータ管理テーブル１２４１ａから検索する（ステップＳ２５３）。ここでは、ＩＯ情報処理部１２４２ａは、エントリ１６００（図１７）を目標とするエントリとして検索することができる（ステップＳ２５４のＹｅｓ）。
【０１３８】
この場合、ＩＯ情報処理部１２４２ａは、図１７において矢印Ａ１３で示されるように、エントリ１６００のフィールドＣ５に、受領ＬＢＡｑ（＝２）を新ＬＢＡとして設定する（ステップＳ２５７）。次にＩＯ情報処理部１２４２ａは、エントリ１６００のフィールドＣ４及びＣ５の内容（つまり、旧ＬＢＡ及び新ＬＢＡ）を階層化ストレージ装置２０に通知するためのＣＯＷ通知を実行する（ステップＳ２５８）。そしてＩＯ情報処理部１２４２ａは、エントリ１６００をデータ管理テーブル１２４１から削除する（ステップＳ２５９）。
【０１３９】
階層化ストレージ装置２０のストレージコントローラ２３は、ＩＯ情報処理部１２４２ａからのＣＯＷ通知に応じて、アクセスカウントテーブル２３０内の旧ＬＢＡ（＝ＬＢＡｐ＝１）に対応付けられたカウントを、アクセスカウントテーブル２３０内の新ＬＢＡ（＝ＬＢＡｑ＝２）に対応付けられたカウントに引き継ぐ。そしてストレージコントローラ２３は、旧ＬＢＡ（＝ＬＢＡｐ＝１）に対応付けられたカウントをクリアする。
【０１４０】
第２の実施形態によれば、デーモン１２４ａ（内のＩＯ情報処理部１２４２ａ）は、デバイスドライバ１２３及びキャッシュコントローラ１２５からのＩＯ情報を処理することで、ファイルシステム１２１０のＣＯＷ動作をリアルタイムに検知して、当該ＣＯＷ動作に関する旧ＬＢＡ及び新ＬＢＡを階層化ストレージ装置２０に通知することができる。これにより、階層化ストレージ装置２０のストレージコントローラ２３は、ファイルシステム１２１０のＣＯＷ機能が有効で、且つコンピュータ１０＿１（乃至１０＿ｎ）がキャッシュを備えている場合でも、アプリケーション１２２により発行されるアクセス要求（特に、ファイルＦ内にデータを上書きするためのライト要求）の状況を正しく反映した階層化を実現することができる。しかも、この実現のために、ＯＳ１２１（ファイルシステム１２１０）及びアプリケーション１２２を変更する必要がない。
【０１４１】
＜第３の実施形態＞
次に、第３の実施形態に係る階層化ストレージシステムについて説明する。第３の実施形態に係る階層化ストレージシステムは、第１及び第２の実施形態に係る階層化ストレージシステムと同様のハードウェア構成を有しているものとする。そこで、第３の実施形態に係る階層化ストレージシステムの構成に関する説明に、便宜的に図１を参照する。但し、第３の実施形態における階層化ストレージシステムでは、コンピュータ１０＿１（乃至１０−ｎ）の機能構成が、第１及び第２の実施形態におけるそれとは異なる。例えば、第３の実施形態におけるコンピュータ１０＿１は、デバイスドライバ１２３及びデーモン１２４（１２４ａ）とは異なる機能のデバイスドライバ１２３ｂ及びデーモン１２４ｂ（図１８）を含む。また、第３の実施形態におけるコンピュータ１０＿１上では、アプリケーション１２２とは異なる機能のアプリケーション１２２ｂ（図１８）が走行する。したがって、第３の実施形態において必要ならば、図１に示されるアプリケーション１２２、デバイスドライバ１２３及びデーモン１２４を、それぞれアプリケーション１２２ｂ、デバイスドライバ１２３ｂ及びデーモン１２４ｂに読み替えられたい。
【０１４２】
以下、第３の実施形態における階層化ストレージシステムの機能構成について、第１の実施形態におけるそれと異なる点を中心に、図１８を参照して説明する。図１８は、第３の実施形態に係る階層化ストレージシステムの典型的な機能構成を示すブロック図である。
【０１４３】
図１８に示されるコンピュータ１０＿１上では、アプリケーション１２２ｂが走行する。アプリケーション１２２ｂは、リード要求またはライト要求に対応するＩＯ情報を生成して、当該ＩＯ情報をデーモン１２４ｂに渡す。アプリケーション１２２ｂからのＩＯ情報は、ファイル情報［ファイル名，オフセット］とハッシュ値とを含む。このハッシュ値は、ファイル情報［ファイル名，オフセット］で指定されるファイル内の位置から読み出されたデータ、または当該ファイル内の位置に書き込まれるデータに基づいて算出される。
【０１４４】
また、図１８に示されるコンピュータ１０＿１において、デバイスドライバ１２３ｂは、ファイルシステム１２１０からのリード要求またはライト要求に対応するＩＯ情報を生成して、当該ＩＯ情報をデーモン１２４ｂに渡す。デバイスドライバ１２３ｂからのＩＯ情報は、リード要求またはライト要求の指定するＬＢＡと、リード要求またはライト要求に応じてリードまたはライトされるデータのハッシュ値とを含む。デーモン１２４ｂは、アプリケーション１２２ｂ及びデバイスドライバ１２３からのＩＯ情報に基づいて、ＣＯＷ動作により存在する、１つの［ファイル名，オフセット］に対応する複数のＬＢＡを検出する。
【０１４５】
図１９は、図１８に示されるデーモン１２４ｂの典型的な機能構成を示すブロック図である。デーモン１２４ｂは、ファイル−ＬＢＡテーブル３０１、カウントテーブル３０２、テーブル管理部３０３、テーブル管理部３０４、及びカウント補正部３０５を含む。
【０１４６】
ファイル−ＬＢＡテーブル３０１のエントリ群の各々は、後述のように、ファイル情報［ファイル名，オフセット］とＬＢＡリストとを対応付けて保持するのに用いられる。カウントテーブル３０２のエントリ群の各々は、後述のように、ＬＢＡとカウントと最終アクセス日時情報とを保持するのに用いられる。
【０１４７】
テーブル管理部３０３は、第１のテーブル管理処理を実行し、アプリケーション１２２ｂ及びデバイスドライバ１２３ｂからのＩＯ情報に基づいてファイル−ＬＢＡテーブル３０１を管理（更新）する。テーブル管理部３０４は、第２のテーブル管理処理を実行し、デバイスドライバ１２３ｂからのＩＯ情報に基づいてカウントテーブル３０２を管理（更新）する。
【０１４８】
アプリケーション１２２ｂからのＩＯ情報は、ファイル名、オフセット及びハッシュ値を含む。ＩＯ情報中のハッシュ値は、当該ＩＯ情報中のファイル名及びオフセットで指定されるファイル内の位置から読み出されたデータ、または当該ファイル内の位置に書き込まれるデータに基づいて算出される。デバイスドライバ１２３ｂからのＩＯ情報は、アクセス先のＬＢＡ及びハッシュ値を含む。つまりデバイスドライバ１２３ｂからのＩＯ情報は、ＩＯ識別子を含まない点を除けば、デバイスドライバ１２３からのそれと同様である。
【０１４９】
カウント補正部３０５は、階層化ストレージ装置２０内のアクセスカウントテーブル２３０のカウントを補正するのに用いられるカウント補正情報を、ファイル−ＬＢＡテーブル３０１及びカウントテーブル３０２に基づいて生成して、当該カウント補正情報を階層化ストレージ装置２０に送信するためのカウント補正処理を実行する。カウント補正部３０５はカウント補正処理において、同一ファイル内の同一オフセットへのアクセスでありながら、ＣＯＷ動作によって複数のＬＢＡへのアクセスとしてカウントされた状態を、ファイル−ＬＢＡテーブル３０１及びカウントテーブル３０２に基づいて検出する。カウント補正部３０５はカウント補正処理において、ＬＢＡリスト内の最後にアクセスされたＬＢＡに対応付けられたカウント（アクセスカウントテーブル２３０のカウント）を、同一ファイル内の同一オフセットへのアクセスの回数に一致させるのに用いられる補正値（補正カウント）を算出する。カウント補正部３０５はカウント補正処理において、この算出結果に基づいて、ＬＢＡ及び補正カウントの組の列を含むカウント補正情報を階層化ストレージ装置２０に送出する。
【０１５０】
図２０は、図１９に示されるファイル−ＬＢＡテーブル３０１のデータ構造例を示す。ファイル−ＬＢＡテーブル３０１のエントリ群の各々は、フィールドＥ１乃至Ｅ３を含む。フィールドＥ１は、ファイル名を保持するのに用いられるファイル名フィールドであり、フィールドＥ２は、当該ファイル名で示されるファイル内のオフセットを保持するのに用いられるオフセットフィールドである。つまり、フィールドＥ１及びＥ２はファイル情報［ファイル名，オフセット］を保持するのに用いられる。フィールドＥ３は、対応するエントリのフィールドＥ１及びＥ２の内容で示されるファイル内のオフセットのデータが格納されている１つ以上のＬＢＡを保持するのに用いられるＬＢＡリストフィールドである。つまり、フィールドＥ３は、ＣＯＷ動作により、１つの［ファイル名，オフセット］に対応する複数のＬＢＡが存在する可能性があることを想定して用意される。このような構造を有するファイル−ＬＢＡテーブル３０１は、一種のマッピングテーブルである。
【０１５１】
図２１は、図１９に示されるカウントテーブル３０２のデータ構造例を示す。カウントテーブル３０２のエントリ群の各々は、フィールドＧ１乃至Ｇ３を含む。フィールドＧ１は、ＬＢＡを保持するのに用いられるＬＢＡフィールドである。フィールドＧ２は、対応するエントリのフィールドＧ１に保持されているＬＢＡで示される領域（ブロック）へのアクセスのカウントを保持するのに用いられるカウントフィールドである。フィールドＧ３は、対応するエントリが最後にアクセスされた日時を示す最終アクセス日時情報を保持するのに用いられる最終アクセス日時フィールドである。
【０１５２】
次に、第３の実施形態においてテーブル管理部３０３によって実行される第１のテーブル管理処理について、図２２を参照して説明する。図２２は、第１のテーブル管理処理の典型的な手順を示すフローチャートである。
【０１５３】
まず、アプリケーション１２２ｂが、リード要求またはライト要求を発行したものとする。アプリケーション１２２ｂからのリード要求またはライト要求は、アクセス先を示すファイル情報［ファイル名，オフセット］を含む。このリード要求またはライト要求に応じて、システムコール発行機構からＯＳ１２１にリードシステムコールまたはライトシステムコールが発行される。
【０１５４】
ＯＳ１２１のファイルシステム１２１０は、このリードシステムコールまたはライトシステムコールに応じて、デバイスドライバ１２３ｂにより階層化ストレージ装置２０にリード要求またはライト要求を送出させる。このデバイスドライバ１２３ｂからのリード要求またはライト要求は、アクセス先を示すＬＢＡを含む。階層化ストレージ装置２０のストレージコントローラ２３は、このリード要求またはライト要求によって指定されたＬＢＡに割り当てられている物理アドレスに基づいて、高速ストレージ装置２１または低速ストレージ装置２２からのデータの読み出し、または高速ストレージ装置２１または低速ストレージ装置２２へのデータの書き込みを実行する。
【０１５５】
このデータの読み出し、または書き込みに応じて、アプリケーション１２２ｂからデーモン１２４ｂに、ＩＯ情報［ファイル名，オフセット，ハッシュ値］が渡される。同様に、デバイスドライバ１２３ｂからデーモン１２４ｂに、ＩＯ情報［ＬＢＡ，ハッシュ値］が渡される。
【０１５６】
デーモン１２４ｂのテーブル管理部３０３は、アプリケーション１２２ｂからのＩＯ情報［ファイル名，オフセット，ハッシュ値］、及びデバイスドライバ１２３ｂからのＩＯ情報［ＬＢＡ，ハッシュ値］を受け取る（ステップＳ３１）。テーブル管理部３０３は、両方の受領ハッシュ値が等しい場合、受領ファイル名及び受領オフセットを、受領ＬＢＡと関連付ける（ステップＳ３２）。なお、両方の受領ハッシュ値が等しくない場合、テーブル管理部３０３は第１のテーブル管理処理を終了する。但し、この手順は、図２２のフローチャートでは省略されている。
【０１５７】
次にテーブル管理部３０３は、受領ファイル名及び受領オフセットに等しいファイル名及びオフセットを持つエントリを、目標とするエントリとしてファイル−ＬＢＡテーブル３０１から検索する（ステップＳ３３）。そして、テーブル管理部３０３は、目標とするエントリを検索できたかを判定する（ステップＳ３４）。ステップＳ３３の判定がＹｅｓの場合、テーブル管理部３０３は、ファイル−ＬＢＡテーブル３０１内の目標エントリ以外のエントリ群の中から受領ＬＢＡに等しいＬＢＡを持つ他のエントリを検索する（ステップＳ３５）。そして、テーブル管理部３０３は、受領ＬＢＡに等しいＬＢＡを持つ他のエントリを検索できたかを判定する（ステップＳ３６）。
【０１５８】
テーブル管理部３０３は、目標エントリのフィールドＥ３中のＬＢＡリストに、受領ＬＢＡに等しいＬＢＡが含まれていないならば、ステップＳ３６の判定結果に無関係に、当該ＬＢＡリストに受領ＬＢＡを追加する（ステップＳ３８）。したがって、ステップＳ３６の判定がＹｅｓであるならば、同一のＬＢＡで指定される領域（論理ブロック）が、異なるファイル名及びオフセットの組に基づいてアクセスされたことになる。このことは、ＣＯＷ動作で使用された論理ブロックが回収されて再利用されたことを示す。そこでテーブル管理部３０３は、ステップＳ３６の判定がＹｅｓの場合、ステップＳ３８に先行してステップＳ３７を実行する。ステップＳ３７においてテーブル管理部３０３は、カウント補正部３０５を起動して、当該カウント補正部３０５によりカウント補正処理を実行させる。
【０１５９】
一方、ステップＳ３４の判定がＮｏの場合、テーブル管理部３０３は、受領ＬＢＡに等しいＬＢＡを持つエントリを、ファイル−ＬＢＡテーブル３０１から検索する（ステップＳ３９）。そして、テーブル管理部３０３は、受領ＬＢＡに等しいＬＢＡを持つエントリを検索できたかを判定する（ステップＳ４０）。
【０１６０】
テーブル管理部３０３は、ステップＳ４０の判定結果に無関係に、受領ファイル名、受領オフセット及び受領ＬＢＡを持つエントリをファイル−ＬＢＡテーブル３０１に追加する（ステップＳ４２）。したがって、ステップＳ４０の判定がＹｅｓであるならば、同一のＬＢＡで指定される論理ブロックが、異なるファイル名及びオフセットの組に基づいてアクセスされたことになる。このことは、ＣＯＷ動作で使用された論理ブロックが回収されて再利用されたことを示す。そこでテーブル管理部３０３は、ステップＳ４０の判定がＹｅｓの場合、ステップＳ４２に先行してステップＳ４１を実行する。ステップＳ４１においてテーブル管理部３０３は、カウント補正部３０５を起動して、当該カウント補正部３０５によりカウント補正処理を実行させる。テーブル管理部３０３は、ステップＳ３８またはＳ４２を実行すると、第１のテーブル管理処理を終了する。
【０１６１】
次に、第３の実施形態においてテーブル管理部３０４によって実行される第２のテーブル管理処理について、図２３を参照して説明する。図２３は、第２のテーブル管理処理の典型的な手順を示すフローチャートである。
【０１６２】
まず、ファイルシステム１２１０が、デバイスドライバ１２３ｂにより階層化ストレージ装置２０にリード要求またはライト要求を送出させたものとする。これにより、階層化ストレージ装置２０のストレージコントローラ２が、高速ストレージ装置２１または低速ストレージ装置２２からのデータの読み出し、または高速ストレージ装置２１または低速ストレージ装置２２へのデータの書き込みを実行したものとする。
【０１６３】
このデータの読み出し、または書き込みに応じて、デバイスドライバ１２３ｂからデーモン１２４ｂに、ＩＯ情報［ＬＢＡ，ハッシュ値］が渡される。デーモン１２４ｂのテーブル管理部３０４は、デバイスドライバ１２３ｂからのＩＯ情報［ＬＢＡ，ハッシュ値］を受け取る（ステップＳ５１）。
【０１６４】
次にテーブル管理部３０４は、受領ＬＢＡに等しいＬＢＡを持つエントリを、目標とするエントリとしてカウントテーブル３０２から検索する（ステップＳ５２）。そして、テーブル管理部３０３は、受領ＬＢＡに等しいＬＢＡを持つエントリを検索できたかを判定する（ステップＳ５３）。ステップＳ５３の判定がＹｅｓであるならば、テーブル管理部３０３は、検索されたエントリ中のカウントを１インクリメントし、且つ当該検索されたエントリ中の最終アクセス日時情報を現在の日時を示すように更新する（ステップＳ５４）。
【０１６５】
これに対し、テップＳ５３の判定がＮｏであるならば、テーブル管理部３０３は、受領ＬＢＡ、カウント１、及び現在の日時を示す最終アクセス日時情報を含むエントリを、カウントテーブル３０２に追加する（ステップＳ５５）。テーブル管理部３０３は、ステップＳ５４またはＳ５５を実行すると、第２のテーブル管理処理を終了する。
【０１６６】
次に、第３の実施形態において、テーブル管理部３０３によってカウント補正部３０５が起動された場合に（図２２のステップ３７またはＳ４１）、当該カウント補正部３０５によって実行されるカウント補正処理について、図２４を参照して説明する。図２４は、カウント補正処理の典型的な手順を示すフローチャートである。第３の実施形態においてカウント補正部３０５は、階層化ストレージ装置２０のストレージコントローラ２３が、階層化処理を実行する場合にも、当該ストレージコントローラ２３からの要求に応じて起動される。
【０１６７】
カウント補正部３０５は、ファイル−ＬＢＡテーブル３０１の全てのエントリについて、以下のステップＳ６１を含む処理を繰り返す（ステップＳ６０）。ここでは、カウントテーブル３０２の第ｉエントリについて、ステップＳ６１を含む処理が実行されるものとする。
【０１６８】
まずカウント補正部３０５は、第ｉエントリ中のＬＢＡリストが２つ以上のＬＢＡを含むかを判定する（ステップＳ６１）。ステップＳ６１の判定がＹｅｓである場合、カウント補正部３０５は、第ｉエントリ中のファイル名及びオフセットの組で指定されるブロックへのアクセスの要求（アプリケーション１２２ｂからのアクセス要求）に基づいてＣＯＷ動作が行われていると判定する。つまりカウント補正部３０５は、第ｉエントリが、ＣＯＷ動作に基づいてアクセスされたＬＢＡ（２つ以上のＬＢＡ）を全て含んでいると判定する。そこでカウント補正部３０５は、第ｉエントリに含まれる全てのＬＢＡを取得する（ステップＳ６２）。
【０１６９】
次にカウント補正部３０５は、取得されたＬＢＡをそれぞれ持つエントリを、カウントテーブル３０２から検索する（ステップＳ６３）。そしてカウント補正部３０５は、検索された全てのエントリの最終アクセス日時情報の示す最終アクセス日時を比較して、最終アクセス日時が最新のエントリを選択する（ステップＳ６４）。
【０１７０】
次にカウント補正部３０５は、選択されなかった残りのエントリ（つまり、１つ以上のエントリ）中のカウントの合計を算出し、選択されたエントリ中のカウントを、算出された合計に変更する（ステップＳ６５）。またカウント補正部３０５は、選択されなかった残りのエントリ中のカウントを、負の値に変更する（ステップＳ６６）。これによりカウント補正部３０５は、第ｉエントリについての処理を終了する。
【０１７１】
これに対し、ステップＳ６１の判定がＮｏである場合、カウント補正部３０５は、第ｉエントリ中のファイル名及びオフセットの組で指定されるブロックは、ＣＯＷ動作とは無関係であると判定する。そこでカウント補正部３０５は、アクセスカウントテーブル２３０において第ｉエントリ中の単一のＬＢＡと対応付けられたカウントを補正する必要はないと判定する。この場合、カウント補正部３０５は第ｉエントリについての処理を終了する。カウント補正部３０５は、以上の処理（ステップＳ６１を含む処理）を、ファイル−ＬＢＡテーブル３０１の全エントリについて繰り返す（ステップＳ６０）。
【０１７２】
するとカウント補正部３０５は、カウントテーブル３０２に基づいてカウント補正情報を作成して、当該カウント補正情報を階層化ストレージ装置２０に送信する（ステップＳ６７）。カウント補正情報は、ＬＢＡと補正カウントの組の列を含む。補正カウントは、ステップＳ６５またはＳ６６で変更されたカウントである。次にカウント補正部３０５は、ファイル−ＬＢＡテーブル３０１及びカウントテーブル３０２の全てのエントリを削除して（ステップＳ６８）、カウント補正処理を終了する（ステップＳ６９）。
【０１７３】
次に、第１の実施形態における第１のテーブル管理処理、第２のテーブル管理処理及びカウント補正処理の具体例について、図２２乃至図２４のフローチャートに加えて、図２５乃至図３１を参照して説明する。図２５は第１のテーブル管理処理でエントリが追加されたファイル−ＬＢＡテーブルの例を示す図であり、図２６は第２のテーブル管理処理でエントリが追加されたカウントテーブルの例を示す図である。図２７は第３の実施形態におけるカウントテーブルの内容の遷移の例を示す図であり、図２８は、第１のテーブル管理処理でエントリ中のＬＢＡリストの内容が更新されたファイル−ＬＢＡテーブルの例を示す図である。図２９はカウント補正処理で作成されたカウント補正情報の例を示す図であり、図３０は第３の実施形態におけるアクセスカウントテーブルの内容の例を示す図であり、図３１は第３の実施形態における補正されたアクセスカウントテーブルの内容の例を示す図である。
【０１７４】
まず説明を簡略化するために、ファイル−ＬＢＡテーブル３０１及びカウントテーブル３０２が初期化されているものする。この状態で、アプリケーション１２２ｂが新たなファイルＦのオフセット０のブロックのデータを作成したものとする。ファイルＦのファイル名はＦ１であり、ファイルＦのオフセット０のブロックのデータはＤ１であり、当該データＤ１のハッシュ値は０ｘ１２３４であるものとする。また、データＤ１は、ＬＢＡが１（ＬＢＡ＝ＬＢＡｐ＝１）の論理ブロックに書き込まれるものとする。
【０１７５】
この場合、アプリケーション１２２ｂはデーモン１２４ｂにＩＯ情報［ファイル名＝Ｆ１，オフセット＝０，ハッシュ値＝０ｘ１２３４］を渡す。これに対してデバイスドライバ１２３ｂは、デーモン１２４ｂにＩＯ情報［ＬＢＡ＝１，ハッシュ値＝０ｘ１２３４］を渡す。
【０１７６】
するとデーモン１２４ｂのテーブル管理部３０３は、ＩＯ情報［ファイル名＝Ｆ１，オフセット＝０，ハッシュ値＝０ｘ１２３４］中のファイル名＝Ｆ１及びオフセット＝０と、ＩＯ情報［ＬＢＡ＝１，ハッシュ値＝０ｘ１２３４］中のＬＢＡ＝１とを、ハッシュ値＝０ｘ１２３４に基づいて関連付ける（図２２のステップＳ３１及びＳ３２）。そしてテーブル管理部３０３は、図２５に示されるように、ファイル名＝Ｆ１、オフセット＝０及びＬＢＡ＝１を持つエントリ２５０１を、ファイル−ＬＢＡテーブル３０１に追加する（図２２のステップＳ３３，Ｓ３４，Ｓ３９，Ｓ４０及びＳ４２）。一方、テーブル管理部３０４は、図２６に示されるように、ＬＢＡ＝１、カウント＝１、及び現在の日時（2015/xx/yy 15:00）を示す最終アクセス日時情報を持つエントリ２６０１を、カウントテーブル３０２に追加する。（図２３のステップＳ５１乃至Ｓ５３及びＳ５５）。
【０１７７】
その後、アプリケーション１２２ｂが、ファイルＦのオフセット０からのデータＤ１の読み出しを実行したものとする。この場合、アプリケーション１２２ｂはデーモン１２４ｂにＩＯ情報［ファイル名＝Ｆ１，オフセット＝０，ハッシュ値＝０ｘ１２３４］を渡す。これに対してデバイスドライバ１２３ｂは、デーモン１２４ｂにＩＯ情報［ＬＢＡ＝１，ハッシュ値＝０ｘ１２３４］を渡す。
【０１７８】
するとデーモン１２４ｂのテーブル管理部３０３は、ＩＯ情報［ファイル名＝Ｆ１，オフセット＝０，ハッシュ値＝０ｘ１２３４］中のファイル名＝Ｆ１及びオフセット＝０と、ＩＯ情報［ＬＢＡ＝１，ハッシュ値＝０ｘ１２３４］中のＬＢＡ＝１とを、ハッシュ値＝０ｘ１２３４に基づいて関連付ける（図２２のステップＳ３１及びＳ３２）。このとき、ファイル−ＬＢＡテーブル３０１は、ファイル名＝Ｆ１及びオフセット＝０を持つエントリ２５０１を含む（図２２のステップＳ３４のＹｅｓ）。エントリ２５０１には、ＬＢＡ＝１が存在する。このためテーブル管理部３０３は、図２２のステップ３８を実行しない。したがってエントリ２５０１のフィールドＥ３の内容は更新されない。
【０１７９】
一方、カウントテーブル３０２は、図２６に示されるように、ＬＢＡ＝１を持つエントリ２６０１を含む（図２３のステップＳ５３のＹｅｓ）。そこでテーブル管理部３０３は、図２６に示される状態にあるエントリ２６０１中のカウントを１インクリメントすることにより、図２７において矢印Ａ２１で示されるように当該カウントを２に更新し、且つ最終アクセス日時情報が現在の日時（2015/xx/yy 16:00）を示すように当該最終アクセス日時情報を更新する（図２３のステップＳ５４）。
【０１８０】
その後、アプリケーション１２２ｂが、ファイルＦのオフセット０にデータＤ２を上書きすることを指示するライト要求ＷＲを発行したものとする。この場合、ライト要求ＷＲに応じたファイルシステム１２１０のＣＯＷ動作により、当該ライト要求ＷＲが、リード要求ＲＲ、ライト要求ＷＲ１及びライト要求ＷＲ２に分解される。そして、リード要求ＲＲ、ライト要求ＷＲ１及びライト要求ＷＲ２が実行されることにより、データＤ１が書き込まれているＬＢＡ（＝ＬＢＡｐ＝１）とは異なるＬＢＡ（＝ＬＢＡｐ＝２）の論理ブロックに、データＤ２が書き込まれるものとする。データＤ２のハッシュ値は、前述のように０ｘ１３５７である。
【０１８１】
この場合、アプリケーション１２２ｂは、ライト要求ＷＲに対応するＩＯ情報［ファイル名＝Ｆ１，オフセット＝０，ハッシュ値＝０ｘ１３５７］をデーモン１２４ｂに渡す。これに対してデバイスドライバ１２３ｂは、リード要求ＲＲに対応するＩＯ情報［ＬＢＡ＝１，ハッシュ値＝０ｘ１２３４］、ライト要求ＷＲ１に対応するＩＯ情報［ＬＢＡ＝２，ハッシュ値＝０ｘ１２３４］、及びライト要求ＷＲ２に対応するＩＯ情報［ＬＢＡ＝２，ハッシュ値＝０ｘ１３５７］を逐次デーモン１２４ｂに渡す。
【０１８２】
ライト要求ＷＲに対応するＩＯ情報及びライト要求ＷＲ２に対応するＩＯ情報は、いずれもハッシュ値＝０ｘ１３５７を含む。そこでデーモン１２４ｂのテーブル管理部３０３は、ライト要求ＷＲに対応するＩＯ情報中のファイル名＝Ｆ１及びオフセット＝０と、ライト要求ＷＲ２に対応するＩＯ情報中のＬＢＡ＝２とを、ハッシュ値＝０ｘ１３５７に基づいて関連付ける（図２２のステップＳ３１及びＳ３２）。
【０１８３】
これに対して、リード要求ＲＲ及びライト要求ＷＲ１の各々に対応するＩＯ情報は、ハッシュ値＝０ｘ１３５７とは異なるハッシュ値（＝０ｘ１２３４）を含む。このためテーブル管理部３０３は、リード要求ＲＲ及びライト要求ＷＲ１の各々に対応するＩＯ情報中のＬＢＡを、ライト要求ＷＲに対応するＩＯ情報中のファイル名＝Ｆ１及びオフセット＝０と関連付けない。このことは、テーブル管理部３０３（デーモン１２４ｂ）が、リード要求ＲＲ、ライト要求ＷＲ１及びライト要求ＷＲ２のうちのライト要求ＷＲ２のみを、ライト要求ＷＲに対応するアクセス要求であると認識することと等価である。
【０１８４】
このとき、ファイル−ＬＢＡテーブル３０１は、図２５に示されるように、ファイル名＝Ｆ１及びオフセット＝０を持つエントリ２５０１を含む。この場合、テーブル管理部３０３は、エントリ２５０１を目標エントリとして検索することができる（図２２のステップＳ３４のＹｅｓ）。図２５に示されるエントリ２５０１には、ＬＢＡ＝２は存在しない。そこでテーブル管理部３０３は、図２５に示されるエントリ２５０１のフィールドＥ３中のＬＢＡリストに、ＬＢＡ＝２を追加する（図２２のステップＳ３８）。これにより、エントリ２５０１中のＬＢＡリストの内容は、図２８に示されるように変更される。
【０１８５】
一方、エントリ２６０１の内容が、図２７において矢印Ａ２１で示されるように更新されたカウントテーブル３０２は、ＬＢＡ＝２を持つエントリを含まない（図２３のステップＳ５３のＮｏ）。この場合、テーブル管理部３０４は、図２７において矢印Ａ２２で示されるように、ＬＢＡ＝２、カウント＝１、及び現在の日時（2015/xx/yy 17:00）を示す最終アクセス日時情報を持つエントリ２６０２を、カウントテーブル３０２に追加する。（図２３のステップＳ５５）。
【０１８６】
その後、ストレージコントローラ２３が階層化処理を実行するために、コンピュータ１０＿１にカウント補正情報を要求したものとする。すると、コンピュータ１０＿１のデーモン１２４ｂのカウント補正部３０５は、図２４に示されるフローチャートに従ってカウント補正処理を実行する。これによりカウント補正部３０５は、カウント補正情報を作成する（図２４のステップＳ６７）。
【０１８７】
このとき、ファイル−ＬＢＡテーブル３０１は、図２８に示される状態にあるエントリ２５０１を含み、カウントテーブル３０２は、図２７において矢印Ａ２２で示される状態にあるエントリ２６０１及び２６０２を含むものとする。この状態において、エントリ２５０１中のＬＢＡリストは、２つのＬＢＡ、即ちＬＢＡ＝１及びＬＢＡ＝２を含む。同様にエントリ２６０１及び２６０２は、それぞれ、ＬＢＡ＝１及びＬＢＡ＝２を含む。
【０１８８】
そこでカウント補正部３０５は、エントリ２５０１中のＬＢＡリストからＬＢＡ＝１及びＬＢＡ＝２を取得する（図２４のステップＳ６１及びＳ６２）。またカウント補正部３０５は、ファイル−ＬＢＡテーブル３０１から、ＬＢＡ＝１及びＬＢＡ＝２をそれぞれ有するエントリ２６０１及び２６０２を検索する（図２４のステップＳ６３）。そしてカウント補正部３０５は、エントリ２６０１及び２６０２から、最終アクセス日時が最新のエントリ２６０２を選択する（図２４のステップＳ６４）。選択されなかったエントリ２６０１中のカウントは２である。この場合、このカウント＝２が、選択されなかった１つ以上のエントリの合計として用いられる。
【０１８９】
そこでカウント補正部３０５は、選択されたエントリ２６０２中のカウント（＝１）を、２（より詳細には、＋２）に変更する（図２４のステップＳ６５）。またカウント補正部３０５は、選択されなかったエントリ２６０１中のカウント（＝２）を負の値、つまり−２に変更する（図２４のステップＳ６６）。
【０１９０】
次にカウント補正部３０５は、変更後のカウントテーブル３０２の内容（即ち変更後のエントリ２６０１及び２６０２中のＬＢＡ及びカウントの組）に基づいて、図２９に示されるカウント補正情報を作成する（図２４のステップＳ６７）。このカウント補正情報は、変更後のカウントテーブル３０２中のＬＢＡ及びカウントの組の列を、ＬＢＡ及び補正カウントの組の列として含むリスト［（ＬＢＡ＝１，補正カウント＝−２），（ＬＢＡ＝２，補正カウント＝＋２）］から構成される、ステップＳ６７においてカウント補正部３０５は、作成されたカウント補正情報を階層化ストレージ装置２０に送信する。そして、カウント補正部３０５は、ファイル−ＬＢＡテーブル３０１のエントリ２５０１及びカウントテーブル３０２のエントリ２６０１及び２６０２を全て削除する（図２４ステップＳ６８）。
【０１９１】
一方、階層化ストレージ装置２０のストレージコントローラ２３は、デバイスドライバ１２３ｂからのリード要求またはライト要求に応じて、例えば、指定のＬＢＡ（受領ＬＢＡ）及びカウント＝１を含むエントリをアクセスカウントテーブル２３０に追加する。また、指定のＬＢＡを含むエントリがアクセスカウントテーブル２３０に存在する場合、ストレージコントローラ２３は当該エントリ中のカウントを１インクリメントする。
【０１９２】
第３の実施形態では、アプリケーション１２２ｂが新たなファイルＦのオフセット０のブロックのデータＤ１を作成した場合に、デバイスドライバ１２３ｂから階層化ストレージ装置２０に、ＬＢＡ＝１へのデータＤ１の書き込みを指定するライト要求が送出されたものとする。その後、アプリケーション１２２ｂがファイルＦのオフセット０のブロックからのデータの読み出しを要求した場合、デバイスドライバ１２３ｂから階層化ストレージ装置２０に、ＬＢＡ＝１からのデータの読み出しを指定するリード要求が送出されたものとする。その後、アプリケーション１２２ｂがファイルＦのオフセット０のブロックへのデータＤの上書きを要求した場合、第１の実施形態と同様に、ファイルシステム１２１０のＣＯＷ動作に従い、デバイスドライバ１２３ｂから階層化ストレージ装置２０に、リード要求ＲＲ、ライト要求ＷＲ１及びライト要求ＷＲ２が、順次送出される。
【０１９３】
この場合、アクセスカウントテーブル２３０は、図３０に示されるように、ＬＢＡ＝１及びＬＢＡ＝２をそれぞれ持つエントリ３００１及び３００２を含む。また、ＬＢＡ＝１及びＬＢＡ＝２に対応付けられたエントリ３００１及び３００２中のカウントは、図３０に示されるように、それぞれ３及び２である。
【０１９４】
ストレージコントローラ２３は、カウント補正部３０５から階層化ストレージ装置２０に、図２９に示されるカウント補正情報［（ＬＢＡ＝１，補正カウント＝−２），（ＬＢＡ＝２，補正カウント＝＋２）］が送信された場合、当該カウント補正情報に基づいて、アクセスカウントテーブル２３０を次のように補正する。まずストレージコントローラ２３は、アクセスカウントテーブル２３０に含まれていて、且つカウント補正情報の先頭の要素（ＬＢＡ＝１，補正カウント＝−２）中のＬＢＡ（＝１）に等しいＬＢＡを持つエントリ３００１を選択する。そしてストレージコントローラ２３は、エントリ３００１中のカウント＝３に補正カウント＝−２を加算する。これにより、エントリ３００１中のカウントは、図３１に示されるように１に補正される。
【０１９５】
次にストレージコントローラ２３は、アクセスカウントテーブル２３０に含まれていて、且つカウント補正情報の次（最後）の要素（ＬＢＡ＝２，補正カウント＝＋２）中のＬＢＡ（＝２）に等しいＬＢＡを持つエントリ３００２を選択する。そしてストレージコントローラ２３は、エントリ３００２中のカウント＝２に補正カウント＝＋２を加算する。これにより、エントリ３００１中のカウントは、図３１に示されるように４に補正される。
【０１９６】
アクセスカウントテーブル２３０のエントリ３００１及び３００２中のカウントの合計（第１の合計）は、補正前及び補正後のいずれの状態においても５である（図３０及び図３１）。これに対して、カウントテーブル３０２のエントリ２６０１及び３６０２中のカウントの合計（第２の合計）は３であり（図２７）、第１の合計に一致しない。その理由は、デーモン１２４ｂが、リード要求ＲＲ、ライト要求ＷＲ１及びライト要求ＷＲ２のうちのライト要求ＷＲ２のみを、アプリケーション１２２ｂからのライト要求ＷＲに対応していると認識することによる。
【０１９７】
しかし、第３の実施形態によれば、アクセスカウントテーブル２３０とカウントテーブル３０２とでカウントのずれが生じるとしても、アプリケーション１２２ｂが認識するファイルアクセスの状況に合致するカウントに極力近づけるように、アクセスカウントテーブル２３０を補正することができる。これにより、階層化ストレージ装置２０のストレージコントローラ２３は、ファイルシステム１２１０のＣＯＷ機能が有効な場合でも、アプリケーション１２２ｂにより発行されるアクセス要求の状況を比較的正しく反映した階層化を実現することができる。
【０１９８】
＜第３の実施形態の変形例＞
次に、第３の実施形態の変形例に係る階層化ストレージシステムについて説明する。本変形例の第１の特徴は、コンピュータ１０＿１が、スナップショットに関する情報を扱う機能を有するデーモン１２４ｃ（図３２）を含むことにある。したがって、本変形例において必要ならば、図１に示されるデーモン１２４をデーモン１２４ｃに読み替えられたい。また、第３の実施形態と同様に、図１に示されるアプリケーション１２２及びデバイスドライバ１２３を、それぞれアプリケーション１２２ｂ及びデバイスドライバ１２３ｂに読み替えられたい。
【０１９９】
以下、第３の実施形態の変形例における階層化ストレージシステムの機能構成について、第３の実施形態におけるそれと異なる点を中心に、図３２を参照して説明する。図３２は、第３の実施形態の変形例に係る階層化ストレージシステムの典型的な機能構成を示すブロック図である。図３２においてコンピュータ１０＿１は、第３の実施形態におけるそれとは異なって、スナップショット部１２６を含む。また、図３２においてコンピュータ１０＿１は、第３の実施形態におけるデーモン１２４ｂに代えて用いられるデーモン１２４ｃを含む。
【０２００】
スナップショット部１２６は、ファイルのバックアップ（つまり、スナップショット）の作成及び削除を実行する。この実行のために、スナップショット部１２６はスナップショットの作成要求または削除要求をＯＳ１２１に発行する。作成要求または削除要求は、作成または削除されるべきスナップショットに関するＩＯ情報を含む。このＩＯ情報は、スナップショットとしてバックアップされるべきファイルまたは削除されるべきスナップショットに対応するファイルのファイル名と、当該スナップショットのスナップショット名とを含む。
【０２０１】
本変形例において、ファイルのスナップショットは、当該ファイルが格納されている領域（第１の領域）に作成される。つまり、ファイルのスナップショットは、当該ファイルのデータが移動されることなく作成される。このためスナップショットの作成直後は、第１の領域内のファイル（つまり元のファイル）がスナップショットとして参照される。よって、スナップショットのための特別な領域を必要としない。ＣＯＷ機能が有効な状態で、アプリケーション１２２ｂが元のファイルを変更する場合、ファイルシステム１２１０は、ＣＯＷ動作により、ファイルの新たなデータを、元のファイルの領域とは異なる領域に書き込む。変更前のデータは、スナップショットとして参照された状態にある。
【０２０２】
スナップショット部１２６は、スナップショットの作成要求または削除要求をＯＳ１２１に発行する場合、当該作成要求または削除要求に対応する上述のＩＯ情報をデーモン１２４ｃに渡す。デーモン１２４ｃは、第３の実施形態で示された機能に加えて、スナップショットを管理する機能を有する。
【０２０３】
図３３は、図３２に示されるデーモン１２４ｃの典型的な機能構成を示すブロック図である。デーモン１２４ｃは、第３の実施形態におけるデーモン１２４ｂと同様に、ファイル−ＬＢＡテーブル３０１、テーブル管理部３０３、テーブル管理部３０４、及びカウント補正部３０５を含む。デーモン１２４ｃは更に、第３の実施形態におけるカウントテーブル３０２に代えて用いられるカウントテーブル３０２ｃ、及び図３２に示されるスナップショット部１２６に対応するスナップショット管理部３０６とを含む。
【０２０４】
図３４は、図３３に示されるカウントテーブル３０２ｃのデータ構造例を示す。カウントテーブル３０２ｃのエントリ群の各々は、第３の実施形態におけるカウントテーブル３０２のそれと同様にフィールドＧ１乃至Ｇ３を含む。カウントテーブル３０２ｃのエントリ群の各々は更に、カウントテーブル３０２のそれとは異なり、フィールドＧ４を含む。フィールドＧ４は、対応するエントリのフィールドＧ１の内容（ＬＢＡ）で示される論理ブロックに格納されたデータが、異なるスナップショットとして同時に参照されている数（被参照数）を示す。
【０２０５】
図３３に示されるスナップショット管理部３０６は、スナップショット部１２６からの、スナップショット作成要求に対応するＩＯ情報［ファイル名，スナップショット名］に基づいて、第１のスナップショット管理処理を実行する。またスナップショット管理部３０６は、スナップショット部１２６からのスナップショット削除要求に対応するＩＯ情報［ファイル名，スナップショット名］に基づいて、第２のスナップショット管理処理を実行する。
【０２０６】
次に、第３の実施形態の変形例においてスナップショット管理部３０６によって実行される第１のスナップショット管理処理について、図３５を参照して説明する。図３５は、第１のスナップショット管理処理の典型的な手順を示すフローチャートである。
【０２０７】
まずスナップショット部１２６が、ファイルシステム１２１０にスナップショット作成要求を発行したものとする。スナップショット作成要求は、ファイルＦのファイル名Ｆ１及びスナップショット名ＳＳ１の組を含むものとする。これによりファイルシステム１２１０は、ファイル名Ｆ１で示されるファイルＦを、スナップショット名ＳＳで示されるスナップショットとして管理する。スナップショット部１２６はまた、スナップショット作成要求に含まれているファイル名Ｆ１及びスナップショット名ＳＳ１の組と同一のＩＯ情報［ファイル名＝Ｆ１，スナップショット名＝ＳＳ１］をデーモン１２４ｃに渡す。
【０２０８】
するとデーモン１２４ｃのスナップショット管理部３０６は、図３５のフローチャートで示される第１のスナップショット管理処理を、次のように実行する。まずスナップショット管理部３０６は、スナップショット部１２６から渡されたＩＯ情報［ファイル名＝Ｆ１，スナップショット名＝ＳＳ１］を受け取る（ステップＳ７１）。
【０２０９】
次にスナップショット管理部３０６は、ファイル−ＬＢＡテーブル３０１から、受領ファイル名Ｆ１に一致するファイル名を持つエントリを全て選択する（ステップＳ７２）。そしてスナップショット管理部３０６は、選択された全エントリからＬＢＡリストを抽出する（ステップＳ７３）。
【０２１０】
次にスナップショット管理部３０６は、抽出された全ＬＢＡリスト中の全てのＬＢＡに基づいて、ファイル−ＬＢＡテーブル３０１に含まれていて、且つ当該ＬＢＡとそれぞれ対応付けられたエントリを全て参照する（ステップＳ７４）。ステップＳ７４においてスナップショット管理部３０６は、参照された全エントリから、最新の最終アクセス日時を示すエントリを選択し、選択されたエントリからＬＢＡを抽出する。つまりスナップショット管理部３０６は、参照された全エントリから、最終アクセス日時が最新のＬＢＡを抽出する。抽出されたＬＢＡは、スナップショットとして作成されるべきファイル（より詳細には、ファイル内のあるオフセット）の最新のデータが格納されている論理領域（ブロック）を示す。
【０２１１】
次にスナップショット管理部３０６は、カウントテーブル３０２ｃに含まれていて、且つ抽出されたＬＢＡを含むＬＢＡリスト中の全ＬＢＡにそれぞれ対応付けられたエントリを全て選択し、選択された全エントリ中の被参照数をいずれも１インクリメントする（ステップＳ７５）。次にスナップショット管理部３０６は、受領スナップショット名ＳＳ１をファイル名として持ち、且つ抽出されたＬＢＡ（つまり、最新のＬＢＡ）をＬＢＡリストとして持つエントリを、ファイル−ＬＢＡテーブル３０１に追加する（ステップＳ７６）。スナップショット管理部３０６は、追加されたエントリ中のオフセットとして、ステップＳ７２においてファイル−ＬＢＡテーブル３０１から選択された全エントリのうち、最新のＬＢＡを含むＬＢＡリストを持つエントリに設定されたオフセットを用いる。スナップショット管理部３０６はステップＳ７６を実行すると、第１のスナップショット管理処理を終了する。
【０２１２】
次に、第３の実施形態の変形例においてスナップショット管理部３０６によって実行される第２のスナップショット管理処理について、図３６を参照して説明する。図３６は、第２のスナップショット管理処理の典型的な手順を示すフローチャートである。
【０２１３】
まずスナップショット部１２６が、ファイルシステム１２１０にスナップショット削除要求を発行したものとする。スナップショット削除要求は、ファイルＦのファイル名Ｆ１及びスナップショット名ＳＳ１の組を含むものとする。スナップショット部１２６はまた、スナップショット作成要求に含まれているファイル名Ｆ１及びスナップショット名ＳＳ１の組と同一のＩＯ情報［ファイル名＝Ｆ１，スナップショット名＝ＳＳ１］をデーモン１２４ｃに渡す。
【０２１４】
するとデーモン１２４ｃのスナップショット管理部３０６は、図３６のフローチャートで示される第２のスナップショット管理処理を、次のように実行する。まずスナップショット管理部３０６は、スナップショット部１２６から渡されたＩＯ情報［ファイル名＝Ｆ１，スナップショット名＝ＳＳ１］を受け取る（ステップＳ８１）。
【０２１５】
次にスナップショット管理部３０６は、ファイル−ＬＢＡテーブル３０１から、受領フスナップショット名ＳＳ１に一致するファイル名を持つエントリを全て選択する（ステップＳ８２）。そしてスナップショット管理部３０６は、ステップＳ８３及びＳ８４を実行する。ステップＳ８３及びＳ８４は、前述の第１のスナップショット管理処理におけるステップＳ７３及びＳ７４に相当する。したがってスナップショット管理部３０６は、ステップＳ８３及びＳ８４の実行により、最新のＬＢＡを抽出する。必要ならば、第１のスナップショット管理処理に関する前述の説明において、ステップＳ７３及びＳ７４を、ステップＳ８３及びＳ８４に読み替えられたい。
【０２１６】
次にスナップショット管理部３０６は、カウントテーブル３０２ｃに含まれていて、且つ抽出されたＬＢＡを含むＬＢＡリスト中の全ＬＢＡにそれぞれ対応付けられたエントリを全て選択し、選択された全エントリ中の被参照数をいずれも１ディクリメントする（ステップＳ８５）。次にスナップショット管理部３０６は、ディクリメント操作（ステップＳ８６）によって値が０となった被参照数を持つ全てのエントリを、目標とするエントリとしてカウントテーブル３０２ｃから検索する（ステップＳ８７）。
【０２１７】
もし、目標とするエントリを検索できたならば（ステップＳ８７のＹｅｓ）、スナップショット管理部３０６は検索された全エントリ中のカウントの合計Ｎを算出し、且つ当該全エントリ中のカウントを０に変更する（ステップＳ８８）。検索されたエントリ中のＬＢＡは、以前に１つ以上のスナップショットとして参照されていたものの、現在は参照されなくなったデータの格納先の論理ブロックを示す。なお、１つのエントリだけが検出されたならば、スナップショット管理部３０６は、当該１つのエントリ中のカウントを、合計Ｎとして決定する。
【０２１８】
次にスナップショット管理部３０６は、ファイル−ＬＢＡテーブル３０１を参照することにより、検索されたエントリ中のＬＢＡを含むＬＢＡリストを持つエントリを全て特定する（ステップＳ８９）。ステップＳ８９においてスナップショット管理部３０６は、特定された全エントリの中から、２つ以上のＬＢＡを含むＬＢＡリストを全て抽出する。抽出されたＬＢＡリストは、検索されたエントリ中のＬＢＡを含む。つまりスナップショット管理部３０６は、検索されたエントリ中のＬＢＡに一致するするＬＢＡ以外に、１つ以上のＬＢＡを含む２つ以上のＬＢＡリストを、ファイル−ＬＢＡテーブル３０１から全て抽出する。
【０２１９】
次にスナップショット管理部３０６は、第１（２）のスナップショット管理処理におけるステップＳ７４（Ｓ８４）に相当するステップＳ９０を実行する。即ちスナップショット管理部３０６は、ステップＳ８９において抽出された全ＬＢＡリスト中の全てのＬＢＡに基づいて、ファイル−ＬＢＡテーブル３０１に含まれていて、且つ当該ＬＢＡとそれぞれ対応付けられたエントリを全て参照する。そしてスナップショット管理部３０６は、参照された全エントリから、最終アクセス日時が最新のＬＢＡを抽出する。
【０２２０】
次にスナップショット管理部３０６は、カウントテーブル３０２ｃに含まれていて、且つステップＳ９０において抽出された最新のＬＢＡに対応付けられたエントリ中のカウントに、ステップＳ８８において算出された合計Ｎを加算する（ステップＳ９１）。つまり、スナップショット管理部３０６は、ステップＳ８８において０に変更されたカウントの変更前の値の合計Ｎを、最新のＬＢＡに対応付けられたエントリ中のカウントに引き継ぐ。
【０２２１】
次にスナップショット管理部３０６は、ステップＳ８２において選択されたエントリを全てファイル−ＬＢＡテーブル３０１から削除する（ステップＳ９２）。そしてスナップショット管理部３０６は、第２のスナップショット管理処理を終了する。
【０２２２】
第３の実施形態の変形例によれば、スナップショット管理部３０６は、スナップショットとして参照されなくなったデータの格納先を示すＬＢＡに対応付けられたカウントを、ＣＯＷ動作によって変更された格納先を示す最新のＬＢＡに対応付けられたカウントに加算することができる。これにより、階層化ストレージ装置２０のストレージコントローラ２３は、ファイルシステム１２１０のＣＯＷ機能が有効で、且つ階層化ストレージシステム（のコンピュータ１０＿１）がスナップショットを適用している場合でも、アプリケーション１２２により発行されるアクセス要求の状況を正しく反映した階層化を実現することができる。
【０２２３】
前記第１乃至第３の実施形態、及び前記第３の実施形態の変形例では、ファイルの各オフセットのデータは、当該ファイルの作成時期に無関係に、アクセスカウントに応じて、高速ストレージ装置２１または低速ストレージ装置２２に再配置される。この再配置について、簡単に説明する。
【０２２４】
まず、ファイルＦａのオフセットＯＦＳＴａのデータＤａが、ＬＢＡａで指定される論理ブロックＬＢａに格納されているものとする。この場合、ストレージコントローラ２３は、アクセスカウントテーブル２３０においてＬＢＡａに対応付けられたアクセスカウントＣＮＴａ（例えば、一定期間におけるアクセスカウント）が、閾値ＴＨを超えるか否かに応じて、データＤａを高速ストレージ装置２１または低速ストレージ装置２２のいずれに再配置するかを決定する。具体的には、ＣＮＴａ＞ＴＨであって、且つデータＤａが低速ストレージ装置２２に配置されている場合、当該データＤａは高速ストレージ装置２１に再配置される。
【０２２５】
しかし、ファイルＦａが最近作成されている場合、ＣＮＴａがＴＨを超えるのに時間を要し、データＤａは比較的長い期間、低速ストレージ装置２２に配置される。そこで、ファイルＦａが新規に作成された場合、ストレージコントローラ２３が、当該ファイルＦａの各オフセットのデータを、アクセスカウントに無関係に高速ストレージ装置２１に配置しても構わない。このような構成では、コピーオンライト動作の特徴により、データの上書きも、新規書き込みとして、高速ストレージ装置２１に対して行われる。このため、高速ストレージ装置２１の記憶容量が足りなくなる可能性がある。
【０２２６】
そこで、ストレージコントローラ２３は、例えば、高速ストレージ装置２１に配置されているファイルのデータのうち、作成から一定期間が経過し、且つ対応するアクセスカウントが少ないデータを、低速ストレージ装置２２に移動する。従来技術では、このアクセスカウントは、コピーオンライト動作の影響を受けるために正確ではなく、したがって低速ストレージ装置２２への適切な移動は困難である。これに対して、前記第１乃至第３の実施形態、及び前記第３の実施形態の変形例では、コピーオンライト動作におけるコピー元の論理ブロックアドレスに対応付けられたアクセスカウントを、コピーオンライト動作におけるコピー先の論理ブロックアドレスに対応付けられたアクセスカウントに引き継ぐことができるため、アクセスカウントは正確である。よって、アクセスカウントが少ないデータを、低速ストレージ装置２２に適切に移動することができる。
【０２２７】
以上説明した少なくとも１つの実施形態によれば、ストレージコントローラが管理するアクセスカウントを、コピーオンライト機能が有効な場合でも、アプリケーションが認識するファイルアクセスの状況に合致するように補正することができ、ユーザの利便性の向上に寄与する階層化を実現することができる。
【０２２８】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。
【要約】
実施形態によれば、階層化ストレージシステムは、階層化ストレージ装置と、当該階層化ストレージ装置を利用するコンピュータとを含む。前記コンピュータは、ファイルシステムと、補正支援部とを含む。前記ファイルシステムは、アプリケーションからのアクセス要求がデータの上書きを要求するライト要求である場合、コピーオンライト動作を実行する。前記補正支援部は、前記ストレージコントローラによって管理されていて、且つ前記コピーオンライト動作におけるコピー元の論理ブロックアドレスに対応付けられたアクセスカウントを、前記コピーオンライト動作におけるコピー先の論理ブロックアドレスに対応付けられたアクセスカウントに引き継がせる。【図１】
0005976980.tif 000002
【図２】
0005976980.tif 000003
【図３】
0005976980.tif 000004
【図４】
0005976980.tif 000005
【図５】
0005976980.tif 000006
【図６】
0005976980.tif 000007
【図７】
0005976980.tif 000008
【図８】
0005976980.tif 000009
【図９】
0005976980.tif 000010
【図１０】
0005976980.tif 000011
【図１１】
0005976980.tif 000012
【図１２】
0005976980.tif 000013
【図１３】
0005976980.tif 000014
【図１４】
0005976980.tif 000015
【図１５】
0005976980.tif 000016
【図１６】
0005976980.tif 000017
【図１７】
0005976980.tif 000018
【図１８】
0005976980.tif 000019
【図１９】
0005976980.tif 000020
【図２０】
0005976980.tif 000021
【図２１】
0005976980.tif 000022
【図２２】
0005976980.tif 000023
【図２３】
0005976980.tif 000024
【図２４】
0005976980.tif 000025
【図２５】
0005976980.tif 000026
【図２６】
0005976980.tif 000027
【図２７】
0005976980.tif 000028
【図２８】
0005976980.tif 000029
【図２９】
0005976980.tif 000030
【図３０】
0005976980.tif 000031
【図３１】
0005976980.tif 000032
【図３２】
0005976980.tif 000033
【図３３】
0005976980.tif 000034
【図３４】
0005976980.tif 000035
【図３５】
0005976980.tif 000036
【図３６】
0005976980.tif 000037