(57)【特許請求の範囲】
【請求項１】
１以上の記憶デバイスで構成された記憶デバイス群と、
前記記憶デバイス群及びホストコンピュータに接続され第１バッファ領域及び第１キャッシュ領域を有する第１コントローラと、
前記記憶デバイス群及び前記ホストコンピュータに接続され第２バッファ領域及び第２キャッシュ領域を有する第２コントローラと
を有し、
前記第１コントローラは、前記ホストコンピュータから第１ライト要求を受信し、前記第１ライト要求に従う第１ライトデータを、前記第１バッファ領域を介さずに前記第１キャッシュ領域におけるいずれかのキャッシュサブ領域である第１キャッシュサブ領域に格納し、前記第１キャッシュサブ領域に格納された前記第１ライトデータを前記第２キャッシュ領域のいずれかのキャッシュサブ領域である第２キャッシュサブ領域に前記第２バッファ領域を介さずに格納するために前記第２コントローラに転送し、前記第１キャッシュサブ領域内の前記第１ライトデータを、前記第１ライト要求で指定されているライト先に従う指定範囲に基づき前記記憶デバイス群に書き込むようになっており、
前記第１コントローラは、前記第１キャッシュサブ領域の状態が、前記第１キャッシュサブ領域への前記第１ライトデータの格納に成功した場合にクリアされる第１中断状態か否かを管理し、前記第１又は第２コントローラは、前記第２キャッシュサブ領域の状態が、前記第１キャッシュサブ領域から前記第２キャッシュサブ領域への前記第１ライトデータの転送に成功した場合にクリアされる第２中断状態か否かを管理し、
前記第１コントローラは、中断状態回復処理を行い、
前記中断状態回復処理は、
前記第１キャッシュサブ領域が前記第１中断状態であり前記第２キャッシュサブ領域が前記第２中断状態であるか否かを判断すること、
前記第１キャッシュサブ領域が前記第１中断状態であり前記第２キャッシュサブ領域が前記第２中断状態である場合、前記第１キャッシュサブ領域をコピー先として設定し、前記第２キャッシュサブ領域をコピー元として設定し、コピー元からコピー先にデータをコピーし、且つ、前記第１及び第２キャッシュサブ領域にそれぞれ対応する前記第１及び第２中断状態をクリアすること、
前記第１キャッシュサブ領域が前記第１中断状態でなく前記第２キャッシュサブ領域が前記第２中断状態である場合、前記第２キャッシュサブ領域をコピー先として設定し、前記第１キャッシュサブ領域をコピー元として設定し、コピー元からコピー先にデータをコピーし、前記第２キャッシュサブ領域に対応する前記第２中断状態をクリアすること、
を含む、
ストレージシステム。
【請求項２】
前記中断状態回復処理は、コピー不要条件が満たされているか否かを判断すること、を更に含み、
前記コピー不要条件が満たされていない場合、前記第１コントローラは、コピー元からコピー先へのデータのコピーを行い、前記コピー不要条件が満たされている場合、前記第１コントローラは、コピー元からコピー先へのデータのコピーをすること無く、前記第１及び第２キャッシュサブ領域に対応する前記第１及び第２中断状態をクリアする、又は、前記第２キャッシュサブ領域に対応する前記第２中断状態をクリアする、
を含む、
請求項１に記載のストレージシステム。
【請求項３】
前記コピー不要条件が満たされる場合は、前記中断状態回復処理が、前記第１ライト要求に従うライト処理からの起動であり、前記第１コントローラがコピー先のキャッシュサブ領域を有し、かつ、前記第２中断状態の原因となった転送に対応した過去のライト要求で指定されているライト先に従う指定範囲が、前記第１ライト要求で指定されているライト先に従う指定範囲に包含される場合である、
請求項２に記載のストレージシステム。
【請求項４】
前記第１コントローラは、第１リード要求を前記ホストコンピュータから受信した場合、前記第１リード要求に従う第１リードデータが前記第１キャッシュサブ領域にあっても、前記第１キャッシュサブ領域が前記第１中断状態であれば、前記第１キャッシュサブ領域から前記ホストコンピュータへの前記第１リードデータの転送を行わない、
請求項１に記載のストレージシステム。
【請求項５】
前記第１リードデータが、前記記憶デバイス群に書き込まれていないデータである第１ダーティデータであれば、前記第１コントローラは、前記第１中断状態ではないキャッシュサブ領域内のデータであり前記第１ダーティデータに対応したデータを前記ホストコンピュータへ転送する、
請求項４に記載のストレージシステム。
【請求項６】
前記第１コントローラは、第２ライト要求又は第２リード要求を受信し、
前記第２ライト要求を受信した場合、前記第１コントローラは、前記第２ライト要求に従う第２ライトデータの格納先が、前記第１中断状態の前記第１キャッシュサブ領域であれば、前記第２ライト要求の処理の前に、前記第１キャッシュサブ領域について前記中断状態回復処理を行い、
前記第２リード要求を受信した場合、前記第１コントローラは、前記第２リード要求に従う第２リードデータが前記第１中断状態の前記第１キャッシュサブ領域内のデータであっても、前記第１キャッシュサブ領域についての前記中断状態回復処理を前記第２リード要求の処理とは非同期に実行する、
請求項５に記載のストレージシステム。
【請求項７】
前記第１コントローラは、前記第２コントローラへ転送する前記第１ライトデータに付随している保証コードを確認すること無しに前記第１ライトデータを前記第２コントローラへ転送し、
前記第２コントローラが、前記第１ライトデータを受信し、前記第１ライトデータに付随している前記保証コードを確認する、
請求項１に記載のストレージシステム。
【請求項８】
前記第１コントローラは、論理ボリューム間でデータをコピーする内部機能を実行している場合に、前記第１ライトデータを前記第１バッファ領域に格納し、前記第１バッファ領域から前記第１キャッシュサブ領域へ格納する、
請求項１に記載のストレージシステム。
【請求項９】
前記第１コントローラは、前記第１ライトデータの格納先の前記第１キャッシュサブ領域に格納されているデータが前記記憶デバイス群に書込み済のデータであるクリーンデータであれば、前記中断状態回復処理において、前記第１キャッシュサブ領域を解放する、
請求項１に記載のストレージシステム。
【請求項１０】
前記第１コントローラは、前記第１中断状態の前記第１キャッシュサブ領域内のデータを回復するために或るキャッシュサブ領域と前記第１キャッシュサブ領域との間でデータコピーを行うようになっており、
前記第１コントローラは、コピー先のキャッシュサブ領域が前記第１キャッシュサブ領域であり、且つ、第１中断状態決定時のライト範囲が前記第１ライト要求の前記指定範囲に包含される場合、前記データコピーをスキップする、
請求項１に記載のストレージシステム。
【請求項１１】
前記第１コントローラが、第１メモリを有し、前記第２コントローラが、第２メモリを有し、
前記第１バッファ領域及び前記第１キャッシュ領域が、前記第１メモリに集約されており、前記第２バッファ領域及び前記第２キャッシュ領域が、前記第２メモリに集約されている、
請求項１に記載のストレージシステム。
【請求項１２】
１以上の記憶デバイスで構成された記憶デバイス群及びホストコンピュータに接続され第１バッファ領域及び第１キャッシュ領域を有する第１コントローラと、前記記憶デバイス群及び前記ホストコンピュータに接続され第２バッファ領域及び第２キャッシュ領域を有する第２コントローラとを有し、前記第１コントローラは、前記ホストコンピュータからライト要求を受信し、前記ライト要求に従うライトデータを、前記第１バッファ領域を介さずに前記第１キャッシュ領域におけるいずれかのキャッシュサブ領域である第１キャッシュサブ領域に格納し、前記第１キャッシュサブ領域に格納されたライトデータを、前記第２キャッシュ領域におけるいずれかのキャッシュサブ領域である第２キャッシュサブ領域に前記第２バッファ領域を介さずに格納するために前記第２コントローラに転送し、前記第１キャッシュサブ領域内のライトデータを前記記憶デバイス群に書き込むようになっているストレージシステム、の記憶制御方法であって、
前記第１コントローラは、前記第１キャッシュサブ領域の状態が、前記第１キャッシュサブ領域への前記ライトデータの格納に成功した場合にクリアされる第１中断状態か否かを管理し、前記第１又は第２コントローラは、前記第２キャッシュサブ領域の状態が、前記第１キャッシュサブ領域から前記第２キャッシュサブ領域への前記ライトデータの転送に成功した場合にクリアされる第２中断状態か否かを管理し、
前記第１コントローラは、中断状態回復処理を行い、
前記中断状態回復処理は、
前記第１キャッシュサブ領域が前記第１中断状態であり前記第２キャッシュサブ領域が前記第２中断状態であるか否かを判断すること、
前記第１キャッシュサブ領域が前記第１中断状態であり前記第２キャッシュサブ領域が前記第２中断状態である場合、前記第１キャッシュサブ領域をコピー先として設定し、前記第２キャッシュサブ領域をコピー元として設定し、コピー元からコピー先にデータをコピーし、且つ、前記第１及び第２キャッシュサブ領域にそれぞれ対応する前記第１及び第２中断状態をクリアすること、
前記第１キャッシュサブ領域が前記第１中断状態でなく前記第２キャッシュサブ領域が前記第２中断状態である場合、前記第２キャッシュサブ領域をコピー先として設定し、前記第１キャッシュサブ領域をコピー元として設定し、コピー元からコピー先にデータをコピーし、前記第２キャッシュサブ領域に対応する前記第２中断状態をクリアすること、
を含む、
記憶制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ホストからのライトデータをストレージシステムのキャッシュ領域に書き込む技術に関する。
【背景技術】
【０００２】
ホストコンピュータからライト要求を受信し、そのライト要求に付随するライトデータをキャッシュメモリ領域（以下、キャッシュ領域）に格納したときに、ホストコンピュータにライト終了を報告するストレージシステムが知られている。また、キャッシュ領域に格納したライトデータを、多重化（一般的に、２重化）することで、電源喪失等の障害に対するライトデータの保護を向上するストレージシステムも知られている。【０００３】
特許文献１では、ホストコンピュータからのライトデータを２重化する際、キャッシュ領域を有する複数のコントローラ間の排他制御を無くすことで、性能を低下させることなくデータ保護を実現している。【０００４】
特許文献２では、ユーザデータをパリティ等の冗長データを付与して格納するストレージシステムにおいて、ホストコンピュータからの更新データ（ライトデータ）を、更新前のデータ（旧データ）とは別のキャッシュ領域に格納することで、冗長データ生成時に記憶装置へのアクセスを低減し、ストレージシステムの処理効率を改善している。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−１４６８４２号公報
【特許文献２】特開平７−３２８０７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ホストコンピュータからのライトデータをストレージシステムのキャッシュ領域に格納するデータ転送形態として、下記方式（Ａ）及び（Ｂ）がある。
（Ａ）ストレージシステムのＦＥ−Ｉ／Ｆ（フロントエンドの通信インタフェースデバイス）が有するバッファ領域にホストコンピュータからのライトデータを一時的に格納し、格納したライトデータが一定のデータ量になった場合に、ライトデータをまとめてキャッシュ領域に転送する。
（Ｂ）ＦＥ−Ｉ／Ｆが有するバッファ領域を介さずに、ストレージシステムのキャッシュ領域にホストコンピュータからのライトデータを格納する。【０００７】
一般に、ミッドレンジクラスの一部及びハイエンドクラスのストレージシステムでは、ライトデータを纏めて転送することでストレージシステム内部のデータ転送パスの転送効率の低下を低減するため、方式（Ａ）を用いることが多い。ミッドレンジクラスのストレージシステムでは、高機能の獲得や開発容易化を目的に、ハイエンドクラスのストレージシステムからマイクロプログラムを流用する一方、低コスト化を目的にハードウェアは簡素化、サーバ等との共通化が進んでいる。その一環として、従来は物理的に分離されていた、ユーザデータを格納するキャッシュ領域とデータ転送に使用されるバッファ領域を、プロセッサに直接接続されたメモリに集約している。【０００８】
このようなメモリを有するハードウェア構成において、ホストコンピュータとストレージシステム間のデータ転送を、バッファ領域を介する方式（Ａ）により実行する場合、集約されたメモリにおけるデータ入出力量が増大し、性能低下を生じることがある。よって、ホストコンピュータとストレージシステム間のデータ転送は、バッファ領域を介さない方式（Ｂ）により実行することが望ましいと考えられる。【０００９】
一方、ホストコンピュータからのライトデータを受信中に、ホストコンピュータとストレージシステム間の障害等により、ホストコンピュータからのライトデータの転送が中断することがある。この場合、ストレージシステムは、ホストコンピュータからのライト要求に対しエラーを応答し、ホストコンピュータによるライト要求のリトライを期待するが、ホストコンピュータとストレージシステム間の障害要因がパスの断線等であった場合、ホストコンピュータからのライト要求のリトライは困難となる。【００１０】
この時、バッファ領域を介する方式（Ａ）の場合、ライトデータの転送が中断しても、当該バッファ領域のデータを破棄すればよい。しかし、バッファ領域を介さない方式（Ｂ）の場合、ストレージシステムのキャッシュ領域には、転送が中断したライトデータの一部と、ライトデータが書き込まれる前のデータが混在する可能性がある。【００１１】
よって、方式（Ｂ）において、ホストコンピュータからのライトデータを受信中に、ホストコンピュータからのライト要求のリトライが困難な障害要因により、ライトデータの転送が中断した場合においても、ストレージシステムのキャッシュ領域に格納されているユーザデータを正しく維持することが課題である。
【課題を解決するための手段】
【００１２】
ストレージシステムが、１以上の記憶デバイスで構成された記憶デバイス群と、記憶デバイス群及びホストコンピュータに接続され第１バッファ領域及び第１キャッシュ領域を有する第１コントローラと、記憶デバイス群及びホストコンピュータに接続され第２バッファ領域及び第２キャッシュ領域を有する第２コントローラとを有する。第１コントローラは、ホストコンピュータからライト要求を受信し、ライト要求に従うライトデータを、第１バッファ領域を介さずに第１キャッシュ領域に格納し、第１キャッシュ領域に格納されたライトデータを、第２キャッシュ領域に第２バッファ領域を介さずに格納するために第２コントローラに転送し、第１キャッシュ領域内のライトデータを記憶デバイス群に書き込むようになっている。第１コントローラは、第１キャッシュサブ領域の状態が、第１キャッシュサブ領域への第１ライトデータの格納に成功した場合にクリアされる第１中断状態か否かを管理し、第１又は第２コントローラは、第２キャッシュサブ領域の状態が、第１キャッシュサブ領域から第２キャッシュサブ領域へのライトデータの転送に成功した場合にクリアされる第２中断状態か否かを管理する。第１コントローラは、中断状態回復処理を行う。中断回復処理は、第１キャッシュサブ領域が第１中断状態であり第２キャッシュサブ領域が第２中断状態であるか否かを判断することを含む。また、中断回復処理は、第１キャッシュサブ領域が第１中断状態であり第２キャッシュサブ領域が第２中断状態である場合、第１キャッシュサブ領域をコピー先として設定し、第２キャッシュサブ領域をコピー元として設定し、コピー元からコピー先にデータをコピーし、且つ、第１及び第２キャッシュサブ領域にそれぞれ対応する第１及び第２中断状態をクリアすることを含む。また、中断回復処理は、第１キャッシュサブ領域が第１中断状態でなく第２キャッシュサブ領域が第２中断状態である場合、第２キャッシュサブ領域をコピー先として設定し、第１キャッシュサブ領域をコピー元として設定し、コピー元からコピー先にデータをコピーし、第２キャッシュサブ領域に対応する第２中断状態をクリアすることを含む。
【発明の効果】
【００１３】
ホストコンピュータからのライトデータをバッファ領域を介さずキャッシュ領域に転送する方式において、ホストコンピュータからのライトデータを受信中にそのライトデータの転送が中断した場合でも、キャッシュ領域に格納されているユーザデータを正しく維持することができる。
【図面の簡単な説明】
【００１４】
【図１】実施例の概要を示す。
【図２】実施例に係る計算機システムの一例を示す。
【図３】実施例に係るバッファ領域管理テーブルの一例を示す。
【図４】実施例に係るＶＯＬ管理テーブルの一例を示す。
【図５】実施例に係るキャッシュディレクトリテーブルの一例を示す。
【図６】実施例に係るＣＳ領域管理テーブルの一例を示す。
【図７】実施例に係るキャッシュ割り当て管理テーブルの一例を示す。
【図８】実施例に係るキューヘッダの一例を示す。
【図９】実施例に係るバッファ領域の管理の一例を示す。
【図１０】実施例に係るキャッシュ領域の管理の一例を示す。
【図１１】実施例に係るリード直転送の一例を示す。
【図１２】実施例に係るリード２段転送の一例を示す。
【図１３】実施例に係るライト２段転送の一例を示す。
【図１４】実施例に係るライト直転送の一例を示す。
【図１５】実施例に係るライト転送方式の特徴比較の一例を示す。
【図１６】実施例に係るリード処理の流れの一例の一部を示す。
【図１７】実施例に係るリード処理の流れの一例の残りを示す。
【図１８】実施例に係るライト処理の流れの一例の一部を示す。
【図１９】実施例に係るライト処理の流れの一例の別の一部を示す。
【図２０】実施例に係るライト処理の流れの一例の残りを示す。
【図２１】実施例に係る中断状態回復処理の一例を示す。
【発明を実施するための形態】
【００１５】
以下、実施例を説明する。
【００１６】
以下の説明では、「×××テーブル」の表現にて情報を説明することがあるが、情報は、どのようなデータ構造で表現されていてもよい。すなわち、情報がデータ構造に依存しないことを示すために、「×××テーブル」を「×××情報」と呼ぶことができる。
【００１７】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、制御デバイスが有するプロセッサ（例えばＣＰＵ（Central  Processing  Unit））によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及び／又は通信インターフェイスデバイス（例えば通信ポート）を用いながら行うため、処理の主語が、プロセッサ、そのプロセッサを有するコントローラ又は装置（例えばストレージシステム）とされてもよい。プロセッサが行う処理の一部又は全部が、コントローラが有するハードウェア回路で行われてもよい。コンピュータプログラムは、プログラムソースから制御デバイスにインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又は記憶メディアであってもよい。
【００１８】
また、以下の説明では、同種の要素を区別して説明する場合は、その要素の参照符号に代えて、その要素に割り振られた識別子（例えば番号）を使用することがある。例えば、コントローラを特に区別しないで説明する場合には、コントローラ２２と記載し、個々のコントローラを区別して説明する場合には、コントローラ＃０及び＃１のように記載することがある。
【００１９】
また、以下の説明では、種々の対象（例えば、ＶＯＬ）の識別情報として、番号或いは名称等が使用されるが、それらは互いに置換可能であってもよいし、或いは、他種の識別情報が使用されてもよい。
【００２０】
また、以下の説明における用語の意味は、下記の通りである。
（＊）「ＶＯＬ」は、論理ボリュームの略であり、論理的な記憶デバイスである。ＶＯＬは、実体的なＶＯＬ（ＲＶＯＬ）であってもよいし、仮想的なＶＯＬ（ＶＶＯＬ）であってもよい。また、ＶＯＬは、そのＶＯＬを提供するストレージシステムに接続されている外部の装置（例えばホストコンピュータ）に提供されるオンラインＶＯＬと、外部の装置には提供されない（外部の装置からは認識されない）オフラインＶＯＬとがあってよい。
（＊）「ＲＶＯＬ」は、そのＲＶＯＬを有するストレージシステムが有する物理的な記憶資源（例えば、複数のＰＤＥＶで構成されたＲＡＩＤ（Redundant  Array  of  Independent  (or  Inexpensive)  Disks）グループ）に基づくＶＯＬである。
（＊）「ＲＧ」は、ＲＡＩＤグループの略である。
（＊）「ＶＶＯＬ」としては、例えば、そのＶＶＯＬを有するストレージシステムに接続されている外部のストレージシステムの記憶資源（例えばＶＯＬ）に基づいておりストレージ仮想化技術に従うＶＯＬである外部接続ＶＯＬ（ＥＶＯＬ）と、複数の仮想ページ（仮想的な記憶領域）で構成されており容量仮想化技術（典型的にはThin  Provisioning）に従うＶＯＬ（ＴＰＶＯＬ）と、オリジナルのＶＯＬのスナップショットとして提供されるスナップショットＶＯＬとがあってよい。ＴＰＶＯＬは、典型的にはオンラインＶＯＬである。スナップショットＶＯＬは、ＲＶＯＬであってもよい。
（＊）「ＰＤＥＶ」は、不揮発性の物理的な記憶デバイスの略である。複数のＰＤＥＶで複数のＲＡＩＤグループが構成されてよい。ＲＡＩＤグループはパリティグループと呼ばれてもよい。
（＊）「プール」は、論理的な記憶領域（例えば複数のプールＶＯＬの集合）であり、用途ごとに用意されてよい。例えば、プールとして、ＴＰプールと、スナップショットプールとがあってよい。ＴＰプールは、複数の実ページ（実体的な記憶領域）で構成された記憶領域である。ＴＰプールからＴＰＶＯＬの仮想ページに実ページが割り当てられてよい。スナップショットプールは、オリジナルのＶＯＬから退避されたデータが格納される記憶領域でよい。プール（典型的にはＴＰプール）は、性能（例えばＩ／Ｏ性能）の異なる複数のティアを有してよい。各ティアは、Ｉ／Ｏ性能が同程度の１又は複数のプールＶＯＬで構成されてよい。
（＊）「プールＶＯＬ」は、プールの構成要素となるＶＯＬである。プールＶＯＬは、ＲＶＯＬであってもよいしＥＶＯＬであってもよい。プールＶＯＬは、典型的にはオフラインＶＯＬである。
（＊）バッファ領域は、複数のバッファサブ領域で構成されている。バッファ領域からバッファサブ領域単位で領域が確保される。以下、バッファサブ領域を「ＢＳ領域」と記載する。
（＊）キャッシュ領域（キャッシュメモリ領域）は、複数のキャッシュサブ領域で構成されている。キャッシュ領域からキャッシュサブ領域単位で領域が確保される。以下、キャッシュサブ領域を「ＣＳ領域」と記載する。
【００２１】
さて、まず、実施例の概要を説明する。
【００２２】
図１は、実施例の概要を示す。
【００２３】
ホストコンピュータ１（＃０、＃１）が、通信ネットワーク１１を介して、ストレージシステム２に接続されている。ストレージシステム２には、データの冗長性を確保するため、冗長化されたコントローラ２２（二重化されたコントローラ＃０及び＃１）存在している。コントローラ＃０、＃１同士は、相互に接続されている。
【００２４】
各コントローラ２２（＃０、＃１）は、ＦＥ−Ｉ／Ｆ２１０（＃０、＃１）、ＣＰＵ２３０（＃０、＃１）、及びメモリ２４０（＃０、＃１）を有する。メモリ２４０には、バッファ領域２４２（＃０、＃１）、及びキャッシュ領域２４４（＃０、＃１）がある。バッファ領域２４２は、キャッシュ領域２４４に入出力されるデータが一時格納される記憶領域である。バッファ領域２４２から読み出されたデータはバッファ領域２４２から削除されるようになっている。一方、キャッシュ領域２４４は、ＰＤＥＶ（ＲＧ）に入出力されるデータが一時格納される記憶領域である。キャッシュ領域２４４からデータが読み出されたからといって、バッファ領域２４２と違い、読み出されたデータが必ずしもキャッシュ領域２４４から削除されない。バッファ領域２４２とキャッシュ領域２４４は異なるメモリに分散していてもよいが、本実施例では、メモリ２４０にバッファ領域２４２及びキャッシュ領域２４４が集約されている。キャッシュ領域２４４には、ＰＤＥＶ（ＲＧ）から読み出されたデータが書き込まれる領域としてリード面４１（４１ａ）が確保されたり、ＰＤＥＶ（ＲＧ）に書き込まれるデータが書き込まれる領域としてライト面４２（４２ａ、４２ｂ）が確保されたりすることがある。本実施例の説明において、特段の説明が無い場合、リード面もライト面もキャッシュ領域２４４に存在する領域（典型的にはＣＳ領域）である。
【００２５】
また、以下の説明では、下記の様な前提条件があるとする。
（１）コントローラ＃０のキャッシュ領域＃０に格納されたデータ（後述のデータＡ）が、コントローラ＃１のキャッシュ領域＃１にコピーされている。
（２）ＦＥ−Ｉ／Ｆ２１０には、ライト時及びリード時に積極的に利用できるバッファ領域がない。そのため、ホストコンピュータ１から送信されるライトデータは、ＦＥ−Ｉ／Ｆ２１０を介してメモリ２４４のキャッシュ領域２４４に送信される。その際、そのメモリ２４４におけるバッファ領域２４２には、ライトデータは格納されない。
【００２６】
以下の説明において、バッファ領域を介さずにキャッシュ領域２４４にライトデータが転送されることを「ライト直転送」と言う。以下、ライト直転送実行時にストレージシステム２がホストコンピュータ１からリード要求又はライト要求を受信した場合に行われる処理を説明する。
【００２７】
ホストコンピュータ＃０からライト要求をコントローラ＃０が受信した場合、ＣＰＵ＃０は、キャッシュ領域＃０からライトデータの格納領域（ライト面４２ａ）を確保し、また、コントローラ＃１を介して、キャッシュ領域＃１から、ライト面４２ａに格納したデータのコピー先である格納領域（ライト面４２ｂ）を確保する。
【００２８】
その後、コントローラ＃０のＣＰＵ＃０は、ＦＥ−Ｉ／Ｆ＃０を介してライト面４２ａにライトデータを格納する。
【００２９】
ライト要求を受信した場合、ライト面４２ａに、既に別のライト要求（例えば、同じ領域（例えばＶＯＬにおける領域）を指定した過去のライト要求）によるライトデータ（以下、データＡ）が存在しており、データＡが、（パリティ未生成の）ダーティデータである場合がある。ダーティデータとは、記憶デバイスにデステージされていないデータ（記憶デバイスに存在しないデータ）である。
【００３０】
ホストコンピュータ＃０から新たなライトデータ（データＢ）をコントローラ＃０が受信している最中に、ネットワーク１１等のパスに障害が発生すると、ＦＥ−Ｉ／Ｆ＃０が、ライト面４２ａにおけるダーティデータ（データＡ）を破壊してしまう（１−１）。つまり、データＢによって上書きされるデータＡが、データＡの一部分だけがデータＢの一部分によって上書きされた別のデータ（以下、データＣ）となってしまう。データＡに関するパリティは未生成なので、データＡを復元することはできない。
【００３１】
データＢによりダーティデータＡが破壊された状態で、データＡのライト先領域をリード元領域としたリード要求をホストコンピュータ＃１よりコントローラ＃１が受信すると、コントローラ＃１のＣＰＵ＃１は、ライト面４２ｂからバッファ領域＃１にダーティデータＡをリードしリード面４１ａのクリーンデータＡと統合してバッファ領域＃１から、データＡをホストコンピュータ＃１へ転送する（１―２）。なお、リード要求されたアドレス範囲のデータ全てがライト面４２ｂに存在する場合は、ライト面４２ｂから直接ホスト＃１へ転送するリード直転送が行われる。
【００３２】
ネットワーク１１等のパスに障害が回復した後に、ダーティデータ（データＡ）が破壊された状態で、ホストコンピュータ＃０よりライト要求をコントローラ＃０が受信すると、ＣＰＵ＃０は、ライト要求を実行する前に、コントローラ＃１のライト面４２ｂに格納されているデータＡ（破壊されていないダーティデータＡ）を用いて、ライト面４２ａのデータＣをデータＡに回復する（つまり、ライト面４２ａのデータＣを、ライト面４２ｂのデータＡで上書きする）（１―３）。
【００３３】
この時、ＣＰＵ＃０が、ＣＰＵ＃１に、ライト面４２ｂに格納されているデータＡでデータＣを上書きさせた後、ＣＰＵ＃０が、キャッシュ領域＃０に格納されているデータＡに対して、当該ライト要求を実行する。
【００３４】
以上の処理により、ライト直転送実行時においても、ホストコンピュータ１からのリード／ライト要求を、キャッシュ領域２４４に格納されているデータの状態に応じて、コントローラ２２間でデータをやり取りすることにより、ホストコンピュータ１からのデータへのアクセスを維持することができる。
【００３５】
以上が、本実施例の概要である。以下、本実施例を詳細に説明する。
【００３６】
図２は、実施例に係る計算機システムの一例を示す。
【００３７】
計算機システムは、ホストコンピュータ１、管理端末１２、保守端末２３、及びストレージシステム２を有する。
【００３８】
ホストコンピュータ１、管理端末１２、及び保守端末２３が、ネットワーク１１（例えば、ＳＡＮ（Storage  Area  Network））を介し、ストレージシステム２のＦＥ−Ｉ／Ｆ２１０に接続されている。
【００３９】
ストレージシステム２は、記憶制御装置２１及び記憶デバイスユニット２０を有する。記憶制御装置２１は、コントローラ２２を有する。コントローラ２２は、通信インタフェースと、記憶デバイスと、それらに接続されたプロセッサとを有する。通信インタフェースとしては、例えば、ＦＥ−Ｉ／Ｆ（Front  End  Inter/Face）２１０、及びＢＥ−Ｉ／Ｆ（Back  End  Inter/Face）２２０がある。記憶デバイスとしては、例えば、メモリ２４０がある。プロセッサとしては、例えば、ＣＰＵ（Central  Processing  Unit）２３０がある。なお、図に示す例では、各コントローラ２２が１つのメモリ２４０を備えている構成としているが、各コントローラ２２が、メモリ２４０を複数備えている構成としてもよい。
【００４０】
記憶制御装置２１は、冗長性を確保する目的で、コントローラ２２を２台（コントローラ＃０、＃１）備えている。コントローラ＃０及び＃１は相互に接続されている。ストレージシステム２の可用性を向上させるため、コントローラ２２毎に専用の電源を用意し、それぞれのコントローラ２２に対して、その専用の電源を用いて給電してもよい。
【００４１】
ＦＥ−Ｉ／Ｆ２１０は、ホストコンピュータ１等のフロントエンドに存在する外部デバイスと通信するためのインタフェースデバイスである。ＢＥ−Ｉ／Ｆ２２０は、コントローラ２２が記憶デバイスユニット２０と通信するためのインタフェースデバイスである。
【００４２】
メモリ２４０は、プログラム領域２４１、バッファ領域２４２、管理テーブル領域２４３、及びキャッシュ領域２４４から構成されている。なお、両方のコントローラ２２が有するメモリ２４０は、不揮発性メモリであっても、揮発性メモリであってもよいが、ダーティデータを格納するキャッシュ領域は、バックアップ電源等により不揮発化されていていよい。
【００４３】
プログラム領域２４１には、リードプログラム５０、ライトプログラム５１、データ転送中断状態回復プログラム５２等の各種制御プログラムが格納される。
【００４４】
バッファ領域２４２は、後述のリード直転送及びライト直転送が行われない場合に、コントローラ２２間でデータ転送をする際に使用される領域である。
【００４５】
管理テーブル領域２４３には、各種管理テーブルが格納される。管理テーブルとしては、バッファ領域管理テーブル３０、ＶＯＬ管理テーブル３１、キャッシュディレクトリテーブル３２、ＣＳ領域管理テーブル３３、キャッシュ割当て管理テーブル３４、及びキューヘッダ３５がある。これらの管理テーブルの詳細は、後述する。なお、本実施例では、キャッシュ領域２４４は、複数のＣＳ領域で構成されている。
【００４６】
キャッシュ領域２４４は、記憶デバイスユニット２０からホストコンピュータ１へ送信されるリードデータや、ホストコンピュータ１から記憶デバイスユニット２０へ送信されるライトデータをキャッシュする領域である。
【００４７】
ＣＰＵ２３０は、メモリ２４０に格納されているプログラムを実行することで、各種機能を実現する。キャッシュ領域２４４には、記憶デバイスユニット２０にライトされるデータ及び記憶デバイスユニット２０からリードされたデータが一時的に格納される。
【００４８】
記憶デバイスユニット２０は、複数のＰＤＥＶ２００を有する。ＰＤＥＶは、ＨＤＤ（Hard  Disk  Drive）でよいが、他種の記憶デバイス（不揮発性の記憶デバイス）、例えば、ＳＳＤ（Solid  State  Device）のようなＦＭ（Flash  Memory）デバイスでもよい。記憶デバイスユニット２０は、異なる種類のＰＤＥＶを有してよい。また、複数の同種のＰＤＥＶでＲＧが構成されてよい。ＲＧには、所定のＲＡＩＤレベルに従いデータが格納される。以下、オンラインＶＯＬに格納されるデータは最終的にはＲＧに格納されるとする。
【００４９】
コントローラ２２がホストコンピュータ１からのライトデータを受信すると、ＦＥ−Ｉ／Ｆ２１０によって受信したライトデータに保証コードが付与される。保証コードが付与されたデータは、ＲＧに格納される。リードデータ転送時には、ＣＰＵ２３０により、リードデータに付与されている保証コードがチェックされる。保証コードは、データの格納位置を示す情報（ＶＯＬ番号やＶＯＬ内のアドレス等）やデータの一貫性を確認する情報（ＣＲＣ（Cyclic  Redundancy  Check）等）から構成されてもよい。
【００５０】
図３は、実施例に係るバッファ領域管理テーブルの一例を示す。
【００５１】
バッファ領域管理テーブル３０は、ＢＳ領域の割当てを管理するためのテーブルである。バッファ領域管理テーブル３０は、割当てサイズ３０１、ＣＰＵ割当て情報３０２、割当てビットマップ３０３、及びＢＳ領域アドレス３０４を有する。ＢＳ領域アドレス３０４は、ＢＳ領域毎に存在する。
【００５２】
割当てサイズ３０１は、ＢＳ領域のサイズを示す。
【００５３】
ＣＰＵ割当て情報３０２は、バッファ領域２４２のどの範囲（どのＢＳ領域）がどのＣＰＵ２３０によって使用されているかを示す。ＣＰＵ割当て情報３０２は、バッファ領域２４２における領域範囲（１以上のＢＳ領域アドレス）とＣＰＵ２３０との対応関係であってもよい。つまり、予め、ＢＳ領域毎に、使用されるＣＰＵ２３０が決められていてもよい。そのような対応関係が予め決められていることで、ＣＰＵ２３０へのＢＳ領域の割当て、或いはＢＳ領域の解放に従う負荷（バッファ領域２４２への競合の負荷）を低減することが期待できる。また、本実施例では、バッファ領域２４２からＢＳ領域を割り当てることは、通常、そのバッファ領域２４２を有するコントローラ２２内のＣＰＵ２３０により行われるが、他のコントローラ２２から転送されてくるデータの格納ためにバッファ領域２４２からＢＳ領域を割り当てることについては、当該他のコントローラ２２内のＣＰＵにより行われる。つまり、本実施例では、ＣＰＵ割当て情報３０２において、他のコントローラ２２内のＣＰＵ２３０がＢＳ領域に対応付けられている場合、そのＢＳ領域は、コントローラ２２間のデータ転送に使用されるＢＳ領域であることがわかる。なお、本発明はこれに限定されず、例えば、バッファ領域２４２からＢＳ領域を割り当てることは、そのバッファ領域２４２を有しない他のコントローラ内２２のＣＰＵ２３０により行われてもよいし、他のコントローラ２２から転送されてくるデータの格納ためにバッファ領域２４２からＢＳ領域を割り当てることについては、そのバッファ領域２４２を有するコントローラ２２内のＣＰＵ２３０により行われてもよい。
【００５４】
割当てビットマップ３０３は、複数のＢＳ領域にそれぞれ対応した複数のビットで構成されている。各ビットは、そのビットに対応したＢＳ領域が使用中（例えば「１」）か未使用状態（例えば「０」）であるかを示す。
【００５５】
ＢＳ領域アドレス３０４は、ＢＳ領域のバッファ領域２４２でのアドレスを示す。
【００５６】
図４は、実施例に係るＶＯＬ管理テーブルの一例を示す。
【００５７】
ＶＯＬ管理テーブル３１は、ＶＯＬ毎に存在する。ＶＯＬ管理テーブル３１は、ＶＯＬ番号３１１、容量３１２、状態３１３、ホストパス定義情報リスト３１４、ＶＯＬ属性３１５、及び記憶領域情報３１６を有する。
【００５８】
ＶＯＬ番号３１１は、ＶＯＬの識別番号である。容量３１２は、ＶＯＬの容量を示す。状態３１３は、ＶＯＬの状態を示す。ＶＯＬの状態には、例えば、正常、閉塞、及び未使用がある。
【００５９】
ホストパス定義情報リスト３１４は、リード／ライト要求元のホストコンピュータ１を特定するための情報（ホストコンピュータ１の名称、及びポート特定情報等）、及びリード／ライト要求先の当該ＶＯＬを特定するための情報（当該ストレージシステム２のポート特定情報やＬＵＮ（Logical  Unit  Number）等）を示す。
【００６０】
ＶＯＬ属性３１５は、ＶＯＬの属性を示す。ＶＯＬの属性には、例えば、オンラインＶＯＬ、ＲＶＯＬ、ＴＰＶＯＬ、ＥＶＯＬ及びプールＶＯＬ等がある。
【００６１】
記憶領域情報３１６は、ＶＯＬ属性３１５に対応した情報を示す。例えば、ＶＯＬ属性３１５がＲＶＯＬであれば、記憶領域情報３１６は、そのＲＶＯＬの基になっているＲＧに関する情報（ＲＡＩＤレベル、ＰＤＥＶ数等）でよい。また、ＶＯＬ属性３１５ＴＰＶＯＬであれば、記憶領域情報３１６は、ＴＰＶＯＬに割当てられたプールに関する情報や、仮想ページと実ページの対応関係でよい。
【００６２】
図５から図８にキャッシュ領域２４４を管理するためのテーブル群を示す。キャッシュ領域２４４を管理するテーブル群は、キャッシュディレクトリテーブル３２、ＣＳ領域管理テーブル３３、キャッシュ割当て管理テーブル３４、及びキューヘッダ３５を含む。
【００６３】
図５は、実施例に係るキャッシュディレクトリテーブル３２の一例を示す。
【００６４】
キャッシュディレクトリテーブル３２は、ＣＰＵ２４が、ＶＯＬにライトされる又はＶＯＬからリードされたデータのキャッシュ領域２４４における格納状態を検索するために使用する。つまり、キャッシュディレクトリテーブル３２は、ＣＳ領域管理テーブル３３への索引である。
【００６５】
キャッシュディレクトリテーブル３２は、複数のサブディレクトリエントリに分割されている。また、キャッシュ領域２４４は、複数のＣＳ領域で構成されているが、１つのサブディレクトリエントリが、１つまたは複数のＣＳ領域に関連付けられる。
【００６６】
ハッシュ情報３２１は、Ｉ／Ｏ先情報のハッシュ値と、ハッシュヘッダとの対応関係を示す情報である。Ｉ／Ｏ先情報は、ホストコンピュータ１からのＩ／Ｏ要求に含まれる情報であって、Ｉ／Ｏ先の領域を表す情報であり、典型的には、ＶＯＬ番号とＶＯＬ内のアドレスとを含む。ハッシュヘッダの実体として、ＣＳ領域管理テーブル３３のアドレスを示す先頭ポインタ３２２と終端ポインタ３２３がある。
【００６７】
つまり、キャッシュディレクトリテーブル３２は、Ｉ／Ｏ先情報とＣＳ領域との対応関係を管理し、Ｉ／Ｏ先についてＣＳ領域が確保済か否かを検索することに使用される索引に相当する。キャッシュディレクトリテーブル３２のＩ／Ｏ先情報のハッシュ値に対応する先頭ポインタ３２２を辿った先にI／Ｏ先に対応するＣＳ領域管理テーブル３３が見つからなかった場合、それは、ＣＳ領域が確保されていないことを意味する。一方、キャッシュディレクトリテーブル３２のＩ／Ｏ先情報のハッシュ値に対応する先頭ポインタ３２２を辿った先にI／Ｏ先に対応するＣＳ領域管理テーブル３３が見つかった場合、それは、Ｉ／Ｏ先についてＣＳ領域が既に確保済であり、Ｉ／Ｏ対象のデータをその確保済のＣＳ領域に格納すればよいことを意味する。
【００６８】
なお、同一のハッシュヘッダに接続されるＣＳ領域管理テーブル３３の最大数を低減し検索時間の長大化を抑止するため、キャッシュディレクトリテーブル３２のサイズは、ストレージシステム２がサポートする容量に応じて決定してもよい。
【００６９】
図６は、実施例に係るＣＳ領域管理テーブル３３の一例を示す。
【００７０】
ＣＳ領域管理テーブル３３は、ＣＳ領域毎に存在し、そのＣＳ領域の格納状態を管理する情報である。ＣＳ領域管理テーブル３３は、データ状態３３１、エラー状態３３２、ディレクトリ前方ポインタ３３３、ディレクトリ後方ポインタ３３４、キュー前方ポインタ３３５、キュー後方ポインタ３３６、割当てアドレス３３７、リード面／ライト面フラグ３３８、及び転送制御情報３３９を有する。
【００７１】
データ状態３３１は、ＣＳ領域内のデータの状態を示す。データの状態としては、例えば、フリー、クリーン、パリティ未生成ダーティ、及びパリティ生成済みダーティがある。「フリー」とは、ＣＳ領域が空き領域であることを示す。「クリーン」とは、ＣＳ領域に格納されているデータが記憶デバイスユニット２０に格納されている状態を示す。「パリティ未生成ダーティ」とは、ＣＳ領域に格納されているデータに関するパリティが生成されておらず、且つ、そのデータが記憶デバイスユニット２０に格納されていない状態を示す。「パリティ生成ダーティ」とは、ＣＳ領域に格納されているデータに関するパリティは生成されているが、そのデータが記憶デバイスユニット２０に格納されていない状態を示す。
【００７２】
エラー状態３３２は、ライトデータ受信時におけるデータ転送中断状態か否かを示す。あるＩ／Ｏ先に対応するＣＳ領域について、各コントローラ内のＣＳ領域管理テーブル３３内では、エラー状態３３２がデータ転送中断状態を示す場合、その状態は、データ転送中断状態１及びデータ転送中断状態２の一方である。つまり、１つのコントローラ内のＣＳ領域管理テーブル３３内では、データ転送中断状態１及びデータ転送中断状態２の両方が同時に立つことはない。しかし、あるＩ／Ｏ先に対応するＣＳ領域について、一方のコントローラ内のＣＳ領域管理テーブル３３内では、エラー状態３３２がデータ転送中断状態１であり、他方のコントローラ内のＣＳ領域管理テーブル３３内では、データ転送状態３３２がデータ転送中断状態２であることはある。「データ転送中断状態１」とは、ホストコンピュータ１からストレージシステム２に対するデータの転送が、完全に行われなかった状態を示す。「データ転送中断状態２」とは、一方のコントローラから他方のコントローラへのデータ転送が完全に行われなかった状態を示す。以下、データ転送中断状態を「中断状態」と略記する。
【００７３】
ディレクトリ前方ポインタ３３３及びディレクトリ後方ポインタ３３４は、対応するサブディレクトリエントリ、または、ハッシュ値が同じＣＳ領域管理テーブル３３を示す。具体的には、前方ポインタ３３３が、対応するサブディレクトリエントリ中の先頭ポインタ３２２、または、ハッシュ値が同じＣＳ領域管理テーブル３３に対応し、後方ポインタ３３４が、対応するサブディレクトリエントリ中の終端ポインタ３２３、または、ハッシュ値が同じＣＳ領域管理テーブル３３に対応している（図１０参照）。
【００７４】
キュー前方ポインタ３３５及びキュー後方ポインタ３３６は、キューヘッダ３５（クリーン、パリティ生成前ダーティ、パリティ生成後ダーティ、及びフリーの何れか）に接続するための情報である。キュー前方ポインタ３３５及びキュー後方ポインタ３３６については、後述する。
【００７５】
割当てアドレス３３７は、このアドレス３３７を有するＣＳ領域管理テーブル３３の接続先のキャッシュ割当て管理テーブル３４のアドレスを表すポインタである。割当てアドレス３３７は、割当てアドレス１及び割当てアドレス２を有する。割当てアドレス１及び割当てアドレス２のうちの一方がライト面に対応し他方がリード面に対応する。
【００７６】
リード面／ライト面フラグ３３８は、割当てアドレス１と割当てアドレス２のどちらがリード面（クリーンデータ及びパリティ生成済みダーティデータを格納するＣＳ領域）でありどちらがライト面（パリティ未生成ダーティデータを格納するＣＳ領域）であるかを示す情報である。具体的には、フラグ３３８が立っていたら、割当てアドレス１にはリード面が対応しており、フラグ３３８が倒れていたら、割当てアドレス１にライト面が対応していることになる。
【００７７】
新データであるライトデータに対する新パリティを現パリティと現データから生成する場合に備え、現データに相当するクリーンデータ（記憶デバイスユニットに書込み済みのデータ）や、現データに相当するパリティ生成後ダーティデータ（記憶デバイスユニットに未書込みでパリティ生成後の（ダーティ状態の）ライトデータ）が、リード面に保持される。この様に、ＣＳ領域に格納されているデータの状態（クリーン又はダーティ）で、ＣＳ領域をライト面又はリード面として扱うことにより、ＣＳ領域を有効活用できる。
【００７８】
転送制御情報３３９は、データが書き込まれているライト範囲（キャッシュ領域２４４におけるアドレス範囲）及び、コントローラ２２のホストコンピュータ１に対するデータ転送要求のリトライ回数を示す。
【００７９】
図７は、実施例に係るキャッシュ割当て管理テーブル３４の一例を示す。
【００８０】
キャッシュ割当て管理テーブル３４は、ＣＳ領域毎に存在する。キャッシュ割当て管理テーブル３４は、キャッシュ領域２４４（ＣＳ領域）の割当てを管理するための情報である。
【００８１】
キャッシュ割当て管理テーブル３４は、ＣＳ領域アドレス３４１、接続ポインタ３４２、ステージングブロックマップ３４３及びダーティブロックマップ３４４を有する。ＣＳ領域アドレス３４１は、ＣＳ領域のアドレスを示す。接続ポインタ３４２は、ＣＳ領域管理テーブル３３、または、ＣＳ領域管理テーブル３３へ複数のキャッシュ割当て管理テーブル３４を割り当てる場合の、キャッシュ割当て管理テーブル３４へのポインタである。ステージングブロックマップ３４３は、ＣＳ領域を構成する複数のサブ領域にそれぞれ対応した複数のビットを有し、クリーンデータが格納されている領域に対応したビットがＯＮ（１）である。ダーティブロックマップ３４４は、ＣＳ領域を構成する複数のサブ領域にそれぞれ対応した複数のビットを有し、ダーティデータが格納されている領域に対応したビットがＯＮ（１）である。１つのＣＳ領域管理テーブル３３のリード面或いはライト面のそれぞれに対し、異なるキャッシュ割当て管理テーブル３４を接続ポインタで接続してもよい。
【００８２】
図８は、実施例に係るキューヘッダ３５の一例を示す。
【００８３】
キューヘッダ３５は、データ状態３３１毎に存在し、そのデータ状態に対応した管理テーブル（例えば、ＣＳ領域管理テーブル３３或いはキャッシュ割当て管理テーブル３４）のキューの先頭である。キューヘッダ３５は、キュー属性３５１、エントリ数カウンタ３５２、先頭ポインタ３５３及び終端ポインタ３５４を有する。キュー属性３５１は、対応するデータ状態を示す。エントリ数カウンタ３５２は、接続されている管理テーブルの数を示す。先頭ポインタ３５３は、キューの先頭の管理テーブルのアドレスを示す。終端ポインタ３５４は、キューの末端の管理テーブルのアドレスを示す。
【００８４】
図９は、実施例に係るバッファ領域の管理の一例を示す。
【００８５】
バッファ領域管理テーブル３０により、バッファ領域２４２における各ＢＳ領域の状態が管理される。例えば、ＣＰＵ２３０は、ＢＳ領域アドレス３０４からＢＳ領域を特定したり、割当てビットマップ３０３から、未使用状態のＢＳ領域を特定したり、未使用状態のＢＳ領域を割り当てたらそのＢＳ領域に対応したビットの値をＯＮ（１）に変更したり、使用中のＢＳ領域からデータが読み出されたらそのＢＳ領域に対応したビットの値をＯＦＦ（０）に変更（ＢＳ領域を解放）したりすることができる。
【００８６】
図１０は、実施例に係るキャッシュ領域２４４の管理の一例を示す。なお、図１０において「ダーティ（前）」は、パリティ生成前ダーティを示し、「ダーティ（後）」は、パリティ生成後ダーティを示す。
【００８７】
ＣＳ領域管理テーブル３３が、キャッシュディレクトリテーブル３２中のサブディレクトリエントリに接続されている。１つのサブディレクトリエントリは、前述したように、Ｉ／Ｏ先情報のハッシュ値に対応している。
【００８８】
また、キューヘッダ３５が、ＣＳ領域管理テーブル３３及びキャッシュ割当て管理テーブル３４の各々について存在する。また、特に、ＣＳ領域管理テーブル３３については、複数のデータ状態にそれぞれ対応した複数のキューヘッダ３５が存在する。以下、データ状態「ＡＡ」（例えばフリー）に対応したキューヘッダに接続されている管理テーブルのキューを「ＡＡキュー」（例えばフリーキュー）と言うことがある。ＣＳ領域管理テーブル３３は、その管理テーブル３３が示すデータ状態に対応したキューヘッダ３５に直接的に又は間接的に接続されている。間接的な接続は、例えば、１以上の他のＣＳ領域管理テーブル３３を隔てての接続である。上述のように、キューポンタには、キュー前方ポインタ３３５、及びキュー後方ポインタ３３６の２つのキューポインタがある。このように、２つのポインタを持つ理由は、ＣＳ領域管理テーブル３３に格納されているデータのＬＲＵ（Least  Recently  Used）制御、すなわち、アクセスから時間が経ったデータを優先してキャッシュ上から破棄する制御を実現させるためである。具体的には、例えば、或るキューヘッダ３５に対応したＣＳ領域管理テーブル３３（対象ＣＳ領域管理テーブル３３）を先頭の位置に移動する場合、この対象ＣＳ領域管理テーブル３３を途中から抜き取る必要がある。そして、対象ＣＳ領域管理テーブル３３を途中から抜く動作の際に、キューの接続状態を維持するため、対象ＣＳ領域管理テーブル３３の前方ポインタが指すＣＳ領域管理テーブルと、後方ポインタが指すＣＳ領域管理テーブルとを接続する必要があるためである。
【００８９】
ＣＳ領域管理テーブル３３は、割当てアドレス１及び２の少なくとも一方を介してキャッシュ割当て管理テーブル３４に接続される。なお、ＣＳ領域管理テーブル３３中の割当てアドレス１及び２の各々に、キャッシュ割当て管理テーブル３４が割り当てられることがある。例えば、ＣＳ領域管理テーブル３３に対応しクリーン状態のデータを格納しているリード面に対してライトが発生し、そのリード面についてライト面を確保する場合がある。その場合、リード面に加えてライト面を１つのＣＳ領域管理テーブル３３に割り当てる必要があり、このような場合に、１つのＣＳ領域管理テーブル３３中の割当管理テーブルアドレス１及び２の両方が使用される。
【００９０】
クリーンデータは、一方のコントローラ２２にのみ格納されるが、パリティ未生成ダーティデータ、及びパリティ生成済みダーティデータは、一方のコントローラのキャッシュ領域と他方のコントローラのキャッシュ領域に二重化される。なお、キャッシュ領域２４４が、揮発性領域と不揮発性領域とを有し、クリーンデータが揮発性領域に格納され、ダーティデータが不揮発性領域に格納されてもよい。
【００９１】
ＣＰＵ２３０は、ホストコンピュータ１からのリード或いはライト要求受信時に、その要求が有するＩ／Ｏ先情報のハッシュ値に対応するキャッシュディレクトリテーブル３２の先頭ポインタ３２２を辿った先にI／Ｏ先に対応するＣＳ領域管理テーブル３３が存在するか否かを判断する。その判断の結果が偽の場合、それは、そのＩ／Ｏ先についてＣＳ領域が未確保であることを意味する。ＣＳ領域が未確保ならば、ＣＰＵ２３０は、ＣＳ領域を確保する。具体的には、ＣＰＵ２３０は、フリーキュー（ＣＳ領域管理テーブル群）から１つのＣＳ領域管理テーブル３３を取得し、取得した管理テーブル３３をサブディレクトリエントリに接続し、且つ、フリーキュー（キャッシュ割当て管理テーブル群）から１つまたは複数のキャッシュ割当て管理テーブル３４を取得し、その管理テーブル３４を、上記取得したＣＳ領域管理テーブル３３に接続する。
【００９２】
受信した要求がリード要求の場合、ＣＰＵ２３０は、ＣＳ領域をリード面として確保し、そのリード面に、Ｉ／Ｏ先情報に従うリード元となるＲＧからデータをステージングし、データ状態３３１をフリーからクリーンに変更し、対応するＣＳ領域管理テーブル３３を、クリーンキューに接続する（例えば、クリーンのキューヘッダ３５に直接的に接続する）。
【００９３】
受信した要求がライト要求の場合、ＣＰＵ２３０は、ＣＳ領域をライト面として確保し、ライト面にライトデータを格納し、データ状態３３１をフリーからパリティ未生成ダーティに変更し、対応するＣＳ領域管理テーブル３３を、パリティ未生成ダーティのキューヘッダ３５に接続する。
【００９４】
ホストコンピュータ１からの要求とは非同期に、ストレージシステム２内でパリティ生成を実行した場合、ＣＰＵ２３０は、リード面に、ライト面のダーティデータを統合して、ライト面のデータを破棄し、データ状態３３１をパリティ生成済ダーティに変更し、対応するＣＳ領域管理テーブル３３を、パリティ生成済みダーティキューに接続する。
【００９５】
パリティ生成済みダーティキューに接続されたＣＳ領域管理テーブル３３に対応したＣＳ領域内のデータは、ホストコンピュータ１からの要求とは非同期に、ライト先のＲＧにデステージされる。なお、ホストコンピュータ１からのアクセスを契機に、同一属性のキュー内で、そのアクセスに対応するＣＳ領域管理テーブル３３が先頭へ遷移してよい。なぜなら、その管理テーブル３３は、最近アクセスされたＣＳ領域に対応した管理テーブル３３だからである。
【００９６】
図１１から図１４にＦＥ−Ｉ／Ｆ２１０のデータ転送形態の概要を示す。ホストコンピュータ１とキャッシュ領域２４４との間のデータ転送形態として、２段転送と直転送がある。２段転送は、バッファ領域２４２（ＢＳ領域）を介してデータを転送する転送形態である。直転送は、バッファ領域２４２（ＢＳ領域）を介さずデータを転送する転送形態である。２段転送として、ライト２段転送とリード２段転送がある。ライト２段転送は、ホストコンピュータ１からのライトデータをバッファ領域２４２（ＢＳ領域）を介してキャッシュ領域２４４（ＣＳ領域）に転送する２段転送である。リード２段転送は、キャッシュメモリ２４４内のリードデータをバッファ領域２４２（ＢＳ領域）を介してホストコンピュータ１に転送する２段転送である。一方、直転送として、ライト直転送とリード直転送がある。ライト直転送は、ホストコンピュータ１からのライトデータをバッファ領域２４２（ＢＳ領域）を介さずにキャッシュ領域２４４（ＣＳ領域）に転送する直転送である。リード直転送は、キャッシュ領域２４４（ＣＳ領域）内のリードデータをバッファ領域２４２（ＢＳ領域）を介さずにホストコンピュータ１に転送する直転送である。
【００９７】
図１１は、リード直転送の一例を示す。図１２は、リード２段転送の一例を示す。
【００９８】
図１１に示すように、リード要求を受けたＦＥ−Ｉ／Ｆ＃０からリード直転送できるのは、ＦＥ−Ｉ／Ｆ＃０が、リードデータがキャッシュ領域＃０に存在する場合である。リード直転送では、キャッシュ領域＃０に格納されているリードデータを、コントローラ＃０のＦＥ−Ｉ／Ｆ＃０がホストコンピュータ１へ転送する。詳細には、ＦＥ−Ｉ／Ｆ＃０が、リードデータに付随している保証コードをチェックし、リードデータにビットエラーが発生していなければ、ＣＰＵ＃０が、リードデータを、ＦＥ−Ｉ／Ｆ＃０を介して（例えば、リードデータに付随している保証コードをチェックしつつ）、ホストコンピュータ１へ転送する（１１―１）。その後、ＣＰＵ＃０は、リード要求完了報告を、ＦＥ−Ｉ／Ｆ＃０を介して、ホストコンピュータ１に送信する（１１―２）。なお、保証コードのチェックは、ＦＥ−Ｉ／Ｆ＃０に代えてＣＰＵ＃０が行ってもよい。
【００９９】
一方、図１２に示すように、リード要求を受けたＦＥ−Ｉ／Ｆ＃０が受けたがリードデータがキャッシュ領域＃１に格納されている場合、リード２段転送が行われる。リード２段転送では、ＣＰＵ＃０が、バッファ領域＃０からＢＳ領域を確保する。以下、バッファ領域＃１から確保されたＢＳ領域を「ＢＳ領域＃１」と言い、バッファ領域＃０から確保されたＢＳ領域を「ＢＳ領域＃０」と言う。確保したＢＳ領域＃０に、キャッシュ領域＃１内のリード面４１ｂのリードデータが転送される。この転送は、ＣＰＵ＃１によるリード面４１ｂからＢＳ領域＃０へのライトであるが、ＣＰＵ＃０によるリード面４１ｂからＢＳ領域＃０へのリードでもよい。ＣＰＵ＃０は、ＢＳ領域＃０にリードデータを格納した後に（１２―１）、ＦＥ−Ｉ／Ｆ＃０が、格納したリードデータに付随している保証コードをチェックし、ＣＰＵ＃０が、ＦＥ−Ｉ／Ｆ＃０を介して（例えば、リードデータに付随している保証コードをチェックしつつ）、リードデータをＢＳ領域＃０からホストコンピュータ１へ転送する（１２―２）。その後、ＣＰＵ＃０は、リード要求完了報告をホストコンピュータ１に送信する（１１―３）。
【０１００】
図示していないが、ライト面のデータが存在する場合（つまり、ホストコンピュータ１がライト要求を送信した後にリード要求を送信した場合）、リードデータは、ライト面のデータにリード面のデータを補ったものになる。別々のコントローラ２２に存在するリード面とライト面からリードデータを転送する場合は、２段転送となる。
【０１０１】
図１３は、ライト２段転送の一例を示し、図１４は、ライト直転送の一例を示す。
【０１０２】
ライトデータ転送中断によるライト面のパリティ未生成ダーティデータ破壊を避けるため、一般に、ライトは常に２段転送で実行され、また、図示しないが、ストレージシステム２の内部機能（ローカルコピー、遠隔コピー等）においてライトデータを複製する場合等でも、２段転送で実行されてよい。
【０１０３】
図１３に示すように、ライト２段転送では、ホストコンピュータ１からのライトデータに対して、ＦＥ−Ｉ／Ｆ＃０が、保証コードを付与し、保証コードを付与したライトデータを、ＢＳ領域＃０（ライト２段転送のためにバッファ領域＃０から確保されたＢＳ領域）に格納する（１３―１）。キャッシュ領域＃０のライト面４２ａにパリティ未生成のダーティデータが格納されている場合、ＣＰＵ＃０が、保証コードを確認する（１３―２）。なお、ライト要求受信時、ライト面４２ａ及びライト面４２ｂを新規に割当てる等、パリティ未生成のダーティデータを格納していない場合は、（１３―２）の保証コードの確認が省略される。
【０１０４】
ビットエラーが発生していなければ、ＣＰＵ＃０が、ＢＳ領域＃０からキャッシュ領域＃０のライト面４２ａにライトデータをコピーし（１３―３）、更に、キャッシュ領域＃１のライト面４２ｂにライトデータをコピーする（１３―４）。ＣＰＵ＃１は、ライト面４２ｂに格納されたライトデータの保証コードを確認する（１３―５）。ビットエラーが発生していなければ、ＣＰＵ＃１は、ＣＰＵ＃０及びＦＥ−Ｉ／Ｆ＃０を介して、ホストコンピュータ１にライト要求完了を報告する（１３―６）。
【０１０５】
一方、図１４に示すように、ライト直転送では、ホストコンピュータ１からのライトデータをＦＥ−Ｉ／Ｆ＃０が保証コードを付与し、保証コードを付与したライトデータをキャッシュ領域＃０のライト面４２ａに格納する（１４―１）。ライト面４２ａにパリティ未生成のダーティデータを格納している場合は、ＣＰＵ＃０は、保証コードを確認する（１４―２）。なお、ライト２段転送と同様、ライト要求受信時、ライト面４２ａ、ライト面４２ｂを新規に割当てる等、パリティ未生成のダーティデータを格納していない場合、（１４−２）の保証コード確認が省略される。
【０１０６】
ビットエラーが発生していなければ、ＣＰＵ＃０が、キャッシュ領域＃０のライト面４２ａからキャッシュ領域＃１のライト面４２ｂにライトデータをコピーする（１４―３）。ＣＰＵ＃１は、ライト面４２ｂに格納されたライトデータの保証コードを確認する（１４―４）。ビットエラーが発生していなければ、ＣＰＵ＃１は、ＦＥ−Ｉ／Ｆ＃１を介して、ホストコンピュータ１にライト要求完了を報告する（１４―５）。
【０１０７】
図１５は、実施例に係るライト転送方式の特徴比較の一例を示す。
【０１０８】
データ状態について、次の通りである。すなわち、ライト要求受信時のキャッシュ領域２４４の状態が、キャッシュデータ無し、または、（キャッシュデータ有りで、かつ、(データ状態がクリーン、または、パリティ生成済みダーティ)）のケースが、ケースＸである。また、キャッシュデータ有りで、かつ、データ状態がパリティ未生成ダーティのケースが、ケースＹである。
【０１０９】
転送形態は、２段転送（保証コード確認有り／無し）と直転送（保証コード確認有り／無し）に大別される。
【０１１０】
ライト中障害時のデータ回復方法は、ケースＸでは、いずれの方式もライトデータが破棄され、ケースＹでは、２段転送ではライトデータの転送リトライが行われ、直転送では、ライトデータの転送リトライ、または、他コントローラのダーティデータによる回復が行われる。なお、ライト中障害時のデータ回復方法に記載されている確固書き（（１−１）〜（１−６））は、それぞれ、図１３の（１３−１）〜（１３−６）にそれぞれ対応し、また、確固書き（（１−１）〜（１−５））は、それぞれ、図１４の（１４−１）〜（１４−５）対応している。
【０１１１】
「ライト時２段転送のみ」と比較して、「ライト時直接転送のみ」は、ライト時のメモリアクセス回数を削減することができる。また、ライト面にパリティ未生成ダーティがある場合のみ「ライト２段転送」をする形態も考えられる。メモリアクセス回数削減効果は低減するがライトデータ転送中断時のデータ回復の実装が容易である。
【０１１２】
以下の説明では、主に「ライト時直接転送のみ」において、一部、ライト２段転送も実行可能とした形態について説明する。
【０１１３】
図１６及び図１７は、実施例に係るリード処理の流れの一例を示す。リード処理はＣＰＵ２３０がリードプログラム５０を実行することで実現される。
【０１１４】
まず、図１６に示すように、ＣＰＵ２３０が、ＦＥ−Ｉ／Ｆ２１０からのリード要求を検出する（ステップ１０００）。
【０１１５】
次に、ＣＰＵ２３０は、リード要求が有するリード元情報（リード元を表すＩ／Ｏ先情報）から、キャッシュディレクトリテーブル３２を介し、ＣＳ領域管理テーブル３３とキャッシュ割当て管理テーブル３４を参照する。これは、自コントローラと他コントローラの両方のキャッシュ領域管理テーブル３３に対して実行する。ＣＰＵ２３０が、リード要求範囲のキャッシュ領域管理テーブル３３を参照し、リード要求データのキャッシュ領域２４４への格納状態を確認する（ステップ１００１）。
【０１１６】
次に、リードすべきライト面を決定するため、ＣＰＵ２３０は、中断状態があるか判断する（ステップ１００２）。リード要求範囲にライト面のデータが存在する場合、リード対象データは、ライト面のデータにリード面のデータを補ったものになる。なお、中断状態として、前述したように、中断状態１及び２がある。中断状態１とは、ホストコンピュータ１からライト要求を受信したコントローラ２２へ、ライト要求に従うライトデータが完全に転送されなかった場合における、ライト要求を受信したコントローラが有するＣＳ領域の状態である。中断状態２とは、ライトデータを受信したコントローラから他のコントローラへライトデータが完全に転送されなかった場合における、他のコントローラが有するＣＳ領域の状態である。
【０１１７】
データ転送中断状態１とデータ転送中断状態２のどちらも存在しない場合（ステップ１００２：Ｎｏ）、ＣＰＵ２３０は、通常どおり、クリーンデータが存在するリード面をリード対象に設定する（ステップ１００３）。その後、ステップ１０１０へ進む。
【０１１８】
中断状態１と中断状態２のどちらか一方でも存在する場合（ステップ１００２：Ｙｅｓ）、ＣＰＵ２３０は、中断状態２が発生しているコントローラ２２のライト面に、パリティ未生成ダーティデータが存在するか否かを確認する（ステップ１００４）。
【０１１９】
パリティ未生成ダーティデータが無い場合（ステップ１００４：Ｙｅｓ）、ＣＰＵ２３０は、新規割当てしたライト面にライトデータを格納しようとしており、ライトデータの転送に失敗した場合、当該ライトデータを破棄するため、ライト面をリード対象とせず、リード面のデータ（及び、ステップ１０１１でステージングするデータ）をリード対象とする（ステップ１００５）。その後、ステップ１００９へ進む。
【０１２０】
パリティ未生成ダーティデータが有る場合（ステップ１００４：Ｎｏ）、ＣＰＵ２３０は、自コントローラと他コントローラのリード元に対応するＣＳ領域管理テーブル３３の両方を見た場合、中断状態１と中断状態２の両方があるか判断する（ステップ１００６）。
【０１２１】
中断状態１と中断状態２の両方が有る場合（ステップ１００６：Ｙｅｓ）、ＣＰＵ２３０は、ライト要求を受信したコントローラ２２のキャッシュ領域２４４にホストコンピュータ１からライトデータを転送中に発生した障害状態が存在するため、中断状態２が設定されているコントローラ２２（パリティ未生成ダーティデータが格納されているコントローラ２２）のライト面をリード対象とする（ステップ１００７）。その後、ステップ１００９へ進む。
【０１２２】
中断状態１と中断状態２のどちらか一方しか無い場合（つまり、中断状態２が片方のコントローラ側にある場合）（ステップ１００６：Ｎｏ）、ライト要求を受信したコントローラ２２のライト面から他方のコントローラ２２のライト面にライトデータをコピー中に発生した障害状態が存在するため、ＣＰＵ２３０は、中断状態２が設定されていないコントローラ２２（ライト要求を受信したコントローラ２２）側のライト面をリード対象とする（ステップ１００８）。
【０１２３】
次に、ＣＰＵ２３０は、リード要求範囲について、中断状態回復処理を起動する（ステップ１００９）。中断状態回復処理は、起動するだけで終了を待たない。
【０１２４】
次に、ＣＰＵ２３０は、リード要求範囲の全てのデータがキャッシュ領域２４４に存在するか判断する（ステップ１０１０）。
【０１２５】
リード要求範囲の全てのデータがキャッシュ領域２４４に存在する場合（ステップ１０１０：Ｙｅｓ）、図１７のステップ１０１３へ進む。
【０１２６】
リード要求範囲の全てのデータがキャッシュ領域２４４に存在しない場合（ステップ１０１０：Ｎｏ）、ＣＰＵ２３０は、キャッシュ領域２４４に格納されていないデータを、リード面に、ＲＧからステージングする（ステップ１０１１）。ＣＰＵ２３０は、リード面に有効なクリーンデータが格納されていることを示すため、ステージングブロックマップにおける、ステージング範囲に対応したビットをＯＮに設定する（ステップ１０１２）。その後、図１７のステップ１０１３へ進む。
【０１２７】
図１７に示すように、ＣＰＵ２３０は、リード要求範囲全てのデータが自コントローラ側にあるか判断する（ステップ１０１３）。リード要求範囲のデータを格納しているライト面とリード面の両方が自コントローラ側にある必要がある。
【０１２８】
リード要求範囲の一部のデータが自コントローラ側に無い場合（ステップ１０１３：Ｎｏ）、ＣＰＵ２３０は、リード２段転送を実行するため、自コントローラのＢＳ領域を確保する（ステップ１０１４）。ＣＰＵ２３０は、確保したＢＳ領域に、リード面と（ステップ１００２からステップ１００８で決定した）ライト面から、リードデータを（ＤＭＡ等により）コピーする（ステップ１０１５）。ＣＰＵ２３０は、確保したＢＳ領域からホストコンピュータ１へＦＥ−Ｉ／Ｆ２１０を介してリードデータを転送する（ステップ１０１６）。その後、ステップ１０１８へ進む。
【０１２９】
リード要求範囲の全てのデータが自コントローラ側に有る場合（ステップ１０１３：Ｙｅｓ）、ＣＰＵ２３０は、リード直転送を実行するため、自コントローラ２２のリード面から、ホストコンピュータ１へＦＥ−Ｉ／Ｆ２１０を介して、リードデータを転送する（ステップ１０１７）。
【０１３０】
次に、ＣＰＵ２３０は、ホストコンピュータ１へリード要求の正常終了を報告する（ステップ１０１８）。
【０１３１】
次に、ＣＰＵ２３０は、未解放のＢＳ領域の有無を判断する（ステップ１０１９）。リード２段転送を実行した場合、ステップ１０１４で確保したＢＳ領域を未解放のまま自コントローラに有しているため、ＣＰＵ２３０は、確保したＢＳ領域を解放する（ステップ１０２０）。
【０１３２】
最後に、ＣＰＵ２３０は、データ状態に応じたキュー遷移を実行する（ステップ１０２１）。ＣＰＵ２３０は、ＣＳ領域管理テーブル３３をフリーキューから新規確保した場合は、クリーンキュー先頭に接続、また、リード要求時にＣＳ領域管理テーブル３３が存在した場合は、同一のデータ状態のキュー内でキューの先頭に接続し直す等を実行する。
【０１３３】
以上で、リード処理の説明を終了する。
【０１３４】
図１８、図１９及び図２０は、実施例に係るライト処理の流れの一例を示す。ライト処理は、ＣＰＵ２３０がライトプログラム５１を実行することで実現される。
【０１３５】
図１８に示すように、まず、ＣＰＵ２３０は、ＦＥ−Ｉ／Ｆ２１０からのライト要求を検出する（ステップ１１００）。
【０１３６】
次に、ＣＰＵ２３０は、ライト要求が有するライト先情報（ＶＯＬ番号とＶＯＬ内のアドレス）から、キャッシュディレクトリテーブル３２を介し、ＣＳ領域管理テーブル３３とキャッシュ割当て管理テーブル３４を参照する。これは、自コントローラと他コントローラの両方のＣＳ領域管理テーブル３３に対して実行される。ＣＰＵ２３０は、ライト要求範囲のキャッシ領域管理テーブル３３を参照し、ライト範囲のデータのキャッシュ領域２４４への格納状態を確認する（ステップ１１０１）。なお、ライト先情報についてＣＳ領域管理テーブル３３が未だ確保されていないこともあり得る。
【０１３７】
次に、ＣＰＵ２３０は、既にライト面を確保しているか判断する（ステップ１１０２）。これは、自コントローラと他コントローラの両方のＣＳ領域管理テーブル３３に対して実行する。通常は、両方に確保されているか、あるいは、両方確保されていないかのどちらかである。
【０１３８】
未だライト面が確保されていない場合（ステップ１１０２：Ｎｏ）、ＣＰＵ２３０は、ライト面を新規に確保する（ステップ１１０３）。これは、自コントローラと他コントローラの両方のＣＳ領域管理テーブル３３に対して実行する。
【０１３９】
既にライト面を確保している場合（ステップ１１０２：Ｙｅｓ）、ＣＰＵ２３０は、ライト要求範囲に中断状態があるか判断する（ステップ１１０４）。
【０１４０】
ライト要求範囲に中断状態が無い場合（ステップ１１０４：Ｎｏ）、ステップ１１０７へ進む。
【０１４１】
ライト要求範囲に中断状態が有る場合（ステップ１１０４：Ｙｅｓ）、ＣＰＵ２３０は、ライト要求範囲について中断状態回復処理を、ライト同期の起動要因で起動する（ステップ１１０５）。その後、ＣＰＵ２３０は、中断状態回復処理の終了を待つ（ステップ１１０６）。
【０１４２】
次に、ＣＰＵ２３０は、ライト要求範囲のライトデータを格納するのに不足するライト面を追加確保する（ステップ１１０７）。ＣＰＵ２３０は、確保済みのライト面でライト要求範囲のライトデータを格納できる場合は何もしない。
【０１４３】
次に、ＣＰＵ２３０は、キャッシュメモリ直転送実行可能か判断する（ステップ１１０８）。通常、ライト直転送が実行可能（ステップ１１０８：Ｙｅｓ）であるが、当該ボリュームに対して、ストレージシステム２の上述の内部機能を適用している場合等では、ライト２段転送が必要になる場合がある（ステップ１１０８：Ｎｏ）。その場合、図２０のステップ１２００へ進む。
【０１４４】
次に、ＣＰＵ２３０は、ライト要求を受信した自コントローラ２２のエラー状態を中断状態１、他コントローラのエラー状態を中断状態２に設定する（ステップ１１０９）。
【０１４５】
次に、ＦＥ−Ｉ／Ｆ２１０は、ライトデータをホストコンピュータ１から自コントローラのキャッシュ領域２４４のライト面に、保証コードを付与しながら格納する（ステップ１１１０）。
【０１４６】
次に、ＣＰＵ２３０は、自コントローラのライト面に、ライトデータのライト先領域（ＶＯＬにおける領域）と同じ領域をライト先としたダーティデータ（例えばパリティ未生成ダーティデータ）が有るか判断する（ステップ１１１１）。
【０１４７】
パリティ未生成ダーティデータが無い場合（ステップ１１１１：Ｎｏ）、ＣＰＵ２３０は、新規割当てしたライト面にライトデータを格納しようとしている状態であり、ライトデータの転送に失敗した場合、当該ライトデータは破棄するため、ライト要求を受信したコントローラ２２側でのデータ保証コードの確認をスキップする。その後、ステップ１１１４へ進む。
【０１４８】
自コントローラのライト面に、パリティ未生成ダーティデータが有る場合（ステップ１１１１：Ｙｅｓ）、ＣＰＵ２３０は、ライトデータの保証コードを確認する（ステップ１１１２）。
【０１４９】
次に、ＣＰＵ２３０は、ライトデータの自コントローラのキャッシュ領域への格納が正常終了したか判断する（ステップ１１１３）。これは、ＦＥ−Ｉ／Ｆ２１０のデータ転送実行結果、データ保証コード確認結果等で判断する。
【０１５０】
格納が正常終了していない場合（ステップ１１１３：Ｎｏ）、図１９のステップ１１２９へ進む。
【０１５１】
格納が正常終了している場合（ステップ１１１３：Ｙｅｓ）、ＣＰＵ２３０は、ライト面に有効なダーティデータが格納されていることを示すため、ライト要求範囲の自コントローラのライト面に対応したダーティブロックマップにおける、ダーティデータが格納された領域に対応したビットを、ＯＮに設定する（ステップ１１１４）。
【０１５２】
次に、ＣＰＵ２３０は、ライト要求を受信した自コントローラ２２のエラー状態の中断状態１をクリア（キャンセル）する（ステップ１１１５）。その後、図１９のステップ１１１６へ進む。
【０１５３】
図１９に示すように、ＣＰＵ２３０は、ライトデータを自コントローラのライト面から他コントローラのライト面に（ＤＭＡ等により）コピーする（ステップ１１１６）。
【０１５４】
次に、ＣＰＵ２３０は、ライトデータの保証コードを確認する（ステップ１１１７）。
【０１５５】
次に、ＣＰＵ２３０は、ライトデータの他コントローラのキャッシュ領域２４４への格納が正常終了したか判断する（ステップ１１１８）。これは、ステップ１１１６のコピー実行結果、データ保証コード確認結果等で判断する。
【０１５６】
格納が正常終了した場合（ステップ１１１８：Ｙｅｓ）、ステップ１１２５へ進む。
【０１５７】
格納が正常終了していない場合（ステップ１１１８：Ｎｏ）、ハードウェア等の一時的な不具合等によるデータ転送失敗等が想定されるため、ＣＰＵ２３０は、ライトデータのコントローラ間のコピーをリトライする。まず、ＣＰＵ２３０は、リトライ回数を初期化し（ステップ１１１９）、ステップ１１１６相当の、ライトデータを自コントローラのライト面から他コントローラのライト面に（ＤＭＡ等により）コピーをリトライする（ステップ１１２０）。その後、ＣＰＵ２３０は、ステップ１１１７相当の、ＣＰＵ２３０によりライトデータの保証コードを確認する（ステップ１１２１）。次に、ＣＰＵ２３０は、リトライが正常終了したか判断する（ステップ１１２２）。これは、リトライのコピー実行結果、データ保証コード確認結果等で判断する。リトライが正常終了した場合（ステップ１１２２：Ｙｅｓ）、ステップ１１２５へ進む。リトライが正常終了しなかった場合（ステップ１１２２：Ｎｏ）、ＣＰＵ２３０は、リトライ回数を加算し（ステップ１１２３）、リトライ回数が閾値を超えているか判断する（ステップ１１２４）。リトライ回数が閾値を超えている場合（ステップ１１２４：Ｙｅｓ）、ステップ１１２９へ進む。リトライ回数が閾値を超えていない場合（ステップ１１２４：Ｎｏ）、ＣＰＵ２３０は、再度コピーをリトライするため、ステップ１１２０へ進む。
【０１５８】
リトライが正常終了した場合（ステップ１１２２：Ｙｅｓ）、又はＳ１１１８：Ｙｅｓの後、ライト面に有効なダーティデータが格納されていることを示すため、ＣＰＵ２３０は、他コントローラのライト面のライト要求範囲のダーティブロックマップをＯＮに設定する（ステップ１１２５）。
【０１５９】
次に、ＣＰＵ２３０は、ライト要求を受信した他コントローラ２２のエラー状態の中断状態２をクリア（キャンセル）する（ステップ１１２６）。
【０１６０】
次に、ＣＰＵ２３０は、ホストコンピュータ１へライト要求の正常終了を報告する（ステップ１１２７）。
【０１６１】
次に、ＣＰＵ２３０は、データ状態に応じたキュー遷移を実行する（ステップ１１２８）。ＣＳ領域管理テーブル３３のデータ状態がクリーンだった場合、ＣＰＵ２３０は、パリティ未生成ダーティに変更し、ダーティ（生成前）キュー先頭に接続、また、既ダーティ（生成前）キューに接続中であってもキューの先頭に接続し直す等を実行する。
【０１６２】
一方、ＣＰＵ２３０は、ステップ１１１３：Ｎｏ（ライトデータの自コントローラのキャッシュ領域への格納が正常終了していない場合）、ステップ１１２４：Ｙｅｓ（ライトデータの自コントローラのライト面から他コントローラのライト面への（ＤＭＡ等による）コピーリトライが閾値を超えている場合）、ステップ１２０４：Ｎｏ（後述するライト２段転送における、ライトデータの自コントローラのバッファ領域への格納が正常終了していない場合）、又は、ステップ１２１２：Ｙｅｓ（後述するライト２段転送における、ライトデータの自コントローラの割当てたＢＳ領域から自コントローラのライト面への（ＤＭＡ等による）コピーリトライが閾値を超えている場合）の場合、ＣＰＵ２３０は、ホストコンピュータ１へライト要求のエラー終了を報告し（ステップ１１２９）、ライト要求範囲についてデータ転送中断回復処理を起動する（ステップ１１３０）。
【０１６３】
最後に、ＣＰＵ２３０は、未解放のＢＳ領域の有無を判断する（ステップ１１３１）。後述するライト２段転送を実行した場合、ステップ１２００で確保したＢＳ領域が未解放のまま自コントローラに存在するため、ＣＰＵ２３０は、未解放のＢＳ領域を解放する（ステップ１１３２）。
【０１６４】
図１８のステップ１１０８：Ｎｏの場合、図２０に示すように、ＣＰＵ２３０は、自コントローラのＢＳ領域を確保し（ステップ１２００）、ＦＥ−Ｉ／Ｆ２１０は、ライトデータを自コントローラの割当てたＢＳ領域に保証コードを付与して格納する（ステップ１２０１）。
【０１６５】
次に、ＣＰＵ２３０は、自コントローラのライト面に、パリティ未生成ダーティデータが有るか判断する（ステップ１２０２）。
【０１６６】
パリティ未生成ダーティデータが無い場合（ステップ１２０２：Ｎｏ）、新規割当てしたライト面にライトデータを格納しようとしている状態であり、ライトデータの転送に失敗した場合、当該ライトデータは破棄するため、ＣＰＵ２３０は、ライト要求を受信したコントローラ２２側でのデータ保証コードの確認をスキップする。その後、ステップ１２０５へ進む。
【０１６７】
パリティ未生成ダーティデータが有る場合（ステップ１２０２：Ｙｅｓ）、ＣＰＵ２３０により、確保したＢＳ領域に格納したライトデータの保証コードを確認する（ステップ１２０３）。
【０１６８】
次に、ＣＰＵ２３０は、ライトデータの自コントローラのＢＳ領域への格納は正常終了したか判断する（ステップ１２０４）。ＦＥ−Ｉ／Ｆ２１０のデータ転送実行結果、データ保証コード確認結果等で判断する。
【０１６９】
格納が正常終了していない場合（ステップ１２０４：Ｎｏ）、図１９のステップ１１２９へ進む。
【０１７０】
格納が正常終了している場合（ステップ１２０４：Ｙｅｓ）、ＣＰＵ２３０は、ライト要求を受信した自コントローラ２２のエラー状態を中断状態１、他コントローラのエラー状態を中断状態２に設定する（ステップ１２０５）。
【０１７１】
次に、ライトデータが、自コントローラのＢＳ領域からライト面に（ＤＭＡ等により）コピーされる（ステップ１２０６）。
【０１７２】
次に、ＣＰＵ２３０は、ライトデータの自コントローラのＣＳ領域への格納は正常終了したか判断する（ステップ１２０７）。ステップ１２０５のコピー実行結果等で判断する。
【０１７３】
格納が正常終了した場合（ステップ１２０７：Ｙｅｓ）、ステップ１２１３へ進む。
【０１７４】
格納が正常終了していない場合（ステップ１２０７：Ｎｏ）、ＣＰＵ１３０は、ハードウェア等の一時的な不具合等によるデータ転送失敗等が想定されるため、ライトデータの自コントローラのＢＳ領域からＣＳ領域へのコピーをリトライする。まず、ＣＰＵ２３０は、リトライ回数を初期化し（ステップ１２０８）、ステップ１２０６相当の、ライトデータを自コントローラのＢＳ領域からライト面に（ＤＭＡ等により）コピーをリトライする（ステップ１２０９）。次に、ＣＰＵ２３０は、リトライが正常終了したか判断する（ステップ１２１０）。リトライのコピー実行結果等で判断する。リトライが正常終了した場合（ステップ１２１０：Ｙｅｓ）、ステップ１２１３へ進む。リトライが正常終了していない場合（ステップ１２１０：Ｎｏ）、ＣＰＵ２３０は、リトライ回数を加算し（ステップ１２１１）、リトライ回数が閾値を超えているか判断する（ステップ１２１２）。リトライ回数が閾値を超えている場合（ステップ１２１２：Ｙｅｓ）、図１９のステップ１１２９へ進む。リトライ回数が閾値を超えていない場合（ステップ１２１２：Ｎｏ）、ＣＰＵ２３０は、再度コピーをリトライするため、ステップ１２０９へ進む。
【０１７５】
次に、ライト面に有効なダーティデータが格納されていることを示すため、ＣＰＵ２３０は、自コントローラのライト面に対応したダーティブロックマップにおける、ダーティデータが格納されている領域に対応したビットを、ＯＮに設定する（ステップ１２１３）。
【０１７６】
次に、ＣＰＵ２３０は、ライト要求を受信した自コントローラのエラー状態の中断状態１をクリア（キャンセル）する（ステップ１２１４）。その後、ＣＰＵ２３０は、図１９のステップ１１１６へ進む。
【０１７７】
以上で、ライト処理の説明を終了する。
【０１７８】
図２１は、実施例に係る中断状態回復処理の流れの一例を示す。
【０１７９】
中断状態回復処理は、ＣＰＵ２３０が中断状態回復プログラム５２を実行することで実現される。中断状態回復処理の起動要因としては、リード処理同期（リード処理からの起動）及びライト処理同期（ライト処理からの起動）のいずれかがあるが、その他、ホストコンピュータ１のＩ／Ｏ要求（リード／ライト要求）とは非同期の処理である非同期処理（例えば、パリティ生成処理からの起動、或いは、周期的な障害監視処理からの起動）であってもよい。また、中断状態回復処理は、キャッシュ領域２４４の中断状態に応じて異なる（詳細は図１５を参照）。
【０１８０】
まず、ＣＰＵ２３０は、中断状態回復処理の起動要因、及び指定された範囲に属するＣＳ領域に対応したＣＳ領域管理テーブルを参照する（ステップ１３００）。これは、自コントローラと他コントローラの両方のＣＳ領域管理テーブルに対して実行する。また、図２１の説明において、「指定された範囲」とは、例えば、起動要因がライト処理同期又はリード処理同期の場合、ホストコンピュータ１から受信したＩ／Ｏ要求で指定されているアドレス範囲（例えば、ＬＵＮ、ＬＢＡ（Logical  Block  Address）及びデータ長）でよく、起動要因がライト処理同期とリード処理同期のいずれでも無い場合、ＣＰＵ２３０（中断状態回復プログラム５２）が任意に指定した範囲でよい。以下、説明を分かり易くするために、図２１の説明において、指定された範囲に属するＣＳ領域を「指定ＣＳ領域」と言い、指定ＣＳ領域は１つのコントローラにつき１つであるとする。
【０１８１】
次に、ＣＰＵ２３０は、少なくとも１つのコントローラにおける指定ＣＳ領域に対応したＣＳ領域管理テーブルに中断状態があるか（エラー状態３３２が中断状態１又は２であるか）判断する（ステップ１３０１）。
【０１８２】
中断状態が無い場合（ステップ１３０１：Ｎｏ）、ＣＰＵ２３０は、中断状態回復処理を終了する。このケースは、この中断状態回復処理が中断状態が無い状態で起動された、あるいは、上記起動要因以外の別契機で起動された中断状態回復処理が既に中断状態を回復した等のケースであると考えられる。
【０１８３】
中断状態が有る場合（ステップ１３０１：Ｙｅｓ）、ＣＰＵ２３０は、中断状態２に対応した指定ＣＳ領域（中断状態２が設定されているコントローラ側のキャッシュ領域のライト面）に、ライト要求に対応するパリティ未生成ダーティデータが無いか判断する（ステップ１３０２）。なお、「中断状態が有る」ということは、中断状態１及び２のうち少なくとも中断状態２が有るということである。なぜなら、ライト処理（図１８〜図２０）において、暫定的に中断状態１及び２の両方が設定され（Ｓ１１０９又はＳ１２０５）、その後、中断状態１及び２のうち先にクリアされるのは必ず中断状態１だからである（Ｓ１１１５又はＳ１２１４）。
【０１８４】
中断状態２に対応した指定ＣＳ領域にパリティ未生成ダーティデータが無い場合（ステップ１３０２：Ｙｅｓ）、ＣＰＵ２３０は、新規割当てしたライト面にライトデータを格納しようとしている状態であり、エラー終了したライト要求に対応するライトデータを破棄する（ステップ１３０４）。ただし、起動要因がライト処理同期の場合(１３０３：Ｙｅｓ)、ＣＰＵ２３０は、中断状態回復処理の後にライト処理を控えているため、確保済みのライト面を再利用する目的で、（中断状態２のみが設定されている場合を想定し）データ転送元のダーティブロックマップをＯＦＦに設定する（ステップ１３０５）。その後、ステップ１３１５へ進む。
【０１８５】
次に、ＣＰＵ２３０は、自コントローラと他コントローラのそれぞれの指定ＣＳ領域に対応するＣＳ領域管理テーブル３３の両方を全体として見た場合、中断状態１と中断状態２の両方があるか判断する（ステップ１３０６）。
【０１８６】
中断状態１と中断状態２の両方がある場合（ステップ１３０６：Ｙｅｓ）、ライト要求を受信したコントローラ側のライト面のパリティ未生成ダーティデータが破壊されている可能性があるため、ＣＰＵ２３０は、中断状態１に対応した指定ＣＳ領域を有するコントローラ（つまり自コントローラ）内のいずれかのＣＳ領域をデータコピー先として設定し、中断状態２に対応した指定ＣＳ領域（つまり他コントローラの指定ＣＳ領域）をデータコピー元として設定する（ステップ１３０７）。その後、ステップ１３０９へ進む。なお、データコピー先は、中断状態１に対応した指定ＣＳ領域それ自体、すなわち、破壊されている可能性があるパリティ未生成ダーティデータを記憶しているライト面でもよい。
【０１８７】
中断状態１と中断状態２の一方がある場合（ステップ１３０６：Ｎｏ）、つまり、中断状態２のみが有る場合、自コントローラの指定ＣＳ領域（ライト面）から他コントローラの指定ＣＳ領域（ライト面）へのライトデータのコピーが失敗していると考えられるため、ＣＰＵ２３０は、中断状態２に対応した指定ＣＳ領域を有するコントローラ（つまり他コントローラ）内のいずれかのＣＳ領域をデータコピー先として設定し、中断状態２が対応付けられていない指定ＣＳ領域（つまり自コントローラ内の指定ＣＳ領域）をデータコピー元として設定する（ステップ１３０８）。なお、データコピー先は、中断状態２に対応した指定ＣＳ領域それ自体でもよい。
【０１８８】
次に、ＣＰＵ２３０は、データコピー不要条件が満たされているか判断する（ステップ１３０９）。データコピー不要条件が満たされていない場合、ＣＰＵ２３０は、コピー元からコピー先へのデータコピー（ステップ１３１０〜ステップ１３１４）を行うが、データコピー不要条件が満たされている場合、ＣＰＵ２３０は、そのようなデータコピーを行うことなく、ステップ１３１５を行う。なお、当該判断を実施せず（一律、データコピー不要条件に合致しないと判断（ステップ１３０９：Ｎｏ）として）中断状態回復処理を実行してもデータ回復は問題なく可能である。具体的な判断条件は、起動要因がライト処理同期であり、かつ、現ライト要求を受信したコントローラがデータコピー先の指定ＣＳ領域を有し、かつ、データ転送中断時のライト要求範囲（ライト要求で指定されているアドレス範囲）が現ライト要求範囲に包含される場合である。この場合、ステップ１３１０〜ステップ１３１４のデータコピー処理で回復したライト面のパリティ未生成ダーティデータの状態を、控えている現ライト要求のライト処理によって上書きすることになるからである。
【０１８９】
次に、ステップ１３１０〜ステップ１３１４のデータコピー処理により、データ転送が中断された可能性のあるライト面を、他方のコントローラの正常なライト面のパリティ未生成ダーティデータで上書きし、エラー状態を回復する。
【０１９０】
ＣＰＵ２３０は、データコピー位置を初期位置として指定されたリード／ライト範囲の先頭に設定し（ステップ１３１０）、指定された範囲全てのデータコピーを終了したか判断する（ステップ１３１１）。
【０１９１】
データコピーが未終了の場合（ステップ１３１１：Ｎｏ）、データ転送元のライト面からデータ転送先のライト面にダーティデータを一定量（ＤＭＡ等により）コピーする（ステップ１３１２）。このとき、コピー元のダーティブロックマップがＯＮ設定されている範囲内のデータのみをコピーすればよい。次に、ライト面に有効なダーティデータが格納されていることを示すため、ＣＰＵ２３０は、コピー先コントローラのライト面のライト要求範囲のダーティブロックマップを（コピー元のダーティブロックマップＯＮ設定に合わせて）ＯＮに設定する（ステップ１３１３）。次に、ＣＰＵ２３０は、データコピー位置をコピーした分だけ一定量進める（ステップ１３１４）。その後、ステップ１３１１へ進む。
【０１９２】
データコピーを終了の場合（ステップ１３１１：Ｙｅｓ）、ＣＰＵ２３０は、指定ＣＳ領域に対応した中断状態をクリアして（ステップ１３１５）、中断状態回復処理を終了する。
【０１９３】
以上、一実施例を説明したが、本発明は上記実施例に限定されない。
【０１９４】
例えば、図示しないが、ステップ１３１２のコピーが失敗した場合、コピー方法が複数（複数のＤＭＡエンジンが実装されている等）用意されている場合は、別の方法によるコピーをリトライしたり、また、ＣＰＵ２３０が、コピー先のライト面を一度解放し、再度フリーキューから確保した同一コントローラのキャッシュ領域の別の領域をライト面としてコピーをリトライしたりしてもよい。それでも中断状態が回復できない場合は、コピー元のライト面のパリティ未生成ダーティデータのパリティを生成し、ＲＧにコピー元のパリティ生成済ダーティデータと新パリティをデステージして、コピー元とコピー先のライト面内のデータを破棄してもよい。
【符号の説明】
【０１９５】
１：ホストコンピュータ、２：ストレージシステム、２１：記憶制御装置、２２：コントローラ、２１０：ＦＥ−Ｉ／Ｆ、２３０：ＣＰＵ、２４０：メモリ、２４２：バッファ領域、２４３：管理テーブル領域、２４４：キャッシュ領域
【図２】
0006009095.tif 000002
【図３】
0006009095.tif 000003
【図４】
0006009095.tif 000004
【図５】
0006009095.tif 000005
【図６】
0006009095.tif 000006
【図７】
0006009095.tif 000007
【図８】
0006009095.tif 000008
【図９】
0006009095.tif 000009
【図１５】
0006009095.tif 000010
【図１６】
0006009095.tif 000011
【図１７】
0006009095.tif 000012
【図１８】
0006009095.tif 000013
【図１９】
0006009095.tif 000014
【図２０】
0006009095.tif 000015
【図２１】
0006009095.tif 000016
【図１】
0006009095.tif 000017
【図１０】
0006009095.tif 000018
【図１１】
0006009095.tif 000019
【図１２】
0006009095.tif 000020
【図１３】
0006009095.tif 000021
【図１４】
0006009095.tif 000022