(57)【特許請求の範囲】
【請求項１】
記憶デバイスに対するデータの入出力を制御し、一時記憶領域と、演算処理を行う演算部を有するプロセッサとを有するストレージコントローラと、
前記ストレージコントローラに接続され、ホストコンピュータからのリード要求又はライト要求を、前記ストレージコントローラに送信するインタフェース装置と
を備え、
前記ストレージコントローラが、前記リード要求又は前記ライト要求を受信した場合、前記プロセッサが、前記インタフェース装置に対して、前記リード要求に従うリードデータのリード処理の一部又は全部を実行することの指示であるリード支援指示、又は、前記ライト要求に従うライトデータのライト処理の一部又は全部を実行することの指示であるライト支援指示を送信し、
前記インタフェース装置が、
前記ストレージコントローラからの前記リード支援指示又は前記ライト支援指示に従い、前記リードデータのリード処理の一部又は全部、又は、前記ライトデータのライト処理の一部又は全部を実行し、
前記ホストコンピュータに対して、前記リード処理が完了した旨の第１の応答又は前記ライト処理が完了した旨第２の応答を送信するコンピュータシステム。
【請求項２】
前記一時記憶領域が、前記ストレージコントローラに複数存在し、
前記ライト処理は、前記ライトデータを前記複数の一時記憶領域へそれぞれ書き込む一時記憶ライト処理と、前記複数の一時記憶領域に書き込まれたライトデータの正当性を確認する確認処理とを含み、
前記ライト支援指示として、前記一時記憶ライト処理を実行することの指示である第１のライト支援指示と、前記確認処理を実行することの指示である第２のライト支援指示とがあり、
前記インタフェース装置は、前記一時記憶領域のアドレスを指定した第１のライト支援指示に従い、前記ライトデータを前記複数の一時記憶領域の前記指定されたアドレスにそれぞれ書き込む一時記憶ライト処理を実行し、前記第２のライト支援指示に従い、前記複数の一時記憶領域にそれぞれ格納されたライトデータの正当性を確認する確認処理を実行する
請求項１に記載のコンピュータシステム。
【請求項３】
前記インタフェース装置は、前記確認処理において、
前記複数の一時記憶領域にそれぞれ格納されたライトデータの正当性が確認された場合は、前記ストレージコントローラに対して、前記確認処理が成功した旨の通知を送信し、かつ、前記ホストコンピュータに対して、前記第２の応答を送信し、
前記複数の一時記憶領域にそれぞれ格納された前記データの正当性が確認されなかった場合は、前記ストレージコントローラに対して、前記確認処理が失敗した旨の通知を送信する
請求項２に記載のコンピュータシステム。
【請求項４】
前記ストレージコントローラは、
前記ライトデータにより更新される旧データが、前記複数の一時記憶領域に存在する場合には、前記インタフェース装置に対して、前記複数の一時記憶領域のうちの１つにおける空き領域を対象とした、前記第１のライト支援指示及び前記第２のライト支援指示を送信し、
前記インタフェース装置は、
前記第１のライト支援指示に従い、対象の空き領域にライトデータを書き込み、前記第２のライト支援指示に従い、対象の空き領域に対して確認処理を行い、
前記確認処理が成功した場合に、前記複数の一時記憶領域に存在する前記旧データに、前記空き領域に格納されたライトデータを上書きする
請求項３に記載のコンピュータシステム。
【請求項５】
前記インタフェース装置が、前記ホストコンピュータに存在する
請求項２に記載のコンピュータシステム。
【請求項６】
前記複数の一時記憶領域のそれぞれは、その一時記憶領域に格納されたデータの管理情報と、前記記憶デバイスに対して追加処理が必要か否かの情報を示す追加情報とを格納し、
前記ライト処理は、さらに、前記管理情報を更新する更新処理、及び、前記記憶デバイスに対して所定の処理を行う追加処理を含み、
前記ストレージコントローラの前記プロセッサが、
前記ライトデータに対応し前記ライトデータにより更新される旧データが前記複数の一時記憶領域に存在せず、前記データを格納する記憶デバイスに追加処理が必要でないと判定した場合には、前記インタフェース装置に対して、前記一時記憶ライト処理及び前記確認処理の後に、前記更新処理を実行することの指示である第３のライト支援指示を送信し、
前記旧データが前記複数の一時記憶領域に存在せず、前記データを格納する記憶デバイスに追加処理が必要であると判定した場合には、前記一時記憶ライト処理及び確認処理が行われた後に、前記追加処理及び前記更新処理を実行する
請求項２に記載のコンピュータシステム。
【請求項７】
前記インタフェース装置が、前記ホストコンピュータに存在し、
前記プロセッサは第１のプロセッサと第２のプロセッサを有し、
前記一時記憶領域は第１の一時記憶領域と第２の一時記憶領域とを有し、
前記インタフェース装置は、第１のパスを介して前記第１のプロセッサに対応づけられる前記第１の一時記憶領域にアクセスし、第２のパスを介して前記第２のプロセッサに対応づけられる前記第２の一時記憶領域にアクセスする
請求項１に記載のコンピュータシステム。
【請求項８】
前記確認処理は、前記ストレージコントローラに対し、前記ライトデータのライト先の論理領域を指定したリードコマンドを発行することを含む
請求項２に記載のコンピュータシステム。
【請求項９】
前記ライトデータに、メタデータが付されており、前記メタデータが、前記ライトデータのライト先の論理アドレスを含んだ情報である参照情報を含み、
前記ライト要求が、前記ライトデータのライト先の論理アドレスを含み、
前記確認処理は、前記ライトデータに付されたメタデータにおける参照情報中の論理アドレスを一時記憶領域からそれぞれ読み出すこととし、読み出したそれぞれの論理アドレスと、前記ライト要求が含む論理アドレスとを比較することを含む
請求項２に記載のコンピュータシステム。
【請求項１０】
前記メタデータが、さらに、前記ライトデータの誤り符号を含み、
前記確認処理は、さらに、前記ライトデータに付されたメタデータにおける誤り符号を前記複数の一時記憶領域からそれぞれ読み出すことと、読み出したそれぞれの誤り符号と、前記ライトデータから算出される誤り符号とを比較することとを含む、
請求項９に記載のコンピュータシステム。
【請求項１１】
前記第１のパスが使用不可となった場合に、
前記第２のプロセッサは前記第１のパスが使用不可に対応するモードに切り替える旨を前記インタフェース装置に通知し、
前記第２のプロセッサは前記第２のパスを介して受信したライトデータを前記第１のプロセッサを介して前記第１の一時記憶領域に格納する
請求項７に記載のコンピュータシステム。
【請求項１２】
記憶デバイスに対するデータの入出力を制御し、一時記憶領域と、演算処理を行う演算部を有するプロセッサとを有するストレージコントローラと、
前記ストレージコントローラに接続され、ホストコンピュータからのリード要求又はライト要求を、前記ストレージコントローラに送信するインタフェース装置と、
を備えるコンピュータシステムにより実行される方法であって、
前記ストレージコントローラが、前記リード要求又は前記ライト要求を受信した場合、前記プロセッサが、前記インタフェース装置に対して、前記リード要求に従うリードデータのリード処理の一部又は全部を実行することの指示であるリード支援指示、又は、前記ライト要求に従うライトデータのライト処理の一部又は全部を実行することの指示であるライト支援指示を送信し、
前記インタフェース装置が、
前記ストレージコントローラからの前記リード支援指示又は前記ライト支援指示に従い、前記リードデータのリード処理の一部又は全部、又は、前記ライトデータのライト処理の一部又は全部を実行し、
前記ホストコンピュータに対して、前記リード処理が完了した旨の第１の応答又は前記ライト処理が完了した旨第２の応答を送信する方法。
【請求項１３】
前記一時記憶領域が、前記ストレージコントローラに複数存在し、
前記ライト処理は、前記ライトデータを前記複数の一時記憶領域へそれぞれ書き込む一時記憶ライト処理と、前記複数の一時記憶領域に書き込まれたライトデータの正当性を確認する確認処理とを含み、
前記ライト支援指示として、前記一時記憶ライト処理を実行することの指示である第１のライト支援指示と、前記確認処理を実行することの指示である第２のライト支援指示とがあり、
前記インタフェース装置は、前記一時記憶領域のアドレスを指定した第１のライト支援指示に従い、前記ライトデータを前記複数の一時記憶領域の前記指定されたアドレスにそれぞれ書き込む一時記憶ライト処理を実行し、前記第２のライト支援指示に従い、前記複数の一時記憶領域にそれぞれ格納されたライトデータの正当性を確認する確認処理を実行する
請求項１２に記載の方法。
【請求項１４】
前記インタフェース装置は、前記確認処理において、
前記複数の一時記憶領域にそれぞれ格納されたライトデータの正当性が確認された場合は、前記ストレージコントローラに対して、前記確認処理が成功した旨の通知を送信し、かつ、前記ホストコンピュータに対して、前記第２の応答を送信し、
前記複数の一時記憶領域にそれぞれ格納された前記データの正当性が確認されなかった場合は、前記ストレージコントローラに対して、前記確認処理が失敗した旨の通知を送信する
請求項１３に記載の方法。
【請求項１５】
前記ストレージコントローラは、
前記ライトデータにより更新される旧データが、前記複数の一時記憶領域に存在する場合には、前記インタフェース装置に対して、前記複数の一時記憶領域のうちの１つにおける空き領域を対象とした、前記第１のライト支援指示及び前記第２のライト支援指示を送信し、
前記インタフェース装置は、
前記第１のライト支援指示に従い、対象の空き領域にライトデータを書き込み、前記第２のライト支援指示に従い、対象の空き領域に対して確認処理を行い、
前記確認処理が成功した場合に、前記複数の一時記憶領域に存在する前記旧データに、前記空き領域に格納されたライトデータを上書きする
請求項１４に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムでのデータ転送に関する。
【背景技術】
【０００２】
近年、社会活動で生み出される膨大なデータを分析することにより価値を出すビッグデータ分析と呼ばれる技術が普及している。このため、ストレージシステムにはより一層、高い性能が求められるようになる。【０００３】
特に、システムの信頼性を担保するためにハードウェアに障害等が生じてもデータを失わないことが求められる。よってライト（書込み）データはストレージ内で多重化して保持されることが必要であり、ストレージ装置の書込性能を向上させることが望ましい。【０００４】
例えば、ストレージコントローラが二重化されたストレージ装置の書込性能を向上させる技術として、ホストコンピュータからのライト要求に従うデータを受信し、そのデータを、プロセッサが一方のストレージコントローラのメモリに格納した後、プロセッサの指示に従って、そのメモリからＤＭＡ（Direct Memory Access）がデータを読み出し、他方のストレージコントローラのメモリにデータをコピーすると共に、コピー先のメモリに対しダミーのリードリクエストを発行することで、コピー先のメモリにデータがコピーされたことを自動的に確認する技術が知られている（特許文献１）
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】WO2011/151859
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記従来技術においては、ストレージコントローラのプロセッサにより、いったんメモリに書き込まれたデータについて、プロセッサを介さずに、データの二重化処理を自動化することで、プロセッサの負荷を低減することができる。【０００７】
しかし、ホストコンピュータから受信したライト要求に従うデータを受信することと、そのデータを、一旦ストレージ装置内の１つのメモリに格納することは、プロセッサが行っている。このため、プロセッサの負荷が十分に低減されてはいない。特に、データは容量が大きいため、データの送受信は他のステップに比べてプロセッサには負荷がかかる。さらに、書込み要求に従うデータを２つのメモリに二重化し、メモリまで到達したことを確認した後の処理については、プロセッサが逐次行う必要がある。そのため、これらの処理により、性能が十分上がらない。
【課題を解決するための手段】
【０００８】
コンピュータシステムは、一時記憶領域、及び、演算部を有するプロセッサを有するストレージコントローラと、ストレージコントローラに接続され、ホストコンピュータからのリード要求又はライト要求を、前記ストレージコントローラに送信するインタフェース装置と、を備える。ストレージコントローラが、リード要求又はライト要求を受信した場合、プロセッサが、インタフェース装置に対して、リード要求に従うリードデータのリード処理の一部又は全部を実行することの指示であるリード支援指示、又は、前記ライト要求に従うライトデータのライト処理の一部又は全部の指示であるライト支援指示を送信する。そして、インタフェース装置が、ストレージコントローラからのリード支援指示又はライト支援指示に従い、リードデータのリード処理の一部又は全部、又は、ライトデータのライト処理の一部又は全部を実行し、ホストコンピュータに対して、リード処理が完了した旨の第１の応答又はライト処理が完了した旨第２の応答を送信する。
【発明の効果】
【０００９】
本発明により、ストレージコントローラのプロセッサにかかる負荷を低減し、コンピュータシステムのリード／ライト性能が向上する。
【図面の簡単な説明】
【００１０】
【図１】図1は、実施例１にかかるコンピュータシステム１の構成及び概要を説明するための図である。
【図２】図２は、リードコマンド処理プログラム６１のフローチャートである。
【図３】図３は、リード＋応答機能５１の処理のフローチャートである。
【図４】図４は、ライトコマンド処理プログラム６３のフローチャートの一部である。
【図５】図５は、ライトコマンド処理プログラム６３のフローチャートの残りである。
【図６】図６は、応答機能５３の処理のフローチャートである。
【図７】図７は、ライト＋確認＋更新＋応答機能５４の処理のフローチャートである。
【図８】図８は、キャッシュディレクトリ４２の構成を示す図である。
【図９】図９は、確認＋応答機能５６の処理のフローチャートである。
【図１０】図１０は、データ確認部３６によるデータ確認処理の一例（第一の例）を示すフローチャートである。
【図１１】図１１は、データ確認部３６によるデータ確認処理の変形例（第二の例）を示すフローチャートである。
【図１２】図１２は、データ確認部３６によるデータ確認処理の変形例（第三の例）を示すフローチャートである。
【図１３】図１３は、実施例２にかかるコンピュータシステム１のハードウェア構成を示す図である。
【図１４】図１４は、実施例３にかかるコンピュータシステム１のハードウェア構成を示す図である。
【発明を実施するための形態】
【００１１】
本発明は、ストレージシステムを含むコンピュータシステムにおいて、性能を向上させるための技術に関する。
【００１２】
以下、添付図面を参照して本発明の幾つかの実施例にかかるコンピュータシステムについて説明する。ただし、これらの実施例は、本発明を実現するための一例に過ぎず、本発明の技術的範囲を限定するものではないことに注意すべきである。また、各図において共通の構成については同一の参照番号が付されている。なお、複数の同種のものについては、９９９ａ、９９９ｂなど、数字の最後に英文字を付すことで個々を区別するが、必要に応じて英文字を省略して説明する場合がある。
【００１３】
以下の説明においては、必要に応じて、リード要求及びライト要求を総称して「リード／ライト要求」といい、リード要求に従うリード処理及びライト要求に従うライト処理を総称して「リード／ライト処理」ということがある。つまり、「リード／ライト」という表記は、リード又はライトのことである。
【００１４】
また、以下の説明においては、必要に応じて、ライト要求に従うデータをライトデータ、リード要求に従うデータをリードデータという場合がある。なお、特に特定する必要がない場合は、単にデータという。
【実施例１】
【００１５】
図1は、実施例１にかかるコンピュータシステム１の構成及び概要を説明するための図である。【００１６】
以下、図１を参照して、本実施例にかかるコンピュータシステム１の概要を説明する。【００１７】
本実施例にかかるコンピュータシステム１は、ホストコンピュータ又はサーバ（以下、ホストという）２と、ストレージコントローラ４と、インタフェース装置３とを含む。インタフェース装置３に、ホスト２とストレージコントローラ４が接続されている。インタフェース装置３は、例えば、半導体インタフェース装置であってよく、本実施例では、インタフェースＬＳＩ(Large Scale Integration)とする（以下、単にＬＳＩという）。ＬＳＩ３により、ホスト２とストレージコントローラ４間で行われるリード／ライト処理の性能を向上することができる。【００１８】
一般に、ストレージコントローラが、ホストからのリード／ライト要求を受信し、ストレージコントローラにおけるプロセッサのプロセッサコアが、そのリード／ライト要求に基づくリード／ライト処理を行う。リード／ライト処理は、多くのステップから構成され、さらに、リード／ライトデータの送受信もプロセッサコアを介して行われ、リード／ライトデータが一時記憶領域であるキャッシュメモリに格納される。このため、リード／ライト処理のためにプロセッサにかかる負荷が大きい。一般に、リード処理では、プロセッサコアは、ホストからのリードデータがキャッシュメモリに存在するか否かを判定し、判定の結果、リードデータがキャッシュメモリに存在している場合は、リード応答とともにリードデータをホストに送信する。一方、リードデータがキャッシュメモリに存在していない場合は、プロセッサコアは、図示しないＨＤＤ(Hard Disk Drive)のような最終記憶デバイス（補助記憶デバイス）からリードデータをキャシュに読み出し、そのリードデータをリード応答とともにホストに送信する。またライト処理では、プロセッサコアは、ホストから受信したライトデータを１つのキャッシュメモリに書き込むと共に、そのライトデータが正しいか否かの判定を行い、キャッシュディレクトリ（キャッシュメモリの管理情報）を更新し、ホストに対しライト応答を行う。ライト応答を行った後、プロセッサコアは、ライトデータを別のキャッシュメモリにコピーし（データの二重化）、キャッシュディレクトリを更新する。さらに、プロセッサコアは、必要に応じて、応答後にバックエンド処理（典型的には、ライトデータをキャッシュメモリから最終記憶デバイスに書き込む処理）を行う。【００１９】
そこで、本実施例においては、ストレージコントローラ４がホスト２からリード／ライト要求を受信した場合に、プロセッサ６は、リード／ライト処理で行われるステップのうちの一部又は全部のステップを、プロセッサコアに代えてＬＳＩ３に実行させるように、ＬＳＩ３の処理制御部５（後述）に対し指示を出す。例えば、プロセッサ６は、データがキャッシュメモリ（以下、キャッシュという）４１に格納されている等の状況に応じて、種々の指示をＬＳＩ３に出すことができる。一方、処理制御部５は、プロセッサ６からの指示に応じてリード／ライト処理で行われるステップのうちの別の一部又は全部のステップを行う。この結果、リード／ライト処理に関してプロセッサコアの介在が減るので、ストレージコントローラ４の性能を向上させることができる。特に、データの送受信、つまり、リード／ライトデータの送受信にプロセッサコアが介在しないので、プロセッサ６の負荷を軽減させることができる。さらに、リード処理に比べてステップ数の多いライト処理については、より性能を向上させることができる。例えば、オンライントランザクション処理など、信頼性の観点から、ホスト２からのライトデータを、ホスト２の外部に設けたストレージ装置に多重化して格納する必要がある場合には、上述の通り、ＬＳＩ３のライト性能を向上させることで、より大量なデータのやりとりによる大規模な処理を効率よく実現することが可能となる。【００２０】
以下、図１を参照して、本実施例にかかるコンピュータシステム１の構成を詳細に説明する。【００２１】
コンピュータシステム１は、前述したように、ホスト２、ストレージコントローラ４、及び、ＬＳＩ３を有する。【００２２】
ホスト２は、プロセッサ２１（図１３参照）及びメモリ（図示なし）を有する計算機であり、ストレージコントローラ４に対し、ＬＳＩ３を介してリード／ライト要求を送信する。【００２３】
ストレージコントローラ４は、１つ以上の物理記憶デバイスを有してもよいし（、ストレージコントローラ４の外部に１つ以上の物理記憶デバイスが接続されてもよい。なお、これら１つ以上の物理記憶デバイスの複数の物理記憶領域を基に、複数の論理領域を有する１つ以上の論理ボリュームが形成される。当該論理ボリューム、又は、論理ボリュームの記憶領域が割り当てられた仮想ボリュームはホスト２に提供される。ストレージコントローラ４は、複数のキャッシュ４１、複数のキャッシュディレクトリ（以下、ディレクトリという）４２、及び、プロセッサ６を有する。【００２４】
キャッシュ４１は、リード／ライトデータを一時的に格納する不揮発性又は揮発性のメモリである。また、キャッシュ４１には、データが格納される論理領域を有する論理ボリュームの番号（以下、ボリューム番号という。）に対応付けて、各論理ボリュームに追加処理が必要か否かの情報を示す追加情報が格納される。具体的には、追加情報は、例えば、論理ボリューム毎に、リモートコピーが必要か否かの情報と、スナップショットが必要か否かの情報であるが、これに限られない。なお、リード要求には、リード元のボリューム番号及び論理領域を示すアドレス（以下、論理アドレスという）が含まれる。ライト要求には、ライト先のボリューム番号、論理アドレス及びライトデータが含まれる。【００２５】
また、信頼性を保つため、キャッシュ４１にデータを書き込む際に、データには、そのデータの所定の範囲毎（例えば1セクタ毎）にメタデータが付されてもよい。具体的には、例えば、メタデータは、データ格納先の論理アドレスを含んだ参照情報（例えばＲｅｆｅｒｅｎｃｅ  Ｔａｇ）と、データの誤り符号（例えばＣＲＣ値）を設定するＧｕａｒｄ部と、を含む。以下の説明では、データが格納される論理領域のアドレスを論理アドレス、データ格納先の論理アドレスを含んだ参照情報をＲｅｆｅｒｅｎｃｅ  Ｔａｇ、データの誤り符号をＣＲＣ値として説明するが、これに限定されない。【００２６】
ディレクトリ４２は、キャッシュ４１の管理情報である（図８参照）。具体的には、例えば、図８に示すように、ディレクトリ４２には、キャシュ４１内に格納されているデータについて、当該データのボリューム番号４２１及びボリューム内の論理アドレス（LogicalBlockAddress）４２２と、そのデータのキャッシュ４１におけるキャッシュ領域のメモリアドレス４２３とが対応づけて管理される。また、ディレクトリ４２には、このメモリアドレス４２３で指定されたキャッシュ領域にライトデータが保持されているか否かを示すＤｉｒｔｙフラグ４２４が設定される。Ｄｉｒｔｙフラグ４２４は、例えば、デフォルトで「０」が設定されて、Ｗｒｉｔｅ処理等で対応するキャッシュメモリ４２に書き込みデータが格納された場合に、「１」が設定される。【００２７】
キャッシュ４１は、ハードウェア等の故障時にもデータを格納し動作を継続できるように（つまり、データを多重化させるために）、２つ以上（本実施例では２つ、４１ａ及び４１ｂ）搭載されている。本実施例では、ディレクトリ４２は、それぞれキャッシュ４１毎の情報を管理するように、キャッシュ４１に対応させて同じ数（図では４２ａ及び４２ｂ）搭載されるが、これに限られない。以下、２つのキャシュ（２つのディレクトリ）を区別するときには、キャシュ４１ａ、４１ｂ（ディレクトリ４２ａ、４２ｂ）といい、それらを区別しないときには、キャッシュ４１（ディレクトリ４２）という。【００２８】
プロセッサ６は、ストレージコントローラ４を制御するプログラムを動作させる。このプログラムは、例えば、ホスト２からのリード要求に基づくリード処理を実行するリード処理プログラム６１、ライト要求に基づくライト処理を実行するライト処理プログラム６３である。リード処理及びライト処理は、ＬＳＩ３に対して、データ等の状況に応じた指示を行う処理である。【００２９】
ＬＳＩ３は、データ送信部３１、データ受信部３２、コマンド応答部３３、データ書込部３４、データ読出部３５、データ確認部３６、フラグ更新部３７、及び、処理制御部５を有する。これらの各部は以下詳述する動作を行うようなハード構成で構成されるものを想定する。データ送信部３１は、リードデータをホスト２に送信する。データ受信部３２は、ホスト２からライト要求及びライトデータを受信する。コマンド応答部３３は、ホスト２からのリード／ライト要求に対する応答を行う。データ書込部３４は、ライトデータをキャッシュ４１に書き込む。データ読出部３５は、キャッシュ４１からリードデータを読み出す。データ確認部３６は、キャシュ４１にデータが格納されているか否かを確認する。フラグ更新部３７は、ディレクトリ４２の更新処理を行う。処理制御部５は、プロセッサ６からの指示により、上記各部３１乃至３７を制御する。各部３１乃至３７が行う処理については、後に詳述する。【００３０】
処理制御部５は、プロセッサ６からの指示に従い実現されるリード＋応答機能５１、応答機能５３、ライト＋確認＋更新＋応答機能５４、ライト＋確認機能５５、及び、確認＋応答機能５６を含む、複数の機能を提供する。リード＋応答機能５１は、プロセッサ６からのリード要求に基づく指示に対し、ホスト２へのデータ送信及び処理完了通知を行う機能である。応答機能５３は、プロセッサ６からのライト要求に基づく指示に対し、ホスト２に処理完了を通知する機能である。ライト＋確認＋更新＋応答機能５４は、プロセッサ６からのライト要求に基づく指示に対し、ライトデータのキャッシュ４１への書き込み処理、確認処理、及び、ディレクトリ４２の更新処理を実行し、ホスト２への処理完了を通知する機能である。ここで、本実施例においてはライトデータのキャッシュ４１への書き込み処理では、キャッシュ４１ａ、キャッシュ４２ｂの二箇所に対して書き込みを行う。また、確認、更新処理についても同様に、確認処理では４１ａと４１ｂの二箇所、更新処理では４２ａと４２ｂの二箇所に対し処理を行う。本構成により何れかのハードウェア障害の場合にもデータを保持することが可能となりシステムの信頼性を向上することが可能となる。ライト＋確認機能５５は、プロセッサ６からのライト要求に基づく指示に対し、キャッシュ４１への書き込み処理、及び確認処理を行う機能である。確認＋応答機能５６は、プロセッサ６からのライト要求に基づく指示に対し、キャッシュ４１に書込処理が行われたデータの確認処理を行い、ホスト２に処理完了を通知する機能である。こちらについても、キャッシュメモリ４１の二箇所にデータが正しく保管されたことを確認してからホストコンピュータに応答するため、確認処理は、キャッシュメモリ４１ａ、４１ｂの両方に対して行う。各処理の詳細は、後に詳述する。なお、これらの各処理は、ＬＳＩ３のメモリ（図示なし）に格納されたプログラムをプロセッサ（図示なし）が実行してもよい。また、これらの各処理は、ハードウェア回路により実現されてもよい。従って、プロセッサは、ＬＳＩ３の必須要素ではない。【００３１】
以下、ホスト２からのリード要求に対する、ストレージコントローラ４及びＬＳＩ３が実行する処理について、順を追って説明する。【００３２】
図２は、リードコマンド処理プログラム６１のフローチャートである。本プログラムはストレージコントローラ４がホスト２からリード要求を、ＬＳＩ１３を介して受け取った場合に、プロセッサ６（具体的には、プロセッサ６内部のプロセッサコア、この説明について以下同様）により実行される。この時点では、ＬＳＩ１３は要求を転送するのみである。【００３３】
プロセッサ６は、ディレクトリ４２を検索し、ホスト２から要求されたリードデータが、キャッシュ４１に存在するかを判定する（Ｓ６１１）。本実施例においてはキャッシュ４１ａ、ｂに同じデータが格納されていることを前提としている。よって、Ｓ６１１は少なくとも何れかのディレクトリを検索するようにしても良いし、両方検索しても良い。具体的には、プロセッサ６は、ディレクトリ４２を参照し、リード要求に含まれるリード元の論理アドレスに対応するキャッシュ４１のメモリアドレスがキャッシュディレクトリの管理情報にあるか否かを判定する。キャッシュ４１ａ、ｂの何れにもリードデータが存在しない場合（Ｓ６１１で、Ｎｏ）、プロセッサ６は、データを保持する物理記憶デバイス等からキャッシュ４１にリードデータを読み出し（Ｓ６１２）、Ｓ６１３に処理を進める。一方、キャッシュ４１ａ、ｂの少なくとも何れかにリードデータが存在する場合（Ｓ６１１で、Ｙｅｓ）、プロセッサ６は、Ｓ６１３に処理を進める。Ｓ６１３で、プロセッサ６は、ＬＳＩ３の処理制御部５に対し、Ｒｅａｄ＋応答を行うよう指示し、処理を終了する。【００３４】
図３は、リード＋応答機能５１の処理のフローチャートである。本処理は、ストレージコントローラ４がホスト２からリード要求を受け取った場合に、プロセッサ６からの指示によって起動される。【００３５】
本処理の起動により、処理制御部５は、データ読み出し部３５に対し、リードデータをキャッシュ４１から読み出すよう指示する（Ｓ５１１）。本実施例においては、少なくともデータを有するキャッシュ４１ａ、ｂの何れかに読み出し要求を出す。キャッシュ４１ａ，４１ｂの両方にデータが存在する場合，何れから読み出すかは、メモリへのアクセス量などといった負荷を考慮して決定しても良い。そして、処理制御部５は、読み出しが成功したか否かを判定する（Ｓ５１２）。具体的には、例えば、処理制御部５は、まず、リードデータが読み出しされた否か、つまり読み出しに対してエラー応答、  タイムアウトなどが発生していないかを判定する。そして、リードデータが読みだされた場合には、処理制御部５は、例えば、リードデータに付されたメタデータを参照し、Ｒｅｆｅｒｅｎｃｅ  Ｔａｇが、期待値と一致しているか、Ｇｕａｒｄ部に設定されたＣＲＣ値がリードデータから算出したＣＲＣ値と一致するかを比較し、リードデータが正しいか否かを判定する。この場合の期待値は、リード要求に含まれる論理アドレスであってよい。リードデータの読み出しに成功した場合（Ｓ５１２で、Ｙｅｓ）、処理制御部５は、データ送信部３１に読み出したデータの送信を指示し（Ｓ５１３）、コマンド応答部３３に、リード要求に対する完了応答をホスト２に送信するよう指示する（Ｓ５１４）。そして、処理制御部５は、プロセッサ６に対し、ホスト２に対するリードデータの送信及び完了応答が終わったことを通知し（Ｓ５１５）、処理を終了する。一方、リードデータの読み出しに失敗した場合は（Ｓ５１２で、Ｎｏ）、処理制御部５は、プロセッサ６に処理失敗を通知し（Ｓ５１６）、処理を終了する。なお、Ｓ５１６の通知と共に、処理制御部５は、前述した処理の失敗の要因をプロセッサ６に通知することとすることもできる。ここで、失敗の要因とは、例えば、Ｒｅａｄ要求に対し、一定時間以内に応答が来なかったことを示すタイムアウト、メモリ故障などによりデータ読み取りができなかった読み取り失敗、ＤＩＦのフィールドが期待値と異なった場合などである。【００３６】
一般に、多くの場合に処理は正常終了される。一方、処理失敗の要因は様々であって、対失敗要因分析や、その後の対応決定のためには非常に複雑な処理が必要とされることが多い。但し、処理が失敗となる確率は低い。このため、失敗の場合の処理は、複雑な処理を容易に記述できるソフトウェア処理が好適であって、本実施例におけるプロセッサ６にて実施するようにすることが望ましい。一方で、正常処理は規定の処理を迅速に処理可能なハードウェア主体構成をとるＬＳＩ３に分担させる。本構成により通常時の性能と、異常時の高度な処理を両立することができる。これは、以下の例についても同様である。尚、失敗要因の通知の後にプロセッサ６が行う処理の具体例としては、失敗の要因を調査した結果に従い再度処理を実行し、成功すれば正常完了をホスト２に通知する。また、成功が困難と判断した場合は、プロセッサ６が、ホスト２に処理失敗を通知してもよい。【００３７】
上記より、リード処理における、ホスト２へのリードデータの送信及びリード要求に対する完了応答を、ＬＳＩ３に対する1回の指示で実現でき、ＬＳＩ３との間で処理を分散することができる。プロセッサ６は、実行すべき処理のステップ数を減らせるため、負荷を軽減できる。この結果、リード処理について、プロセッサ６の介在を減少させることで負荷が軽減されて、ストレージ装置の性能が向上する。また、ホスト２に対しては、リード要求から完了応答までの時間も減少するため、ホスト２の処理能力も向上する。さらに、発生頻度が少ない複雑な処理については、プロセッサ６が実行し、発生頻度が多いが、比較的簡易な処理についてはＬＳＩ３が行うことで、処理の分担が明確になり、結果として、コンピュータシステム１全体の処理能力が向上する。【００３８】
以下、ホスト２からのライト要求に対する、ストレージコントローラ４のプロセッサ６及びＬＳＩ３が実行する処理について、順を追って説明する。【００３９】
図４は、ライト処理プログラム６３のフローチャートの一部である。本プログラムは、ストレージコントローラ４がホスト２からライト要求及びライトデータを受け取った場合に、プロセッサ６（具体的には、プロセッサ６内部のプロセッサコア、この説明について以下同様）により実行される。【００４０】
本処理が起動されると、プロセッサ６は、ディレクトリ４２ａ、ｂを検索し、キャッシュ４１に旧データ（ライトデータに対応し、ライトデータに更新されるデータ）が格納されているかどうかを判定する（Ｓ６３１）。例えば、この判定は、ライト要求に含まれるライト先の論理アドレスが、ディレクトリ４２に存在するか否かの判定である。キャッシュ４１にライトデータに対応する旧データが格納されている場合には、キャッシュ４１でデータの更新（上書き）が行われる。なお、ライトデータの送信時に旧データを上書きした場合、上書き処理中に何らかの理由（ホスト側のエラーなど）で中断するなど、旧データを破壊してしまう可能性がある。そのため、ストレージコントローラ4内にキャッシュとは異なる一時記憶領域としてバッファを設けることもできる（図１４の４４ａ，ｂ）。キャッシュ４１上でライトデータによる旧データの更新が行われる場合には、以下に示すように、ホスト２から受信したライトデータをバッファ４４に一旦格納し、その後、そのライトデータを旧データが格納されているキャッシュ４２に上書きするとしてもよい。【００４１】
Ｓ６３１の判定の結果、キャッシュ４１に旧データが格納されている場合は（Ｓ６３１で、Ｙｅｓ）、プロセッサ６は、データを一時的に格納するため、バッファ４４ａ，４４ｂのいずれかの領域を確保する。その後、処理制御部５に対し、確保したバッファ４３ａ、ｂのアドレスを通知し、この領域を転送先としたライト＋確認処理を指示する（Ｓ６３２）。処理制御部５がバッファ４４の領域にライトデータを書込むライト＋確認処理で、ライトデータが正しく書き込まれたことを確認できた場合は、処理制御部５より「処理完了」が通知され、確認できなかった場合は、「処理失敗」が通知される。一方、判定の結果、キャッシュ４１ａ、ｂの少なくとも何れかに旧データが格納されていない場合は（Ｓ６３１で、Ｎｏ）、プロセッサ６は、Ｓ６３６に処理を進める（図５参照）。【００４２】
プロセッサ６は、ライトデータの書き込みが両方のバッファ４４ａ、ｂ（図１３参照）に正常に行われたことが確認できたか否かを判定する（Ｓ６３３）。確認できた場合は（Ｓ６３３で、Ｙｅｓ）、プロセッサ６は、Ｓ６３２で書き込まれたバッファ４４上のライトデータをキャッシュ４１の旧データに上書きする（Ｓ６３４）。この際、プロセッサ６は、ライトデータを多重化する。例えば、旧データが２つのキャシュ４１ａ、４１ｂに格納されている場合は、プロセッサ６は、それぞれのキャッシュ４１ａ、４１ｂの旧データをライトデータで上書きする。【００４３】
その後、プロセッサ６は、処理制御部５に対し、確認＋応答処理を指示し（Ｓ６３５）、処理を終了する。確認＋応答処理については、後に詳述するが、この処理において、ライトデータが正しく書き込まれたことを確認できた場合は、処理制御部５より「処理完了」が通知され、確認できなかった場合は、「処理失敗」が通知される（図９参照）。ここで、データはキャッシュ４１ａ、４１ｂに二重化されているので、確認処理は、データが格納される全てのキャッシュ（例えば、４１ａと４１ｂ）について確認される。なお、上書き後の確認は、Ｓ６３４でプロセッサ６により行われてもよい。この場合、Ｓ６３５では、プロセッサ６は、例えば、Ｓ６４０と同様に、単に応答の指示を行えば良い。【００４４】
Ｓ６３３で、ライトデータの書き込みが正常に行われたことが確認できなかった場合は（Ｓ６３３で、Ｎｏ）、プロセッサ６は、処理を終了する。処理の終了後、プロセッサ６は、ライトデータの書き込みが正常に終了しなかった原因を分析する。そして、ホスト２に対して、例えば、ライトデータの再送信要求などの適切な処理を行う。【００４５】
ここで、Ｓ６３４のライトデータ上書きは、インタフェースＬＳＩ３が行っても良い。この場合、Ｓ６３３の後、プロセッサ６はインタフェースＬＳＩ３に対し、二重書きの指示を行う。そして、指示を受けたインタフェースＬＳＩ３は、バッファ４４上のデータを読み出し、キャッシュ４１ａ、４１ｂの二箇所へ書き込む。更にこの場合、Ｓ６３５の確認＋応答まで含め、インタフェースＬＳＩ３の一連の動作としても良い。【００４６】
又、バッファ４４は、例えばホストコンピュータ２上のメモリにあっても良い。この場合、インタフェースＬＳＩ３は、Ｓ６３２の指示を受けると、ホストコンピュータ２から受信したデータを、ホストコンピュータ２上のバッファ領域に書き込む。又は、既にメモリ上に格納されている場合には、データを改めて格納することなく、書込み完了をプロセッサ６側に通知する。その後、Ｓ６３４において、インタフェースＬＳＩ３がホストコンピュータ２上のバッファ領域に書き込まれたデータを読み出し、キャッシュ４１ａ、４１ｂの２箇所に書き込む。この場合、ストレージ側のデータ転送の回数を１回削減することができるため、データ転送に要するプロセッサやインタフェースＬＳＩ３の処理を減らすことができる。このため、更に性能を向上させることができる。【００４７】
上記の場合も含めて本構成によれば、データの二重化をインタフェースＬＳＩ３が行うことで、プロセッサ６の負荷を減らすことができ、性能を向上させることができる。【００４８】
図５は、ライトコマンド処理プログラム６３のフローチャートの残りである。以下のステップは、キャッシュ４１に旧データが存在しなかった場合（図４のＳ６３１で、Ｎｏ）に、プロセッサ６（具体的には、プロセッサ６内部のプロセッサコア、この説明について以下同様）により実行される。【００４９】
ライトコマンド処理プログラム６３を実行することでプロセッサ６は、ライトデータをキャッシュ４１に格納した後に追加処理があるか否かを判定する（Ｓ６３６）。具体的には、プロセッサ６は、キャッシュ４１に格納された追加情報を参照し、ライト要求に含まれる書き込み先のボリューム番号について、追加処理が必要か否かを判定する。【００５０】
判定の結果、追加処理が必要な場合は（Ｓ６３６で、Ｙｅｓ）、ＬＳＩ３に対しバッファ領域４４、或いはキャッシュメモリ４１ａ、ｂのアドレスを通知してライト＋確認処理を指示し（Ｓ６３７）、その後、追加処理を行う（Ｓ６３８）。追加処理は、前述の通り、例えば、リモートコピー処理、スナップショット処理である。リモートコピー処理を行う場合、プロセッサ６は、例えば、リモート接続されたストレージシステムに対して、コピー先のボリューム番号と論理アドレスを含むコピー要求及びライトデータを送信し、コピー先からの応答を受信することで処理を完了する。また、スナップショット処理の場合、プロセッサ６は、例えば、ライト要求に含まれるライト先の論理ボリュームの論理アドレスが示す論理領域（この説明では、対象領域という）にデータが存在する場合には、その時点のボリュームイメージを取り出せるように、対象領域のデータを別のボリューム（例えば、プール）の別領域に待避させることで処理を完了する。その後、プロセッサ６は、ディレクトリ４２を更新する（Ｓ６３９）本処理は後述のＳ５４５と同じである。その後、ＬＳＩ３に応答を指示し（Ｓ６４０）、処理を終了する。一般に、追加処理はストレージの機能であって、非常に複雑になる場合が多い一方、通常の処理に比べ、処理時間をかけても良い。そこで、このように、追加処理前後の部分をハードウェア化し、追加処理部分をソフトウェアで行えるようにすることで、ストレージシステムの機能拡張性と性能を両立することができる。【００５１】
一方、Ｓ６３６の判定の結果、追加処理が必要無い場合は（Ｓ６３６で、Ｎｏ）、プロセッサ６は、キャッシュメモリ４１ａ、ｂのアドレスを通知してＬＳＩ３にライト＋確認＋更新＋応答を指示し（Ｓ６４１）、処理を終了する。【００５２】
上記より、様々な状況において、ストレージ装置に求められる信頼性及び機能を損なわず、プロセッサ６が行う処理のステップ数を減らし負荷を減らすことができる。これにより、ストレージ装置の性能、ホスト２の処理能力を向上させることができ、結果として、コンピュータシステム１の処理能力を向上させることができる。また、例えば、追加処理や上書きなど発生頻度が少ない複雑な処理についてはプロセッサ６が実行し、キャッシュ４１へのライト処理、確認処理、応答処理、更新処理などの発生頻度が多いが、比較的簡易な処理についてはＬＳＩ３が行うことで、処理の分担が明確になり、結果として、コンピュータシステム１全体の処理能力が向上する。【００５３】
図６は、応答機能５３の処理のフローチャートである。【００５４】
本処理は、プロセッサ６からの応答の指示によって起動する（図５のＳ６４０参照）。以下、順を追って説明する。【００５５】
本処理の起動により、処理制御部５は、コマンド応答部３３に、ホスト２への転送完了応答の送信を指示する（Ｓ５３１）。そして、処理制御部５は、プロセッサ６に応答を行ったことを通知し（Ｓ５３２）、処理を終了する。【００５６】
なお、本処理は、図５のＳ６４０での応答の指示があった場合に限られず、ライトデータのキャッシュ４１へのライト処理、確認処理などの応答以外の処理が、何らかの方法で既に行われている場合に行われてよい。【００５７】
図７は、ライト＋確認＋更新＋応答機能５４の処理のフローチャートである。【００５８】
本処理は、プロセッサ６からのライト＋確認＋更新＋応答の指示によって起動する（図５のＳ６４１参照）。尚、ここで、ホストコンピュータから受領したデータはハードウェア障害等が発生した場合においても、保持し続ける必要がある。そのため、ライト及び確認処理は、キャッシュメモリ４１ａ、４１ｂの両方に対して行う。また、更新処理も、キャッシュディレクトリ４２ａ、４２ｂの両方に対して行う。【００５９】
本処理の起動により、処理制御部５は、データ受信部３２に、ホスト２からのライトデータ受信を指示する（Ｓ５４１）。そして、処理制御部５は、データ書込部３４に、受信したライトデータをキャッシュ４１ａ，ｂに書き込むよう指示する（Ｓ５４２）。この時、ライトデータの書き込み先アドレスは、予めプロセッサ６からの処理指示で指定されたものを用いる。この指示に基づき、データ書込部３４は、２つのキャッシュ４１ａ、４１ｂにライトデータを書込む。また、データ書き込み部３４は、ライトデータから論理アドレス及びＣＲＣ値を算出し、メタデータ（Ｒｅｆｅｒｅｎｃｅ  Ｔａｇ及びＧｕａｒｄ部）としてライトデータに付与してもよい。【００６０】
処理制御部５は、データ確認部３６に対し、キャッシュ４１にデータが正しく格納されたか否かの確認を行う確認処理を指示する（Ｓ５４３）。この処理も、書き込みを行ったキャッシュ４１ａ、キャッシュ４１ｂ両方に対して行う。確認処理について、詳細は後述する。確認処理により、データがキャッシュ４１ａ、ｂに正しく格納されていることが確認する（Ｓ５４４）。結果がＹｅｓの場合、処理制御部５は、ライト要求により指定された論理領域を示す論理アドレスに対応するメモリアドレスのキャッシュ４１領域にデータが格納されたことを示すフラグを書き込むようフラグ更新部３７指示することで（Ｓ５４５）、データが格納されたことをディレクトリ４２に反映する。なお、この処理も、２つのディレクトリ４２ａ、４２ｂに対して行う。そして、処理制御部５は、コマンド応答部３３に、ホスト２への転送完了応答の送信を指示し（Ｓ５４６）、プロセッサ６に応答を行ったことを通知して（Ｓ５４７）、処理を終了する。【００６１】
一方、Ｓ５４４で、データが少なくともキャッシュ４１ａ、ｂの何れかに正しく格納されていることが確認できなかった場合（Ｓ５４４で、Ｎｏ）、処理制御部５は、プロセッサ６に確認処理の失敗を通知し（Ｓ５４８）、処理を終了する。なお、Ｓ５４８では、本処理の再実行、又は、ホスト２に対するエラー応答は行っていない。この場合、プロセッサ６が、確認処理の失敗の原因を調査し、本処理を再実行するか、ホスト２に対してエラー応答等を行うか等の判断を行う。そして、プロセッサ６は、その判断に従い、確認処理の成功又は失敗の通知を行うよう処理制御部５に指示するようにしてもよい。【００６２】
上記より、プロセッサ６の処理制御部５に対する１つの指示により、キャッシュ４１へのデータ書き込み処理、確認処理、ディレクトリ４２の更新処理、応答処理の４つのステップが行われる。従って、プロセッサ６の負荷を減らすことができ、ストレージコントローラ４の性能やホスト２の処理能力が向上し、結果として、コンピュータシステム１全体の処理能力が向上する。【００６３】
次にライト＋確認機能５５の処理のフローチャートを説明する。【００６４】
本処理は、プロセッサ６からのライト＋確認の指示によって起動する（図４のＳ６３２、又は、図５のＳ６３７参照）。【００６５】
本処理は、ライト＋確認＋更新＋応答機能５４のステップの一部の処理と同様の処理が行われる。具体的にはＳ５４５，５４６以外のＳ５４１〜５４４，Ｓ５４７，Ｓ５４８処理を行うことを想定する。【００６６】
図９は、確認＋応答機能５６の処理のフローチャートである。【００６７】
本処理は、プロセッサ６からの確認＋応答の指示によって起動する（図４の６３５参照）。【００６８】
本処理の起動により、処理制御部５は、データ確認部３６に対し、キャッシュ４１にデータが正しく格納されたか否かの確認を行う確認処理を指示する（Ｓ５６１）。ここで、ストレージシステムが書き込み完了を応答するためには、データがキャッシュ４１ａ、４１ｂの両方に書き込まれている必要がある。そのため、この確認処理は、キャッシュ４１ａ、４１ｂ両方に対して行う。確認処理について、詳細は後述する。確認処理により、データがキャッシュ４１ａ、ｂの両方からに正しく格納されている旨の通知を確認できた場合（Ｓ５６２で、Ｙｅｓ）、処理制御部５は、コマンド応答部３３に、ホスト２への転送完了応答の送信を指示し（Ｓ５６３）、プロセッサ６に応答を行ったことを通知して（Ｓ５６４）、処理を終了する。【００６９】
一方、Ｓ５６２で、データが少なくとも何れかのキャッシュ４１ａ、ｂに正しく格納されていることが確認できなかった場合（Ｓ５６２で、Ｎｏ）、処理制御部５は、プロセッサ６に確認処理の失敗を通知し（Ｓ５６５）、処理を終了する。【００７０】
なお、上述したように、本処理が呼び出されるのは、例えば、キャッシュ４１上の旧データを、ホスト２からのライトデータで上書きするために、一時的に空き領域にライトデータを格納する場合である（図４のＳ６３５）。このため、ディレクトリ４２を更新する必要は無く、確認処理の後、直ちに応答処理を行い、処理を完了すればよい。【００７１】
以下、確認処理について、幾つかの例を挙げて説明する。  確認処理は、例えば、処理制御部５からの指示に基づいて行われる（具体的には、例えば、図８のＳ５５３、図９のＳ５６１等の指示）。【００７２】
図１０は、データ確認部３６により、１つのキャッシュメモリに対し、データ確認を行う処理の一例（第一の例）を示すフローチャートである。【００７３】
本処理の起動により、データ確認部３６は、ストレージコントローラ４に対し、リードコマンドを発行する（Ｓ３６１）。具体的には、例えば、リードコマンドは、確認したいデータの宛先（例えば、本処理の直前に発行されたホスト２からのライト要求に基づくライト先の論理ボリューム及び論理アドレス）を指定して発行される。【００７４】
データ確認部３５は、リードコマンドに対するプロセッサ６からの応答を受信し、その応答結果を判定する（Ｓ３６２）。判定の結果、エラー応答を受信した場合、又は、応答が無かった場合は（Ｓ３６２で、失敗）、確認処理が失敗したと判断し（Ｓ３６３）、処理を終了する。この判断は、例えば、リードコマンドで指定した宛先に対する、データの伝送路が正しく動作していないため、対象となるデータのライト処理が完了しておらず、キャッシュ４１に対象のデータが格納されていないとの推測に基づく判断である。一方、Ｓ３６２でリードコマンドに対する応答が返ってきた場合は（Ｓ３６２で、成功）、確認処理が成功したと判断し（Ｓ３６４）、処理を終了する。この判断は、例えば、リードコマンドで指定した宛先に対する、データの伝送路が正しく動作しているため、対象となるデータのライト処理が正常に完了しており、キャッシュ４１に対象のデータが正しく格納されているとの判断である。【００７５】
上記では、確認したい対象の宛先へリードコマンドを発行するという、極めて簡単な処理のみで、キャッシュ４１に対象のデータが存在するか否かを判定できる。この結果、確認処理は、少ない処理量でデータの存在を確認することができる。【００７６】
図１１は、データ確認部３６によるデータ確認処理の変形例（第二の例）を示すフローチャートである。本実施例では対象データの内容確認まで行う。【００７７】
本処理の起動により、データ確認部３６は、キャッシュ４１から、確認の対象となる1セクタ分のデータ（以下、対象データという）に付されたメタデータのＲｅｆｅｒｅｎｃｅ  Ｔａｇを読み出す（Ｓ３７１）。具体的には、データ確認部３６は、対象データの論理アドレスを指定したリードコマンドをストレージコントローラ４に発行してもよいし、その他の周知の方法により対象データのＲｅｆｅｒｅｎｃｅ  Ｔａｇを読み出してもよい。そして、データ確認部３６は、読み出した１セクタ分のデータに付されたＲｅｆｅｒｅｎｃｅ  Ｔａｇと、期待値とを比較する（Ｓ３７２）。この場合の期待値は、対象データが書き込まれた際にライトコマンドで指定された論理アドレスであってよい。また、期待値として、対象データの格納場所の論理アドレスが予め設定されていてもよい。また、期待値は、プロセッサ６から処理制御部５経由で送信されてよい。これらの値が一致した場合（Ｓ３７２で、一致）、データ確認部３６は、Ｓ３７３に処理を進める。一方、これらの値が一致しなかった場合（Ｓ３７２で、不一致）、データ確認部２６は、確認失敗と判断し（Ｓ３７５）、処理を終了する。【００７８】
Ｓ３７３で、データ確認部３６は、対象データに付された残り全てのＲｅｆｅｒｅｎｃｅ  Ｔａｇにについて、セクタ毎にＳ３７１及びＳ３７２の処理を繰り返す（Ｓ３７３）。対象データの全セクタについて、Ｒｅｆｅｒｅｎｃｅ  Ｔａｇと期待値とが一致した場合（Ｓ３７３で、一致）、データ確認部３６は、確認成功と判断する（Ｓ３７４）。一方、いずれかのセクタでＲｅｆｅｒｅｎｃｅ  Ｔａｇと期待値とが一致しなかった場合（Ｓ３７３で、不一致）、データ確認部３６は、確認失敗と判断し（Ｓ３７５）処理を終了する。【００７９】
上記により、対象データの取り違え（つまり、データを格納される位置の誤り）を検出することができる。また、Ｓ３７１及びＳ３７３においては、対象データの一部、具体的にはメタデータであるＲｅｆｅｒｅｎｃｅ  Ｔａｇのみを読み出しているため、読み出すデータの量を低減することができる。また、CRC演算を行わないため、処理の負荷も軽減できる。【００８０】
図１２は、データ確認部３６によるデータ確認処理の変形例（第三の例）を示すフローチャートである。【００８１】
本処理の起動により、データ確認部３６は、対象データ（データ部及びメタデータ）を１セクタ分読み出す（Ｓ３８１）。具体的には、データ確認部３６は、対象データの論理アドレスを指定したリードコマンドをストレージコントローラ４に発行してもよいし、その他の周知の方法により対象データのＲｅｆｅｒｅｎｃｅ  Ｔａｇを読み出してもよい。そして、データ確認部３６は、読み出したセクタのＲｅｆｅｒｅｎｃｅ  Ｔａｇと、期待値とを比較する（Ｓ３８２）。本ステップ詳細はＳ３７２と同様である。これらの値が一致した場合（Ｓ３８２で、一致）、データ確認部３６は、Ｓ３８３に処理を進める。一方、これらの値が一致しなかった場合（Ｓ３８２で、不一致）、データ確認部２６は、確認失敗と判断し（Ｓ３８７）、処理を終了する。【００８２】
次に、データ確認部３６は、読み出したセクタのデータ部について、ＣＲＣ値を算出する（Ｓ３８３）。そして、算出したＣＲＣ値と読み出したセクタのＧｕａｒｄ部のＣＲＣ値を比較する（Ｓ３８４）。比較の結果、これらの値が不一致であった場合（Ｓ３８４で、不一致）、データ確認部３６は、確認失敗と判断し（Ｓ３８７）、処理を終了する。一方、比較の結果、これらの値が一致した場合（Ｓ３８４で、一致）、データ確認部３６は、Ｓ３８５に処理を進める。【００８３】
Ｓ３８５で、データ確認部３６は、対象データの残りの全セクタについて、セクタ毎にＳ３８１乃至３８４の処理を繰り返す（Ｓ３７５）。対象データの全セクタについて、Ｒｅｆｅｒｅｎｃｅ  Ｔａｇと期待値、及び、ＣＲＣ値とＧｕａｒｄ部のＣＲＣ値がそれぞれ一致した場合（Ｓ３８５で、一致）、データ確認部３６は、確認成功と判断し（Ｓ３８６）、処理を終了する。一方、いずれかのセクタでＲｅｆｅｒｅｎｃｅ  Ｔａｇと期待値、及び、ＣＲＣ値とＧｕａｒｄ部のＣＲＣ値がそれぞれ一致しなかった場合（Ｓ３８５で、不一致）、データ確認部３６は、確認失敗と判断し（Ｓ３８７）、処理を終了する。【００８４】
本処理では、対象データの取り違え、対象データの誤り発生なども検出することができる。
上記いずれかのデータ確認処理により、対象データがキャッシュ４１格納されていること、又は対象データの正確性を保証できる。これにより、ストレージ装置の信頼性を保ちつつ、コンピュータシステム１の性能を向上させることができる。なお、確認処理は、上記のいずれかの例を実行してもよいし、複数の例を組み合わせて実行してもよい。
【実施例２】
【００８５】
図１３は、実施例２にかかるコンピュータシステム１のハードウェア構成を示す図である。実施例１と同様の構成要素については、同じ符号を付し説明を省略する場合がある。【００８６】
本実施例では、ＬＳＩ３は、ホスト２側のインタフェースとして、ホスト２に実装される。以下、具体的に説明する。ストレージコントローラ４は、互いにバスで接続されたプロセッサ６ａ、６ｂを有する。この構成をとることにより、例えばプロセッサ６ａ、６ｂのいずれか、或いはキャッシュ４１ａ、４１ｂが動作しなくなる障害の場合においても、他方のプロセッサ６、及びキャッシュ４１を使うことで、ストレージ動作を継続させることができる。本実施例においてはメモリ４３ａ、４３ｂはプロセッサ６ａ、６ｂの其々とバスで接続されている。プロセッサ６ａ、６ｂは、それぞれ、スイッチと、プロセッサコアとを有しており、スイッチがＬＳＩ３と、メモリ４３ａ、４３ｂに接続されている。図では、プロセッサ６とメモリ４３は、２つであるが、３つ以上であってもよい。また、ホスト２の有するプロセッサ２１とＬＳＩ３も複数であってもよいし、ホスト２も複数であってよい。メモリ４３ａ、４３ｂには、それぞれ、キャッシュ４１ａ、４１ｂ、ディレクトリ４２ａ、４２ｂ、及び、バッファ４４ａ、４４ｂの領域が確保される。各処理は実施例１に記載の通りであり、ＬＳＩ３は、ディレクトリ４２ａとメモリ４３ａにアクセスする際には、プロセッサ６ａ内のスイッチを経由する経路７ａを用いる。又、キャッシュディレクトリ４２ｂとメモリ４３ｂにアクセスする際には、プロセッサｂ内のスイッチを経由する経路７ｂを用いる。【００８７】
これにより、ＬＳＩ３から、それぞれメモリ４３ａ、４３ｂまでの経路が対称となり、どちらの経路を選んでもコンピュータシステム１の処理量は変わらない。このため、処理を均等に分散するだけで全ての資源を効率よく使うことができる。更に、従来のデュアルコントローラ形態では片側のプロセッサ側でデータを格納した後で、他方へのコピーが行なわれていた。従来方式に比べて、本実施例によればプロセッサ６ａ−プロセッサ６ｂ間のデータ流量が減るため、性能向上にも繋がる。又、ＬＳＩ３をサーバ側に設けることでサーバ・ストレージ間の冗長構成を担保することも可能になり信頼性向上に寄与する。又、本構成において、サーバ・ストレージ間をPCIｅ方式にて接続することも可能である。本方式によれば通常のFibre Channel等で接続する方式に比べてＩＯ帯域の低下が少なく、データのやりとりによる性能低下を低減することが可能である。【００８８】
尚、この構成において、ハードウェア障害等により、経路７ａ、７ｂのうち片方が使えなくなる場合のフローを説明する。例として、経路７ａを使う処理が失敗した場合に、ＬＳＩ３又はストレージコントローラ４は経路７ａが使えないと判断する。ＬＳＩ３が故障を認識した場合にはストレージコントローラ４に通知する。経路７ａが使えない場合、ＬＳＩ３は、キャッシュ４１ａやディレクトリ４２ａへアクセスすることができないため、その後のフローは一方の経路７ａが使えない場合の処理フローに移行する。具体的には、ストレージコントローラ４は、ホスト２からの要求を、経路７ｂ経由でストレージコントローラ４に送信するよう、ＬＳＩ３の設定を変更する。また、その後の各処理の指示においてデータ書込、読出、確認などの指示を行う際、経路７ｂを経由して行うよう指示する。【００８９】
そして、キャッシュ４１ａやディレクトリに４２ａに対して操作を行う場合は、プロセッサ６ａと６ｂとの間のパス（具体的には、プロセッサ６ａのスイッチとプロセッサ６ｂのスイッチとの間のパス）を用いて行う。例えば書き込み処理であれば、プロセッサ６ｂがキャッシュメモリ４１ｂのデータを読み出し、キャッシュメモリ４１ａに書き込むことで実現する。また、確認処理については、プロセッサ６ｂ内のプロセッサコアがプロセッサ６ａ内のプロセッサコアに依頼し、プロセッサ６ａ内のプロセッサコアが確認処理を代替する。ディレクトリ４２の更新処理についても同様である。
【実施例３】
【００９０】
次に、実施例３にかかるコンピュータシステム１について説明する。【００９１】
図１４は、第三実施例にかかるコンピュータシステム１のハードウェア構成を示す図である。第一及び第二実施例と同様の構成要素については、同じ符号を付し説明を省略する場合がある。【００９２】
本実施例では、ＬＳＩ３は、ストレージコントローラ４側のインタフェースとして、ストレージコントローラ４に実装される。以下、具体的に説明する。ストレージコントローラ４は、２つのＬＳＩ３ａ、３ｂを有し、ＬＳＩ３ａがプロセッサ６ａ内のスイッチに接続され、ＬＳＩ３ｂがプロセッサ６ｂ内のスイッチに接続される。図では、プロセッサ６ａ、６ｂ、メモリ４３ａ、４３ｂ及びＬＳＩ３ａ、３ｂは、それぞれ２つであるが、３つ以上であってもよい。ＬＳＩ３ａは、メモリ４３ａにアクセスする際は、プロセッサ６ａ内のスイッチを経由する経路７ａを用い、メモリ４３ｂにアクセスする際は、プロセッサ６ａ内のスイッチ、及び、プロセッサ６ｂ内のスイッチを経由する経路７ｂを用いる。【００９３】
これにより、プロセッサ６と密に連携するＬＳＩ３をストレージコントローラ４内に一体化することができる。そのため、ホスト２とストレージコントローラ４の独立性を高めることができ、保守や設計が容易となる。【００９４】
以上により、ホスト２からのリード／ライト要求に対し、プロセッサ６の指示に応じて、処理の大部分をＬＳＩ３が行えるようになる。そして、一連の処理におけるプロセッサ６の処理介在が減少し、プロセッサ６が処理できるアクセス要求が増加する。その結果、ストレージコントローラ４の性能が向上し、ホスト２からのリード／ライト要求から完了応答までの時間も減少するため、ホスト２の処理能力も向上する。以上によりコンピュータシステム１の処理能力が向上する。また、このとき、データが正しく格納されていることを保証する確認処理や、リモートコピーやスナップショットなどの追加処理についても、従来と同じ機能を保つことができる。以上により、高信頼・高機能を保ちつつ、コンピュータシステム１の性能を向上させることができる。
【符号の説明】
【００９５】
１：コンピュータシステム、２：ホストコンピュータ、３：インタフェースＬＳＩ、４：ストレージコントローラ
【図１】
0005976937.tif 000002
【図２】
0005976937.tif 000003
【図３】
0005976937.tif 000004
【図４】
0005976937.tif 000005
【図５】
0005976937.tif 000006
【図６】
0005976937.tif 000007
【図７】
0005976937.tif 000008
【図８】
0005976937.tif 000009
【図９】
0005976937.tif 000010
【図１０】
0005976937.tif 000011
【図１１】
0005976937.tif 000012
【図１２】
0005976937.tif 000013
【図１３】
0005976937.tif 000014
【図１４】
0005976937.tif 000015