(57)【特許請求の範囲】
【請求項１】
ディスク部(200)における位置情報(342,351)と書き込み確定を保証するためのチェック情報(341)とを含む保証コード(310)を有する更新対象の旧データ(301)を格納する第１のメモリ(160)と、
前記旧データの更新データ(302)及びその書き込み要求を外部機器(40)から受信し、データの位置情報(342,351)と書き込み確定を保証するためのチェック情報(341)を含む保証コード(310)を前記更新データ(302)に付与し、前記保証コード付更新データを前記第１のメモリ(160)に転送する転送処理部(110)と、
前記書き込み要求に応答して、前記旧データ(301)の前記チェック情報(341)を前記更新データ(302)の前記チェック情報(341)と異なる情報に変更し、前記更新データ(302)の前記第１のメモリ(160)への書き込みを確定させた場合に前記変更後のチェック情報(341)を変更前のチェック情報(341)に上書きし、前記変更前のチェック情報(341)と前記変更後のチェック情報(341)を判定し、前記外部機器(40)に書き込み処理完了の通知を送信する第１のメモリ制御部(150)と、
を備える、ストレージ装置(10)。
【請求項２】
請求項１において、
前記書き込み要求は、前記第１のメモリ(160)内の前記旧データ(301)を特定する情報を含み、
前記第１のモリ制御部(150)は、前記書き込み要求に含まれる前記旧データ(301)を特定する情報を参照し、前記第１のメモリ(160)に更新対象の前記旧データ(301)が存在するか確認し、存在する場合に前記旧データ(301)の前記チェック情報(341)を変更する、ストレージ装置(10)。
【請求項３】
請求項１において、
前記転送処理部(110)は、前記第１のメモリ制御部(150)からの前記更新データ(302)の前記第１のメモリ(160)への書き込み完了の通知を前記外部機器(40)に送信する、ストレージ装置(10)。
【請求項４】
請求項１において、
前記転送処理部(110)は、前記更新データ(302)を所定単位長で複数に分割して複数のデータブロック(300)を生成し、それぞれのデータブロック(300)に前記保証コード(310)を付与し、
前記第１のメモリ制御部(150)は、前記データブロック(300)単位で、前記第１のメモリ(160)への書き込みを確定させ、前記変更後のチェック情報(341)を前記変更前のチェック情報(341)に戻す、ストレージ装置(10)。
【請求項５】
請求項１において、
前記第１のメモリ制御部(150)は、前記更新データ(302)に付されている前記保証コード(310)の前記位置情報(342,351)と前記更新データ(302)が書かれるべき前記ディスク部(200)の位置を示す設定情報(16240)とを照合し、一致するかを確認する、ストレージ装置(10)。
【請求項６】
請求項５において、
前記保証コード(310)は、さらに、データエラーを検出するためのデータエラー検出コード(320)を含み、
前記第１のメモリ制御部(150)は、前記第１のメモリ(160)に書き込まれた前記更新データ(302)から演算して得られた情報と前記データエラー検出コード(320)とを比較し、両者が一致する場合に前記更新データ(302)の前記第１のメモリ(160)への書き込みを確定させる、ストレージ装置(10)。
【請求項７】
請求項１において、
さらに、前記第１のメモリ(160)に格納されるデータのコピーデータを格納する第２のメモリ(460)と、
前記転送処理部(110)から前記第１のメモリ(160)に転送されるデータのコピーを生成するコピー生成部(120)と、
前記第２のメモリ(460)へのデータの書き込みを制御する第２のメモリ制御部(450)と、
を備え、
前記コピー生成部(120)は、前記更新データのコピー（第２の更新データ）を生成し、
前記第２のメモリ制御部(450)は、前記第２の更新データを前記第２のメモリ(460)に書き込み、ミラーリングを実現する、ストレージ装置(10)。
【請求項８】
請求項７において、
前記第１のメモリ制御部(150)は、さらに、前記第２のメモリ(460)に存在する前記旧データ(301)のコピー（第２の旧データ）が有するチェック情報(341)を前記第２の更新データが有するチェック情報(341)と異なる情報に変更し、前記第２の更新データ(302)の前記第２のメモリ(160)への書き込みを確定させた場合に前記変更後のチェック情報(341)を変更前のチェック情報(341)に戻す、ストレージ装置(10)。
【請求項９】
請求項８において、
前記第１のメモリ制御部(150)は、更新対象である前記第２の旧データが有する前記位置情報(342,351)が前記第１のメモリ(160)に格納された旧データ（第１の旧データ）が有する前記位置情報(342,351)と同一であるか、及び、前記第２の旧データが有する前記チェック情報(341)が変更されているか、をチェックするように前記第２のメモリ制御部(450)に対して依頼し、
前記第２のメモリ制御部(450)は、チェック結果を前記第１のメモリ制御部(150)に返信し、
前記チェック結果がＯＫである場合に、前記転送処理部(110)は、前記第２の更新データの前記第２のメモリ(460)への転送を開始する、ストレージ装置(10)。
【請求項１０】
請求項９において、
前記第１のメモリ制御部(150)は、さらに、前記チェック結果が前記第２のメモリ制御部(450)から返信されてくるまで、前記チェックの依頼の状況を管理する、ストレージ装置(10)。
【請求項１１】
ストレージ装置(10)の制御方法であって、
前記ストレージ装置(10)は、ディスク部(200)におけるデータの位置情報(342,351)と書き込み確定を保証するためのチェック情報(341)とを含む保証コード(310)を有する更新対象の旧データ(301)を格納する第１のメモリ(160)と、転送処理部(110)と、第１のメモリ制御部(150)と、を備え、
前記制御方法は、
前記転送処理部(110)が、前記旧データの更新データ(302)及びその書き込み要求を外部機器(40)から受信し、位置情報(342,351)と書き込み確定を保証するためのチェック情報(341)を含む保証コード(310)を前記更新データ(302)に付与し、前記保証コード付更新データを前記第１のメモリ(160)に転送し、
前記メモリ制御部(150)が、前記書き込み要求に応答して、前記旧データ(301)の前記チェック情報(341)を前記更新データ(302)の前記チェック情報(341)と異なる情報に変更し、前記更新データ(302)の前記第１のメモリ(160)への書き込みを確定させた場合に前記変更後のチェック情報(341)を変更前のチェック情報(341)に上書きし、前記変更前のチェック情報(341)と前記変更後のチェック情報(341)を判定し、前記外部機器(40)に書き込み処理完了の通知を送信する、制御方法。
【請求項１２】
請求項１１において、
前記ディスク部(200)は、複数のディスク装置(220)を含み、
前記位置情報(342,351)は、前記ディスク部(200)におけるデータの格納位置であって、
論理ユニット番号(342)と論理ユニット内の先頭アドレス情報(351)を含み、
前記チェック情報(341)は、更新済か否かを示すビット情報であり、
前記転送処理部(110)は、前記外部機器(40)であるホスト計算機(40)と通信するためのホストアダプタ(110)であり、
前記書き込み要求は、前記旧データ(301)の論理ユニット番号(342)と前記先頭アドレス情報(351)とデータ長を含み、
前記ホストアダプタ(110)は、前記更新データ(302)を所定単位長で複数に分割して複数のデータブロック(300)を生成し、それぞれのデータブロック(300)に前記保証コード(310)を付与し、
前記第１のメモリ制御部(150)は、前記旧データ(301)の論理ユニット番号(342)と前記先頭アドレス情報(351)とデータ長を参照し、前記第１のメモリ(160)に更新対象の前記旧データ(301)が存在するか確認し、存在する場合に前記旧データ(301)の前記チェック情報(341)を変更し、
前記第１のメモリ制御部(150)は、前記更新データ(302)に付されている前記保証コード(310)の前記位置情報(342,351)と前記更新データ(302)が書かれるべきディスク部(200)の位置を示す設定情報(16240)とを照合することにより、前記更新データ(302)が正しいデータか否かを確認すると共に、正しいデータであると確認できた場合に前記データブロック(300)単位で、前記第１のメモリ(160)への前記更新データ(302)の書き込みを確定させ、前記変更後のチェック情報(341)を前記変更前のチェック情報(341)に戻す、制御方法。
【請求項１３】
ディスク装置(220)を含むコンピュータを請求項１に記載のストレージ装置として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置、及びその制御方法、並びにプログラムに関し、例えば、ストレージ装置（ディスクアレイ装置）の上位装置であるホストからデータを受け取った場合（以下、データライト）の、ディスクアレイ装置内の書き込みを確定させるための技術に関する。
【背景技術】
【０００２】
ディスクアレイ装置では、ＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）構成を採ることで、複数ディスクの並列動作を可能とし、ホストからのデータ読み出し（以下、データリード）およびデータライトを高速に実現している。また、ディスクアレイ装置では、Ｍｉｒｒｏｒ、Ｐａｒｉｔｙ等のＲＡＩＤレベルに応じた冗長データを作成することにより、ディスク故障に対して高い耐障害性を実現している。
【０００３】
さらに、ディスクアレイ装置では、システム全体の信頼性を向上する目的で、受領データに対し転送中のデータ化けや転送先アドレス誤りを検出するための保証コードが付与されている。例えば、データライト時には、ホストから受領したデータは一定のデータ長である論理データブロックに分割され、論理データブロックごとに保証コードの付加を行い、保障コード付論理データがキャッシュメモリやディスクに格納される。その後、ホストからのデータリード要求時には、ホスト転送前に保証コードをチェックすることで、ホストに転送するデータがライト時のものと同一であることが保証される。
【０００４】
保証コードの具体例としては、一般的に転送中のデータビットエラーを検出するためのＬＲＣ（Longitudinal Redundancy Check）、および、アドレス誤りを検出するためのＬＡ（Logical Address）を付与する技術が知られている（特許文献１参照）。近年では、保証コードの標準フォーマットとして、ストレージインタフェース技術委員会であるＴ１０が提唱する、ＤＩＦ（Data Integrity Field）が広まっている。
【０００５】
また、保証コードの生成・付与およびチェック・削除をサポートするインタフェース機器を、ディスクアレイ装置のホストアダプタとして使用することもある。この場合、ディスクアレイ装置の入り口であるディスクアダプタが、データライト時にホストから受領したデータに対して保証コードを付与する。一方、データリード時には、ディスクアダプタが、保証コードの整合性をチェックする。このようにすることで、装置内でデータエラーや紛失が発生していないことを保証することができるようになっている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００１−２０２２９５号公報
【特許文献２】特開２００３−３２３２６３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に示されるようなディスクアレイ装置では、保証コードを用いてデータリード時におけるデータエラー（データ化けやデータの欠落等）がないことを確認しているが、データライト時においてキャッシュメモリ上にデータが間違いなく書き込まれたことを保証することは考慮されていない。一般的なディスクアレイ装置は、Ｉ／Ｏ（Input/Output）処理性能向上のため高速低容量のキャッシュメモリを備えており、データライト時には非同期ライト処理と呼ばれる処理方式を採っている。これは、ホストから転送されたデータをキャッシュメモリに格納した時点で、ホストに対し転送完了を通知し、その後任意のタイミングでキャッシュメモリ上のデータをディスク装置に書き込む処理方式である。
【０００８】
このため、特許文献１に開示されるようなディスクアレイ装置では、データ書き込み時の転送エラー発生によりキャッシュメモリにデータが正しく書き込まれずに、ホストからのデータ転送セッションがクローズされてしまう場合がある。つまり、ホストは、ディスクアレイ装置からの転送終了を受領した時点でデータ転送が正常終了したと判断し、転送セッションをクローズしてしまう。その後、ディスクアレイ装置がキャッシュメモリ上のデータのエラーを検出したとしても、ホストに対するデータの再送要求は実行できない。結果的に、ディスクアレイ装置は受領したデータを紛失するデータロストを起こしてしまう。
【０００９】
従って、キャッシュメモリにデータが間違いなく格納されたことを保証するためには、ホストに転送完了を通知する前に、キャッシュメモリ内に格納されたデータの保証コードをチェックし、転送エラーが発生していないことを確認する必要がある。
【００１０】
本発明はこのような状況に鑑みてなされたものであり、キャッシュメモリにデータが正しく書かれたことを保証してデータロストの発生を防止するための技術を提供するものである。
【課題を解決するための手段】
【００１１】
本発明では、キャッシュメモリへのデータ転送確定を保証するための手段として、保証コードのアドレス部をチェックする処理方式をとる。ただし、アドレス部のみのチェックの場合、キャッシュ上に存在するデータを上書き更新（以下、上書きライト）する場合の更新検出能力がない。なぜなら、上書きの前後でアドレス情報は不変であるため、どの契機でチェックしてもチェック結果は常に同じとなるためである。
【００１２】
そこで、本発明では、保証コードに上書き更新を確定するためのチェックビットを設け、アドレス情報とチェックビットの双方を確認することで、上書きライトを確定させている。
【００１３】
まず、上書きライト時にはホストからのデータ転送が始まる前に、キャッシュ上に存在する上書き対象データに付与された保証コードのチェックビットに未更新であることを示す「１」を設定する。次に、ホストに対しデータ転送要求を発行し、ホストアダプタに、ホストから転送されるデータに付与する保証コードのチェックビット部分に、更新済みであることを示す「０」を付与するように指示を出す。ホストアダプタからキャッシュメモリに転送されるデータには、チェックビットに更新済みを示す「０」が付与された保証コードが付与されるため、キャッシュメモリ上のデータが正しく更新された場合は、事前に「１」に設定していたチェックビットが「０」に更新されているはずである。ゆえに、キャッシュメモリへの転送終了後、更新対象データの保証コード部分のうち、アドレス部とチェックビットのみをチェックすれば、アドレス誤りと上書き更新の双方を確定することが可能となる。
【００１４】
即ち、本発明によるディスクアレイ装置は、メモリ(160)と、転送処理部(110)と、メモリ制御部(150)と、を有する。ここで、メモリ(160)には、ディスク部(200)におけるデータの位置情報(342,351)と書き込み確定を保証するためのチェック情報(341)とを含む保証コード(310)を有する更新対象の旧データ(301)が格納されている。そして、メモリ制御部(150)が旧データ(301)の更新である更新データ(302)の書き込み要求を外部機器(40)から受信した際には、旧データ(301)のチェック情報(341)を更新データ(302)に付与するチェック情報(341)と異なる情報に変更した後に、外部機器(40)に更新データ(302)の転送開始を指示する。転送処理部(110)は、外部機器(40)から受信した更新データ(302)に、位置情報(342,351)と書き込み確定を保証するためのチェック情報(341)を含む保証コード(310)を付与し、保証コード付更新データをメモリ(160)に転送する。これにより、更新データ(302)がメモリ(160)に正しく書き込まれた場合に、変更後のチェック情報(341)が変更前のチェック情報(341)に戻るようにする。なお、メモリ制御部(150)は、書き込み要求に含まれる旧データ(301)を特定する情報を参照し、メモリ(160)に更新対象の前記旧データ(301)が存在するか確認し、存在する場合に旧データ(301)のチェック情報(341)を変更するようにする。
【００１５】
また、転送処理部(110)は、メモリ制御部(150)からの更新データ(302)のメモリ(160)への書き込み完了の通知を外部機器(40)に送信する。
【００１６】
なお、転送処理部(110)が、更新データ(302)を所定単位長（例えば、５１２バイト）で複数に分割して複数のデータブロック(300)を生成し、それぞれのデータブロック(300)に保証コード(310)を付与するようにしても良い。この場合、メモリ制御部(150)は、データブロック(300)単位で、更新データ(302)のメモリ(160)への書き込みを確定させ、変更後のチェック情報(341)を変更前のチェック情報(341)に戻すようにする。
【００１７】
また、メモリ制御部(150)は、更新データ(302)に付されている保証コード(310)の位置情報(342,351)と更新データ(302)が書かれるべきディスク部(200)の位置を示す設定情報(16240)とを照合することにより、更新データ(302)が正しいデータか否かを確認する。
【００１８】
さらに、保証コード(310)が、データエラーを検出するためのデータエラー検出コード(320)を含む場合、メモリ制御部(150)が、メモリ(160)に書き込まれた更新データ(302)から演算して得られた情報とデータエラー検出コード(320)とを比較し、両者が一致する場合に更新データ(302)のメモリ(160)への書き込みを確定させるようにしてもよい。
【００１９】
さらなる本発明の特徴は、以下本発明を実施するための形態および添付図面によって明らかになるものである。
【発明の効果】
【００２０】
本発明によれば、ディスクアレイ装置においてデータロストを起こす可能性を低下させることができ、ディスクアレイ装置のデータ信頼性を向上させることができる。
【００２１】
また、保証コードのアドレス部チェックのみでは検出できない、キャッシュ上データの上書き更新についてのエラーを検出することができるようになる。
【図面の簡単な説明】
【００２２】
【図１】本発明の第１の実施形態におけるディスクアレイシステムの概略構成を示すブロック図である。
【図２】ＤＩＦフォーマットについての概要図である。
【図３】メモリの内部構成を示す図である。
【図４】ＬＵ管理テーブルの構成例を示す図である。
【図５】メモリ管理テーブルの構成例を示す図である。
【図６】転送リストの構成例を示す図である。
【図７】本発明で使用するＵＤＴのフォーマット例を示す図である。
【図８】データ上書きライトの動作概要を説明するための図である。
【図９】データ上書きライトを説明するためのフローチャートである。
【図１０】ホスト計算機からのデータ転送要求に対してＣＰＵが行う受領準備処理を説明するためのフローチャートである。
【図１１】ホストアダプタがデータに対して保証コードを付与する際の処理を説明するためのフローチャートである。
【図１２】ＣＰＵがキャッシュへのデータ転送終了を確認する際の処理を説明するためのフローチャートである。
【図１３】ＣＰＵがホスト計算機に対してデータ転送結果を送信する際の処理を説明するためのフローチャートである。
【図１４】管理ソフトウェアがユーザに動作モードの設定インタフェース例を示す図である。
【図１５】第２の実施形態におけるディスクアレイシステムの概略構成を示すブロック図である。
【図１６】第２の実施形態におけるメモリの内部構成を示す図である。
【図１７】依頼テーブル１６２５０の構成例を示す図である。
【図１８】ステータス管理テーブル１６２６０の構成例を示す図である。
【図１９】第２の実施形態における、ホスト計算機からのデータ転送要求に対してＣＰＵが行う受領準備処理の詳細を説明するためのフローチャートである。
【図２０】自系ＣＰＵが他系ＣＰＵに対してのチェック依頼を発行し、終了結果を得るまでの処理の詳細を説明するためのフローチャートである。
【図２１】自系ＣＰＵと他系ＣＰＵの通信に関する概要を説明するための図である。
【発明を実施するための形態】
【００２３】
本発明は、メモリ（キャッシュメモリ）内の旧データを更新データで上書きする際に、確実に上書き保存できたことを保証するための技術を開示するものである。
【００２４】
以下、添付図面を参照して本発明の実施形態について説明する。ただし、本実施形態は本発明を実現するための一例に過ぎず、本発明の技術的範囲を限定するものではないことに注意すべきである。また、各図において共通の構成については同一の参照番号が付されている。なお、本発明では、データ保証コードにＤＩＦを用いることを前提としているが、別のフォーマットを用いても良い。
【００２５】
（１）第１の実施形態
＜システム構成＞
図１は、本発明の第１の実施形態によるディスクアレイシステム（ストレージシステム）の概略構成を示すブロック図である。ディスクアレイシステムは、ディスクアレイ装置（ストレージ装置）１０と、ホスト計算機４０と、を備えている。
【００２６】
図１において、ディスクアレイ装置１０は、ディスクアレイ装置１０全体の制御を行なう制御部１００と、データが記憶されるディスク部２００とから構成される。
【００２７】
ディスクアレイ装置１０には、制御部１００のホストアダプタ１１０を介して、ホスト計算機（ディスクアレイ装置１０を利用する上位装置（例えばアプリケーションサーバ））４０が接続されている。なお、ディスクアレイ装置１０とホスト計算機４０を接続するためのインタフェースには、例えば、データ転送に用いられるＳＣＳＩプロトコルに対応するＳＡＮ（Storage Area Network）２０が用いられる。ＳＡＮ２０の構築には、例えば、ファイバチャネル、ＳＣＳＩ（Small Computer System Interface）、ｉＳＣＳＩ（internet Small Computer System Interface）、ＵＳＢ（Universal Serial Bus）、ＩＥＥＥ１３９４バス等を用いることが可能である。
【００２８】
また、ディスクアレイ装置１０に接続されるホスト計算機４０は、複数台設置されていても良い。また、ＳＡＮ２０に代えて、他種のインタフェースが採用されても良い。
【００２９】
ホスト計算機４０には、ディスクアレイ装置１０の動作を制御する制御ソフトウェアがインストールされており、ホスト計算機４０で実行される制御ソフトウェアにより、ディスクアレイ装置１０に対してコマンドなどを発行し、ディスクアレイ装置１０の動作を制御することができる。ただし、ディスクアレイ装置１０とホスト計算機４０で実行される制御ソフトウェアとは、例えばＬＡＮ（Local Area Network）３０を経由して通信されるため、制御部１００にはディスクアレイ装置１０がＬＡＮ３０と接続するためのインタフェースであるＮＩＣ（Network Interface Card）１４０を備えている。ディスクアレイ装置１０の管理、制御或いは保守を行う計算機は、ホスト計算機４０とは別の計算機が使用されても良い。また、ＬＡＮ３０に代えて他種の通信ネットワークが利用されても良い。
【００３０】
制御部１００は、ホスト計算機４０が接続されて当該ホスト計算機４０との通信を行うホストアダプタ１１０と、制御部１００及びディスク部２００が互いに通信するためのインタフェースとなるディスクアダプタ１３０と、ＬＡＮ３０の接続インタフェースであるＮＩＣ１４０と、ディスクアレイ装置１０全体の制御を行なうＣＰＵ（Central Processing Unit）１５０と、Ｓｗｉｔｃｈ１２０と、を備えている。ＣＰＵ１５０と、ホストアダプタ１１０と、ディスクアダプタ１３０は、Ｓｗｉｔｃｈ１２０を介して接続されている。各デバイス間においては、例えばＰＣＩ（Peripheral Component Interconnect）のような内部バス１７０により通信が行われる。なお、Ｓｗｉｔｃｈ１２０に代えてＩＯＨ（I/O HUB）を用いても良い。
【００３１】
また、制御部１００は、ＣＰＵ１５０がディスクアレイ装置１０を制御するために必要なコンピュータプログラムやデータが記憶されるメモリ１６０を備えている。ＣＰＵ１５０とメモリ１６０とは、例えばＤＤＲ３（Double Data Rate 3）等の専用バス１８０で接続されている。さらに、本発明においてメモリ１６０は、ホスト計算機４０とディスク部２００との間で通信されるデータを一時的に記憶するキャッシュメモリとしての役割も備えている。
【００３２】
ホストアダプタ１１０は、ＤＭＡ（Direct Memory Access）転送機能１１１を備えている。そして、ホストアダプタ１１０は、ＣＰＵ１５０によってメモリ１６０内で設定される転送リストに従ってデータ転送を実施する。また、ホストアダプタ１１０は、ＤＩＦ生成・チェック機能１１２を備えている。つまり、ホストアダプタ１１０は、データライト時には、ホスト計算機４０から受領したデータに対しデータ保証コードであるＤＩＦを付与することができ、また、データリード時には、メモリ１６０から転送されたデータから演算して得られたコードと付加されている保証コードとを比較することで、ディスクアレイ装置１０内でデータが変化していなかチェックすることができる。両者が同一であれば、データが変化していないことが保証される。
【００３３】
ディスクアダプタ１３０は、ホストアダプタ１１０と同様のＤＭＡ機能１３１およびＤＩＦ機能１３２を備えており、メモリ１６０とディスク装置２１０間の転送における転送エラーの検出を行うことが可能となっている。
【００３４】
ディスク部２００は、複数のディスク装置群２１０を備えている。各ディスク装置群２１０はさらに複数のディスク装置２２０から構成され、複数のディスク装置２２０のうちの２以上のディスク装置２２０によりＲＡＩＤグループが構成される。ディスク装置２２０は、例えばハードディスクドライブ（ＨＤＤ）であるが、他種の物理ディスクドライブ、例えば、ＤＶＤ（Digital Versatile Disk）ドライブなどであっても良い。また、物理ディスクドライブに代えて、半導体メモリドライブ（例えばフラッシュメモリドライブ）などの他種の物理記憶装置を採用しても良い。なお、ディスク装置群２１０とディスクアダプタ１３０とはファイバチャネル、ＳＡＳ（Serial Attached SCSI）等の専用バス１９０により接続されている。
【００３５】
＜ＤＩＦフォーマットの構成＞
図２は、ＤＩＦフォーマットの概略構成を示す図である。図２に示されるように、ＤＩＦを使用する場合、ホスト計算機４０から受領したデータは５１２Ｂｙｔｅ単位の論理データブロック３００に分割され、そこにデータ保証コードである８ＢｙｔｅのＤＩＦ３１０が付与される。ＤＩＦ３１０は、例えば２ＢｙｔｅのＣＲＣ（Cyclical Redundancy Check）コード３２０と合計６ＢｙｔｅのＵＤＴ（User Defined Tag）３３０より構成される。
【００３６】
ＣＲＣ３２０は従来のＬＲＣに相当するデータビットエラーを検出するためのコードであり、５１２Ｂｙｔｅの論理データブロック３００に対するＣＲＣ計算結果が格納される。また、ＵＤＴ３３０は２ＢｙｔｅのＡｐｐｌｉｃａｔｉｏｎ  Ｔａｇ３４０と４ＢｙｔｅのＲｅｆｅｒｅｎｃｅ  Ｔａｇ３５０より構成され、ユーザが任意の値を設定可能であるが、一般的に従来のＬＡ（Logical Address）に相当する使われ方（アドレス（位置）誤りを検出する）が想定されている。つまり、ＵＤＴ（Application Tag）３４０は従来のＬＵＮ（Logical Unit Number）に相当し、ＵＤＴ（Reference Tag）３５０は、従来のＬＢＡに相当する。
【００３７】
＜メモリの内部構成＞
図３は、メモリ１６０の内部構成を示す図である。図３に示されるように、メモリ１６０は、ユーザデータを一時的に格納するために使用される領域であるデータキャッシュ領域１６１０と、ディスクアレイ装置１０を制御するためのプログラムや各種テーブルが格納されているシステム領域１６２０とにより構成される。
【００３８】
データキャッシュ領域１６１０は、任意のサイズを持つ複数のセグメントに分割され、セグメント単位でユーザデータ１６１１０を格納する領域である。
【００３９】
システム領域１６２０は、ＣＰＵ１５０が実行する各種プログラムであるプログラム群１６２１０と、ＲＡＩＤグループ内に作成されたＬＵ（Logical Unit）のアドレス空間とディスク装置内の物理アドレス空間との対応を管理するためのＬＵ管理テーブル１６２２０と、データキャッシュ領域１６１０のセグメントを管理するためのメモリ管理テーブル１６２３０と、ＣＰＵ１５０によって作成され、ＣＰＵ１５０がホストアダプタ１１０もしくはディスクアダプタ１３０に対してＤＭＡ転送を指示するために使用する転送リスト１６２４０と、を格納している。
【００４０】
＜各テーブル及び転送リストの構成＞
図４は、ＬＵ管理テーブル１６２２０の構成を示す図である。図４において、ＬＵＮ１６２２１０は、作成されたＬＵの識別子であり、この識別子にはユニークな数字が割り当てられる。ＬＵサイズ１６２２２０は、ＬＵの容量を示している。ディスクＮｏ１６２２３０は、ＬＵを格納するディスク装置２２０のディスク番号を示し、ＳＴＡＲＴ  ＬＢＡ１６２２４０およびＬＡＳＴ  ＬＢＡ１６２２５０はＬＵの開始アドレスおよび最終のアドレスを示している。
【００４１】
図５は、メモリ管理テーブル１６２３０の構成を示す図である。図５において、セグメントＮｏ１６２３１０は、セグメントの識別子であり、この識別子にはそれぞれユニークな数字が割り当てられている。ＬＵＮ１６２３２０、ＬＢＡ１６２３３０、及びＬＥＮＧＴＨ１６２３４０は、セグメントに格納されているユーザデータを管理するための情報である。ＬＵＮ１６２３２０は対象データのＬＵナンバーを示し、ＬＢＡ１６２３３０はＬＵ内の対象データの先頭アドレスを示し、ＬＥＮＧＴＨ１６２３４０は対象データのデータ長を示している。なお、格納すべきデータサイズが１セグメントのサイズよりも大きいときには、複数のセグメントに亘って当該データのＬＵＮ、ＬＢＡ及びＬＥＮＧＴＨが管理されることになる。
【００４２】
図６は、転送リスト１６２４０の構成を示す図である。転送リストは、ＣＰＵ１５０によって作成されるホストアダプタ１１０に対する命令文である。ホストアダプタ１１０は、この転送リストを参照し、転送処理を実行する。なお、図６では、リストは１つしか示されていないが、複数の転送リストが作成されメモリ１６０に格納される。
【００４３】
図６において、リストＮｏ１６２４１０は複数枚あるリストの識別子であり、この識別子にはユニークな数字が割り当てられる。転送方向１６２４２０は、ＤＭＡ転送の転送方向を示す情報である。例えば、ＤＭＡ転送を行うデバイスから見て自身のバッファからデータが転送される方向を「ＲＤ（リード）」、反対に自身のバッファにデータが入ってくる方向を「ＷＲ（ライト）」として転送方向が示される。
【００４４】
セグメントＮｏ１６２４３０およびＬＥＮＧＴＨ１６２４４０は、ＤＭＡ転送先のアドレスおよび転送サイズを示す情報である。また、チェックビット１６２４５０、ＬＵＮ１６２４６０、及びＬＢＡ１６２４７０は、本実施形態で使用するＵＤＴ３３０（詳細は図７で説明）の設定内容を示す情報である。Ｍｏｄｅ１６２４８０は、ＤＩＦに対する動作内容を示す情報である。ここには、例えば、データにＤＩＦを付与する場合は「付与」、チェックのみ実施する場合は「Ｃｈｅｃｋ」、チェック後にＤＩＦを削除する場合は「Ｃｈｅｃｋ  ＆  Ｄｅｌｅｔｅ」のようなコマンドに対する数値が入力される。
【００４５】
例えば、図６に示される転送リスト１６２４０によれば、ホストアダプタ１１０は、メモリ１６０のセグメントＮｏ．１００に対して、ＬＵＮ１０のＬＢＡ２００に格納されるべき８ＬＥＮＧＴＨ分のデータにＤＩＦを付与し、チェックビットを０として書き込む処理を実行する。
【００４６】
図７は、本発明の実施形態におけるＵＤＴ（User Defined Tag）の使用例を示す図である。図７に示されるように、本発明では、ＵＤＴ３３０として、Ａｐｐｌｉｃａｔｉｏｎ  Ｔａｇ３４０にデータ上書き確定のチェックビット３４１と、転送先ＬＵ番号であるＬＵＮ３４２が設定される。また、Ｒｅｆｅｒｅｎｃｅ  Ｔａｇ３５０にはＬＢＡ３５１が設定される。このように、ＬＵＮ３４２およびＬＢＡ３５１を定義することにより、従来のＬＡと同様のアドレス誤りチェック機能を実現し、さらにチェックビット３４１によりキャッシュに上に格納されているデータ（旧データ）への上書きライト完了を保証することができる。
【００４７】
＜上書きライト完了保証処理の内容＞
続いて、図８及び９を参照して、上書き完了保証処理の具体的な動作（例）について説明する。図８は、メモリ上に存在するデータに対する更新である、上書きライトの動作概要図であり、図９は、図８をフローチャートとして表した図である。
【００４８】
図８は、メモリ１６０に格納されている旧データ３０１を、ホスト計算機４０が新データ３０２に更新し、その更新データをメモリに書き込むまでの様子を示している。データの流れが実線で、データ転送を行うために必要なコマンドの流れが破線でそれぞれ示されている。
【００４９】
ホスト計算機４０は、データ転送要求コマンド（書き込み要求）をディスクアレイ装置１０に発行する（ステップＳ１００）。コマンドを受け取ったＣＰＵ１５０は、データ転送要求コマンドを解釈（ＬＵＮ、ＬＢＡ及びＬＥＮＧＴＨを特定する）し、データ受領準備処理を行う。このコマンド解釈により、メモリ１６０上に旧データ３０１が存在する（キャッシュヒット）かどうか分かる。データ受領準備処理として具体的には、ＣＰＵ１５０は、キャッシュ上に旧データ３０１が存在する場合、旧データ３０１に付与されたチェックビット３４１に未更新データを示す「１（図８中、黒塗り）」を設定し、さらにホストアダプタ１１０に対して、新データ（更新データ）３０２へ付与するＤＩＦの設定内容を含むＤＭＡ転送リスト（図６参照）を作成する。このとき、ＤＭＡ転送リスト中の新データ３０２に付与するＤＩＦ３１０内のチェックビット３４１には更新済みを示す「０（図８中、白塗り）」を設定する（ステップＳ２００）。なお、旧データがメモリ１６０上に存在しない（キャッシュミス）場合には、ＣＰＵ１５０は、チェックビットの設定はせずに、データをそのまま転送するようにホスト計算機４０に通知する。
【００５０】
その後、ＣＰＵ１５０は、ホスト計算機４０に対してデータ転送許可通知を発行する（ステップＳ３００）。データ転送許可通知を受け取ったホスト計算機４０は、ディスクアレイ装置１０に対し新データ３０２の転送を開始する（ステップＳ４００）。
【００５１】
また、新データ３０２を受け取ったホストアダプタ１１０は、転送リストの設定内容に従って新データ３０２の各ブロックに対してＤＩＦを付与しながら、新データをブロック単位（図２参照）でメモリ１６０へ転送する。このとき、付与されるＤＩＦのチェックビット３４１は更新済みを示す「０」と設定される（ステップＳ５００）。
【００５２】
ホストアダプタ１１０の転送終了後、ＣＰＵ１５０はメモリ上のＵＤＴを読み込み、チェックビット３４１を含むＵＤＴの値が妥当であるか否かをチェックする（ステップＳ６００）。すなわち、旧データ３０１が新データ３０２に確実に更新されている場合は、上書き更新のためＬＡ部分に該当するＬＵＮ３４２およびＬＢＡ３５１は更新前と同じであるが、チェックビット３４１の値は更新済みを示す「０」となっているはずである。その後、ＣＰＵ１５０は、ホストアダプタ１１０を介して、チェック結果に応じたレスポンスをホスト計算機４０に送信し（ステップＳ７００）、ホスト計算機４０はレスポンス内容に応じて、転送の終了やデータ再送等のコマンド終了処理を実施する（ステップＳ８００）。以上のステップにより、旧データ３０１が新データ３０２に確実に更新されたことを保証できるようになる。
【００５３】
＜ステップＳ２００の詳細＞
図１０は、データ受領準備処理であるステップＳ２００を詳細に説明するためのフローチャートである。
【００５４】
ＣＰＵ１５０は、ホスト計算機４０からのデータライト要求を受け取ると、要求コマンドのターゲット情報から抽出したライト対象データのＬＵＮ、ＬＢＡ、ＬＥＮＧＴＨをキーに、メモリ管理テーブル１６２３０を参照することで、対象データがメモリ１６０に存在する（キャッシュヒット）か否かを判定する（ステップＳ２０１）。ステップＳ２０１の判定の結果、対象データがメモリ上に存在する場合、ＣＰＵ１５０はヒット判定であると判断し（判定結果、ＹＥＳ）、メモリ１６０上データのチェックビットに対し、未更新データを示す「１」をライトする（ステップＳ２０２）。その後、ＣＰＵ１５０は、ホストアダプタがＤＭＡ転送を行うために必要な情報である転送リスト１６２４０を作成し（ステップＳ２０３）、本処理を終了する。なお、ステップＳ２０３で作成する転送リスト１６２４０の具体例としては、転送方向１６２４２０に「ＷＲ」が、ＤＩＦ設定Ｍｏｄｅ１６２４８０に「付与」が、チェックビット１６２４５０に更新済みを示す「０」が、ＬＵＮ１６２４６０およびＬＢＡ１６２４７０に対象データのＬＵＮおよびＬＢＡが、それぞれ設定されたものが挙げられる（図６参照）。
【００５５】
一方、ステップＳ２０１の判定の結果、対象データがメモリ上に存在しない場合、ＣＰＵ１５０は、キャッシュミスであると判断し（判定結果、ＮＯ）、上書き更新用の処理であるステップＳ２０２は実施せず、そのまま、ＤＭＡ転送リスト１６２４０の作成へと移行する。
【００５６】
＜ステップＳ５００の詳細＞
図１１は、ホストアダプタ１１０がホスト計算機４０から受け取ったデータにＤＩＦを付与しながらメモリ１６０へのＤＭＡ転送を実施するステップＳ５００を詳細に説明するためのフローチャートである。
【００５７】
まず、ホストアダプタ１１０は、ホスト計算機４０から受領したデータを一定のデータ長である論理データブロックに分割し（ステップＳ５０１）、転送リスト１６２４０の設定内容に従って各論理データブロックにＤＩＦ保証コードを付与する（ステップＳ５０２）。
【００５８】
その後、ホストアダプタ１１０は、論理データブロックと保証コードを転送先であるメモリ１６０へと転送する（ステップＳ５０３）。また、ホストアダプタ１１０は、ＣＰＵ１５０に対し転送終了を送信する（ステップＳ５０４）。なお、データサイズを転送単位長（例：５１２バイト＋ＤＩＦ）で除算すれば、何回転送すべきかが分かるので、転送完了か否か判断することができる。
【００５９】
＜ステップＳ６００の詳細＞
図１２は、ＣＰＵ１５０がキャッシュへ転送されたデータが正しく更新されていることを確認する処理であるステップＳ６００を詳細に説明するためのフローチャートである。
【００６０】
ホストアダプタ１１０からの転送終了通知を受け取ると、ＣＰＵ１５０は、転送先のメモリから対象データのＵＤＴ部分をリードし、リードした情報と設定情報とが一致するかを確認する。具体的には、ＣＰＵ１５０は、転送リスト１６２４０を参照し、チェックビット１６２４５０、ＬＵＮ１６２４６０、及びＬＢＡ１６２４７０の設定内容と、実際に付与されたＵＤＴの値を比較することで本処理を実行する（ステップＳ６０１）。
【００６１】
アドレス部であるＬＵＮとＬＢＡの値が確認され（ステップＳ６０２）、チェック結果が妥当である場合（判定ＯＫ）、処理はチェックビットの判定処理に移行する（ステップＳ６０３）。ステップＳ６０３の判定の結果が妥当であると判断された場合は（判定ＯＫ）、ＣＰＵ１５０は旧データの更新が正常に完了したと判断し、転送ＯＫの判定を行い（ステップＳ６０４）本処理を終了する。
【００６２】
一方、ステップＳ６０３の判定結果が妥当でない場合は、データ更新が確定されていないと判断され（判定ＮＧ）、処理は、タイムアウトであるか否かを判断するステップＳ６０６に移行する。ステップＳ６０６では、ＣＰＵ１５０は、ステップＳ６０３から規定の時間経過したかを判断し、規定の時間を経過していない場合は（判定ＮＯ）、再度ステップＳ６０３の処理を実行する。規定時間以上を経過した場合は、ＣＰＵ１５０は、何らかの障害が発生していると判断し（判定ＹＥＳ）、転送ＮＧの判定処理を行う（ステップＳ６０５）。
【００６３】
また、ステップＳ６０２にてアドレス部のチェック結果が妥当でないと判断した場合（判定ＮＧ）においても、ＣＰＵ１５０は、転送異常であると判断し、転送ＮＧの判定処理を行う（ステップＳ６０５）。
【００６４】
＜ステップＳ７００の詳細＞
図１３は、ＣＰＵ１５０が転送終了ステータスをホスト計算機４０へ送信する処理であるステップＳ７００を詳細に説明するためのフローチャートである。
【００６５】
まず、ＣＰＵ１５０は、ステップＳ６００の判定結果を基に、データ転送が正常に終了したか否かを判断する（ステップＳ７０１）。正常終了である場合は（判定「正常」）、ＣＰＵ１５０はホスト計算機４０に「正常終了」を送信し、本処理を終了する（ステップＳ７０２）。
【００６６】
一方、ステップＳ７０１の結果が正常終了でない場合は（判定「異常」）、ＣＰＵ１５０はホスト計算機４０にデータ転送が失敗したことを示す「転送異常」を送信し（ステップＳ７０３）、本処理を終了する。
【００６７】
以上により、本発明にてデータライト時に、ホスト計算機４０からメモリ１６０にデータが転送された際に、ホスト計算機４０に対して転送終了応答を送信する前に、メモリ１６０へのデータライトが確定したことを保証することができる。
【００６８】
＜その他追加説明等＞
なお、以上の各ステップでは、非同期ライトを想定しメモリ１６０へのライトフローのみを記載したが、ディスクアレイ装置１０としては、任意のタイミングでメモリ１６０に格納したデータをディスク装置２２０へと格納する処理を実行する。
【００６９】
また、本実施形態では、ＣＰＵ１５０への性能影響を考慮し、データ転送終了確定のためのチェック対象をＵＤＴ３３０のみに限定している。つまり、転送完了保証には、キャッシュメモリ上に転送されたデータからＵＤＴ（ＬＡ）／ＣＲＣ（ＬＲＣ）等を再計算して得られた結果とホストアダプタが付与した値とを比較し、両者が一致するか判断する必要がある。ＵＤＴ（ＬＡ）はアドレス等の位置情報であるため、単純な比較のみでチェック可能である。しかし、ＣＲＣ（ＬＲＣ）はデータ部の排他的論理和等の演算をとったものであるため、チェックのためにはキャッシュメモリ上のデータに対しても排他的論理和等の演算を実行する必要がある。本処理をＣＰＵ１５０が担当した場合、ＣＰＵ１５０のリソースが消費され、装置のＩ／Ｏ処理性能低下を引き起こしてしまう。このため、上述の第１の実施形態では、チェック対象をＵＤＴ３３０のみに限定している。
【００７０】
ただし、信頼性向上のためＣＲＣ３２０を含むＤＩＦ３１０全体に対するチェックを行っても良い。この場合、図１２に記載したステップＳ６０１でのリード＆コンペア対象をＤＩＦ３１０全体に対して行えばよい。また、ホスト計算機４０にインストールされた制御ソフトウェアを介して、チェック動作の設定・確認を可能とするインタフェースを提供することで、ユーザの要件に応じた設定が可能となる。具体的には、ＣＰＵ１５０のＩ／Ｏ処理性能は低下するが、データの信頼性は１００％保証可能であるＤＩＦ３１０フルチェックモード（高信頼性モード）、もしくは、フルチェックに比べて信頼性は若干落ちるもののＣＰＵ１５０のＩ／Ｏ処理性能低下を抑止可能なＵＤＴ３３０のみの簡易チェックモード（高性能モード）の２パターンを制御ソフトウェアにより提供することで実現可能である。なお、図１４は、制御ソフトウェアのインタフェース例を示している。
【００７１】
（２）第２の実施形態
第２の実施形態は、ディスクアレイ装置１０内に制御部１００を２つ設けたディスクアレイシステム（ストレージシステム）に関する。このような２重構成を採用するのは、ディスクアレイ装置１０の、制御部１００の一点障害によるシステムダウンを避けるためである。本実施形態では、システムに２つの制御部１００を搭載した場合を想定しているが、制御部の数は２つに限られるものではない。以下では、第１の実施形態との差分を中心に説明することとする。
【００７２】
＜システム構成＞
図１５は、本発明の第２の実施形態によるディスクアレイシステム（ストレージシステム）の概略構成を示す図である。当該ディスクアレイシステムは、第１の実施形態と同様、ディスクアレイ装置（ストレージ装置）１０と、ホスト計算機４０と、を備えている。ただし、図１５に示されるように、ディスクアレイ装置の内部構成が第１の実施形態とは異なっている。
【００７３】
また、図１５に示されるディスクアレイ装置１０においては、２つの制御部１００及び４００が専用の通信線１７０で接続され、各制御部が１つのディスク部２００を共有している。さらに、第２の実施形態では、ホスト計算機４０から転送されたデータは、データを受領した側（以下「自系」）の制御部１００に属するＳｗｉｔｃｈ１２０が持つコピー機能にてコピーされ、１つは自系のメモリ１６０へ、もう１つは反対側（以下「他系」）の制御部４００のメモリ４６０へと転送される。これにより、ディスクアレイ装置１０の内部で、ライトデータが自系と他系の両メモリ１６０及び４６０に同時に格納される「ミラーライト」動作を実現することができる。仮に、Ｓｗｉｔｃｈ１２０がコピー機能を持たない場合は、データは自系メモリ１６０に一度格納され、その後自系ＣＰＵ１５０が他系メモリ４６０にデータを転送することでミラーライトを実現する。また、このミラーライトにより、例えば自系メモリ１６０に格納したデータをディスク２２０に格納する前に、自系の制御部１００が故障したとしても、他系のメモリ４６０にも同一のデータが格納されているため他系の制御部４００が処理を引き継ぎ、データをディスク装置２２０に書き込むことができる。
【００７４】
＜メモリの内部構成＞
上書きライト時の基本的な処理は、図９のフローチャートと同様であるが、データ受領準備を行うステップＳ２００と、転送終了の確認を行うステップＳ６００において、第１の実施形態とは異なる処理が実行される。つまり、ステップＳ２００では、上書きライトである場合は、自系メモリ１６０と他系メモリ４６０に格納されているデータに対しチェックビットの変更が行われた後、他系メモリ４６０のデータに対するチェックビットの更新が確定したことが確認できた場合に、処理は、データ転送許可フェーズであるステップＳ３００に移行する。また、ステップＳ６００では、自系メモリ１６０と他系メモリ４６０に転送されたデータの上書き更新が完了したことがそれぞれ確認された後に、処理はホスト計算機４０に転送結果を報告するステップＳ７００に移行する。
【００７５】
これらの処理を実現するには、自系ＣＰＵ１５０と他系ＣＰＵ４５０との間で処理の依頼とレスポンス、処理状況のステータスをシェアする必要がある。
【００７６】
そこで、第２の実施形態では、メモリ１６０のシステム領域１６２０に２つの新しいテーブルが設けられている。
【００７７】
図１６は、第２の実施形態におけるメモリ１６０の内部構成を示す図である。図１６に示されるように、第２の実施形態では、追加の構成として、自系ＣＰＵ１５０と他系ＣＰＵ４５０が処理の依頼および結果の通達に使用する依頼テーブル１６２５０（図１７参照）と、依頼に対するお互いの処理状況をシェアするためのテーブルであるステータス管理テーブル１６２６０（図１８参照）と、が新たに設けられている。
【００７８】
＜新たに設けられたテーブルの内容＞
図１７は、依頼テーブル１６２５０の構成例を示す図である。依頼テーブルは、自系装置が他系装置に対象データの保証コードのチェックを依頼する場合に発行されるテーブルである。
【００７９】
図１７において、リストＮｏ１６２５１０は、複数枚ある依頼テーブルを識別するために割り振られた番号である。セグメントＮｏ１６２５２０は、処理対象のデータが格納されている他系メモリ４６０内のセグメントの番号である。チェックビット１６２５４０、ＬＵＮ１６２５５０およびＬＢＡ１６２５６０は、チェック対象データの期待値である。なお、他系のメモリ（キャッシュメモリ）のセグメントＮｏを知るための方法としては、例えば、特許文献２に開示されている方法（他系のメモリの状態を参照できる技術）を採用することができる。
【００８０】
図１７に示される例では、自系ＣＰＵ１５０が、他系のメモリのセグメントＮｏが１００の位置に格納されているデータの保証コードについて、チェックビット部分が「１」、ＬＵＮが「１０」、ＬＢＡが「２００」であることをチェックするように他系ＣＰＵ４５０に対して依頼するときの設定例となっている。
【００８１】
また、Ｒｅｓｕｌｔ１６２５７０は他系ＣＰＵ４５０からのチェック結果が格納される領域である。付与された保証コードが依頼情報と同一であればＯＫが、チェック結果が同一でない場合はＮＧがそれぞれ入力される。チェック結果が入力されていない場合には、Ｎ／Ａとなっている。
【００８２】
図１８は、ステータス管理テーブル１６２６０の構成例を示す図である。このステータス管理テーブルは、自系ＣＰＵから他系ＣＰＵへの依頼状況を管理するためのテーブルである。
【００８３】
図１８において、リストＮｏ１６２６１０は、依頼テーブル１６２５０のリストＮｏ１６２５１０と同一の数値が入っており、これにより各依頼状況の管理が可能となっている。自系ステータス１６２６２０は依頼元である自系ＣＰＵの処理ステータスを示し、自系更新Ｔｉｍｅ１６２６３０は自系ＣＰＵ１５０が自系ステータス１６２６２０を更新した時間を示している。また、他系ステータス１６２６４０は依頼先である他系ＣＰＵ４５０の処理ステータスを示し、他系更新Ｔｉｍｅ１６２６５０は他系ＣＰＵ４５０が他系ステータス１６２６４０を更新した時間を示している。ステータス管理テーブル１６２６０の具体的な使用方法については、後述する図２１の説明で明らかにする。
【００８４】
＜上書きライト完了保証処理の内容＞
上書きライト時の基本的な処理は、図９のフローチャートと同様であるので、第１の実施形態とは異なる処理、つまり、データ受領準備を行うステップＳ２００と、転送終了の確認を行うステップＳ６００について、以下説明する。
【００８５】
図１９は、第２の実施形態における、ホスト計算機４０からのデータ転送要求に対して自系ＣＰＵ１５０が行う受領準備処理（ステップＳ２００）の詳細を説明するためのフローチャートである。
【００８６】
まず、ホスト計算機４０からのデータライト要求を受け取った自系ＣＰＵ１５０は、要求コマンドのターゲット情報から抽出したライト対象データのＬＵＮ、ＬＢＡ、及びＬＥＮＧＴＨをキーに、メモリ管理テーブル１６２３０を参照することで、対象データが自系メモリ１６０に存在するか否かを判定する（ステップＳ２１０）。
【００８７】
ステップＳ２１０の判定の結果、対象データがメモリ上に存在する場合、自系ＣＰＵ１５０はキャッシュヒットであると判断し（判定結果、ＹＥＳ）、まず自系のメモリ１６０上データのチェックビットに対し、旧データが未更新であることを示す「１」をライトする（ステップＳ２１１）。次に、自系ＣＰＵ１５０は、他系メモリ４６０上のデータのチェックビットに対して、未更新データを示す「１」をライトし（ステップＳ２１２）、他系ＣＰＵ４５０に依頼テーブル１６２５０を用いてチェックするように依頼通知する（ステップＳ２１３：詳細は図２０にて説明）。
【００８８】
そして、他系ＣＰＵ４５０のチェック結果が正常である場合（判定：ＯＫ）、自系ＣＰＵ１５０は、対象データのチェックビットが正しく更新できていると判断し、ＤＭＡ転送（ホストアダプタによる転送）を行うために必要な情報である転送リスト１６２４０を作成し（ステップＳ２１６）、本処理を終了させる。
【００８９】
一方、ステップＳ２１４の判定において、他系ＣＰＵ４５０のチェック結果が正常でない場合は（判定：ＮＧ）、自系ＣＰＵ１５０は、プログラムのエラーやハードウェアの故障等により、他系制御部４００が正常に動作していないと判断し、他系制御部４００を閉塞させ、ホスト計算機４０の制御ソフトウェアを通じて管理者に障害発生を通知するとともに、以後自系制御部１００のみのシングル動作に切り替える（ステップＳ２１７）。その後、自系ＣＰＵ１５０は、ＤＭＡ転送リスト設定処理を行い（ステップＳ２１６）、本処理を終了する。
【００９０】
また、ステップＳ２１０の判定の結果、対象データがメモリ上に存在しない場合、自系ＣＰＵ１５０はキャッシュミスであると判断する（判定結果、ＮＯ）。そして、処理は、そのままＤＭＡ転送リスト１６２４０の設定処理であるステップＳ２１６に移行する。
【００９１】
図２０は、自系ＣＰＵ１５０が他系ＣＰＵ４５０に対するチェック依頼を発行し終了結果を得るステップＳ２１３の詳細を説明するためのフローチャートである。
【００９２】
自系ＣＰＵ１５０は、依頼テーブル１６２５０およびステータス管理テーブル１６２６０を初期化した後に、依頼テーブル１６２５０にチェック対象のセグメントＮｏ、チェックビット値、ＬＵＮ、及びＬＢＡの情報をセットし（ステップＳ２３０）、他系ＣＰＵ４５０に対して依頼テーブル１６２５０のリストＮｏ１６２５１０を通知することでチェックの依頼を送信する（ステップＳ２３１）。ここで、ステップＳ２３０では依頼テーブル１６２５０のＲｅｓｕｌｔ１６２５７０には初期値であるＮ／Ａが入っている。
【００９３】
ステップＳ２３１の後、自系ＣＰＵ１５０は、依頼テーブル１６２５０に対応するステータス管理テーブル１６２６０の自系ステータス１６２６２０を「依頼中」に変更し、自系更新Ｔｉｍｅ１６２６３０に現在の時間を入力する（ステップＳ２３２）。また、自系ＣＰＵ１５０は、依頼テーブル１６２５０のＲｅｓｕｌｔ１６２５７０がチェックＯＫを示す「ＯＫ」、もしくは、チェック異常を示す「ＮＧ」に更新されているかを確認する（ステップＳ２３３）。Ｒｅｓｕｌｔ１６２５７０に「ＯＫ」が入力されている場合は、自系ＣＰＵ１５０は、他系ＣＰＵ１５０のチェックが正常に終了したと判断し、判断結果として転送ＯＫをリターンして本処理を終了する。
【００９４】
また、ステップＳ２３３の判定の結果がＮＧである場合、自系ＣＰＵ１５０は、現在時刻と自系更新Ｔｉｍｅ１６２６３０もしくは他系更新Ｔｉｍｅ１６２６５０の差分が規定の時間を超過しているかを判断するタイムアウトチェックを行う（ステップＳ２３４）。ステップＳ２３４の判断結果がＹＥＳの場合は、自系ＣＰＵ１５０は、他系に障害が発生していると判断し、判定結果として転送ＮＧをリターンして本処理を終了する。
【００９５】
一方、ステップＳ２３４の判断結果がＮＯである場合は、処理は再度他系のチェック更新を確認するステップＳ２３３へと移行する。
【００９６】
他系ＣＰＵ４５０は、ステップＳ２３１で発行されたチェック依頼を受け取ると、依頼テーブル１６２５０を参照し、チェック対象項目を確認する（ステップＳ２３６）。そして、他系ＣＰＵ４５０は、ステータス管理テーブル１６２６０の他系ステータス１６２６４０を「処理中」に更新するとともに、他系更新Ｔｉｍｅ１６２６５０に現在の時間を入力する（ステップＳ２３７）。次に、他系ＣＰＵ４５０は、チェック対象データのＵＤＴをリードし、その内容が依頼テーブル１６２５０に記載されているものと等しいか否かを比較し（ステップＳ２３８）、全項目が一致する場合はチェック正常を示す「ＯＫ」を、一致しない項目がある場合はチェック異常を示す「ＮＧ」を、依頼テーブル１６２５０のＲｅｓｕｌｔ１６２５７０に入力する（ステップＳ２３９）。また、他系ＣＰＵ４５０は、ステータス管理テーブル１６２６０の他系ステータス１６２６４０に「完了」を入力すると共に、他系更新Ｔｉｍｅ１６２６５０に現在の時間を入力する（ステップＳ２４０）。その後、他系ＣＰＵ４５０は、自系ＣＰＵ１５０に対し、依頼テーブル１６２５０のリストＮｏ１６２５１０を通知することでチェックの終了を通知する（ステップＳ２４１）。
【００９７】
＜ステータス管理テーブルの変化の様子＞
図２１は、自系ＣＰＵ１５０と他系ＣＰＵ４５０の通信についての補足説明図であり、ステータス管理テーブル１６２６０が更新される契機と入力値とを時系列に表現した図である。なお、図中のステップの欄は、図２０のステップ番号に対応する。
【００９８】
まず、ステップＳ２３０にてステータス管理テーブル１６２６０の初期化が行われた場合、すべての入力値が初期値を示すＮ／Ａとなる。次に、ステップＳ２３２にて自系ＣＰＵ１５０が他系ＣＰＵ４５０に対するチェック依頼を送信した場合には、自系ステータス１６２６２０が「依頼中」に、自系更新Ｔｉｍｅ１６２６３０がそのときの時刻にそれぞれ更新される。
【００９９】
一方、他系ステータス１６２６４０および他系更新Ｔｉｍｅ１６２６５０は初期値「Ｎ／Ａ」が入力されたままとなる。その後、ステップＳ２３７にて他系ＣＰＵ４５０がチェックを開始した際には、他系ステータス１６２６４０は「処理中」に、他系更新Ｔｉｍｅ１６２６５０はそのときの時刻にそれぞれ更新される。そして、ステップＳ２４０において、他系ＣＰＵ４５０のチェックが完了した際に、他系ステータス１６２６４０が「完了」に、他系更新Ｔｉｍｅ１６２６５０がそのときの時刻にそれぞれ更新される。なお、自系及び他系更新Ｔｉｍｅは、ＣＰＵのクロックカウンタ値で表されている。
【０１００】
＜その他追加説明＞
以上の更新フローをとることにより、依頼元である自系ＣＰＵ１５０が依頼先である他系ＣＰＵ４５０のチェック状態を確認することができる。また、更新Ｔｉｍｅを記録することで他系ＣＰＵ４５０からの応答が一定時間以上ない場合に、他系制御部４００に障害が発生している可能性があることを自系ＣＰＵ１５０が知ることができる。
【０１０１】
また、ホストアダプタ１１０からの転送後のチェックであるステップＳ６００においても、自系メモリ１６０と他系メモリ４６０のデータが正しく上書きされていることを確認する必要があるが、この場合においても、図１９及び２０に示すフローチャートを用いることで実行可能である。
【０１０２】
以上より、第２の実施形態では、ミラーされたデータがそれぞれのメモリ１６０及び４６０に更新されたことを確定した後に、ホスト計算機４０に対して応答を返すことが可能となる。
【０１０３】
また、第１および第２の実施形態では保証コードにＤＩＦを用いたが、ＬＡ／ＬＲＣを用いた場合においても、ＬＡ／ＬＲＣに上書き確定用のチェックビットを設けることで、本実施形態と同様の機能を実現することが可能である。
【０１０４】
（３）まとめ
i）本発明は、高速、高信頼にデータを格納する装置である、ディスクアレイ装置に適用することができる。
【０１０５】
ii）本発明では、メモリ１６０には、ディスク部２００における位置情報（ＬＵＮ３４２やＬＢＡ３５１）と書き込み確定を保証するためのチェックビット３４１とを含む保証コード３１０を有する更新対象の旧データ３０１が格納されている。そして、ＣＰＵ１５０が旧データ３０１の更新である更新データ３０２の書き込み要求をホスト計算機４０から受信した際には、旧データ３０１のチェックビット３４１の値を更新データ３０２に付与する値である「０」とは異なる「１」に変更した後に、ホスト計算機４０に更新データ３０２の転送開始を指示する。ホストアダプタ１１０は、ホスト計算機４０から受信した更新データ３０２に、位置情報と書き込み確定を保証するためのチェックビット３４１（「０」に設定）を含む保証コード３１０を付与し、保証コード付更新データをメモリ１６０に転送する。これにより、更新データ３０２がメモリ１６０に正しく書き込まれた場合に、変更後のチェックビット３４１（「１」）が変更前のチェックビット３４１（「０」）に戻るようにする。このようにすることにより、メモリ１６０におけるデータのチェックビットが「１」のままであれば、上書き保存が完了していないことが分かり、上書きを確定してからホスト計算機４０からのデータ転送のセッションを終了させることができる。よって、ディスクアレイ装置１０内でのデータロストの危険性を低下させることができる。
【０１０６】
そして、ホストアダプタ１１０は、ＣＰＵ１５０からの更新データ３０２のメモリ１６０への書き込み完了の通知をホスト計算機４０に送信する。通知を受け取った跡に、ホスト計算機４０がデータ転送を終了させる。これにより、メモリ１６０に更新データが上書き保存されたことが保証され、安全にデータ転送セッションを終了させることができるようになる。
【０１０７】
さらに、保証コード３１０に、データエラーを検出するためのＣＲＣコード３２０が含まれる場合、ＣＰＵ１５０が、メモリ１６０に書き込まれた更新データ３０２から演算して得られた情報とＣＲＣコード３２０とを比較し、両者が一致する場合に更新データ３０２のメモリ１６０への書き込みを確定させるようにしてもよい。これにより、転送途中でデータエラーが発生してもエラーを含むデータがメモリ１６０に書き込まれたまま転送セッションが終了することを防ぐことができる。ただし、ＣＲＣコードチェックをするとＣＰＵ１５０に負荷が掛かるので、上述のように、ＵＤＴ（ＬＡ）３３０とチェックビット３４１のみを用いて上書き確定処理をすることにより、ＣＰＵ１５０の負荷を軽減（Ｉ／Ｏ処理性能の低下を防止）することができる。つまり、本発明では、信頼性重視か性能重視かによって、ＣＲＣを用いるか否か使い分けすることができる。
【０１０８】
iii）本発明の別の態様では、制御部１００（自系）と、制御部１００と同様の構成を有する制御部４００（他系）を設け、両者を通信可能に設定し、ミラーリングを実現している。自系制御部１００の処理動作は第１の実施形態の動作に加えて、他系に対して、旧データのチェックビットを「０」から「１」に変更し、自系と同様に他系でもメモリ４６０に更新データのコピーが確実に上書きされるように制御している。このようにすることにより、自系及び他系に同一の更新データを保持させることができ、自系に障害が発生しても他系のメモリ４６０から確実に更新されて上書き保証されたデータを読み出すことができるようになる。
【０１０９】
実施形態では、自系ＣＰＵ１５０が他系メモリ４６０の内容を直接チェックしたり、チェックビットの変更をしたりしているが、自系ＣＰＵ１５０が他系ＣＰＵ４５０に他系メモリ４６０の内容のチェックやチェックビットの変更を依頼し、それに応答して他系ＣＰＵ４５０が実際に内容チェックやチェックビット変更を行うようにしても良い。
【０１１０】
iv）なお、本発明は、実施形態の機能を実現するソフトウェアのプログラムコードによっても実現できる。この場合、プログラムコードを記録した記憶媒体をシステム或は装置に提供し、そのシステム或は装置のコンピュータ（又はＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読み出す。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコード自体、及びそれを記憶した記憶媒体は本発明を構成することになる。このようなプログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカード、ＲＯＭなどが用いられる。
【０１１１】
また、プログラムコードの指示に基づき、コンピュータ上で稼動しているＯＳ（オペレーティングシステム）などが実際の処理の一部又は全部を行い、その処理によって前述した実施の形態の機能が実現されるようにしてもよい。さらに、記憶媒体から読み出されたプログラムコードが、コンピュータ上のメモリに書きこまれた後、そのプログラムコードの指示に基づき、コンピュータのＣＰＵなどが実際の処理の一部又は全部を行い、その処理によって前述した実施の形態の機能が実現されるようにしてもよい。
【０１１２】
また、実施の形態の機能を実現するソフトウェアのプログラムコードを、ネットワークを介して配信することにより、それをシステム又は装置のハードディスクやメモリ等の記憶手段又はＣＤ-ＲＷ、ＣＤ-Ｒ等の記憶媒体に格納し、使用時にそのシステム又は装置のコンピュータ(又はＣＰＵやＭＰＵ)が当該記憶手段や当該記憶媒体に格納されたプログラムコードを読み出して実行するようにしても良い。
【符号の説明】
【０１１３】
１０：ディスクアレイ装置
２０：ＳＡＮ
３０：ＬＡＮ
４０：ホスト計算機
１００：ディスクアレイ装置制御部
１１０：ホストアダプタ
１２０：Ｓｗｉｔｃｈ
１３０：ディスクアダプタ
１４０：ＮＩＣ
１５０：ＣＰＵ
１６０：メモリ
１７０：内部バス
１８０：メモリ専用バス
１９０：ディスクアダプタ専用バス
２００：ディスクアレイ装置ディスク部
２１０：ディスク装置群
２２０：ディスク装置
【図１】
0005247887.tif 000002
【図２】
0005247887.tif 000003
【図３】
0005247887.tif 000004
【図４】
0005247887.tif 000005
【図５】
0005247887.tif 000006
【図６】
0005247887.tif 000007
【図７】
0005247887.tif 000008
【図８】
0005247887.tif 000009
【図９】
0005247887.tif 000010
【図１０】
0005247887.tif 000011
【図１１】
0005247887.tif 000012
【図１２】
0005247887.tif 000013
【図１３】
0005247887.tif 000014
【図１４】
0005247887.tif 000015
【図１５】
0005247887.tif 000016
【図１６】
0005247887.tif 000017
【図１７】
0005247887.tif 000018
【図１８】
0005247887.tif 000019
【図１９】
0005247887.tif 000020
【図２０】
0005247887.tif 000021
【図２１】
0005247887.tif 000022