(57)【特許請求の範囲】
【請求項１】
データを記憶する複数の記憶部に接続され、第１の格納領域と第２の格納領域を有する管理装置の制御方法において、
該記憶部に記憶するためのデータを該第１の格納領域に保持し、
該記憶部に記憶するためのデータから生成したパリティデータを該第２の格納領域に保持し、
該パリティデータを該記憶部に書き込み処理し、該第２の格納領域に保持した該パリティデータと該記憶部に保持されたパリティデータを比較し、
該第２の格納領域に保持した該パリティデータと該記憶部に保持されたパリティデータが異なる場合、該第２の格納領域に保持した該パリティデータが、該複数の記憶部においてストライプを構成する複数のデータを読み出すためのトリガー情報を該第２の格納領域に保持し、
該パリティデータを再び該記憶部に書き込み処理するときに、該トリガー情報を参照して該複数のデータを読み出して、該パリティデータを再び生成して該記憶部に書き込む
ことを特徴とする制御方法。
【請求項２】
請求項１に記載の制御方法において、
該トリガー情報は、該記憶部における該パリティデータを書き込むストライプを示す情報を含むことを特徴とする制御方法。
【請求項３】
請求項１に記載の制御方法において、
該第２の格納領域に保持した該パリティデータのストライプに新たなデータの書き込み処理があった場合、該新たなデータを用いて新たなパリティデータを生成し、該記憶部に書き込むことを特徴とする制御方法。
【請求項４】
データを記憶する複数の記憶部と、
該記憶部に記憶するための該データを保持する第１の格納領域と、
該記憶部に記憶するためのデータから生成したパリティデータを保持する第２の格納領域と、
該パリティデータを該記憶部に書き込み処理し、該第２の格納領域に保持した該パリティデータと該記憶部に保持されたパリティデータを比較し、該第２の格納領域に保持した該パリティデータと該記憶部に保持されたパリティデータが異なる場合、該第２の格納領域に保持した該パリティデータが、該複数の記憶部においてストライプを構成する複数のデータを読み出すためのトリガー情報を該第２の格納領域に保持し、該パリティデータを再び該記憶部に書き込み処理するときに、該トリガー情報を参照して該複数のデータを読み出して、該パリティデータを再び生成して該記憶部に書き込む制御部と、
を備えることを特徴とするディスクアレイ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
記憶装置へのデータ書き込みエラーの制御技術に関する。
【背景技術】
【０００２】
記憶装置の代表としてＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙｓ  ｏｆ Ｉｎｅｘｐｅｎｓｉｖｅ（Ｉｎｄｅｐｅｎｄｅｎｔ）Ｄｉｓｋｓ）がある。ＲＡＩＤはデータを冗長構成して記憶することで信頼性の高いストレージシステムを構築することができ、ＲＡＩＤ５、６が多く活用されている。
【０００３】
しかしながらこれらＲＡＩＤ５、６などのＲＡＩＤシステムにおいて以下の問題がある。その問題は記憶装置へのデータ読み書きを管理するＲＡＩＤコントローラがデータのディスクへの書き込みに成功したが、そのデータに対応するパリティデータのディスクへの書き込みが失敗した場合に発生する。このような場合、ＲＡＩＤコントローラがパリティデータをディスクへ書き込むリトライが成功するまで、ＲＡＩＤコントローラはパリティバッファにパリティデータを保持し続ける。これはデータの冗長構成を保つためである。一方でパリティバッファの資源は限られている。
【０００４】
そのためＲＡＩＤコントローラがパリティバッファにパリティデータを保持し続けた状態で、ホストコンピュータから新たな書き込み命令を続けて受信したり、高負荷の書き込み処理を受信すると、パリティバッファの容量が不足する。その結果、ＲＡＩＤコントローラがホストコンピュータに対して、エラー応答を返してしまう（ジョブアベンド）といった問題が起きる。
【０００５】
ＲＡＩＤに関連する特許文献として以下のものがある。
【特許文献１】特開２００６−２５２４１４号公報
【特許文献２】特開２００３−１６７６８８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
本願発明の管理装置の制御方法は、パリティデータの書き込みエラーが発生した場合であっても、管理装置がシステムダウンしないようにパリティデータの管理を行うことを目的とする。
【課題を解決するための手段】
【０００７】
本願発明に係る管理装置の制御方法の第一の側面によれば、データを記憶する複数の記憶部に接続され、第１の格納領域と第２の格納領域を有する管理装置の制御方法において、該記憶部に記憶するためのデータを該第１の格納領域に保持し、該記憶部に記憶するためのデータから生成したパリティデータを該第２の格納領域に保持し、該パリティデータを該記憶部に書き込み処理し、該第２の格納領域に保持した該パリティデータと該記憶部に保持されたパリティデータを比較し、該第２の格納領域に保持した該パリティデータと該記憶部に保持されたパリティデータが異なる場合、該第２の格納領域に保持した該パリティデータが、該複数の記憶部においてストライプを構成する複数のデータを読み出すためのトリガー情報を該第２の格納領域に保持し、該パリティデータを再び該記憶部に書き込み処理するときに、該トリガー情報を参照して該複数のデータを読み出して、該パリティデータを再び生成して該記憶部に書き込むことを特徴とする。
【発明の効果】
【０００８】
本実施例の管理装置の制御方法は、パリティデータの書き込みエラーが発生した場合であっても、該パリティデータを書き込みトライした記憶部における記憶場所の情報を保持しておくことによって、管理装置がシステムダウンしないようにパリティデータの管理を行うことができる。
【発明を実施するための最良の形態】
【０００９】
以下、ＲＡＩＤシステムにおけるコントローラモジュール（ＣＭ）のバッファ容量の枯渇制御について説明する。
［１．ＲＡＩＤシステム１００］
図１は本実施例に係るＲＡＩＤシステム１００の構成図である。本実施例に係るＲＡＩＤシステム１００はＲＡＩＤ５である。本実施例に係るＲＡＩＤシステム１００は、ＲＡＩＤ５のいわゆる（３＋１）の構成である。ＲＡＩＤシステム１００は、ホストコンピュータ１０１、ＣＡ（チャネルアダプタ）１０２、ＣＭ（コントローラモジュール）１０３、ディスク１０４、１０５、１０６、１０７から構成されている。ＲＡＩＤシステム１００は、ＲＡＩＤ５であるので、各データのストライプは、３つのデータストライプと１のパリティストライプで構成されている。
【００１０】
［１．１．ホストコンピュータ１０１］
ホストコンピュータ１０１は、書き込み命令、読み出し命令をＣＡ１０２に出す。ホストコンピュータ１０１は、書き込み命令と共にディスク１０４〜１０７に書き込むデータをＣＡ１０２に送る。
【００１１】
［１．２．ＣＡ（チャネルアダプタ）１０２］
ＣＡ１０２は、ホストコンピュータ１０１とＣＭ１０３との間で通信制御を行う。ＣＡ１０２は、ホストコンピュータ１０１からＣＭ１０３への書き込み命令又は読み出し命令を処理して、ホストコンピュータ１０１とＣＭ１０３との間のデータ転送を制御する。
［１．３．ＣＭ（コントローラモジュール）１０３］
ＣＭ１０３は、ＣＡ１０２を介してホストコンピュータ１０１から受信するデータをディスク１０４〜１０７に分散して格納する。本実施例において、ＣＭ１０３は、データ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４に書き込み、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０をパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１に更新する場合を考える。
【００１２】
ＣＭ１０３はディスク１０４にデータ（Ｎｅｗ  Ｄａｔａ）１０８を書き込む場合、まずＣＭ１０３はデータ（Ｏｌｄ  Ｄａｔａ）１０９をディスク１０４から読み出す。
【００１３】
そしてＣＭ１０３は、データ（Ｏｌｄ  Ｄａｔａ）１０９に対応するパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０をディスク１０７から読み出す。パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０は、データ（Ｏｌｄ  Ｄａｔａ）１０９、及びディスク１０５、１０６に格納されておりデータ１０９に対応するデータ（図２に記載のデータ２０５、２０６）の排他的論理和である。
【００１４】
ＣＭ１０３は、データ（Ｎｅｗ  Ｄａｔａ）１０８とデータ（Ｏｌｄ  Ｄａｔａ）１０９とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０の排他的論理和をとってデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を生成する。ＣＭ１０３は、データ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４に、データ（Ｎｅｗ  Ｐａｒｉｔｙ）１０９をディスク１０７に書き込みを試みる。
【００１５】
ＣＭ１０３は、ディスク１０４にデータ（Ｎｅｗ  Ｄａｔａ）１０８を書き込み成功し、ディスク１０７にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込み失敗した場合、ディスク１０４〜１０７に格納するデータ間で整合性が取れない問題が発生する。
【００１６】
ここで図２は本実施例に係るディスク１０４〜１０７に格納するデータを示すデータテーブル２００である。データテーブル２００は、データ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４に書き込む前と書き込んだ後におけるディスク１０４〜１０７に格納しているデータを示している。データテーブル２００に示すデータは、ディスク１０４〜１０７が格納する１ストライプ分のデータである。ディスク１０４〜１０７は、データテーブル２００に示すデータ以外のデータも格納している。カラム２０１はディスク１０４に格納するデータ、カラム２０２はディスク１０５に格納するデータ、カラム２０３はディスク１０６に格納するデータ、カラム２０４はディスク１０７に格納するデータを示している。
【００１７】
ＣＭ１０３がディスク１０４、１０７にデータを書く前（Ｐｒｅ）では、ディスク１０４はデータ（Ｏｌｄ  Ｄａｔａ）１０９を、ディスク１０５はデータ（Ｏｌｄ  Ｄａｔａ）２０５を、ディスク１０６はデータ（Ｏｌｄ  Ｄａｔａ）２０６を、ディスク１０７はパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を格納している。
【００１８】
そしてＣＭ１０３がディスク１０４にデータ（Ｎｅｗ  Ｄａｔａ）１０８を書き込んだ後（Ａｆｔｅｒ）では、ディスク１０４はデータ（Ｎｅｗ  Ｄａｔａ）１０８を、ディスク１０５はデータ（Ｏｌｄ  Ｄａｔａ）２０５を、ディスク１０６はデータ（Ｏｌｄ  Ｄａｔａ）２０６を、ディスク１０７はパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を格納している。
【００１９】
本実施例においてＣＭ１０３は、ディスク１０７にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みを失敗する。そのためＣＭ１０３がディスク１０４にデータ（Ｎｅｗ  Ｄａｔａ）１０８を書き込んだ後（Ａｆｔｅｒ）において、ディスク１０４〜１０７に格納されるデータは、ディスク１０４〜１０７データ間で整合性がとれていない状態である。
【００２０】
ＣＭ１０３がディスク１０７にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を書き込み失敗した場合、ＣＭ１０３は書き込みを失敗したパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をパリティバッファに保持する。ＣＭ１０３はパリティデータ１１１をパリティバッファに保持した状態で、さらなるホストコストコンピュータ１０１からの書き込み命令などによりＣＭ１０３によるディスク１０４〜１０７へのデータ書き込みが発生すると、ＣＭ１０３のパリティバッファの容量が足りなくなる問題が発生する。
【００２１】
＜１．３．１．バッファ量の枯渇制御＞
そこで本実施例に係るＣＭ１０３は以下の処理を行い、上記問題であるＣＭ１０３が有するパリティバッファの容量枯渇を制御する。
【００２２】
ＣＭ１０３は書き込みを失敗したパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を他のディスクに書き込む。本実施例ではＣＭ１０３はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込む。ＣＭ１０３がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込みし終わったら、パリティバッファ３１２を開放する。そしてＣＭ１０３は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みを失敗したディスク１０７をＣＭ１０３から切り離す。ディスク１０７の切り離しは、ＣＭ１０３とディスク１０７の電気的な接続を遮断することである。
【００２３】
そしてディスク１０７へパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みが可能になった場合（ディスク１０７が復旧した場合）、ＣＭ１０３はｒｅｂｕｌｉｄ処理を行う。ＣＭ１０３はメモリ上にバッファを確保し、そのバッファにディスク１０４からデータ（Ｎｅｗ  Ｄａｔａ）１０８を、ディスク１０５からデータ（Ｏｌｄ  Ｄａｔａ）２０５を、ディスク１０６からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）２０６を読み出す。ＣＭ１０３はディスク１０６から読み出したパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）２０６をディスク１０７に書き込む。
【００２４】
ＣＭ１０３はデータ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の排他的論理和（ＸＯＲ）を計算してデータ（Ｏｌｄ  Ｄａｔａ）２０６を生成する。ここでデータ（Ｏｌｄ  Ｄａｔａ）２０６は、ディスク１０６に格納されていたデータであって、ＣＭ１０３がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１に上書きしたデータである。ＣＭ１０３は生成したデータ（Ｏｌｄ  Ｄａｔａ）２０６をディスク１０６に書き込む。ＣＭ１０３はバッファを開放する。
【００２５】
これによりＣＭ１０３がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込めないことに起因するバッファ容量の枯渇を防ぐことができる。
【００２６】
図３は本実施例に係るＣＭ１０３の機能ブロック図である。
【００２７】
ＣＭ１０３は、バッファ獲得部３０１、データ読み出し部３０２、パリティ生成部３０３、データ書き込み部３０４、整合判定部３０５、データ書き戻し部３０６、バッファ開放部３０７、ＲＡＩＤ制御部６０１、及びＲＡＩＤリカバリ部６０２、データ確認部９０１、及びデータ生成部９０２を有している。またＣＭ１０３はハード構成として、ＣＰＵ３０８、キャッシュ３０９、メモリ３１０から構成されている。ＣＰＵ３０８が、バッファ獲得部３０１、データ読み出し部３０２、パリティ生成部３０３、データ書き込み部３０４、整合判定部３０５、データ書き戻し部３０６、バッファ開放部３０７、ＲＡＩＤ制御部６０１、及びＲＡＩＤリカバリ部６０２、データ確認部９０１、及びデータ生成部９０２を実行する。ＣＰＵ３０８はＣＭ１０３がこれら機能を実行して、キャッシュ３０９、メモリ３１０へのデータ、そのデータに対応するパリティデータを書き込み／読み出し制御を行う。以下、ＣＭ１０３が有する各機能について説明する。
【００２８】
［２．１．バッファ獲得部３０１］
ＣＰＵ３０８がバッファ獲得部３０１を実行し、メモリ３１０上でデータバッファ３１１、パリティバッファ３１２の獲得処理を行う。ホストコンピュータ１０１からスモールライト（Ｓｍａｌｌ Ｗｒｉｔｅ）のデータ書き込み命令があると、バッファ獲得部３０１は、データ（Ｏｌｄ  Ｄａｔａ）１０９とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を読み出すためのデータバッファ３１１、パリティバッファ３１２をメモリ３１０上に確保する。より具体的にはバッファ獲得部３０１は、メモリ３１０の一定のアドレス範囲にデータ（Ｏｌｄ  Ｄａｔａ）１０９とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を格納できる領域を割り当てる処理を行う。
【００２９】
そしてバッファ獲得部３１０がメモリ３１０上に獲得するデータバッファ３１１の容量は、データ（Ｏｌｄ  Ｄａｔａ）１０９を格納できる最小限の容量であり、データ（Ｏｌｄ  Ｄａｔａ）１０９と同じ大きさ若しくはそれに順ずる程度の容量である。同様にバッファ獲得部３１０がメモリ３１０上に獲得するパリティバッファ３１２の容量は、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を格納できる最小限の容量であり、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０と同じ大きさ若しくはそれに順ずる程度の容量である。これはデータバッファ３１１、パリティバッファ３１２の容量枯渇の原因となるエラーの発生確率が低いことによる。換言すれば、データバッファ３１１、パリティバッファ３１２の容量は、エラーの発生確率とデータ書き込み処理に必要なメモリ容量を考慮した容量である。そのため、バッファ獲得部３１０は、予め定められたエラーの発生確率とデータ書き込み処理に必要なメモリ容量に応じて、データバッファ３１１及びパリティバッファ３１２を確保する。
【００３０】
またスモールライト（Ｓｍａｌｌ  Ｗｒｉｔｅ）は、ＲＡＩＤシステム１００における書き込み範囲が１ストライプの半分以下のブロック（０ｘＣ０ ｂｌｏｃｋ以下）の書き込み処理である。
【００３１】
［２．２．データ読み出し部３０２］
ＣＰＵ３０８がデータ読み出し部３０２を実行し、データバッファ３１１にデータ（Ｏｌｄ  Ｄａｔａ）１０９、パリティバッファ３１２にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を読み出す処理を行う。バッファ獲得部３０１がデータバッファ３１１、パリティバッファ３１２をメモリ３１０上に獲得した後、データ読み出し部３０２は、データバッファ３１１にデータ（Ｏｌｄ  Ｄａｔａ）１０９、パリティバッファ３１２にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を読み出す。データ読み出し部３０２は、データバッファ３１１にデータ（Ｏｌｄ  Ｄａｔａ）１０９、パリティバッファ３１２にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を格納する。
【００３２】
［２．３．パリティ生成部３０３］
ＣＰＵ３０８がパリティ生成部３０３を実行し、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を生成する。まずパリティ生成部３０３は、データバッファ３１１のデータ（Ｏｌｄ  Ｄａｔａ）１０９とパリティバッファ３１２のパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０の排他的論理和（ＸＯＲ）を計算して中間結果を算出する。パリティ生成部３０３は、この中間結果を一時的に、パリティバッファ３１２に格納し、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０をパリティバッファ３１２から削除する。そしてパリティ生成部３０３は中間結果とキャッシュ３０９のデータ（Ｎｅｗ  Ｄａｔａ）１０８との排他的論理和（ＸＯＲ）を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を生成する。パリティ生成部３０３はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をパリティバッファ３１２に格納し、中間結果をパリティバッファ３１２から削除する。
【００３３】
［２．４．データ書き込み部３０４］
ＣＰＵ３０８がデータ書き込み部３０４を実行し、ディスク１０４にデータ（Ｎｅｗ  Ｄａｔａ）１０８を、ディスク１０７にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込む処理を試みる。正常にデータ書き込み処理部３０４が書き込み処理を実行できれば、データ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込むことができる。
【００３４】
しかしながら、ディスクへのタイミングの不一致、ディスク１０７へのゴミの混入などの原因により、データ書き込み部３０４はデータ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４に書き込むことができるが、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込むことができない場合が発生する。この場合パリティバッファ３１２はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）を保持したままとなる。そのため新たにホストコンピュータ１０１からディスク１０４〜１０７へのデータ書き込み命令があると、パリティバッファ３１２の容量が不足するといった問題は生じる。そこで本実施例におけるＲＡＩＤシステム１００では、ディスク１０７へ書き込み失敗したパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に一時的に書き込む。そしてＲＡＩＤシステム１００はパリティバッファ３１２を開放する。具体的にはデータ書き込み部３０４が以下の処理を行って、ディスク１０６にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込む。
【００３５】
データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込み失敗した場合、データ書き込み部３０４はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込む。より具体的にはデータ書き込み部３０４は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を、ディスク１０６におけるパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１に対応したデータ（Ｏｌｄ  Ｄａｔａ）２０６のアドレス範囲に書き込む。これはデータ書き込み部３０４がディスク１０６のデータ２０６をパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１に上書きすることである。そのためＲＡＩＤシステム１００は、ディスク１０６に格納されていたデータ２０６を失う。ＣＭ１０３は、再びパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込むと、ディスク１０４に格納されるデータ（Ｎｅｗ  Ｄａｔａ）１０８、ディスク１０５に格納されるデータ（Ｏｌｄ  Ｄａｔａ）２０５、ディスク１０６に格納されるパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１からデータ（Ｏｌｄ）２０６を作成する。そのためディスク１０６におけるデータ（Ｏｌｄ  Ｄａｔａ）２０６のアドレス範囲にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込むことによって、ＣＭ１０３はＲＡＩＤシステム１００に格納するデータ全体の復元をできる。
【００３６】
パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込めたか否かは、整合判定部３０５が行う処理によって判定される。
【００３７】
またＲＡＩＤシステム１００がホットスワップ（ＨＳ）機能を有している場合には、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）をそのホットスワップのディスクに書き込んでもよい。ホットスワップ機能は、ＲＡＩＤシステム１００が通電された状態のままディスク１０７を取り外し、代替ディスク（予備ディスク）に切り替える機能である。
【００３８】
またデータ書き込み部３０４は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込みをリトライする場合、バッファに保持するデータの中からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を特定する。具体的にはデータ書き込み部３０４はデータの中にあるパリティビットを参照して、そのデータがパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１であるか否かを判別する。そしてデータ書き込み部３０４は、特定したパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に再び書き込む。
【００３９】
［２．５．整合判定部３０５］
ＣＰＵ３０８が整合判定部３０５を実行し、ディスク１０７に格納されるパリティデータを読み出して、パリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータとを比較する。パリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータとを比較した結果、整合判定部３０５がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータが一致しないと判定する場合、データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込むことができなかったと判定する。またパリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータとを比較した結果、整合判定部３０５がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータが一致すると判定する場合、データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込むことができたと判定する。
【００４０】
［２．６．データ書き戻し部３０６］
ＣＰＵ３０８がデータ書き戻し部３０６を実行し、データ（Ｏｌｄ  Ｄａｔａ）１０９をデータバッファ３１１に書き戻す。データ書き込み部３０６がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７へ書き込み失敗した場合に、データ書き戻し部３０６はデータ（Ｏｌｄ  Ｄａｔａ）１０９をデータバッファ３１１に書き戻す。
【００４１】
［２．７．メモリ開放部３０７］
ＣＰＵ３０８がメモリ開放部３０７を実行し、パリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を削除する。
【００４２】
データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込むと、メモリ開放部３０７はパリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を削除する。またメモリ開放部３０７は、キャッシュ３０９に格納するデータ（Ｎｅｗ  Ｄａｔａ）１０８を削除する。これはＲＡＩＤシステム１００が、ディスク１０４にデータ（Ｎｅｗ  Ｄａｔａ）１０８を、ディスク１０５にデータ２０５を、ディスク１０６にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を格納しているためである。つまりＲＡＩＤシステム１００は、これらデータ（Ｎｅｗ  Ｄａｔａ）１０８、データ２０５、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１からデータ２０６を作成できるので、パリティバッファ３１２にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を保持しておく必要はなく、またキャッシュ３０９にデータ（Ｎｅｗ  Ｄａｔａ）１０８を保持しておく必要はない。
【００４３】
なお本実施例において「データバッファ３１１、パリティバッファ３１２、キャッシュ３０９を開放する」は、データバッファ３１１、パリティバッファ３１２、キャッシュ３０９に格納されるデータを削除することを意味し、メモリ３１０、キャッシュ３０９を他のデータを保持して使用できるようにすることを意味する。
【００４４】
［２．８．ＲＡＩＤ制御部６０１］
ＣＰＵ３０８がＲＡＩＤ制御部６０１を実行し、ＲＡＩＤリカバリ部６０２に対して、ディスク１０７の切り離しを依頼する。
【００４５】
メモリ開放部３０７がパリティバッファ３１２、キャッシュ３０９を開放すると、ＲＡＩＤ制御部６０１はＲＡＩＤリカバリ部６０２に対して、ディスク１０７の切り離しを依頼する。
【００４６】
またＲＡＩＤ制御部６０１が、ＲＡＩＤリカバリ部６０２からｒｅｂｕｉｌｄ処理の依頼を受信すると、ＲＡＩＤ制御部６０１はバッファ獲得部３０１にバッファの確保を指示してｒｅｂｕｉｌｄ処理を開始する。
【００４７】
［２．９．ＲＡＩＤリカバリ部６０２］
ＣＰＵ３０８がＲＡＩＤリカバリ部６０２を実行し、ディスク１０７をＲＡＩＤシステム１００から切り離す。
【００４８】
ＲＡＩＤリカバリ部６０２は、ＲＡＩＤ制御部６０１の依頼に応じて、ディスク１０７をＲＡＩＤシステム１００から切り離す。ディスク１０７の切り離し処理は、ＣＭ１０７とディスク１０７との電気的接続を遮断することである。そしてＲＡＩＤリカバリ部６０２は、ＲＡＩＤシステム１００のＲＡＩＤステータス（ＲＡＩＤ  ＳＴＡＴＵＳ）を「ａｖａｉｌａｂｌｅ」から「ｅｘｐｏｓｅｄ」に変更する。ＲＡＩＤリカバリ部６０２は、ＲＡＩＤシステム１００からディスク１０７を切り離しているか否かを管理する。ディスク１０７が切り離されているＲＡＩＤシステム１００はｅｘｐｏｓｅｄ状態である。またｅｘｐｏｓｅｄ状態は、ＲＡＩＤシステム１００が冗長構成のない状態のことである。ａｖａｉｌａｂｌｅ状態は、ＲＡＩＤシステム１００が冗長構成になっている状態である。
【００４９】
さらにＲＡＩＤリカバリ部６０２は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みを管理しており、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込んだディスク（本実施例ではディスク１０６）の情報（フラグ）を保持している。つまりＲＡＩＤリカバリ部６０２は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込んだディスクがディスク１０６であることを示す情報を保持しておく。
【００５０】
またパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みに失敗したディスク１０７が復旧すると、ＲＡＩＤリカバリ部６０２は、ＲＡＩＤ制御部６０１にｒｅｂｕｉｌｄ処理を依頼する。ｒｅｂｕｉｌｄ処理は、ＲＡＩＤシステム１００における冗長構成でない状態（ｅｘｐｏｓｅｄ状態）から冗長構成の状態（ａｖａｉｌａｂｌｅ状態）に復旧する処理である。
【００５１】
［２．１０．データ確認部９０１］
ＣＰＵ３０８がデータ確認部９０１を実行し、ＢＣＣ１００２を参照して、データブロック１００１の論理的な正当性を確認する。
【００５２】
［２．１１．データ生成部９０２］
ＣＰＵ３０８がデータ生成部９０２を実行し、データ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、及びパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の排他的論理和を計算して、データ（Ｏｌｄ  Ｄａｔａ）２０６を生成する。
【００５３】
［３．パリティバッファ３１２の容量の枯渇制御に関するフローチャート］
図４は本実施例に係るＣＭ１０３が処理するパリティバッファ３１２の容量枯渇の制御に関するフローチャートである。
【００５４】
ホストコンピュータ１０１からスモールライト（Ｓｍａｌｌ Ｗｒｉｔｅ）のデータ書き込み命令があると、バッファ獲得部３０１は、データ（Ｏｌｄ  Ｄａｔａ）１０９とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を読み出すためのデータバッファ３１１、パリティバッファ３１２をメモリ３１０上に確保する（ステップＳ４０１）。
【００５５】
バッファ獲得部３０１がデータバッファ３１１、パリティバッファ３１２をメモリ３１０上に獲得した後、データ読み出し部３０２は、データバッファ３１１にデータ（Ｏｌｄ  Ｄａｔａ）１０９、パリティバッファ３１２にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を読み出す（ステップＳ４０２）。データバッファ３１１はデータ（Ｏｌｄ  Ｄａｔａ）１０９を、パリティバッファ３１２はパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を保持する（ステップＳ４０３）。
【００５６】
パリティ生成部３０３は、データバッファ３１１のデータ（Ｏｌｄ  Ｄａｔａ）１０９とパリティバッファ３１２のパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０の排他的論理和（ＸＯＲ）を計算して中間結果を算出する（Ｓ４０４）。パリティ生成部３０３は、この中間結果を一時的に、パリティバッファ３１２に格納し、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０をパリティバッファ３１２から削除する（ステップＳ４０５）。そしてパリティ生成部３０３は中間結果とキャッシュ３０９に保持するデータ（Ｎｅｗ  Ｄａｔａ）１０８との排他的論理和（ＸＯＲ）を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を生成する（ステップＳ４０６）。パリティ生成部３０３はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をパリティバッファ３１２に格納し、中間結果をパリティバッファ３１２から削除する（ステップＳ４０７）。
【００５７】
そしてデータ書き込み部３０４は、データ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込みトライし、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みができたか否かを判別する（ステップＳ４０８）。整合判定部３０５は、ディスク１０７に格納されるパリティデータを読み出す。そして整合判定部３０５は、パリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータとを比較する。パリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータとを比較した結果、整合判定部３０５がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータが一致しないと判定する場合、データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込むことができなかったと判定する（ステップＳ４０８  ＮＯ）。またパリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータとを比較した結果、整合判定部３０５がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１とディスク１０７に格納するパリティデータが一致すると判定する場合、データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込むことができたと判定する（ステップＳ４０８  ＹＥＳ）。
【００５８】
データ書き込み部３０４がデータ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込むことができたと判別する場合（ステップＳ４０８  ＹＥＳ）、バッファ開放部３０７は、パリティバッファ３１２に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１、及びデータバッファ３１１に格納するデータ（Ｏｌｄ  Ｄａｔａ）１０９を削除する（ステップＳ４１５）。ＣＭ１０３はデータの書き込み処理を終了する。データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込むことができなかったと判別する場合（ステップＳ４０８  ＮＯ）、パリティバッファ３１２はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を保持したままとする（ステップＳ４０９）。
【００５９】
そしてデータ書き込み部３０４は、データ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込む（ステップＳ４１０）。より具体的にはデータ書き込み部３０４は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を、ディスク１０６においてパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１に対応したデータ（Ｏｌｄ  Ｄａｔａ）２０６が書き込まれているアドレス範囲に書き込む。これはデータ書き込み部３０４がディスク１０６のデータ２０６をパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１に上書きすることである。ここでデータ書き込み部３０４は、データ（Ｏｌｄ  Ｄａｔａ）２０６のブロックＩＤを参照することによって、データ（Ｏｌｄ  Ｄａｔａ）２０６を特定し、データ（Ｏｌｄ  Ｄａｔａ）２０６のアドレス範囲にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込む。またデータ書き込み部３０４はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１のブロックＩＤ１００４（図１０参照。）に、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込んだアドレス範囲（データ（Ｏｌｄ  Ｄａｔａ）２０６が書き込まれていたアドレス範囲）を示す識別情報を書く。
【００６０】
そしてメモリ開放部３０７はパリティバッファ３１２からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を削除する（ステップＳ４１１）。さらにメモリ開放部３０７はキャッシュ３０９からデータ（Ｎｅｗ  Ｄａｔａ）１０８を削除する（ステップＳ４１２）。パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１はディスク１０６に格納されており、データ（Ｎｅｗ  Ｄａｔａ）１０８はディスク１０４に格納されているため、ディスク１０４〜１０６でデータの整合性が取れており、ＲＡＩＤシステム１００がデータ（Ｏｌｄ  Ｄａｔａ）２０６を復元できる状態になっているためである。そしてディスク１０７にはパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０が格納されており、ディスク１０４〜１０６のデータを整合性がないデータが格納されているため、ＣＭ１０３はディスク１０７を切り離す。
【００６１】
ＲＡＩＤ制御部６０１はＲＡＩＤリカバリ部６０２に対して、ディスク１０７の切り離し（電気的接続の遮断）を依頼する。ＲＡＩＤリカバリ部６０２は、ＲＡＩＤ制御部６０１の依頼に応じて、ディスク１０７をＲＡＩＤシステム１００から切り離す（ステップＳ４１３）。ＲＡＩＤリカバリ部６０２は、ＲＡＩＤシステム１００のＲＡＩＤステータス（ＲＡＩＤ  ＳＴＡＴＵＳ）を「ａｖａｉｌａｂｌｅ」から「ｅｘｐｏｓｅｄ」に変更する（ステップＳ４１４）。
【００６２】
上記図４のフローチャートに示すバッファ容量の枯渇制御を図解すると図５、６のように表すことができる。図５はＣＭ１０３におけるパリティデータ（Ｎｅｗ  Ｄａｔａ）１１１のディスク１０６への書き込みを示す図である。また図６はＣＭ１０３におけるディスク１０７の切り離しを示す図である。
【００６３】
ＣＭ１０３のバッファ獲得部３０１がデータバッファ３１１、パリティバッファ３１２をメモリ３１０上に確保する。続いてＣＭ１０３のデータ読み出し部３０２がデータバッファ３１１にデータ（Ｏｌｄ  Ｄａｔａ）１０９、パリティバッファ３１２にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を読み出す。ＣＭ１０３のデータ読み出し部３０２は、データバッファ３１１にデータ（Ｏｌｄ  Ｄａｔａ）１０９、パリティバッファ３１２にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０を保持する。パリティ生成部３０３は、データ（Ｏｌｄ  Ｄａｔａ）１０９、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０、及びデータ（Ｎｅｗ  Ｄａｔａ）１０８との排他的論理和（ＸＯＲ）を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を生成する。パリティ生成部３０３はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をパリティバッファ３１２に格納する。そしてデータ書き込み部３０４は、データ（Ｎｅｗ  Ｄａｔａ）１０８をディスク１０４、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込みトライする。
【００６４】
データ書き込み部３０４がデータパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込むことができなかった場合、パリティバッファ３１２はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を保持したままとする。そしてデータ書き込み部３０４は、データ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０７に書き込む。メモリ開放部３０７はパリティバッファ３１２からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を削除する。さらにメモリ開放部３０７はキャッシュ３０９からデータ（Ｎｅｗ  Ｄａｔａ）１０８を削除する。
【００６５】
ＲＡＩＤリカバリ部６０２は、ディスク１０７をＲＡＩＤシステム１００から切り離し、ＲＡＩＤシステム１００のＲＡＩＤステータス（ＲＡＩＤ  ＳＴＡＴＵＳ）を「ａｖａｉｌａｂｌｅ」から「ｅｘｐｏｓｅｄ」に変更する。
【００６６】
次にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みエラーから復旧にするために、ＣＭ１０３が実行する処理について説明する。
【００６７】
［４．ｒｅｂｕｉｌｄ処理に関するフローチャート］
図７は本実施例に係るｒｅｂｕｉｌｄ処理に関するフローチャートである。また図８及び９は本実施例に係るｒｅｂｕｉｌｄ処理に関する模式図である。
【００６８】
データ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）をディスク１０６に書き込むと、ＲＡＩＤリカバリ部６０２はディスク１０７をＲＡＩＤシステム１００から切り離してＲＡＩＤステータス（ＲＡＩＤ  ＳＴＡＴＵＳ）をＥｘｐｏｓｅｄ状態にしている（図４に記載のステップＳ４１３、Ｓ４１４の状態である）。
【００６９】
そしてパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みに失敗したディスク１０７が復旧すると、ＣＭ１０７は以下の処理を行う。
【００７０】
図８に示すように、ＲＡＩＤリカバリ部６０２はＲＡＩＤ制御部６０１にｒｅｂｕｉｌｄ処理を依頼する。ｒｅｂｕｉｌｄ処理は、ＲＡＩＤシステム１００における冗長構成でない状態（ｅｘｐｏｓｅｄ状態）から冗長構成の状態（ａｖａｉｌａｂｌｅ状態）に復旧する処理である。そしてＲＡＩＤ制御部６０１は、バッファ獲得部３０１にバッファの確保を指示してｒｅｂｕｉｌｄ処理を開始する。
【００７１】
バッファ獲得部３０１はデータバッファ３１１、パリティバッファ３１２をメモリ３１０上に確保する（ステップＳ７０１）。そしてデータ読み出し部３０２はデータ（Ｎｅｗ  Ｄａｔａ）１０８とデータ（Ｏｌｄ  Ｄａｔａ）２０５をデータバッファ３１１に読み出し、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をパリティバッファ３１２に読み出す（ステップＳ７０２）。
【００７２】
図１０は本実施例に係るパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の構成図である。
【００７３】
本実施例におけるデータ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）１０９、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１１０のデータ構成も以下に示すパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１と同様の構成である。
【００７４】
パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１は５１２バイトのデータブロック（Ｄａｔａ  Ｂｌｏｃｋ）１００１と８バイトのＢＣＣ（Ｂｌｏｃｋ  Ｃｈｅｃｋ  Ｃｏｄｅ）１００２から構成されている。データブロック１００１は、データ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、及びデータ（Ｏｌｄ  Ｄａｔａ）２０６におけるユーザデータ部分の排他的論理和をとった値である。ＢＣＣ１００２は、ＣＭ１０３がデータブロック１００１の論理的な正当性を確認するのに用いる情報である。本実施例ではデータ確認部９０１が、ＢＣＣ１００２を参照して、データブロック１００１の論理的な正当性を確認する。データブロック１００１の論理的な正当性とは、データブロック１００１の破損の有無、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１のディスクにおける論理的なデータ位置があっているか否かである。
【００７５】
さらにＢＣＣ１００２は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の異常を検出するための冗長コードである２バイトのブロックＣＲＣ（Ｂｌｏｃｋ  ＣＲＣ）１００３とデータブロック１００１の論理的なデータ位置をチェックするための位置情報である６バイトのブロックＩＤ（Ｂｌｏｃｋ  ＩＤ）１００４から構成されている。
【００７６】
ブロックＩＤ１００４は１ビットのＢａｄフラグ（Ｂａｄ  Ｆｌａｇ）１００６、１ビットのパリティビット（ｐａｒｉｔｙ  ｂｉｔ）１００７、６ビットのＳＬＵ番号１００８、８ビットのディスク書き込み抜け検出用カウンタ１００９、３２ビットのカウンタ１０１０から構成されている。そしてブロックＩＤ１００４は、ディスク１０６のどのブロックにパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を記載したか否かを示す情報である。これによりＣＭ１０３のデータ書き込み部３０４がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１をディスク１０６に書き込んでも、データ読み出し部３０２はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を読み出すディスク１０６のブロックを特定することができ、パリティバッファ３１２に読み出すことができる。
【００７７】
Ｂａｄフラグ１００６は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１がエラーを含む（データが破損している）ことを示すフラグである。
【００７８】
パリティビット１００７は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１がパリティデータであることを示す情報であり、「１」となっている。またパリティビット１００７が「０」である場合には、そのデータがパリティデータではないことを示す。つまりパリティビット（パリティビット１００７及び他のデータに含まれるパリティビット）は、データがパリティデータであるか否かを示す情報である。ＳＬＵ番号１００８は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１が存在する論理ユニットの識別番号を示すものである。
【００７９】
ＳＬＵ番号１００８は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の存在有無の関係無しに、論理ユニットの識別番号を示すものである。
【００８０】
またディスク書き込み抜け検出用カウンタ１００９は、ディスクへの書き込み抜けを検知するためのカウンタである。カウンタ１０１０は、データブロックの位置情報（Ｂｌｏｃｋ  ＩＤ）のうち、論理ユニット内の各ブロックで異なる値をとるフィールド、そのデータブロックが論理ボリューム内の所定のブロックアドレスのデータであることをチェックするための情報である。
【００８１】
そしてデータ書き込み部３０４は、データバッファ３１１、パリティバッファ３１２に保持するデータ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の中からどのデータがパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１であるか否かを判別する（ステップＳ７０３）。これはそれぞれのデータ（データ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、及びパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１）が有するパリティビットを参照して判別する。パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１のパリティビット１００７は「１」であり、（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５のパリティビットは「０」であるため、データ書き込み部３０４はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を特定することができる。またＣＭ１０３はキャッシュ３０９、メモリ３１０とは異なる記憶部（図示せず。以下、他の記憶部と呼ぶ。）にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を本来書き込むディスクが１０７であることを示す情報を保持している。つまりＣＭ１０３は他の記憶部にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を格納すべきディスクがディスク１０７であることを示す情報を保持している。
【００８２】
データ書き込み部３０４がデータのパリティビットを参照して、そのデータがパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１でないと判別する場合（ステップＳ７０３  ＮＯ）、データ書き込み部３０４は次のデータのパリティビットを参照して、そのデータがパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１であるか否かを判別する（ステップＳ７０３）。
【００８３】
データ書き込み部３０４がデータのパリティビットを参照して、そのデータがパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１であると判別する場合（ステップＳ７０３  ＹＥＳ）、データ書き込み部３０４はディスク１０７にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を再び書き込む（ステップＳ７０４）。データ書き込み部３０４はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込む際に、他の記憶部に保持する情報を参照し、その情報からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を格納すべきディスクがディスク１０７であることを特定して、ディスク１０７にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を書き込む。
【００８４】
そしてデータ生成部９０２は、データ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、及びパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の排他的論理和を計算して、データ（Ｏｌｄ  Ｄａｔａ）２０６を生成し、データバッファ３１１に保持する（ステップＳ７０５）。そしてデータ書き戻し部３０６は生成したデータ（Ｏｌｄ  Ｄａｔａ）２０６をディスク１０６に書き込む（ステップＳ７０６）。そしてメモリ開放部２０７は、データバッファ３１１からデータ（Ｎｅｗ  Ｄａｔａ）１０８、データ（Ｏｌｄ  Ｄａｔａ）２０５、２０６を削除する。またメモリ開放部２０７はパリティバッファ３１２からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１を削除する（ステップＳ７０７）。
【００８５】
ＲＡＩＤリカバリ部６０２は、ＲＡＩＤシステム１００のＲＡＩＤステータス（ＲＡＩＤ  ＳＴＡＴＵＳ）を「ｅｘｐｏｓｅｄ」から「ａｖａｉｌａｂｌｅ」に変更する（ステップＳ７０８）。ＲＡＩＤリカバリ部６０２がＲＡＩＤステータスを「ａｖａｉｌａｂｌｅ状態」に変更することによって、ＲＡＩＤシステム１００はシステムが冗長構成を持つ状態に復旧したことを特定する。
【００８６】
またＲＡＩＤシステム１００がホットスワップ機能（図示せず。）を有する場合には、ＲＡＩＤリカバリ部６０２が以下の判別処理を行う。ＲＡＩＤリカバリ部６０２は、ホットスワップの予備ディスク（図示せず。）が存在するか否かを判別する。そしてＲＡＩＤリカバリ部６０２が、ＲＡＩＤシステム１００に予備ディスクがあると判別する場合、ＲＡＩＤリカバリ部６０２は予備のディスクが未使用であるか否かを判別する。そしてＲＡＩＤリカバリ部６０２が予備のディスクが未使用であると判別する場合には、ＲＡＩＤリカバリ部６０２はＲＡＩＤ制御部６０１にｒｅｂｕｉｌｄ処理を依頼する。そしてＲＡＩＤ制御部６０１は、バッファ獲得部３０１にバッファの確保を指示してｒｅｂｕｉｌｄ処理を開始し、ＣＭ１０３は図７に示すｒｅｂｕｉｌｄ処理を開始してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の再書き込みを行う。
（実施例２）
次に本実施例に係るＣＭ１１００を搭載したＲＡＩＤシステムについて説明する。ＲＡＩＤシステムの構成は図１に示すＲＡＩＤシステム１００と同様の構成であり、ＣＭ１０３をＣＭ１１００に置換した構成である。図１１は本実施例に係るＣＭ１１００の機能ブロック図である。
【００８７】
［５．ＣＭ１１００］
ＣＭ１１００は、ＣＰＵ１１０１、キャッシュ１１０２、及びメモリ１１０３から構成される。そしてＣＰＵ１１０１は、バッファ獲得部１１０４、データ読み出し部１１０５、パリティ生成部１１０６、データ書き込み部１１０７、整合判定部１１０８、データ書き戻し部１１０９、バッファ開放部１１１０、ＲＡＩＤ制御部１１１１、ＲＡＩＤリカバリ部１１１２、データ確認部１１１３、データ生成部１１１４、ストライプチェック部１１１５、パリティビットチェック部１１１６、及びエラー検索部１１１７を実行し、ＲＡＩＤシステムを制御する。またＣＭ１１００は、メモリ１１０３上にデータバッファ１１１８、パリティバッファ１１１９、エラーバッファ１１２０を設けて、ＲＡＩＤシステムのデータ転送制御を行う。キャッシュ１１０２は、ホストコンピュータから書き込み命令のあったデータ、又はホストコンピュータから読み出し命令のあったデータを一時的に保持する。ＣＭ１１００は、キャッシュ１１０２にデータを書き込んだ段階で、ホストコンピュータに完了応答する。ＣＭ１１００はキャッシュ１１０２を有することによって、ホストコンピュータの動作とは非同期にキャッシュ１１０２上のデータをディスク１１２０１〜１２０４に書き込むいわゆるライトバック動作を行うことができ、高速にデータ処理をすることができる。
［５．１．バッファ獲得部１１０４］
ＣＰＵ１１０１がバッファ獲得部１１０４を実行し、メモリ１１０３上でデータバッファ１１１８、パリティバッファ１１１９の獲得処理を行う。ホストコンピュータからスモールライト（Ｓｍａｌｌ Ｗｒｉｔｅ）のデータ書き込み命令があると、バッファ獲得部１１０４は、データ（Ｏｌｄ  Ｄａｔａ）１２０６とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出すためのデータバッファ１１１８、パリティバッファ１１１９をメモリ１１０３上に確保する。より具体的にはバッファ獲得部１１０４は、メモリ１１０３の一定のアドレス範囲にデータ（Ｏｌｄ  Ｄａｔａ）１２０６とパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を格納できる領域を割り当てる処理を行う。
そしてバッファ獲得部１１０４がメモリ１１０３上に獲得するデータバッファ１１１８の容量は、データ（Ｏｌｄ  Ｄａｔａ）１２０６を格納できる最小限の容量であり、データ（Ｏｌｄ  Ｄａｔａ）１２０６と同じ大きさ若しくはそれに順ずる程度の容量である。同様にバッファ獲得部１１０４がメモリ１１０３上に獲得するパリティバッファ１１１９の容量は、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を格納できる最小限の容量であり、パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７と同じ大きさ若しくはそれに順ずる程度の容量である。これはデータバッファ１１１８、パリティバッファ１１１９の容量枯渇の原因となるエラーの発生確率が低いことによる。
［５．２．データ読み出し部１１０５］
ＣＰＵ１１０１がデータ読み出し部１１０５を実行し、データバッファ１１１８にデータ（Ｏｌｄ  Ｄａｔａ）１２０６、パリティバッファ１１１９にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出す処理を行う。バッファ獲得部１１０４がデータバッファ１１１８、パリティバッファ１１１９をメモリ１１０３上に獲得した後、データ読み出し部１１０５は、データバッファ１１１８にデータ（Ｏｌｄ  Ｄａｔａ）１２０６、パリティバッファ１１１９にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出す。データ読み出し部１１０５は、データバッファ１１１８にデータ（Ｏｌｄ  Ｄａｔａ）１２０６、パリティバッファ１１１９にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を格納する。
［５．３．パリティ生成部１１０６］
ＣＰＵ１１０１がパリティ生成部１１０６を実行し、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する。パリティ生成部１１０６は、データバッファ１１１８のデータ（Ｏｌｄ  Ｄａｔａ）１２０６とパリティバッファ１１１９のパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７、キャッシュ１１０２のデータ（Ｎｅｗ  Ｄａｔａ）１２０５との排他的論理和（ＸＯＲ）を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する。
［５．４．データ書き込み部１１０７］
ＣＰＵ１１０１がデータ書き込み部１１０７を実行し、ディスク１２０１にデータ（Ｎｅｗ  Ｄａｔａ）１２０５を、ディスク１２０４にパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込む処理を試みる。正常にデータ書き込み処理部１１０７が書き込み処理を実行できれば、データ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができる。
【００８８】
しかしながら、ディスクへのタイミングの不一致、ディスク１０７へのゴミの混入などの原因により、データ書き込み部１１０７はデータ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１に書き込むことができるが、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができない場合が発生する。
【００８９】
本実施例に係るＣＭ１１００は、ディスク１２０４へ書き込み失敗したパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をパリティバッファ１１１９から開放し、パリティバッファ１１１９を開放するため以下の処理を行う。
【００９０】
バッファ獲得部１１０４がエラーバッファ１１２０をメモリ上に獲得する。そしてデータ書き込み部１１０７はエラーバッファ１１２０に書き込みエラーしたストライプ番号（ｓｔｒｉｐｅ＿ｎｏ）１２０９、ディスク番号（Ｄｉｓｋ＿ｎｏ）１２１０、パリティビット（ｐａｒｉｔｙ＿ｂｉｔ）１２１１を書き込む。ストライプ番号１２０９、ディスク番号１２１０、パリティビット１２１１は、ディスク１２０１〜１２０４においてストライプを構成する複数のデータを読み出すためのトリガー情報である。ストライプ番号１２０９は、データ書き込み部１１０７が書き込みエラーしたパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８の属するストライプの番号である。ディスク番号１２１０は、データ書き込む部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込みエラーしたディスク１２０４を識別する番号である。またパリティビット１２１１は、パリティ生成部１１０６が新たにパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する必要があるか否かを示す情報である。データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込みエラーした場合には、パリティビットを「０」とする。
［５．５．整合判定部１１０８］
ＣＰＵ１１０１が整合判定部１１０８を実行し、ディスク１２０４に格納されるパリティデータを読み出して、パリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータとを比較する。パリティバッファ１２０８に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータとを比較した結果、整合判定部１１０８がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータが一致しないと判定する場合、データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができなかったと判定する。またパリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータとを比較した結果、整合判定部１１０８がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータが一致すると判定する場合、データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができたと判定する。
［５．６．データ書き戻し部１１０９］
ＣＰＵ１１０１がデータ書き戻し部１１０９を実行し、ディスク１２０１〜１２０４からデータ、パリティデータをデータバッファ、パリティバッファ、またはキャッシュ１１０２に書き戻す。
［５．７．バッファ開放部１１１０］
ＣＰＵ１１０１がバッファ開放部１１１０を実行し、パリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を削除する。
【００９１】
またバッファ開放部１１１０は、データバッファ１１１８に格納するデータ（Ｏｌｄ  Ｄａｔａ）１２０６を削除する。またバッファ開放部１１１０は、キャッシュ１１０２に格納するデータ（Ｎｅｗ  Ｄａｔａ）１２０５を削除する。
【００９２】
またバッファ開放部１１１０は、エラーしたストライプが復旧した場合にはエラーバッファ１１２０を開放する。
【００９３】
なお本実施例において「データバッファ１１１８、パリティバッファ１１１９、エラーバッファ１１２０、及びキャッシュ１１０２を開放する」は、データバッファ１１１８、パリティバッファ１１１９、キャッシュ１１０２に格納されるデータを削除することを意味し、メモリ１１０３、キャッシュ１１０２を他のデータを保持して使用できるようにすることを意味する。
［５．８．ＲＡＩＤ制御部１１１１］
ＲＡＩＤ制御部１１１１は、ＲＡＩＤリカバリ部１１１２からｒｅｂｕｉｌｄ処理の依頼を受信すると、ＲＡＩＤ制御部１１１１はバッファ獲得部１１０４にバッファの確保を指示してｒｅｂｕｉｌｄ処理を開始する。
［５．９．ＲＡＩＤリカバリ部１１１２］
パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の書き込みに失敗したディスク１０７が復旧すると、ＣＰＵ１１０１がＲＡＩＤリカバリ部１１１２を実行し、ＲＡＩＤリカバリ部１１１２はＲＡＩＤ制御部１１１１にｒｅｂｕｉｌｄ処理を依頼する。ｒｅｂｕｉｌｄ処理は、ＲＡＩＤシステムにおける冗長構成でない状態（ｅｘｐｏｓｅｄ状態）から冗長構成の状態（ａｖａｉｌａｂｌｅ状態）に復旧する処理である。
［５．１０．データ確認部１１１３］
ＣＰＵ１１００がデータ確認部１１１３を実行し、ＢＣＣを参照して、データブロックの論理的な正当性を確認する。
［５．１１．データ生成部１１１４］
ＣＰＵ１１０１がデータ生成部１１１４を実行し、データ（Ｎｅｗ  Ｄａｔａ）１２０６、データ（Ｏｌｄ  Ｄａｔａ）１３０２、１３０３の排他的論理和を計算して、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する。データ生成部１１１４は、ＲＡＩＤ制御部１１１１が実行する復旧処理（ｒｅｂｕｉｌｄ処理）に基づいて、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する。
［５．１２．ストライプチェック部１１１５］
ＣＰＵ１１０１がストライプチェック部１１１５を実行し、ホストコンピュータから新たに書き込み命令又は読み出し命令のあったデータのストライプ番号をチェックする。具体的にはストライプチェック部１１１５は、エラーバッファ１１２０に格納するストライプ番号１２０９とホストコンピュータから新たに書き込み命令又は読み出し命令のあったデータのストライプ番号を比較して、一致するか否かを判別する。メモリ１１０３上にエラーバッファ１１２０がない場合、またストライプチェック部１１１５がエラーバッファ１１２０にストライプ番号１２０９がないと判別する場合には、ホストコンピュータから新たに書き込み命令又は読み出し命令のあったデータのストライプ番号をチェックしない。
【００９４】
換言すれば、データ書き込み部１１０７がデータ（Ｎｅｗ  Ｄａｔａ）１２０５又はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８の書き込みを失敗した後に、新たにデータ書き込み部１１０７がデータ（Ｎｅｗ  Ｄａｔａ）１３０１をディスク１２０２に書き込む場合に、ストライプチェック部１１１５がデータ（Ｎｅｗ  Ｄａｔａ）１３０１を書き込むストライプをチェックする。
［５．１３．パリティビットチェック部１１１６］
ＣＰＵ１１０１がパリティビットチェック部１１１６を実行し、エラーバッファ１１２０にあるパリティビット１２１１をチェックする。
【００９５】
本実施例においてデータ書き込み部１１０７はパリティビット１２１１を、以下の場合に立てる（パリティビットを「１」とする。）。データ書き込み部１１０７がパリティビット１２１１を立てる場合は、データ書き込み部１１０７がデータ（Ｎｅｗ  Ｄａｔａ）１２０５を書き込み失敗して、データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込み成功した場合である。データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込み成功して、データ書き込み部１１０７がデータ（Ｎｅｗ  Ｄａｔａ）１２０５を書き込み成功した場合には、パリティビット１２１１を立てない（パリティビットを「０」とする。）。
【００９６】
パリティビットチェック部１１１６は、パリティビット１２１１をチェックして、ＣＭ１１００は書き込みを失敗したデータがデータ（Ｎｅｗ  Ｄａｔａ）１２０５であるかパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８であるかを判別することができる。［５．１４．エラー検索部１１１７］
ＣＰＵ１１０１がエラー検索部１１１７を実行し、ディスク１２０１〜１２０４を構成するストライプにおいてエラーがあるか否かを判別する。エラー検索部１１１７はエラーバッファ１１２０に保持するディスク番号１２１０とデータを書き込み又は読み出すディスクを示すディスク番号を比較して、データを書き込む又は読み出すストライプにエラーがあるか否かを判別する。［６．パリティバッファ１１１９の容量の枯渇制御に関するフローチャート］
図１４は本実施例に係るＣＭ１１００が処理するパリティバッファ３１２の容量枯渇の制御に関するフローチャートである。
【００９７】
ホストコンピュータからスモールライト（Ｓｍａｌｌ Ｗｒｉｔｅ）のデータ書き込み命令があると、バッファ獲得部１１０４は、データ（Ｏｌｄ  Ｄａｔａ）１２０６とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出すためのデータバッファ１１１８、パリティバッファ１１１９をメモリ１１０３上に確保する（ステップＳ１４０１）。
【００９８】
バッファ獲得部１１０４がデータバッファ１１１８、パリティバッファ１１１９をメモリ１１０３上に獲得した後、データ読み出し部１１０５は、データバッファ１１１８にデータ（Ｏｌｄ  Ｄａｔａ）１２０６、パリティバッファ１１１９にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出す。データバッファ１１１８はデータ（Ｏｌｄ  Ｄａｔａ）１２０６を、パリティバッファ１１１９はパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を保持する（ステップＳ１４０２）。
【００９９】
パリティ生成部１１０６は、データバッファ１１１８のデータ（Ｏｌｄ  Ｄａｔａ）１２０６とパリティバッファ１１１９のパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７の排他的論理和（ＸＯＲ）、及びキャッシュ１１０２に保持するデータ（Ｎｅｗ  Ｄａｔａ）１２０５との排他的論理和（ＸＯＲ）を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する（ステップＳ１４０３）。
【０１００】
そしてデータ書き込み部１１０７は、データ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込みトライする（ステップＳ１４０４）。整合判定部１１０８はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込みできたか否かを判別する（ステップＳ１４０５）。整合判定部１１０８は、ディスク１２０４に格納されるパリティデータを読み出す。そして整合判定部１１０８は、パリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータとを比較する。パリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータとを比較した結果、整合判定部１１０８がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータが一致しないと判定する場合、データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができなかったと判定する（ステップＳ１４０５  ＮＯ）。またパリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータとを比較した結果、整合判定部１１０８がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８とディスク１２０４に格納するパリティデータが一致すると判定する場合、データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができたと判定する（ステップＳ１４０５  ＹＥＳ）。
【０１０１】
データ書き込み部１１０７がデータ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができたと判別する場合（ステップＳ１４０５  ＹＥＳ）、バッファ開放部１１０４は、パリティバッファ１１１９に格納するパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８、及びデータバッファ１１１８に格納するデータ（Ｏｌｄ  Ｄａｔａ）１２０６を削除する。ＣＭ１１００はデータの書き込み処理を正常に終了する。データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込むことができなかったと判別する場合（ステップＳ１４０５  ＮＯ）、バッファ獲得部１１０４は、エラーバッファ１１２０を獲得する（ステップＳ１４０６）し、バッファ開放部１１１０はデータバッファ１１１８、パリティバッファ１１１９を開放する。
【０１０２】
そして新たにデータ書き込み部１１０７がデータ（Ｎｅｗ  Ｄａｔａ）１３０１をディスク１２０２に書き込む場合に、ストライプチェック部１１１５がデータ（Ｎｅｗ  Ｄａｔａ）１３０１を書き込むストライプがデータを書き込み失敗したストライプであるか否かを判別する（ステップＳ１４０８）。
【０１０３】
ストライプチェック部１１１５は、データ（Ｎｅｗ  Ｄａｔａ）１３０１を書き込むストライプがデータの書き込みを失敗したストライプでない場合（ステップＳ１４０８  ＮＯ）、ＣＭ１１００はパリティバッファ３１２の容量枯渇の制御処理を正常に終了する。
【０１０４】
ストライプチェック部１１１５は、データ（Ｎｅｗ  Ｄａｔａ）１３０１を書き込むストライプがデータの書き込みを失敗したストライプである場合（ステップＳ１４０８  ＹＥＳ）、パリティビットチェック部１１１６はエラーバッファ１１２０に保持するパリティビット１２１１をチェックする（ステップＳ１４０９）。
【０１０５】
パリティビットチェック部１１１６がパリティビット１２１１は「０」であると判別する場合（ステップＳ１４０９  ＮＯ）、データ書き込み部１１０７はデータ（Ｎｅｗ  Ｄａｔａ）１３０１をディスク１２０２に書き込む（ステップＳ１４１０）。
【０１０６】
パリティビットチェック部１１１６がパリティビット１２１１は「１」であると判別する場合（ステップＳ１４０９  ＹＥＳ）、ＣＭ１１００は図２２に記載のバッファ容量の枯渇制御を行う。
【０１０７】
上記図１４のフローチャートに示すバッファ容量の枯渇制御を図解すると図１２、１３のように表すことができる。図１２はＣＭ１１００におけるパリティバッファ１１１９の開放を示す図である。また図１３はＣＭ１１００におけるデータ（Ｎｅｗ  Ｄａｔａ）１３０１のディスク１２０２への書き込みを示す図である。
【０１０８】
また図１５はＣＭ１１００におけるディスク１２０２からのデータの読み出しを示す図である。
【０１０９】
データ書き込み部１１０７がパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込み失敗した場合に、ホストコンピュータから読み出し命令のあると、ストライプチェック部１１１５は読み出し命令のあったデータのストライプ番号とエラーバッファ１１２０に保持されるストライプ番号１２０９を比較する。そしてストライプ番号が一致したら、パリティビットチェック部１１１６は、エラーバッファ１１２０のパリティビット１２１１をチェックする。パリティビットが「０」である場合には、データ書き戻し部１１０９は、読み出し命令のあったデータをキャッシュ１１０６に読み出す。
［７．ｒｅｂｕｉｌｄ処理に関するフローチャート］
図１８は本実施例に係るｒｅｂｕｉｌｄ処理に関するフローチャートである。
【０１１０】
ＣＭ１１００がｒｅｂｕｉｌｄ処理を行う場合、ＲＡＩＤリカバリ部１１１２は、ＲＡＩＤ制御部１１１１にｒｅｂｕｉｌｄ処理を依頼する。
【０１１１】
ＲＡＩＤ制御部１１１１は、エラーバッファ１１２０のストライプ番号１２０９、ディスク番号１２１０を参照する（ステップＳ１８０１）。これはＣＭ１１００がどのストライプにおけるどのディスクにおいて書き込み失敗したかを検索するためである。
【０１１２】
バッファ獲得部１１０４は、データバッファ１８０１、パリティバッファ１８０２をバッファ１１０３上に獲得する（ステップＳ１８０２）。
【０１１３】
データ書き戻し部１１０９は、ディスク番号１２１０が示すディスク以外のディスクからデータをデータバッファ１８０１、パリティバッファ１８０２から読み出す（ステップＳ１８０３）。本実施例ではデータ書き込み部１１０７がディスク１２０４へパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込み失敗している。そのため図１７に記載するように、データ書き戻し部１１０９は、ディスク１２０１からデータ（Ｎｅｗ  Ｄａｔａ）１２０５、ディスク１２０２からデータ（Ｎｅｗ  Ｄａｔａ）１３０１、ディスク１２０３からデータ（Ｏｌｄ  Ｄａｔａ）１３０３をデータバッファ１８０１に書き戻す。
【０１１４】
パリティ生成部１１０６は、データ（Ｎｅｗ  Ｄａｔａ）１２０５、データ（Ｎｅｗ  Ｄａｔａ）１３０１、及びデータ（Ｏｌｄ  Ｄａｔａ）１３０３の排他的論理和を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１８０３を生成し、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１８０３をパリティバッファ１８０２に格納する（ステップＳ１８０４）。
【０１１５】
データ書き込み部１１０７は、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１８０３をディスク１２０４に書き込む（ステップＳ１８０５）。
【０１１６】
バッファ開放部１１１０は、データバッファ１８０１、パリティバッファ１８０２を開放する（ステップＳ１８０６）。
【０１１７】
さらにバッファ開放部１１１０は、エラーバッファ１１２０を開放して（ステップＳ１８０７）、ＣＭ１１００はｒｅｂｕｉｌｄ処理を終了する。
【０１１８】
上記図１８のフローチャートに示すｒｅｂｕｉｌｄ処理を図解すると図１６、１７のように表すことができる。図１６はＲＡＩＤリカバリ部１１１２がＲＡＩＤ制御部１１１１にｒｅｂｕｉｌｄ処理の依頼を示す図である。図１７は、エラーバッファ１１２０の開放を示す図である。
【０１１９】
［８．データバッファ１１１８の容量の枯渇制御に関するフローチャート］
図２１は本実施例に係るデータバッファ１１１８の容量の枯渇制御に関するフローチャートである。
【０１２０】
ＣＭ１１００がデータ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１に書き込み失敗し、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込み成功した場合に、ＣＭ１１００が図２１に記載のフローチャートの処理を実行する。
【０１２１】
図１９は、ＣＭ１１００がデータ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１に書き込み失敗し、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を書き込み成功した場合を示す図である。
【０１２２】
ホストコンピュータからスモールライト（Ｓｍａｌｌ Ｗｒｉｔｅ）のデータ書き込み命令があると、バッファ獲得部１１０４は、データ（Ｏｌｄ  Ｄａｔａ）１２０６とデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出すためのデータバッファ１１１８、パリティバッファ１１０３をメモリ１１０３上に確保する。
【０１２３】
データ読み出し部１１０５は、データバッファ１１１８にデータ（Ｏｌｄ  Ｄａｔａ）１２０６、パリティバッファ１１１９にパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を読み出す。データバッファ１１１８はデータ（Ｏｌｄ  Ｄａｔａ）１２０６を、パリティバッファ１１１９はパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７を保持する。
【０１２４】
パリティ生成部１１０６は、データ（Ｏｌｄ  Ｄａｔａ）１２０６とパリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）１２０７の排他的論理和（ＸＯＲ）、及びデータ（Ｎｅｗ  Ｄａｔａ）１２０５との排他的論理和（ＸＯＲ）を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８を生成する。
【０１２５】
データ書き込み部１１０７は、データ（Ｎｅｗ  Ｄａｔａ）１２０５をディスク１２０１、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をディスク１２０４に書き込みトライする（ステップＳ１４０４）。整合判定部１１０８が、データ（Ｎｅｗ  Ｄａｔａ）１２０６をディスク１２０１に書き込むことができなかったと判定する場合、バッファ獲得部１１０４はエラーバッファ１１２０を獲得して、書き込みエラーしたストライプ番号２００１、ディスク番号２００２、及びパリティビット２００３を格納する。バッファ開放部１１１０はデータバッファ１１１８、パリティバッファ１１１９を開放する。
【０１２６】
そしてＣＭ１１００は、図２１に記載の処理フローを実行する。ＣＭ１１００は、ホストコンピュータから書き込み命令のあったデータ（Ｎｅｗ  Ｄａｔａ）２１０１をディスク１２０２に書き込む処理を実行する。
【０１２７】
パリティビットチェック部１１１６がパリティビット１２１１は「１」であると判別する場合（ステップＳ１４０９  ＹＥＳ）、ＣＭ１１００は図２２に記載のバッファ容量の枯渇制御を行う。
【０１２８】
まずバッファ獲得部１１０４は、データバッファ２１０３、パリティバッファ２１０４をメモリ１１０３上に確保する（ステップＳ２１０１）。
【０１２９】
エラー検索部１１１７はデータ（Ｎｅｗ  Ｄａｔａ）２１０１のディスク番号とエラーバッファ１１２０に保持するディスク番号１２１０を比較する（ステップＳ２１０２）。エラー検索部１１１７はデータ（Ｎｅｗ  Ｄａｔａ）２１０１のディスク番号とディスク番号１２１０が一致するか否かを判別する。
【０１３０】
エラー検索部１１１７はデータ（Ｎｅｗ  Ｄａｔａ）２１０１のディスク番号とディスク番号１２１０が一致すると判別する場合（ステップＳ２２０２  ＹＥＳ）、データ書き戻し部１１０９は、ディスク番号１２１０が示すディスク以外のディスクからデータ、パリティデータをデータバッファ２１０３、パリティバッファ２１０４から読み出す（ステップＳ２１０３）。パリティ生成部１１０６は読み出したデータとデータ（Ｎｅｗ  Ｄａｔａ）２１０１の排他的論理和を計算して、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）２１０２を生成する（ステップＳ２１０４）。データ書き込み部１１０７はパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）２１０２をディスク１２０４に書き込む（ステップＳ２１０５）。
【０１３１】
またエラー検索部１１１７がデータ（Ｎｅｗ  Ｄａｔａ）２１０１のディスク番号とディスク番号１２１０が一致しない場合（ステップＳ２１０２  ＮＯ）、データ書き戻し部１１０９はディスク１２０３からデータ（Ｏｌｄ  Ｄａｔａ）１３０３をデータバッファ２１０３に読み出す。さらにデータ書き戻し部１１０９はディスク１２０４からパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８をパリティバッファ２１０４に読み出す（ステップＳ２１０６）。パリティ生成部１１０６はデータ（Ｎｅｗ  Ｄａｔａ）２１０１、データ（Ｏｌｄ  Ｄａｔａ）１３０３、及びパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１２０８の排他的論理和を計算してパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）２１０２を生成する（ステップＳ２１０７）。そしてデータ書き込み部１１０７はデータ（Ｎｅｗ  Ｄａｔａ）２１０１をディスク１２０２に書き込み、パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）２１０２をディスク１２０４に書き込む（ステップＳ２１０８）。
【０１３２】
上記図２１のフローチャートに示すバッファ容量の枯渇制御を図解すると図１９、図２０のように表すことができる。図１９はＣＭ１１００におけるデータバッファ１１１８の開放を示す図である。また図２０はＣＭ１１００におけるデータ（Ｎｅｗ  Ｄａｔａ）２１０１のディスク１２０２への書き込みを示す図である。
【０１３３】
［９．データバッファ１１１８の容量の枯渇制御に関するフローチャート］
図２３は本実施例に係るディスク１２０２に格納されるデータ（Ｏｌｄ  Ｄａｔａ）１３０２を読み出すフローチャートである。
【０１３４】
図２３は、書き込みエラーしているストライプに対してホストコンピュータからデータの読み出し命令があった場合、ＣＭ１１００が処理するフローチャートの図である。
【０１３５】
ストライプチェック部１１１５は、データ書き戻し部１１０９が読み出したデータ（Ｏｌｄ  Ｄａｔａ）２３０１が属するストライプ番号をチェックする（ステップＳ２３０１）。ストライプチェック部１１１５は、データ（Ｏｌｄ  Ｄａｔａ）２３０１が属するストライプ番号とエラーバッファ２３０５に保持するストライプ番号２３０２を比較して一致するか否かを判別する。
【０１３６】
ストライプチェック部１１１５が、データ（Ｏｌｄ  Ｄａｔａ）２３０１が属するストライプ番号とストライプ番号２３０２が一致しないと判別する場合（ステップＳ２３０１  ＮＯ）、ＣＭ１１００はデータ読み出し処理を正常に終了する。ストライプチェック部１１１５がデータ（Ｏｌｄ  Ｄａｔａ）２３０１が属するストライプ番号とストライプ番号２３０２が一致すると判別する場合（ステップＳ２３０１  ＹＥＳ）、パリティビットチェック部２４０２はエラーバッファ２３０５に保持するパリティビット２３０４をチェックする（ステップＳ２３０２）。パリティビットチェック部２４０２が、パリティビット２３０４が「０」であると判別する場合（ステップＳ２３０２  ＮＯ）、データ書き戻し部１１０９は、データ（Ｏｌｄ  Ｄａｔａ）２３０１をキャッシュ１１０２に読み出し、読み出し処理を正常に終了する（ステップＳ２３０３）。パリティビットチェック部２４０２が、パリティビット２３０４が「１」であると判別する場合（ステップＳ２３０２  ＹＥＳ）、エラー検索部１１１７はデータ（Ｏｌｄ  Ｄａｔａ）２３０１を格納していたディスクのディスク番号をチェックする（ステップＳ２３０４）。エラー検索部１１１７はデータ（Ｏｌｄ  Ｄａｔａ）２３０１を格納していたディスクのディスク番号とエラーバッファ２３０５に保持するディスク番号２３０３が一致するか否かを判別する。
【０１３７】
エラー検索部１１１７がデータ（Ｏｌｄ  Ｄａｔａ）２３０１を格納していたディスクのディスク番号とディスク番号２３０３が一致しないと判別する場合（ステップＳ２３０４  ＮＯ）、データ書き戻し部１１０９はデータ（Ｏｌｄ  Ｄａｔａ）２３０１をキャッシュ１１０２に書き戻す（ステップＳ２３０５）。エラー検索部１１１７がデータ（Ｏｌｄ  Ｄａｔａ）２３０１を格納していたディスクのディスク番号とディスク番号２３０３が一致すると判別する場合（ステップＳ２３０４  ＹＥＳ）、バッファ獲得部１１０４はデータバッファ、パリティバッファを確保する（ステップＳ２３０６）。データ書き戻し部１１０９はディスク番号２３０３以外のディスクからデータをデータバッファ、パリティバッファに書き戻す（ステップＳ２３０７）。例えば図２２に示すようにディスク番号２３０１はディスク１２０２を示すので、データ書き戻し部１１０９はディスク１２０１、１２０３、１２０４よりデータ、パリティデータをそれぞれデータバッファ、パリティバッファに読み出す。
【０１３８】
そしてパリティ生成部１１０６は、データバッファ、パリティバッファに読み出したデータ、パリティデータの排他的論理和を計算してデータ（Ｎｅｗ  Ｄａｔａ）２３０６を生成する（ステップＳ２３０８）。上記図２３のフローチャートに示すデータ（Ｏｌｄ  Ｄａｔａ）１３０２の読み出しを図解すると図２２のように表すことができる。
【図面の簡単な説明】
【０１３９】
【図１】本実施例に係るＲＡＩＤシステム１００の構成図である。
【図２】本実施例に係るデータテーブル２００である。
【図３】本実施例に係るＣＭ１０３の機能ブロック図である。
【図４】本実施例に係るパリティバッファ３１２の容量枯渇の制御に関するフローチャートである。
【図５】本実施例に係るパリティバッファ３１２の容量枯渇の制御を図解した模式図である。
【図６】本実施例に係るパリティバッファ３１２の容量枯渇の制御を図解した模式図である。
【図７】本実施例に係るｒｅｂｕｉｌｄ処理のフローチャートである。
【図８】本実施例に係るｒｅｂｕｉｌｄ処理に関する模式図である。
【図９】本実施例に係るｒｅｂｕｉｌｄ処理に関する模式図である。
【図１０】本実施例に係るパリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）１１１の構成図である。
【図１１】本実施例に係るＣＭ１１００の機能ブロック図である。
【図１２】本実施例に係るパリティバッファ１１１９の容量枯渇の制御を図解した模式図である。
【図１３】本実施例に係るパリティバッファ１１１９の容量枯渇の制御を図解した模式図である。
【図１４】本実施例に係るＣＭ１１００が処理するパリティバッファ３１２の容量枯渇の制御に関するフローチャートである。
【図１５】ＣＭ１１００におけるディスク１２０２からのデータの読み出しを示す図である。
【図１６】本実施例に係るｒｅｂｕｉｌｄ処理の制御を図解した模式図である。
【図１７】本実施例に係るｒｅｂｕｉｌｄ処理の制御を図解した模式図である。
【図１８】本実施例に係るｒｅｂｕｉｌｄ処理に関するフローチャートである。
【図１９】本実施例に係るＣＭ１１００におけるデータバッファ１１１８の開放を示す図である。
【図２０】本実施例に係るデータバッファ１１１８の容量の枯渇制御に関するフローチャートである。
【図２１】本実施例に係るデータバッファ１１１８の容量の枯渇制御に関するフローチャートである。
【図２２】本実施例に係るデータ（Ｏｌｄ  Ｄａｔａ）１３０２の読み出しを示す図である。
【図２３】本実施例に係るディスク１２０２に格納されるデータ（Ｏｌｄ  Ｄａｔａ）１３０２を読み出すフローチャートである。
【符号の説明】
【０１４０】
１０１…ホストコンピュータ
１０２…チャネルアダプタ（ＣＡ）
１０３…コントローラモジュール（ＣＭ）
１０４…ディスク
１０５…ディスク
１０６…ディスク
１０７…ディスク
１０８…データ（Ｎｅｗ  Ｄａｔａ）
１０９…データ（Ｏｌｄ  Ｄａｔａ）
１１０…パリティデータ（Ｏｌｄ  Ｐａｒｉｔｙ）
１１１…パリティデータ（Ｎｅｗ  Ｐａｒｉｔｙ）
２００…データテーブル
３０１…バッファ獲得部
３０２…データ読み出し部
３０３…パリティ生成部
３０４…データ書き込み部
３０５…整合判定部
３０６…データ書き戻し部
３０７…メモリ開放部
６０１…ＲＡＩＤ制御部
６０２…ＲＡＩＤリカバリ部
９０１…データ確認部
９０２…データ生成部
【図１】
0005286956.tif 000002
【図２】
0005286956.tif 000003
【図３】
0005286956.tif 000004
【図４】
0005286956.tif 000005
【図５】
0005286956.tif 000006
【図６】
0005286956.tif 000007
【図７】
0005286956.tif 000008
【図８】
0005286956.tif 000009
【図９】
0005286956.tif 000010
【図１０】
0005286956.tif 000011
【図１１】
0005286956.tif 000012
【図１２】
0005286956.tif 000013
【図１３】
0005286956.tif 000014
【図１４】
0005286956.tif 000015
【図１５】
0005286956.tif 000016
【図１６】
0005286956.tif 000017
【図１７】
0005286956.tif 000018
【図１８】
0005286956.tif 000019
【図１９】
0005286956.tif 000020
【図２０】
0005286956.tif 000021
【図２１】
0005286956.tif 000022
【図２２】
0005286956.tif 000023
【図２３】
0005286956.tif 000024