(57)【要約】【課題】  セクタ長が固定されている複数のディスク装置を備えるディスクアレイ装置において、書き込まれるデータおよび読み出されるデータの正確さを保証すること。【解決手段】ディスクアレイコントローラ１１は、ホスト２０〜２２から受け取ったコマンドが書き込みコマンドであるか読み出しコマンドであるかを判定する。ディスクアレイコントローラ１１は、書き込みコマンドである場合には、受け取ったデータからデータブロック、パリティブロック、保証コードブロックを生成し、複数のディスク装置Ｄ００〜０Ｎに分散させて格納する。ディスクアレイコントローラ１１は、読み出しコマンドである場合には、パリティブロック、保証コードブロックを用いて読み取ったデータブロックが誤っているか否かを判定し、読み取ったデータブロックが誤っている場合には、パリティブロック、保証コードブロックを用いて訂正する。【選択図】  図１
2006107311.tif 000002
【特許請求の範囲】
【請求項１】
データを複数のディスク装置に分散させて管理するディスクアレイ装置であって、
データを送受信するデータ送受信手段と、
セクタ長が固定されている複数のディスク装置であって、データ、データの内容および格納位置を保証する保証情報を、それぞれ異なるディスク装置に格納する、複数のディスク装置と、
前記各ディスク装置に対してデータおよび情報の読み出し／書き込みを実行するアクセス制御手段とを備えるディスクアレイ装置。
【請求項２】
請求項１に記載のディスクアレイ装置において、
前記複数のディスク装置を構成する各ディスク装置は、それぞれが、前記データまたは情報を格納する複数の同一の大きさの格納領域を有し、前記各ディスク装置における各格納領域は、前記データ、保証情報を格納する単位格納列を構成する、ディスクアレイ装置。
【請求項３】
請求項２に記載のディスクアレイ装置において、
前記保証情報は、前記各ディスク装置の１つの格納領域に格納されるデータである格納単位データおよびその格納単位データの属性に関連する複数の冗長データを含み、
前記複数のディスク装置はさらに、各前記単位格納列に含まれることとなる前記格納単位データに基づく冗長データを含む誤り検出／訂正情報を、前記データおよび前記保証情報とは異なるディスク装置に格納するディスクアレイ装置。
【請求項４】
請求項３に記載のディスクアレイ装置はさらに、
外部ホストコンピュータから受け取ったコマンドを解釈するコマンド解釈手段と
外部ホストコンピュータとの間でデータを送受信するデータ送受信手段と、
前記解釈されたコマンドが書き込みコマンドである場合には、前記データ送受信手段によって受信されたデータを用いて、受信されたデータを前記各ディスク装置の格納領域に分散して格納するための複数の前記格納単位データを生成する格納単位データ生成手段と、
各前記単位格納列に含まれることとなる前記格納単位データを用いて前記誤り検出／訂正情報を生成する誤り検出／訂正情報生成手段と、
前記各ディスク装置の前記１つの格納領域に格納される前記格納単位データおよびその格納単位データの属性を用いて保証情報を生成する保証情報生成手段とを備え、
前記アクセス制御手段は、前記生成された格納単位データ、誤り検出／訂正情報および保証情報を前記各ディスク装置の前記格納領域に対して書き込むディスクアレイ装置。
【請求項５】
請求項４に記載のディスクアレイ装置において、
前記解釈されたコマンドが読み出しコマンドであると共に、前記外部ホストコンピュータによって要求されたデータの読み出し単位が、前記単位格納列を単位とする読み出し単位でない場合には、
前記アクセス制御手段は、前記要求されたデータに対応する格納単位データを前記複数のディスク装置から読み出し、
前記ディスクアレイ装置はさらに、
前記読み出された格納単位データおよび前記読み出された格納単位データに対応する前記保証情報とを用いて、前記読み出された格納単位データまたは前記保証情報に誤りが発生しているか否かを判定する第１の判定手段と、
前記読み出された格納単位データまたは前記保証情報に誤りが発生していると判定された場合には、前記読み出された格納単位データまたは前記保証情報に発生している誤りを訂正する第１の訂正手段を備えるディスクアレイ装置。
【請求項６】
請求項５に記載のディスクアレイ装置において、
前記保証情報は、前記１つの格納領域に格納される格納単位データの正しさを保証するデータ保証情報と、前記ディスク装置において前記格納単位データが書き込まれる位置の正しさを保証する位置保証情報とを含み、
前記第１の判定手段は、前記読み出された格納単位データを用いて算出されたデータ保証情報および前記読み出された格納単位データの位置保証情報と、前記保証情報の前記データ保証情報および位置保証情報のいずれか一方が一致しない場合に、前記読み出された格納単位データまたは前記保証情報に誤りが発生していると判定し、
前記第１の訂正手段は、前記読み出された格納単位データが属する単位格納列に含まれる他の全ての格納単位データと、前記誤り検出／訂正情報とを用いて前記読み出された格納単位データを訂正し、前記生成された格納単位データを用いて前記保証情報を訂正するディスクアレイ装置。
【請求項７】
請求項４に記載のディスクアレイ装置において、
前記解釈されたコマンドが読み出しコマンドであると共に、前記外部ホストコンピュータによって要求されたデータの読み出し単位が、前記単位格納列を単位とする読み出し単位である場合には、
前記アクセス制御手段は、前記要求されたデータに対応する格納単位データを含む前記単位格納列を前記複数のディスク装置から読み出し、
前記ディスクアレイ装置はさらに、
前記読み出された前記単位格納列に含まれる前記誤り検出／訂正情報および格納単位データとを用いて、前記読み出された前記単位格納列に含まれる格納単位データまたは前記誤り検出／訂正情報に誤りが発生しているか否かを判定する第２の判定手段と、
前記読み出された前記単位格納列に含まれる格納単位データまたは前記誤り検出／訂正情報に誤りが発生していると判定された場合には、前記読み出された前記単位格納列に含まれる格納単位データまたは前記誤り検出／訂正情報に発生している誤りを訂正する第２の訂正手段を備えるディスクアレイ装置。
【請求項８】
請求項７に記載のディスクアレイ装置はさらに、
前記読み出された前記単位格納列に含まれる格納単位データまたは前記誤り検出／訂正情報に誤りが発生していると判定された場合には、前記保証情報を用いて、前記誤り検出／訂正情報と前記読み出された前記単位格納列に含まれる格納単位データのいずれに誤りが発生しているかを特定する誤り特定手段を備え、
前記第２の訂正手段は、前記読み出された格納単位データに誤りが発生していると特定された場合には、前記読み出された格納単位データが属する単位格納列に含まれる他の全ての格納単位データと前記誤り検出／訂正情報とを用いて前記誤り検出／訂正情報を訂正するディスクアレイ装置。
【請求項９】
請求項８に記載のディスクアレイ装置において、
前記第２の訂正手段は、前記誤り検出／訂正情報に誤りが発生していると特定された場合には、前記誤り検出／訂正情報と同一の単位格納列に含まれる前記格納単位データを用いて前記誤り検出／訂正情報を訂正するディスクアレイ装置。
【請求項１０】
請求項１ないし請求項９のいずれかに記載のディスクアレイ装置において、
前記誤り検出／訂正情報は、前記単位格納列に含まれる全ての前記格納単位データを用いて算出されるパリティ情報であるディスクアレイ装置。
【請求項１１】
請求項１、６、８および９のいずれかに記載のディスクアレイ装置において、
前記保証情報は、前記１つの格納領域に格納される格納単位データの正しさを保証するデータ保証情報と、前記ディスク装置において前記格納単位データの格納位置の正しさを保証する位置保証情報とを含むディスクアレイ装置。
【請求項１２】
請求項１１に記載のディスクアレイ装置において、
前記データ保証情報は、前記各格納領域に格納される格納単位データを用いて算出される垂直または水平パリティ情報であり、
前記位置保証情報は、前記ディスク装置の所望の位置に前記格納単位データを書き込むためのアドレス情報であるディスクアレイ装置。
【請求項１３】
請求項１ないし請求項１２のいずれかに記載のディスクアレイ装置において、
前記誤り検出／訂正情報は、その全てが前記複数のディスク装置を構成する一のディスク装置に格納され、
前記保証情報は、その全てが前記複数のディスク装置を構成する他の一のディスク装置に格納されるディスクアレイ装置。
【請求項１４】
請求項１ないし請求項１２のいずれかに記載のディスクアレイ装置において、
前記誤り検出／訂正情報は前記格納単位データと同様にして、前記複数のディスク装置に分散して格納されるディスクアレイ装置。
【請求項１５】
請求項１４に記載のディスクアレイ装置において、
前記保証情報は前記格納単位データと同様にして、前記複数のディスク装置に分散して格納されるディスクアレイ装置。
【請求項１６】
請求項１ないし請求項１２のいずれかに記載のディスクアレイ装置において、
前記保証情報は前記格納単位データと同様にして、前記複数のディスク装置に分散して格納されるディスクアレイ装置。
【請求項１７】
請求項１６に記載のディスクアレイ装置において、
前記誤り検出／訂正情報は前記格納単位データと同様にして、前記複数のディスク装置に分散して格納されるディスクアレイ装置。
【請求項１８】
請求項１１に記載のディスクアレイ装置において、
前記保証情報はさらに、保証情報の誤りを検出するための第２のデータ保証情報を有し、
前記ディスクアレイ装置は更に、前記第２のデータ保証情報を用いて、前記保証情報と前記読み出された格納単位データのいずれに誤りが発生しているかを特定する第２の特定手段を備えるディスクアレイ装置。
【請求項１９】
請求項１に記載のディスクアレイ装置において、
前記ディスクアレイ装置には管理装置が接続されており、
前記管理装置は、前記複数のディスク装置に前記保証情報を付与するための付与手段と、
前記複数のディスク装置に前記前記保証情報が付与されているか否かを示す表示器とを備える
ディスクアレイ装置。
【請求項２０】
セクタ長が固定されているＮ個（Ｎは４以上の自然数）のディスク装置に対してデータを分散して書き込むディスクアレイ装置であって、
データを送受信するデータ送受信手段と、
前記送受信手段によって受信されたデータを用いて、予め定められた分散サイズの格納単位データを生成する書き込み格納単位データ生成手段と、
前記生成された格納単位データのうち、Ｎ−２個の前記ディスク装置に対して書き込まれる書き込みデータを用いて誤り検出／訂正情報を生成する誤り検出／訂正情報生成手段と、
前記Ｎ−２個の前記ディスク装置のそれぞれに書き込まれる格納単位データと、その格納単位データの属性とを用いて保証情報を生成する保証情報生成手段と、
前記格納単位データ、誤り検出／訂正情報および保証情報を前記複数のディスク装置に対して別々に書き込む書き込み手段とを備えるディスクアレイ装置。
【請求項２１】
データを、同一の大きさの複数の格納領域を有するディスク装置から構成される複数のディスク装置に分散させて管理するディスクアレイ装置の制御方法であって、
外部ホストコンピュータから受信したデータを用いて、前記各ディスク装置の格納領域に分散して格納するための複数の格納単位データを生成し、
前記複数のディスク装置を構成する各ディスク装置の格納領域によって形成される単位格納列に含まれることとなる前記格納単位データを用いて誤り検出／訂正情報を生成し、
前記各ディスク装置の前記１つの格納領域に格納される前記格納単位データおよびその格納単位データの属性を用いて保証情報を生成し、
前記生成した格納単位データ、誤り検出／訂正情報および保証情報を前記単位格納列を構成する前記各ディスク装置の前記格納領域に対して別々に書き込むディスクアレイ装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のディスク装置を備えるディスクアレイ装置、およびディスクアレイ装置の制御方法に関する。
【背景技術】
【０００２】
複数のディスク装置を備えることによってデータに対するアクセス速度、ディスク装置の障害に対する信頼性を向上させる技術として、ＲＡＩＤ（Redundant Array of Inexpensive Disk drives）システムが知られている。ＲＡＩＤに関しては、非特許文献１が詳しい。ＲＡＩＤシステム、例えばＲＡＩＤ３、においては、ディスクまたはセクタにおいて、エラーが返される明確な障害が発生している場合には、パリティ情報を用いてデータを訂正することができる。
【０００３】
また、書き込まれたデータ、または、読み出されたデータが正確なデータであることを保証する技術として、各論理データブロック（セクタ）に保証コードを付す技術が知られている（特許文献１）。
【０００４】
【非特許文献１】ディー・パターソン（D.Patterson)、外２名、「ケース・フォー・リダンダント・アレイ・オブ・インエクスペンシブ・ディスク (A Case for Redundunt Arrays of Inexpensive Disks (RAID)」、エー．シー．エム．シグモッド  コンファレンスプロシーディング(ACM SIGMOD Conference Proceeding)、１９８８年６月、ｐ．１０９〜１１６
【特許文献１】特開２０００−３４７８１５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、ＲＡＩＤシステムでは、読み出し／書き込みを正常に実行できる場合、例えば、データが誤ったアドレスに記録された場合や、データが化けた状態で記録された場合、には、その誤りを検出し、訂正（回復）することができないという問題がある。
【０００６】
また、論理データブロック（セクタ）に対して保証コードを付す技術では、同一セクタ内にデータと共に保証コードを書き込むために、通常のデータに加え保証コードを付加する分だけセクタのサイズを拡大する必要があり、セクタ長が可変長である磁気ディスクが前提となる。この結果、セクタ長が固定されているセクタ長固定ディスク、例えば、近年、ディスクアレイ装置に広く用いられているＡＴＡディスクには適用することができないという問題がある。
【０００７】
本発明は上記課題を解決するためになされたものであり、セクタ長が固定されている複数のディスク装置を備えるディスクアレイ装置において、書き込まれるデータおよび読み出されるデータの正確さを保証することを目的とする。
【課題を解決するための手段】
【０００８】
上記課題を解決するために本発明の第１の態様は、データを複数のディスク装置に分散させて管理するディスクアレイ装置を提供する。本発明の第１の態様に係るディスクアレイ装置は、データを送受信するデータ送受信手段と、セクタ長が固定されている複数のディスク装置であって、データ、誤り検出／訂正情報、および保証情報を、それぞれ異なるディスク装置に格納する、複数のディスク装置と、前記各ディスク装置に対してデータおよび情報の読み出し／書き込みを実行するアクセス制御手段とを備えることを特徴とする。
【０００９】
本発明の第１の態様に係るディスクアレイ装置によれば、データ、誤り検出／訂正情報、および保証情報が、それぞれ異なるディスク装置に格納されるので、セクタ長が固定されている複数のディスク装置から構成されるディスクアレイ装置においても、書き込みデータおよび読み出しデータの正確さを保証することができる。
【００１０】
本発明の第２の態様は、セクタ長が固定されているＮ個（Ｎは４以上の自然数）のディスク装置に対してデータを分散して書き込むディスクアレイ装置を提供する。本発明の第２の態様に係るディスクアレイ装置は、データを送受信するデータ送受信手段と、前記送受信手段によって受信されたデータを用いて、予め定められた分散サイズの格納単位データを生成する書き込み格納単位データ生成手段と、前記生成された格納単位データのうち、Ｎ−２個の前記ディスク装置に対して書き込まれる書き込みデータを用いて第１の誤り訂正情報を生成する第１誤り訂正情報生成手段と、前記Ｎ−２個の前記ディスク装置のそれぞれに書き込まれる格納単位データと、その格納単位データの属性とを用いて第２の誤り訂正情報を生成する第２誤り訂正情報生成手段と、前記格納単位データ、第１および第２の誤り訂正情報を前記複数のディスク装置に対して別々に書き込む書き込み手段とを備えることを特徴とする。
【００１１】
本発明の第２の態様に係るディスクアレイ装置によれば、データ、誤り検出／訂正情報、および保証情報が、それぞれ別のディスク装置に格納されるので、セクタ長が固定されている複数のディスク装置から構成されるディスクアレイ装置においても、書き込みデータおよび読み出しデータの正確さを保証することができる。
【００１２】
本発明の第３の態様は、データを、同一の大きさの複数の格納領域を有するディスク装置から構成される複数のディスク装置に分散させて管理するディスクアレイ装置の制御方法を提供する。本発明の第３の態様に係るディスクアレイ装置の制御方法は、外部ホストコンピュータから受信したデータを用いて、前記各ディスク装置の格納領域に分散して格納するための複数の格納単位データを生成し、前記複数のディスク装置を構成する各ディスク装置の格納領域によって形成される単位格納列に含まれることとなる前記格納単位データを用いて誤り検出／訂正情報を生成し、前記各ディスク装置の前記１つの格納領域に格納される前記格納単位データおよびその格納単位データの属性を用いて保証情報を生成し、前記生成した格納単位データ、誤り検出／訂正情報および保証情報を、前記単位格納列を構成する前記各ディスク装置の前記格納領域に対して別々に書き込むことを特徴とする。
【００１３】
本発明の第３の態様に係るディスクアレイ装置の制御方法によれば、格納単位データ、誤り検出／訂正情報、および誤り検出／訂正情報が、それぞれ異なるディスク装置の格納領域に格納されるので、セクタ長が固定されている複数のディスク装置から構成されるディスクアレイ装置においても、書き込みデータおよび読み出しデータの正確さを保証することができる。
【００１４】
本発明の第３の態様に係るディスクアレイ装置の制御方法は、この他にも、ディスクアレイ装置の制御プログラム、およびディスクアレイ装置の制御プログラムを記録したコンピュータが読み取り可能な記録媒体としても実現され得る。
【発明を実施するための最良の形態】
【００１５】
以下、本発明に係るディスクアレイ装置およびディスクアレイ装置の制御方法について図面を参照しつつ、いくつかの実施例に基づいて説明する。
【００１６】
・第１の実施例：
ディスクアレイ装置の構成：
図１〜図４を参照して第１の実施例に係るディスクアレイ装置について説明する。図１は第１の実施例に係るディスクアレイ装置の概略構成を示す説明図である。図２は第１の実施例に係るディスクアレイ装置の外観図である。図３は第１の実施例に係るディスクアレイ装置におけるディスクアレイコントローラの機能的構成を示すブロック図である。図４は制御プログラムに含まれるモジュールを示す説明図である。
【００１７】
第１の実施例におけるディスクアレイ装置１０は、ディスクアレイコントローラ１１、１２、接続インターフェース１３０、１３１、１３２、複数のディスク装置Ｄ００〜Ｄ２Ｎを備えている。複数のディスク装置Ｄ００〜Ｄ２Ｎは、例えば、図２に示すようにして、ディスクアレイ装置１０に備えられると共に、ＲＡＩＤシステムを構成している。
【００１８】
ディスクアレイコントローラ１１、１２は、制御プログラムを実行することによって、ディスクアレイ装置１０における各種制御処理を実行する制御回路である。本実施例においては、２つのディスクアレイコントローラ１１、１２が備えられているが、１つまたは３つ以上のディスクアレイコントローラが備えられてもよい。ディスクアレイコントローラ１１、１２は、信号線１０１を介して相互に通信可能に接続されている。ディスクアレイコントローラ１１、１２はまた、ストレージネットワーク４０を介して各ホスト２０、２１、２２と接続され、管理用ネットワーク３０を介して管理用端末装置３１と接続されている。なお、ディスクアレイコントローラ１１、１２に加えて、追加のホストインターフェースアダプタを備えてもよい。ホストインターフェースアダプタは、例えば、ＮＡＳ（Network Attached Storage）インターフェースアダプタや、ｉＳＣＳＩ（internet SCSI）インターフェースアダプタなどがある。この場合には、ホストインターフェースアダプタによって各ホスト２０、２１、２２との通信、各ディスクアレイコントローラ１１、１２に対するディスクアクセスコマンドの送信が行われる。
【００１９】
ディスクアレイコントローラ１１、１２は、接続インターフェース１３０、１３１、１３２を介して複数のディスク装置Ｄ００〜Ｄ２Ｎと接続されている。より具体的には、接続インターフェース１３０は、ディスクアレイコントローラ１１、１２と信号線１０２を介して直接接続されており、各接続インターフェース１３０、１３１、１３２は互いに信号線１０３を介して接続されている。したがって、接続インターフェース１３１は接続インターフェース１３０を介して、接続インターフェース１３２は接続インターフェース１３０、１３１を介してディスクアレイコントローラ１１、１２と接続されている。
【００２０】
接続インターフェース１３０は複数のディスク装置Ｄ００〜Ｄ０Ｎと接続され、接続インターフェース１３１は複数のディスク装置Ｄ１０〜Ｄ１Ｎと接続され、接続インターフェース１３２は複数のディスク装置Ｄ２０〜Ｄ２Ｎと接続されている。
【００２１】
ディスクアレイコントローラ１１、１２を含む接続インターフェース１３０および複数のディスク装置Ｄ００〜Ｄ０Ｎのグループは、例えば、基本筐体と呼ばれ、接続インターフェース１３１および複数のディスク装置Ｄ１０〜Ｄ１Ｎのグループ、および接続インターフェース１３２および複数のディスク装置Ｄ２０〜Ｄ２Ｎのグループは、例えば、増設筐体と呼ばれる。なお、図１からも明らかなように、増設筐体は１つであってもよく、あるいは、０または３つ以上であってもよい。また、本実施例においては、ディスクアレイコントローラはディスク装置Ｄ００〜Ｄ２Ｎと同一の筐体に備えられているが、適切な信号線を介して接続されていれば、別筐体であっても良い。
【００２２】
ホスト２０、２１、２２は、例えば、各種データを入力する端末装置であり、ホスト２０、２１、２２において処理されたデータは、逐次、ディスクアレイ装置１０に対して送出され、ディスクアレイ装置１０に格納される。なお、ホスト２０〜２１は、１つであってもよく、あるいは、４つ以上備えられてもよい。
【００２３】
各ディスク装置Ｄ００〜Ｄ２Ｎは、セクタ長が固定されているハードディスクドライブであり、例えば、ＡＴＡ規格のハードディスクドライブが用いられる。
【００２４】
管理用端末装置３１は、ディスクアレイ装置１０に対する保守管理を実行するために用いられる端末装置であり、ホスト２０〜２２とは異なる。管理用端末装置３１には、管理画面３２が備えられており、管理者は管理画面３２を通じて、ディスクアレイ装置１０の状態を管理する。
【００２５】
図３を参照してディスクアレイコントローラ１１の内部構成について説明する。なお、ディスクコントローラ１２も同様の内部構成を有している。ディスクアレイコントローラ１１は、ＣＰＵ１１０、メモリ１１１、フロントエンドＩ／Ｏコントローラ１１２、バックエンドＩ／Ｏコントローラ１１３、管理ネットワーク用Ｉ／Ｏコントローラ１１４、データ転送コントローラ１１５を備えている。
【００２６】
ＣＰＵ１１０、メモリ１１１、フロントエンドＩ／Ｏコントローラ１１２、バックエンドＩ／Ｏコントローラ１１３は、データ転送コントローラ１１５を介して相互に信号線１１６によって接続されている。
【００２７】
メモリ１１１には、ディスク装置Ｄから読み出したデータ、ディスク装置に書き込むデータ、ＣＰＵ１１０の演算結果を一時的に格納するキャッシュバッファ１１７が備えられると共に、ＣＰＵ１１０によって実行される制御プログラム１１８が格納されている。制御プログラム１１８の詳細については図４を参照して後述する。
【００２８】
フロントエンドＩ／Ｏコントローラ１１２はストレージネットワーク４０と接続されて、ホスト２０〜２２との間でデータおよびコマンドの送受信を実行する。バックエンドＩ／Ｏコントローラ１１３は接続インターフェース１３０（１３１、１３２）と接続されて、各ディスク装置Ｄとの間でデータの送受信を実行する。データ転送コントローラ１１５は、ＣＰＵ１１０、メモリ１１１、フロントエンドおよびバックエンドＩ／Ｏコントローラ１１２、１１３の間におけるデータの転送制御を実行する。データ転送コントローラ１１５はまた、他のディスクアレイコントローラに対するデータ転送をも制御する。
【００２９】
管理ネットワーク用Ｉ／Ｏコントローラ１１４は、管理用ネットワーク３０に接続されており、管理用端末装置３１との間でコマンドの送受信を実行する。
【００３０】
図４を参照して、制御プログラム１１８の詳細について説明する。制御プログラム１１８は、コマンド処理プログラムＰｒ１、Ｉ／Ｏ処理プログラムＰｒ２、ＲＡＩＤ制御プログラムＰｒ３、ＲＡＩＤグループ管理テーブルＴｂ１、論理ユニット管理テーブルＴｂ２を備えている。
【００３１】
コマンド処理プログラムＰｒ１は、ホスト２０〜２２から受信したコマンドの解釈、コマンド実行モジュールに対するコマンドの転送を実行するプログラムであり、例えば、実行すべきコマンドがデータの書き込みコマンドであるか、読み出しコマンドであるかを判定する。
【００３２】
Ｉ／Ｏ処理プログラムＰｒ２は、ホスト２０〜２２、他のディスクアレイコントローラ、接続インターフェース１３０との間におけるデータおよびコマンドの送受信を制御するためのプログラムである。
【００３３】
ＲＡＩＤ制御プログラムＰｒ３は、本実施例において主要な各種制御を実行するためのプログラムであり、ＲＡＩＤを実行するための各種処理を実行する。ＲＡＩＤ制御プログラムＰｒ３は、データブロック生成モジュールＭｄ１、アクセス制御モジュールＭｄ２、パリティチェックモジュールＭｄ３、パリティ生成モジュールＭｄ４、第１訂正モジュールＭｄ５、保証コードチェックモジュールＭｄ６、保証コード生成モジュールＭｄ７、第２訂正モジュールＭｄ８、誤り特定モジュールＭｄ９を備えている。
【００３４】
データブロック生成モジュールＭｄ１は、書き込みの対象となるデータをディスク装置Ｄの格納単位であるセクタサイズに適合したデータブロックに分割するためのモジュールである。アクセス制御モジュールＭｄ２は、各ディスク装置Ｄに対するデータブロックの書き込み、要求されたデータに対応する各ディスク装置Ｄに格納されているデータブロックの読み出しを実行するためのモジュールである。
【００３５】
パリティチェックモジュール（第２の判定モジュール）Ｍｄ３は、ディスク装置Ｄに格納されているパリティデータ（誤り検出／訂正情報）が正しいか否かを判定するためのモジュールである。パリティ生成モジュール（第１誤り検出／訂正情報生成モジュール）Ｍｄ４は、ディスク装置Ｄに格納するためのパリティデータ（パリティブロック）を生成するためのモジュールである。第１訂正モジュールＭｄ５は、パリティブロックまたはデータブロックを訂正（回復）するために用いられるモジュールである。
【００３６】
保証コードチェックモジュール（第１の判定モジュール）Ｍｄ６は、ディスク装置Ｄに格納されている保証コード（保証情報）のブロック（保証コードブロック）が正しいか否かを判定するためのモジュールである。保証コード生成モジュール（第２誤り検出／訂正情報生成モジュール）Ｍｄ７は、ディスク装置Ｄに格納するための保証コード（保証コードブロック）を生成するためのモジュールである。第２訂正モジュールＭｄ８は、保証コードブロックまたはデータブロックを訂正するために用いられるモジュールである。誤り特定モジュールＭｄ９は、誤りがパリティブロックに発生しているのか、データブロックに発生しているのか、あるいは、誤りが保証コードブロックに発生しているのか、データブロックに発生しているのかを特定するために用いられるモジュールである。
【００３７】
ＲＡＩＤグループ管理テーブルＴｂ１は、ＲＡＩＤグループを構成するディスク装置についての各種情報を管理するために用いられるテーブルであり、例えば、図５に示す情報を保持している。ここで、図５はＲＡＩＤグループ管理テーブルＴｂ１の一例を示す説明図である。
【００３８】
図５に示すＲＡＩＤグループ管理テーブルＴｂ１は、ＲＡＩＤグループＮｏ．、ＲＡＩＤグループの総記憶容量、ＲＡＩＤレベル、保証コードの有無、ＲＡＩＤグループを構成するディスク装置、保証コードブロックを格納するディスク装置、状態についての情報を保持している。図５に示す例では、例えば、ＲＡＩＤグループ００１は、１９２０ＧＢの総容量を有し、ＲＡＩＤレベルはＲＡＩＤ５であり、保証コードを有しており、構成ディスク装置は、２０〜２６であり、保証コードブロックを格納しているディスク装置は２７であり、状態は正常である。
【００３９】
論理ユニット管理テーブルＴｂ２は、論理ユニットを管理するためのテーブルであり、例えば、図６に示す情報を保持している。ここで、図６は論理ユニット管理テーブルＴｂ２の一例を示す説明図である。
【００４０】
図５に示す論理ユニット管理デーブルＴｂ２は、論理ユニットＮｏ．、論理ユニットの容量、所属するＲＡＩＤグループＮｏ．、状態についての情報を保持している。図６に示す例では、例えば、論理ユニット００２は、容量が８００ＧＢであり、ＲＡＩＤグループ００３に属し、正常に機能している。なお、論理ユニットとは、当業者にとって明らかなように、１または複数の物理的なディスク装置Ｄによって提供される、各ディスク装置Ｄの物理的な記憶容量を超えて取り扱い可能な論理的な記憶領域を意味する。
【００４１】
図７〜図１０を参照して、管理用端末装置３１を通じて実行される、ＲＡＩＤグループの設定処理、論理ユニットの設定処理について説明する。図７はＲＡＩＤグループの設定処理時に管理画面３２に現れる設定ユーザインターフェースの一例を示す説明図である。図８はＲＡＩＤグループ作成時に設定ユーザインターフェース上に現れるポップアップユーザインターフェースの一例を示す説明図である。図９は論理ユニットの設定処理時に管理画面３２に現れる設定ユーザインターフェースの一例を示す説明図である。図１０は論理ユニット作成時に設定ユーザインターフェース上に現れるポップアップユーザインターフェースの一例を示す説明図である。
【００４２】
図７に示すように、管理画面３２には、ディスク装置（ドライブ）の状態を示すドライブマップ、ＲＡＩＤグループ管理テーブルＴｂ１を示すＲＡＩＤグループリスト、各種設定ボタンを含むＲＡＩＤグループ管理ウィンドウが表示される。ＲＡＩＤグループ管理ウィンドウでは、ＲＡＩＤグループリストを通じて、各ＲＡＩＤグループのＲＡＩＤレベル、保証コードの有無等を確認することができる。ＲＡＩＤグループの作成にあたっては、ＲＡＩＤグループを構成するためのディスク装置Ｄが選択される。例えば、図７の例では、ドライブマップ上において、ＲＡＩＤグループを生成するためにディスク装置Ｄ００〜Ｄ０５が選択されており、この状態で「ＲＧ作成」ボタンが押下されると、図８に示すＲＡＩＤグループ作成ウィンドウがポップアップ表示される。図８に示すＲＡＩＤグループ作成ウィンドウでは、作成するＲＡＩＤのレベル、保証コードを付すか否かの選択が行われる。図８の例では、ＲＡＩＤレベルはＲＡＩＤ５に設定され、保証コードは有りに設定されている。
【００４３】
次に、作成されたＲＡＩＤグループについて、論理ユニットの作成が実行される。図９に示すように、管理画面３２には、ＲＡＩＤグループにおける論理ユニットの状態を示すＬＵマップ、ＲＡＩＤグループ管理テーブルＴｂ１を示すＲＡＩＤグループリスト、論理ユニット管理テーブルＴｂ２を示すＬＵリスト、各種設定ボタンを含む論理ユニット管理ウィンドウが表示される。論理ユニット管理ウィンドウでは、ＲＡＩＤグループリストを通じて、各ＲＡＩＤグループのＲＡＩＤレベル、保証コードの有無等を確認、ＬＵマップおよびＬＵリストを通じて論理ユニットの設定の確認を行うことができる。図９の例では、ＲＡＩＤグループ００３には、既に３００ＧＢの使用容量が割り当てられた論理ユニット０００１、８００ＧＢの使用容量が割り当てられた論理ユニット０００２が形成されている。
【００４４】
論理ユニット（ＬＵ）の作成にあたっては、論理ユニットを作成するＲＡＩＤグループが選択される。例えば、図９の例では、ＲＡＩＤグループリスト上において、００３のＲＡＩＤグループが選択されており、この状態で「ＬＵ作成」ボタンが押下されると、図１０に示す論理ユニット作成ウィンドウがポップアップ表示される。図１０に示すＲＡＩＤグループ作成ウィンドウでは、作成する論理ユニットの番号（ＬＵＮ）および使用容量、論理ユニットのフォーマットの有無、作成される論理ユニットを担当するディスクアレイコントローラの設定・選択が行われる。図１０の例では、ＬＵＮは０００３に、使用容量は１２０ＧＢに、ＬＵフォーマットは有り、担当ディスクアレイコントローラは０設定されている。
【００４５】
図１１〜１３を参照して、ＲＡＩＤグループを構成する複数のディスク装置Ｄ００〜Ｄ０５における各データブロックｄi、パリティブロックＰ、保証コードブロックＲの格納状態、保証コードブロックの具体例について説明する。図１１はＲＡＩＤグループを構成する複数のディスク装置における各データブロックｄi、パリティブロックＰ、保証コードブロックＲの格納状態を示す説明図である。図１２は保証コードブロックＲに含まれる、各データブロック、パリティブロックに対応する保証コードサブブロックを概念的に示す説明図である。図１３は保証コードサブブロックの構成を概念的に示す説明図である。
【００４６】
図１１に示すように、各ディスク装置Ｄ００〜Ｄ０５には、複数の同一容量の格納領域ＳＢ（ブロック／セクタ）が含まれており、ＲＡＩＤグループを構成するディスク装置Ｄ００〜Ｄ０５の各格納領域ＳＢの集合は、全てのディスク装置Ｄ００〜Ｄ０５にわたる単位格納列ＳＬ（ストライプ列）を構成する。ストライプ列ＳＬを構成する各ディスク装置Ｄ００〜Ｄ０５の各格納領域ＳＢには、データブロックｄ１、ｄ２、ｄ３、ｄ４、パリティブロックＰ、保証コードブロックＲがそれぞれ格納されている。図１１に示すＲＡＩＤグループのＲＡＩＤレベルはＲＡＩＤ５であり、パリティブロックＰが各ディスク装置Ｄ００〜０５に分散されている。一方、保証コードブロックは、データブロックｄiが格納されるディスク装置Ｄ００〜Ｄ０４とは異なる、１つのディスク装置Ｄ０５に集約されている。
【００４７】
図１２に示すように、保証コードブロックＲは、各格納領域ＳＢに格納されているデータブロックｄ１〜ｄ４に対応する保証コードサブブロックｒ１〜ｒ４、パリティブロックＰに対応する保証コードサブブロックｒＰを含んでいる。空き領域はＬＵフォーマット時に初期化されているので、例えば、０の値を示す、不定値を示すことはない。
【００４８】
保証コードＲの各保証コードサブブロックｒ１〜ｒ４、ｒＰは、図１３に示すように、各データブロックが格納されているアドレス、すなわち、各ディスク装置Ｄに格納されている各データブロックにアクセスするためのアドレスの正しさを保証する位置保証情報、例えば、論理アドレス（ＬＡ）、論理ブロックアドレス（ＬＢＡ）、およびデータブロックの内容の正しさを保証する情報（データ保証情報）、例えば、水平パリティデータ（ＬＲＣ）、垂直パリティデータ（ＶＲＣ）を含んでいる。論理アドレスは論理ユニット上の格納（アクセス）位置を示すアドレスであり、論理ブロックアドレスは論理ユニット上のブロック（セクタ）のアクセス位置を示すアドレスである。水平パリティデータ、垂直パリティデータは、周知の演算手法によって算出される誤り検出および誤り訂正に用いられる情報であり、１セクタが５１２バイトの場合には、例えば、データブロックを４バイト毎に１２８段垂直方向に積み上げて、各列毎にあるいは各行毎に排他的論理和を取ることで算出される。
【００４９】
パリティブロックＰは、各ストライプ列ＳＬに含まれる各データブロックｄ１〜ｄ４の排他的論理和を算出することによって得られる。
【００５０】
図１４を参照して第１の実施例に係るディスクアレイ装置１０におけるデータの書き込み（更新）処理について説明する。図１４は第１の実施例に係るディスクアレイ装置におけるデータ書き込み処理において実行される処理ルーチンを示すフローチャートである。
【００５１】
図１４に示すフローチャートは、ＣＰＵ１１０が実行するコマンド処理プログラムＰｒ１によって、ホスト２０〜２２から受信したコマンドが書き込みコマンドであると解釈（判定）された場合に実行される。
【００５２】
ＣＰＵ１１０は、ホスト２０〜２２からコマンドを受信すると、コマンド処理プログラムＰｒ１を実行して、受信したコマンドが保証コード有りの論理ユニット（ＬＵ）へのアクセスを要求するコマンドであるか否かを判定し（ステップＳ１００）、保証コード有り論理ユニット（ＬＵ）へのアクセスが要求されていると判定した場合には（ステップＳ１００：Ｙｅｓ）、メモリ１１１上にキャッシュバッファ１１７を確保して、ホスト２０〜２２からデータを受信する（ステップＳ１０１）。
【００５３】
ＣＰＵ１１０は、受け取ったデータまたは残りのデータは１ストライプ列ＳＬ分であるか否かを判定する（ステップＳ１０２）。すなわち、キャッシュバッファ１１７上に残っているデータのサイズが、１ストライプ列ＳＬのサイズ以上か否かが判断される。
【００５４】
ＣＰＵ１１０は、キャッシュバッファ１１７上のデータが１ストライプ列ＳＬ分であると判定した場合には（ステップＳ１０２：Ｙｅｓ）、受け取ったデータから生成されるデータブロックを用いて新しいパリティブロックを計算する（ステップＳ１０５）。具体的には、生成されたデータブロックから１ストライプ列ＳＬに対応する数のデータブロックが取得され、取得されたデータブロックを用いてパリティブロックＰが計算される。本実施例では、１ストライプ列ＳＬに格納されるデータブロック数は４つであるから、４つのデータブロックｄ１〜ｄ４を用いてパリティブロックＰが計算される。
【００５５】
ＣＰＵ１１０は、キャッシュバッファ１１７上のデータが１ストライプ列ＳＬ分に満たないと判定した場合には（ステップＳ１０２：Ｎｏ）、新しいデータ（データブロック）に対応する旧データ（データブロック）、旧パリティブロックＰo、旧保証コードブロックＲoをキャッシュバッファ１１７に読み出す（ステップＳ１０４）。受け取ったデータのサイズが１ストライプ列ＳＬのサイズに満たない場合、あるいは、数回の書き込み処理の後に１ストライプ列ＳＬ分に満たないデータブロックが残っている場合が該当する。ＣＰＵ１１０は、キャッシュバッファ１１７上に読み出した旧データブロックｄo、旧パリティブロックＰoおよび新データブロックｄnを用いて新パリティブロックＰnを計算する（ステップＳ１０３）。
【００５６】
ＣＰＵ１１０は、新データブロックｄn（１ストライプ列ＳＬ分または所定数）、新パリティブロックＰn、１ストライプ列ＳＬ分に満たないと判断された場合には加えて旧保証コードブロックＲｏを用いて新たな保証コードブロックＲnを生成する（ステップＳ１０５）。具体的には、ＣＰＵ１１０は、データに付随する格納位置情報から論理アドレス（ＬＡ）の先頭位置に対するオフセット値を読み出して、論理アドレス（ＬＡ）を算出し、新データブロックｄn、新パリティブロックＰnの水平パリティ（ＬＲＣ）を算出する。
【００５７】
ＣＰＵ１１０は、算出された論理アドレス（ＬＡ）に新たなデータブロックｄnを書き込み（ステップＳ１０６）、新たなパリティブロックＰnを書き込み（ステップＳ１０７）、新たな保証コードブロックＲnを保証コードディスク装置Ｄ０５に書き込む（ステップＳ１０８）。
【００５８】
ＣＰＵ１１０はキャッシュバッファ１１７上の全てのデータに対して書き込み処理を完了したか否かを判定し（ステップＳ１０９）、キャッシュバッファ１１７上にデータが残っていると判定した場合には（ステップＳ１０９：Ｎｏ）、ステップＳ１０２〜ステップＳ１０８を繰り返し実行する。ＣＰＵ１１０は、キャッシュバッファ１１７上のデータが全て書き込まれたと判定した場合には（ステップＳ１０９：Ｙｅｓ）、キャッシュバッファ１１７を解放し、ホスト２０〜２２に対してコマンドを正常終了した旨のステータスを返して（ステップＳ１１０）、本処理ルーチンを終了する。
【００５９】
なお、ステップＳ１００において、保証コード有りの論理ユニットへのアクセスは要求されていないと判定した場合には（ステップＳ１００：Ｎｏ）、通常のＲＡＩＤ処理が実行される（ステップＳ１１１）。ＲＡＩＤ処理においては、受け取ったデータを複数のデータブロックｄにストライピング（分割）し、データブロックｄからパリティブロックＰを求め、対応するディスク装置に対して書き込み処理が実行される。なお、ＲＡＩＤ処理は、周知の技術であるから、詳細な説明については省略する。
【００６０】
なお、ディスク装置Ｄに対して最初にデータを書き込む際にも、上述の処理と同様にして書き込み処理が実行される。例えば、各ディスク装置Ｄには、フォーマット処理（初期化）によって「０」が書き込まれており、パリティブロックＰには、１（偶数パリティ）または０（奇数パリティ）が書き込まれている。
【００６１】
図１５〜図１７を参照して第１の実施例に係るディスクアレイ装置１０におけるデータの読み出し処理について説明する。図１５は第１の実施例に係るディスクアレイ装置におけるデータ読み出し処理において実行される処理ルーチンを示すフローチャートである。図１６は第１の実施例に係るディスクアレイ装置における保証コードチェック処理において実行される処理ルーチンを示すフローチャートである。図１７は第１の実施例に係るディスクアレイ装置におけるパリティチェック処理において実行される処理ルーチンを示すフローチャートである。
【００６２】
図１５に示すフローチャートは、ＣＰＵ１１０が実行するコマンド処理プログラムＰｒ１によって、ホスト２０〜２２から受信したコマンドが読み出しコマンドであると解釈（判定）された場合に実行される。
【００６３】
ＣＰＵ１１０は、ホスト２０〜２２からコマンドを受信すると、コマンド処理プログラムＰｒ１を実行して、受信したコマンドが保証コード有りの論理ユニット（ＬＵ）へのアクセスを要求するコマンドであるか否かを判定し（ステップＳ２００）、保証コード有り論理ユニット（ＬＵ）へのアクセスが要求されていると判定した場合には（ステップＳ２００：Ｙｅｓ）、要求されているデータに対応するデータブロックｄiがキャッシュバッファ１１７上に存在するか否かを判定する（ステップＳ２０１）。すなわち、キャッシュヒットの有無が判定される。例えば、先の処理において同一のデータが読み出され、キャッシュバッファ１１７上に該当データが残っている場合には、ディスク装置Ｄにアクセスするよりも高速に要求されているデータを読み出すことができる。ＣＰＵ１１０は、キャッシュバッファ１１７上に読み出されたデータ（データブロックｄi）の格納先論理アドレスの情報を有しているので、要求されているデータがキャッシュバッファ１１７上に存在するか否かを判定することができる。
【００６４】
ＣＰＵ１１０は、要求されているデータに対応するデータブロックｄiがキャッシュバッファ１１７上に存在すると判定した場合には（ステップＳ２０１：Ｙｅｓ）、ホスト２０〜２２に対して読み出したデータブロックからデータを形成して、要求されているデータと正常終了のステータスを返して（ステップＳ２０２）、本処理ルーチンを終了する。
【００６５】
ＣＰＵ１１０は、要求されているデータに対応するデータブロックｄiがキャッシュバッファ１１７上に存在しないと判定した場合には（ステップＳ２０１：Ｎｏ）、読み出しが要求されているデータは、１ストライプ列ＳＬ分のデータであるか否かを判定する（ステップＳ２０３）。すなわち、読み出しが要求されているデータのサイズが、１ストライプ列ＳＬ以上か否かが判断される。
【００６６】
ＣＰＵ１１０は、読み出しが要求されているデータが１ストライプ列ＳＬ分のデータではないと判定した場合には（ステップＳ２０３：Ｎｏ）、保証コードチェック処理を実行する（ステップＳ２０４）。一方、ＣＰＵ１１０は、読み出しが要求されているデータが１ストライプ列ＳＬ分のデータであると判定した場合には（ステップＳ２０３：Ｙｅｓ）、パリティチェック処理を実行する（ステップＳ２０５）。保証コードチェック処理およびパリティチェック処理については、図１６および図１７を参照して詳述する。
【００６７】
ＣＰＵ１１０は、保証コードチェック処理またはパリティチェック処理が終了すると、読み出し処理が正常に終了したか否かを判定し（ステップＳ２０６）、正常に終了したと判定した場合には（ステップＳ２０６：Ｙｅｓ）、要求されたデータ（全てのデータブロック）をキャッシュバッファ１１７上に読み出したか否かを判定する（ステップＳ２０７）。ＣＰＵ１１０は、要求されたデータを全てキャッシュバッファ１１７上に読み出したと判定した場合には（ステップＳ２０７：Ｙｅｓ）、ステップＳ２０２に移行し、本処理ルーチンを終了する。
【００６８】
ＣＰＵ１１０は、要求されたデータを全てキャッシュバッファ１１７上に読み出していないと判定した場合には（ステップＳ２０７：Ｎｏ）、ステップＳ２０３〜ステップＳ２０６の処理を繰り返し実行する。
【００６９】
ＣＰＵ１１０は、ステップＳ２０６において、読み出し処理が正常に終了しなかったと判定した場合には（ステップＳ２０６：Ｎｏ）、ホスト２０〜２２に対してエラー終了のステータスを返して（ステップＳ２０８）、本処理ルーチンを終了する。
【００７０】
ＣＰＵ１１０は、ステップＳ２００において、保証コード有り論理ユニット（ＬＵ）へのアクセスが要求されていないと判定した場合には（ステップＳ２００：Ｎｏ）、通常のＲＡＩＤ処理を実行する（ステップＳ２１０）。通常のＲＡＩＤ処理では、読み出したデータブロックｄiとパリティブロックＰとを用いて読み出したデータブロックの誤りが判定され、キャッシュバッファ１１７上に要求されたデータに対応するデータブロックｄiが全て読み出されると、要求されたデータとしてホストに返される。
【００７１】
図１６を参照して保証コードチェック処理について説明する。ＣＰＵ１１０は、読み出しの対象となる対象データブロックｄi、対応保証コードブロックＲをディスク装置Ｄから読み出す（ステップＳ３００）。このとき、ＣＰＵ１１０は、ホストから読み出しが要求されたデータの格納位置を示すオフセット値を用いて論理アドレス（ＬＡ）を算出し、対象データブロックｄiの格納位置を特定する。また、ＣＰＵ１１０は、算出により求めた論理アドレス（ＬＡ）を保持しておく。
【００７２】
ＣＰＵ１１０は、読み出したデータブロックｄiを用いて水平パリティＬＲＣを算出し（ステップＳ３０１）、対応する保証コードブロックＲからｒiのＬＡとＬＲＣを抽出する（ステップＳ３０２）。ＣＰＵ１１０は、変換により求めた読み出し先ＬＡとｒiのＬＡとが一致するか否かを判定し（ステップＳ３０３）、一致すると判定した場合には（ステップＳ３０３：Ｙｅｓ）、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致するか否かを判定する（ステップＳ３０４）。ＣＰＵ１１０は、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致すると判定した場合には（ステップＳ３０４：Ｙｅｓ）、読み出したデータブロックｄiは正しいと判定して、正常終了のステータスを残し（ステップＳ３０５）、本処理ルーチンを終了する。
【００７３】
ＣＰＵ１１０は、計算により求めた読み出し先ＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ３０３：Ｎｏ）、あるいは、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致しないと判定した場合には（ステップＳ３０４：Ｎｏ）、読み出したデータブロックｄiが含まれる同一のストライプ列ＳＬの未読データブロックとパリティブロックＰとからデータブロックｄiを訂正（回復）する（ステップＳ３０６）。具体的には、未読データブロックとパリティブロックＰの排他的論理和を求めることにより実行される。
【００７４】
ＣＰＵ１１０は、訂正したデータブロックｄiからｒiを生成し、保証コードブロックRを訂正し（ステップＳ３０７）、訂正されたデータブロックｄiと保証コードブロックRを該当ディスクの該当論理アドレスに書き込んで（ステップＳ３０８）、正常終了のステータスを残し（ステップＳ３０５）、本処理ルーチンを終了する。なお、データブロックｄiおよび保証コードブロックＲの双方を訂正するのは、データブロックｄiまたは保証コードブロックＲのいずれかが誤っているために、ステップＳ３０３、３０４における両者のＬＡまたはＬＲＣの不一致に帰結するからである。
【００７５】
図１７を参照してパリティチェック処理について説明する。ＣＰＵ１１０は、対象となるストライプ列ＳＬの全データブロックｄi（ｄ１〜ｄ４）、対応するパリティブロックＰを読み出し（ステップＳ４００）、読み出したデータブロックｄ１〜ｄ４を用いてパリティブロックＰ'を算出する（ステップＳ４０１）。このとき、ＣＰＵ１１０は、ホストから読み出しが要求されたデータの格納位置を示すオフセット値を用いて論理アドレス（ＬＡ）を算出し、対象データブロックｄiの格納位置を特定する。ＣＰＵ１１０は、読み出した全てのデータブロックｄiについて、読み出し時に算出した論理アドレス（ＬＡ）を保持しておく。ＣＰＵ１１０は、読み出しパリティブロックＰと算出パリティブロックＰ'とが等しいか否かを判定し（ステップＳ４０２）、Ｐ＝Ｐ'であると判定した場合には（ステップＳ４０２：Ｙｅｓ）、読み出したデータブロックｄ１〜ｄ４は正しいものとして、正常終了のステータスを残し（ステップＳ４０３）、本処理ルーチンを終了する。
【００７６】
ＣＰＵ１１０は、読み出しパリティブロックＰと算出パリティブロックＰ'とが等しくないと判定した場合には（ステップＳ４０２：Ｎｏ）、対応する保証コードブロックＲを読み出し（ステップＳ４０４）、ｉ＝１とする（ステップＳ４０５）。読み出しパリティブロックＰと算出パリティブロックＰ'とが等しくない場合には、パリティブロックＰとデータブロックｄiのいずれかが誤っているので、保証コードブロックＲを用いてデータブロックｄiが正しいか否かを判定する。なお、ｉは１ストライプ列ＳＬに含まれるデータブロックｄiの番号であり、本実施例では１〜４の整数値である。
【００７７】
ＣＰＵ１１０は、保証コードブロックＲからｒiに格納されていたＬＡとＬＲＣを抽出し（ステップＳ４０６）、データブロックｄiのＬＡとｒiのＬＡとが一致するか否かを判定する（ステップＳ４０７）。ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致すると判定した場合には（ステップＳ４０７：Ｙｅｓ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致するか否かを判定する（ステップＳ４０８）。
【００７８】
ＣＰＵ１１０は、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致すると判定した場合には（ステップＳ４０８：Ｙｅｓ）、ｉを１つインクリメント（ｉ＝ｉ＋１）して（ステップＳ４０９）、ｉ＝ｎであるか否かを判定する（ステップＳ４１０）。すなわち、全てのデータブロックｄiについてチェックが完了したか否かを判定する。ここで、本実施例ではｉは４までであるので、ｎはｉ＋１に等しい５が指定される。
【００７９】
ＣＰＵ１１０は、ｉ＝ｎである、すなわち、全てのデータブロックｄiについてチェックが完了した、と判定した場合には（ステップＳ４１０：Ｙｅｓ）、チェックしたデータブロックｄi（ｄ１〜ｄ４）を用いてパリティブロックＰを訂正する（ステップＳ４１１）。データブロックｄiのＬＡおよびＬＲＣとｒiのＬＡおよびＬＲＣとが一致する場合には、データブロックｄiは全て正常であることになる。したがって、正常なデータブロックｄiを用いてパリティブロックＰを訂正する。
【００８０】
ＣＰＵ１１０は、訂正したパリティブロックＰを用いてｒＰを生成し、保証コードブロックＲを訂正する（ステップＳ４１２）。すなわち、パリティブロックＰを用いてＬＡおよびＬＲＣを算出し、誤ったパリティブロックＰによって生成されていたおそれのある保証コードブロックＲを正常なパリティブロックＰによって生成されたｒＰを用いてを用いて訂正する。
【００８１】
ＣＰＵ１１０は、訂正されたパリティブロックＰおよび保証コードブロックＲを、ＬＡに従って、ディスク装置Ｄの所定の格納位置に書き込み（ステップＳ４１３）、正常終了のステータスを残し（ステップＳ４０３）、本処理ルーチンを終了する。
【００８２】
ＣＰＵ１１０は、保持したＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ４０７：Ｎｏ）、あるいは、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致しないと判定した場合には（ステップＳ４０８：Ｎｏ）、読み出したデータブロックｄiが含まれる同一のストライプ列ＳＬの他データブロックとパリティブロックＰとからｄiを訂正する（ステップＳ３０６）。具体的には、他データブロックとパリティブロックＰの排他的論理和を求めることにより実行される。保持したＬＡとｒiのＬＡとが一致しない、あるいは、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致しない場合には、読み出したデータブロックｄiが誤っていることを意味するので、パリティブロックＰおよび同一ストライプ列ＳＬに属する他のデータブロックを用いてデータブロックｄiを訂正する。
【００８３】
ＣＰＵ１１０は、訂正したｄiからｒiを生成して保証コードブロックＲを訂正し（ステップＳ４１５）、訂正されたデータブロックｄiと保証コードブロックＲとをＬＡに従って、ディスク装置Ｄの所定の格納位置に書き込み（ステップＳ４１３）、正常終了のステータスを残し（ステップＳ４０３）、本処理ルーチンを終了する。
【００８４】
以上説明したように、本発明の第１の実施例に係るディスクアレイ装置１０によれば、各ストライプ列ＳＬは、データブロックｄiおよびパリティブロックＰに加えて、データブロックｄiの格納位置（ＬＡ）およびデータブロックｄiの正確さを検証するための保証コードブロックＲを含むので、データブロックが誤ったアドレスに記録された場合や、データブロックが化けた状態で記録された場合といった、誤りを検出することができる。すなわち、従来のＲＡＩＤシステムにおける、読み出し／書き込みを正常に実行できる場合には、データブロックｄiの誤りを検出し、訂正することができないという問題を解決することができる。
【００８５】
また、保証コードブロックＲは、データブロックｄiを格納するディスク装置Ｄとは異なるディスク装置Ｄに格納されるので、セクタ長が固定されているセクタ長固定ディスク装置によって構成されるディスクアレイ装置１０にも適用することができる。
【００８６】
さらに、保証コードブロックＲを用いることで、誤りがデータブロックｄiとパリティブロックＰのいずれにおいて発生しているかを特定することができると共に、発生した誤りを訂正することができる。したがって、ディスクアレイ装置１０の信頼性を向上させることができると共に、データの正確さを保証することができる。
【００８７】
・変形例：
図１８および図１９を参照して第１の実施例に係るディスクアレイ装置１０の変形例について説明する。図１８は変形例におけるＲＡＩＤグループを構成する複数のディスク装置における各データブロックｄi、パリティブロックＰ、保証コードブロックＲの格納状態を示す説明図、図１９は図１８に示すＲＡＩＤグループに対応するＲＡＩＤグループ管理テーブルの一例を示す説明図である。
【００８８】
上記第１の実施例では、保証コードブロックＲは、保証コードブロックＲを格納する専用のディスク装置Ｄに格納されていたが、パリティブロックＰと同様にして、複数のディスク装置Ｄに分散格納するようにしても良い。かかる場合、ＲＡＩＤグループ管理テーブルからは、保証コードドライブの項目が消える。
【００８９】
この変形例に示すように、保証コードブロックＲを複数のディスク装置Ｄに分散格納することによって、保証コードブロックＲへのアクセスを分散して、並列アクセスによる高速化を図ることができる。すなわち、保証コードブロックＲが特定のディスク装置Ｄに格納されている場合には、異なるストライプ列ＳＬに属するデータブロックｄiへのアクセスが実行される場合、データブロックｄiについては並行してアクセスできるものの、同一のディスク装置Ｄに格納されている保証コードブロックＲへのアクセスは順番待ちとなってしまい、ボトルネックとなってしまう。これに対して、本変形例に示すように保証コードブロックＲを複数のディスク装置Ｄに分散格納すれば、データブロックｄiに対するアクセスと同様にして並列アクセスが可能となる。
【００９０】
・第２の実施例：
図２０〜２２を参照して第２の実施例に係るディスクアレイ装置の制御方法について説明する。図２０は第２の実施例における保証コードブロックの構成を概念的に示す説明図、図２１は第２の実施例に係るディスクアレイ装置における保証コードチェック処理において実行される処理ルーチンを示すフローチャートである。図２２は第２の実施例に係るディスクアレイ装置におけるパリティチェック処理において実行される処理ルーチンを示すフローチャートである。なお、第１の実施例において図１６および１７を用いて説明済みのステップについては、一部図示を省略した。
【００９１】
第２の実施例に係るディスクアレイ装置は、図２０に示すように、保証コードブロックＲを構成する保証コードサブブロックｒiおよびｒＰについて保証コードチェックコード（第２のデータ保証情報、例えば、ＬＲＣ）を有する点で第１の実施例に係るディスクアレイ装置１０と異なる。但し、ディスクアレイ装置の構成は同一であるから同一の符号を付すことでディスクアレイ装置の構成の説明は省略する。
【００９２】
図２１を参照して  第２の実施例における保証コードチェック処理について説明する。なお、ステップＳ３００〜ステップＳ３０５までは第１の実施例における保証コードチェック処理と同様の処理が行われるのでその説明を省略する。
【００９３】
ＣＰＵ１１０は、計算により求めた読み出し先ＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ３０３：Ｎｏ）、あるいは、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致しないと判定した場合には（ステップＳ３０４：Ｎｏ）、保証コードブロックＲの保証コードを検査する（ステップＳ３０１０）。すなわち、データブロックｄiまたは保証コードブロックＲのいずれかに異常（誤り）が発生したので、誤りを訂正する処理を実行する。具体的には、保証コードサブブロックｒi（ｒ１〜ｒ４）およびｒＰを用いて算出した保証コードチェックコード（ＬＲＣ）と保証コードブロックＲに格納されている保証コードチェックコード（ＬＲＣ）とが一致するか否かを判定する。
【００９４】
ＣＰＵ１１０は、保証コードブロックＲは正常である、すなわち、保証コードサブブロックｒi（ｒ１〜ｒ４）およびｒＰを用いて算出した保証コードチェックコード（ＬＲＣ）と保証コードブロックＲに格納されている保証コードチェックコード（ＬＲＣ）とが一致すると判定した場合には（ステップＳ３０１１：Ｙｅｓ）、読み出したデータブロックｄiが含まれる同一のストライプ列ＳＬの他データブロックとパリティブロックＰとからｄiを訂正する（ステップＳ３０１２）。具体的には、他データブロックとパリティブロックＰの排他的論理和を求めることにより実行される。
【００９５】
ＣＰＵ１１０は、訂正されたデータブロックｄiを該当ディスクの該当論理アドレスに書き込んで（ステップＳ３０１３）、正常終了のステータスを残し（ステップＳ３０５）、本処理ルーチンを終了する。
【００９６】
ＣＰＵ１１０は、保証コードブロックＲは正常でないと判定した場合には（ステップＳ３０１１：Ｎｏ）、同一ストライプ列ＳＬの他のデータブロックとパリティブロックＰを読み出し（ステップＳ３０１４）、データブロックｄ１〜ｄ４を用いてパリティブロックＰ'を算出する（ステップＳ３０１５）。ＣＰＵ１１０は、読み出したパリティブロックＰと算出したパリティブロックＰ'とが等しいか否かを判別し（ステップＳ３０１６）、Ｐ＝Ｐ'であると判別した場合には（ステップＳ３０１６：Ｙｅｓ）、データブロックｄｉとパリティブロックＰとから保証コードブロックＲを訂正する（ステップＳ３０１７）。すなわち、読み出したデータブロックｄiは正常であり、保証コードブロックＲに誤りが発生している場合が該当する。データブロックｄｉが正常であることは、パリティブロックＰとＰ'とを比較することで確認することができる。保証コードブロックＲの訂正は、具体的には、各データブロックｄｉとパリティブロックＰを用いて保証コードサブブロックｒｉ、ｒＰを再計算し、さらに、ｒｉ、ｒＰより保証コードブロックＲの保証コードチェックコード（ＬＲＣ）を再計算することにより実行される。ＣＰＵ１１０は、訂正された保証コードブロックＲを該当ディスクの該当論理アドレスに書き込んで（ステップＳ３０１８）、正常終了のステータスを残し（ステップＳ３０５）、本処理ルーチンを終了する。一方、ＣＰＵ１１０は、パリティブロックＰとＰ'とが等しくない場合には（ステップＳ３０１６：Ｎｏ）、保証コードブロックＲが誤っているのか、ホストから要求されたデータブロックｄｉが誤っているのか、あるいは、データブロックｄｉは正しいものの、同一ストライプ列ＳＬの他のデータブロックが誤っているのか、誤りの箇所を特定することができないので、エラー終了のステータスを残し（ステップＳ３０１９）、本処理ルーチンを終了する。
【００９７】
図２２を参照して第２の実施例におけるパリティチェック処理について説明する。なお、ステップＳ４００〜ステップＳ４０４までは第１の実施例におけるパリティチェック処理と同様の処理が行われるのでその説明を省略する。
【００９８】
ＣＰＵ１１０は、対応する保証コードブロックＲを読み出し（ステップＳ４０４）、保証コードブロックＲの保証コードを検査する（ステップＳ４０１０）。ＣＰＵ１１０は、保証コードブロックＲは正常である、すなわち、保証コードサブブロックｒi（ｒ１〜ｒ４）およびｒＰを用いて算出した保証コードチェックコード（ＬＲＣ）と保証コードブロックＲに格納されている保証コードチェックコード（ＬＲＣ）とが一致すると判定した場合には（ステップＳ４０１１：Ｙｅｓ）、ｉ＝１、カウンタＣｎｔ＝０、変数Ｋ＝"  "とする（ステップＳ４０１２）。ここで、ｉは１ストライプ列ＳＬに含まれるデータブロックｄiの番号であり、本実施例では１〜４の整数値である。また、カウンタＣｎｔは誤りが発生したデータブロックの数をカウントする変数であり、変数Ｋは誤りが発生したブロックを格納する変数である。
【００９９】
一方、ＣＰＵ１１０は、保証コードブロックＲは正常でないと判定した場合には（ステップＳ４０１１：Ｎｏ）、保証コードブロックＲを用いてデータブロックｄiに生じている誤り（異常）を検出することができない、すなわち、データブロックｄiが正常であるか否かを判定することができないので、ステップＳ４０１９に移行して本処理ルーチンを終了する。
【０１００】
ＣＰＵ１１０は、保証コードブロックＲからｒiのＬＡとＬＲＣを抽出し（ステップＳ４０１３）、データブロックｄiのＬＡとｒiのＬＡとが一致するか否かを判定する（ステップＳ４０１４）。ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致すると判定した場合には（ステップＳ４０１４：Ｙｅｓ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致するか否かを判定する（ステップＳ４０１５）。
【０１０１】
ＣＰＵ１１０は、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致すると判定した場合には（ステップＳ４０１５：Ｙｅｓ）、ｉを１つインクリメント（ｉ＝ｉ＋１）する（ステップＳ４０１６）。
【０１０２】
ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ４０１４：Ｎｏ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致しないと判定した場合（ステップＳ４０１５：Ｎｏ）には、データブロックｄiに誤り（データ化け）が発生しているので、変数Ｋに該当データブロックｄiを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ４０１７）。ＣＰＵ１１０は、カウンタＣｎｔが２より小さい、すなわち、０または１であるか否かを判定し（ステップＳ４０１８）、カウンタＣｎｔが２より小さいと判定した場合には（ステップＳ４０１８：Ｙｅｓ）、ステップＳ４０１６に移行する。
【０１０３】
一方、ＣＰＵ１１０は、カウンタＣｎｔが２以上であると判定した場合には（ステップＳ４０１８：Ｎｏ）、エラー終了のステータスを残し（ステップＳ４０１９）、本処理ルーチンを終了する。すなわち、本実施例において用いられているＲＡＩＤ５では、１つの誤りデータ（データ化け）までは訂正（訂正）可能であるから、誤りデータの数が２以上の場合には訂正は不可能となり、処理を終えてエラー終了する。
【０１０４】
ＣＰＵ１１０は、ｉを１つインクリメントした後、ｉ＝ｎであるか否かを判定する（ステップＳ４０２０）。すなわち、全てのデータブロックｄiについてチェックが完了したか否かを判定する。ここで、本実施例ではｉは４までであるので、ｎはｉ＋１に等しい５が指定される。
【０１０５】
ＣＰＵ１１０は、ｉ＝ｎでない、すなわち、全てのデータブロックｄiについてチェックが完了していない、と判定した場合には（ステップＳ４０２０：Ｎｏ）、ステップＳ４０１３〜ステップＳ４０１８を繰り返して実行する。ＣＰＵ１１０は、ｉ＝ｎである、すなわち、全てのデータブロックｄiについてチェックが完了した、と判定した場合には（ステップＳ４０２０：Ｙｅｓ）、パリティブロックＰを検査する（ステップＳ４０２１）。具体的には、保証コードブロックＲに含まれるパリティブロックｒＰに格納されているＬＡおよびＬＲＣと、パリティブロックＰを用いて算出したＬＡおよびＬＲＣとがそれぞれ一致するか否か判定される。
【０１０６】
ＣＰＵ１１０は、パリティブロックＰは誤っている、すなわち、パリティブロックｒＰに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣのいずれかが一致しない、と判定した場合には（ステップＳ４０２２：Ｎｏ）、変数ＫにパリティブロックＰを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ４０２３）。ＣＰＵ１１０は、カウンタＣｎｔが２より小さい、すなわち、０または１であるか否かを判定し（ステップＳ４０２４）、カウンタＣｎｔが２より小さいと判定した場合には（ステップＳ４０２４：Ｙｅｓ）、ステップＳ４０２５に移行する。
【０１０７】
一方、ＣＰＵ１１０は、カウンタＣｎｔが２以上であると判定した場合には（ステップＳ４０２４：Ｎｏ）、エラー終了のステータスを残し（ステップＳ４０１９）、本処理ルーチンを終了する。
【０１０８】
ＣＰＵ１１０は、パリティブロックＰは正常である、すなわち、パリティブロックｒＰに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致する、と判定した場合には（ステップＳ４０２２：Ｙｅｓ）、変数Ｋに格納されているブロックを計算によって訂正し（ステップＳ４０２５）、正常終了のステータスを残し（ステップＳ４０３）、本処理ルーチンを終了する。変数Ｋに格納されている異常なブロックがデータブロックｄiである場合には、同一ストライプ列ＳＬのパリティブロックＰ、他データブロックを用いて訂正が実行され、変数Ｋに格納されている異常なブロックがパリティブロックＰである場合には、同一ストライプ列ＳＬのデータブロックｄiを用いて訂正が実行さる。
【０１０９】
以上説明したように、第２の実施例に係るディスクアレイ装置１０によれば、保証コードブロックＲには、各保証コードサブブロックｒiおよびｒＰについての保証コードチェックコードを備えているので、保証コードブロックＲに発生している誤りを検出することができる。したがって、誤りデータの特定精度を向上させることができる。
【０１１０】
また、誤った保証コードブロックＲを用いて、正常なデータブロックｄiに誤りが発生していると誤検出する事象の発生を低減または排除することができる。さらに、誤った正常判断によって、誤ったデータを正常なデータとして返す事態を低減または排除することができる。
【０１１１】
・第３の実施例：
図２３〜図２７を参照して第３の実施例に係るディスクアレイ装置の制御方法について説明する。図２３は第３の実施例におけるＲＡＩＤグループを構成する複数のディスク装置における各データブロックｄi、パリティブロックＰ、Ｑ保証コードブロックＲの格納状態を示す説明図である。図２４は第３の実施例に係るディスクアレイ装置における書き込み処理において実行される処理ルーチンを示すフローチャートである。図２５は第３の実施例に係るディスクアレイ装置における保証コードチェック処理において実行される処理ルーチンを示すフローチャートである。図２６は第３の実施例に係るディスクアレイ装置におけるデータリカバリ処理において実行される処理ルーチンを示すフローチャートである。図２７は第３の実施例に係るディスクアレイ装置におけるパリティチェック処理において実行される処理ルーチンを示すフローチャートである。なお、第１の実施例において図１４〜１７を用いて説明済みのステップについては、一部図示を省略した。
【０１１２】
第３の実施例に係るディスクアレイ装置は、図２３に示すように、複数のディスク装置にパリティブロックＰ、Ｑが分散格納される、いわゆるデュアルパリティタイプのディスクアレイ装置であり、ＲＡＩＤレベルはＲＡＩＤ６である点で第１の実施例に係るディスクアレイ装置１０と異なる。また、保証コードブロックＲには、第２の実施例と同様にして保証コードチェックコードが含まれている。但し、ディスクアレイ装置の構成は同一であるから同一の符号を付すことでディスクアレイ装置の構成の説明は省略する。
【０１１３】
図２４を参照して第３の実施例における書き込み処理について説明する。なお、基本的な処理の流れは第１の実施例における書き込み処理と同様であり、相違点はパリティブロックＰに加えてパリティブロックＱを用いる点にあるので、相違点を中心に説明し、残りのステップには第１の実施例における書き込み処理の説明において用いたステップ番号を付してその説明を省略する。
【０１１４】
ＣＰＵ１１０は、本処理ルーチンを開始すると、ステップＳ１００〜Ｓ１０２を実行し、受け取ったデータまたは残りのデータは１ストライプ列ＳＬ分であるか否かを判定する（ステップＳ１０２）。
【０１１５】
ＣＰＵ１１０は、キャッシュバッファ１１７上のデータが１ストライプ列ＳＬ分に満たないと判定した場合には（ステップＳ１０２：Ｎｏ）、新しいデータ（データブロック）に対応する旧データ（データブロック）、旧パリティブロックＰo、Ｑo、旧保証コードブロックＲoをキャッシュバッファ１１７に読み出す（ステップＳ１０３０）。受け取ったデータのサイズが１ストライプ列ＳＬのサイズに満たない場合、あるいは、数回の書き込み処理の後に１ストライプ列ＳＬ分に満たないデータブロックが残っている場合が該当する。ＣＰＵ１１０は、キャッシュバッファ１１７上に読み出した旧データブロック、旧パリティブロックＰo、および新データブロックｄnを用いて新パリティブロックＰnを計算し、旧データブロック、旧パリティブロックQo、および新データブロックｄnを用いて新パリティブロックQnを計算する（ステップＳ１０４０）。
【０１１６】
ＣＰＵ１１０はステップＳ１０５およびＳ１０６を実行し、新パリティブロックＰn、Ｑnを所定のディスク装置Ｄのアドレス位置に書き込み（ステップＳ１０７０）、ステップＳ１０８〜Ｓ１１０を実行して本処理ルーチンを終了する。
【０１１７】
図２５を参照して保証コードチェック処理について説明する。なお、基本的な処理の流れは第１の実施例における保証コードチェック処理と同様であり、相違点はパリティブロックＰに加えてパリティブロックＱを用いる点、並びに保証コードチェックコードを用いる点にあるので、相違点を中心に説明し、残りのステップには第１の実施例における保証コードチェック処理の説明において用いたステップ番号を付してその説明を省略する。
【０１１８】
ＣＰＵ１１０は、本処理ルーチンを開始すると、ステップＳ３００〜Ｓ３０４を実行し、計算により求めた読み出し先ＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ３０３：Ｎｏ）、あるいは、読み出したデータブロックｄiから算出したＬＲＣとｒiのＬＲＣとが一致しないと判定した場合には（ステップＳ３０４：Ｎｏ）、保証コードブロックＲの保証コードサブブロックを検査する（ステップＳ３０２０）。すなわち、データブロックｄiまたは保証コードブロックＲのいずれかに異常（誤り）が発生したので、誤りを訂正する処理を実行する。具体的には、保証コードサブブロックｒi（ｒ１〜ｒ４）およびｒＰを用いて算出した保証コードチェックコード（ＬＲＣ）と保証コードブロックＲに格納されている保証コードチェックコード（ＬＲＣ）とが一致するか否かを判定する。
【０１１９】
ＣＰＵ１１０は、保証コードブロックＲは正常である、すなわち、保証コードサブブロックｒi（ｒ１〜ｒ４）およびｒＰ、ｒＱを用いて算出した保証コードチェックコード（ＬＲＣ）と保証コードブロックＲに格納されている保証コードチェックコード（ＬＲＣ）とが一致すると判定した場合には（ステップＳ３０２１：Ｙｅｓ）、読み出したデータブロックｄiが含まれる同一のストライプ列ＳＬの他データブロックとパリティブロックＰとからｄi'を算出する（ステップＳ３０２２）。具体的には、他データブロックとパリティブロックＰの排他的論理和を求めることにより実行される。
【０１２０】
ＣＰＵ１１０はさらに、読み出したデータブロックｄiが含まれる同一のストライプ列ＳＬの他データブロックとパリティブロックＱとからｄi''を算出する（ステップＳ３０２３）。Ｑにはいくつかの算出方法があり、例えば、他データブロックとパリティブロックＱのガロア体演算など、ステップＳ３０２２における算出式（単純な排他的論理和）とは異なる論理演算方法によって求められる。
【０１２１】
ＣＰＵ１１０は、パリティブロックＰを用いて算出されたデータブロックｄi'とパリティブロックＱを用いて算出されたデータブロックｄi''が一致するか否かを判定し（ステップＳ３０２４）、ｄi'＝ｄi''であると判定した場合には（ステップＳ３０２４：Ｙｅｓ）、算出されたデータブロックｄi'を訂正されたｄiとして該当ディスクの該当論理アドレスに書き込んで（ステップＳ３０２５）、正常終了のステータスを残し（ステップＳ３０５）、本処理ルーチンを終了する。
【０１２２】
ＣＰＵ１１０は、ステップＳ３０２４において、ｄi'＝ｄi''でないと判定した場合には（ステップＳ３０２４：Ｎｏ）、後述するデータリカバリ処理を実行する（ステップＳ３０２６）。すなわち、他のデータブロック、パリティブロックＰ、Ｑのいずれに誤りが発生しているか特定した後に、誤りを訂正する必要があるからである。
【０１２３】
ＣＰＵ１１０は、保証コードブロックＲは正常でないと判定した場合には（ステップＳ３０２１：Ｎｏ）、同一ストライプ列ＳＬの他のデータブロックとパリティブロックＰを読み出し（ステップＳ３０２７）、データブロックｄ１〜ｄ４を用いてパリティブロックＰ'を算出する（ステップＳ３０２８）。ＣＰＵ１１０は、読み出したパリティブロックＰと算出したパリティブロックＰ'とが等しいか否かを判別し（ステップＳ３０２９）、Ｐ＝Ｐ'であると判別した場合には（ステップＳ３０２９：Ｙｅｓ）、データブロックｄｉとパリティブロックＰとから保証コードブロックＲを訂正する（ステップＳ３０３０）。すなわち、読み出したデータブロックｄiは正常であり、保証コードブロックＲに誤りが発生している場合が該当する。データブロックｄｉが正常であることは、パリティブロックＰとＰ'とを比較することで確認することができる。保証コードブロックＲの訂正は、具体的には、各データブロックｄｉとパリティブロックＰを用いて保証コードサブブロックｒｉ、ｒＰを再計算し、さらに、ｒｉ、ｒＰより保証コードブロックＲの保証コードチェックコード（ＬＲＣ）を再計算することにより実行される。ＣＰＵ１１０は、訂正された保証コードブロックＲを該当ディスクの該当論理アドレスに書き込んで（ステップＳ３０３１）、正常終了のステータスを残し（ステップＳ３０５）、本処理ルーチンを終了する。一方、ＣＰＵ１１０は、パリティブロックＰとＰ'とが等しくない場合には（ステップＳ３０２９：Ｎｏ）、保証コードブロックＲが誤っているのか、ホストから要求されたデータブロックｄｉが誤っているのか、あるいは、データブロックｄｉは正しいものの、同一ストライプ列ＳＬの他のデータブロックが誤っているのか、誤りの箇所を特定することができないので、エラー終了のステータスを残し（ステップＳ３０３２）、本処理ルーチンを終了する。
【０１２４】
図２６を参照して第３の実施例におけるデータリカバリ処理について説明する。なお、保証コードチェック処理において誤りが検出されたデータブロックはデータブロックｄjであるとする（本実施例では、ｊ＝１〜４の整数値）。ＣＰＵ１１０は、ｉ＝１、カウンタＣｎｔ＝１、変数Ｋ[0]＝ｄｊ、Ｋ[1]＝"  "とする（ステップＳ５００）。ここで、ｉは１ストライプ列ＳＬに含まれるデータブロックｄiの番号であり、本実施例では１〜４の整数値である。また、カウンタＣｎｔは誤りが発生したデータブロックの数をカウントする変数であり、変数Ｋは誤りが発生したブロックを格納する変数であり、本実施例では２つの誤りデータを訂正することができるので２つ用いられる。なお、既に１つのデータブロックに誤りが発生しているので、１つめの変数Ｋ[0]は変数Ｋ[0]＝ｄｊとなり、カウンタＣｎｔ＝１とされる。
【０１２５】
ＣＰＵ１１０は、ｉ＝ｊであるか否かを判定し（ステップＳ５０１）、ｉ＝ｊであると判定した場合には（ステップＳ５０１：Ｙｅｓ）、ステップＳ５０６に移行する。すなわち、先の保証コードチェック処理において誤りが検出されたデータブロックｄjに該当するので、データブロックｄiの誤りを判定する処理を実行する必要がないからである。
【０１２６】
ＣＰＵ１１０は、ｉ＝ｊでないと判定した場合には（ステップＳ５０１：Ｎｏ）、保証コードブロックＲからｒiを抽出し（ステップＳ５０２）、抽出したｒiからＬＡとＬＲＣを抽出し（ステップＳ５０３）、データブロックｄiのＬＡとｒiのＬＡとが一致するか否かを判定する（ステップＳ５０４）。ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致すると判定した場合には（ステップＳ５０４：Ｙｅｓ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致するか否かを判定する（ステップＳ５０５）。
【０１２７】
ＣＰＵ１１０は、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致すると判定した場合には（ステップＳ５０５：Ｙｅｓ）、ｉを１つインクリメント（ｉ＝ｉ＋１）する（ステップＳ５０６）。
【０１２８】
ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ５０４：Ｎｏ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致しないと判定した場合（ステップＳ５０５：Ｎｏ）には、データブロックｄiに誤り（データ化け）が発生しているので、変数Ｋに該当データブロックｄiを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ５０７）。ここで、変数ＫはカウンタＣｎｔと関連付けられており、インクリメントされる前のカウンタＣｎｔの値が変数Ｋの番号となる。例えば、今回初めてデータブロックｄiの誤りが検出された場合、インクリメントされる前のカウンタＣｎｔの値はステップＳ５００に示すように１であるので、Ｋ[１]＝ｄiとなる。ＣＰＵ１１０は、カウンタＣｎｔが３より小さい、すなわち、０、１または２であるか否かを判定し（ステップＳ５０８）、カウンタＣｎｔが３より小さいと判定した場合には（ステップＳ５０８：Ｙｅｓ）、ステップＳ５０６に移行する。
【０１２９】
一方、ＣＰＵ１１０は、カウンタＣｎｔが３以上であると判定した場合には（ステップＳ５０８：Ｎｏ）、エラー終了のステータスを残し（ステップＳ５０９）、本処理ルーチンを終了する。すなわち、本実施例において用いられているＲＡＩＤ６では、２つの誤りデータ（データ化け）までは訂正（訂正）可能であるから、誤りデータの数が３以上の場合には訂正は不可能となり、処理を終えてエラー終了する。
【０１３０】
ＣＰＵ１１０は、ｉを１つインクリメントした後、ｉ＝ｎであるか否かを判定する（ステップＳ５１０）。すなわち、全てのデータブロックｄiについてチェックが完了したか否かを判定する。ここで、本実施例では、ｉは４までであるので、ｎにはｉ＋１に等しい５が指定される。
【０１３１】
ＣＰＵ１１０は、ｉ＝ｎでない、すなわち、全てのデータブロックｄiについてチェックが完了していない、と判定した場合には（ステップＳ５１０：Ｎｏ）、ステップＳ５０１〜ステップＳ５０８を繰り返して実行する。ＣＰＵ１１０は、ｉ＝ｎである、すなわち、全てのデータブロックｄiについてチェックが完了した、と判定した場合には（ステップＳ５１０：Ｙｅｓ）、パリティブロックＰおよびＱを検査する（ステップＳ５１１）。具体的には、保証コードブロックＲに含まれるパリティブロックｒＰ、ｒＱに格納されているＬＡおよびＬＲＣと、パリティブロックＰ、Ｑを用いて算出したＬＡおよびＬＲＣとがそれぞれ一致するか否か判定される。
【０１３２】
ＣＰＵ１１０は、パリティブロックＰは誤っているか否かを判定し（ステップＳ５１２）、パリティブロックＰは誤っている、すなわち、パリティブロックｒＰに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致しない、と判定した場合には（ステップＳ５１２：Ｎｏ）、変数ＫにパリティブロックＰを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ５１３）。ＣＰＵ１１０は、カウンタＣｎｔが３より小さい、すなわち、０、１または２であるか否かを判定し（ステップＳ５１４）、カウンタＣｎｔが３より小さいと判定した場合には（ステップＳ５１４：Ｙｅｓ）、ステップＳ５１５に移行する。
【０１３３】
一方、ＣＰＵ１１０は、カウンタＣｎｔが３以上であると判定した場合には（ステップＳ５１４：Ｎｏ）、エラー終了して（ステップＳ５０９）、本処理ルーチンを終了する。
【０１３４】
ＣＰＵ１１０は、パリティブロックＰは正常である、すなわち、パリティブロックｒＰに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致する、と判定した場合には（ステップＳ５１２：Ｙｅｓ）、ＣＰＵ１１０は、パリティブロックＱは誤っているか否かを判定する（ステップＳ５１５）。
【０１３５】
ＣＰＵ１１０は、パリティブロックＱは誤っている、すなわち、保証コードサブブロックｒＱに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致しない、と判定した場合には（ステップＳ５１５：Ｎｏ）、変数ＫにパリティブロックＱを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ５１６）。ＣＰＵ１１０は、カウンタＣｎｔが３より小さい、すなわち、０、１または２であるか否かを判定し（ステップＳ５１７）、カウンタＣｎｔが３より小さいと判定した場合には（ステップＳ５１７：Ｙｅｓ）、ステップＳ５１８に移行する。
【０１３６】
一方、ＣＰＵ１１０は、カウンタＣｎｔが３以上であると判定した場合には（ステップＳ５１７：Ｎｏ）、エラー終了して（ステップＳ５０９）、本処理ルーチンを終了する。
【０１３７】
ＣＰＵ１１０は、パリティブロックＱは正常である、すなわち、保証コードサブブロックｒＱに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致する、と判定した場合には（ステップＳ５１５：Ｙｅｓ）、変数Ｋに格納されているブロックを計算によって訂正し（ステップＳ５１８）、正常終了のステータスを残し（ステップＳ５１９）、本処理ルーチンを終了する。変数Ｋに格納されている異常なブロックがデータブロックｄiである場合には、正常なパリティブロックＰまたはＱと、他の正常なデータブロックを用いて訂正が実行され、変数Ｋに格納されている異常なブロックがパリティブロックＰまたはＱである場合には、正常なデータブロックを用いて訂正が実行される。
【０１３８】
図２７を参照して第３の実施例におけるパリティチェック処理について説明する。なお、ステップＳ４００〜ステップＳ４０４までは第１の実施例におけるパリティチェック処理と同様の処理が行われるのでその説明を省略する。
【０１３９】
ＣＰＵ１１０は、対応する保証コードブロックＲを読み出し（ステップＳ４０４）、保証コードブロックＲの保証コードチェックコードを検査する（ステップＳ４１１０）。すなわち、ＣＰＵ１１０は、保証コードブロックＲは正常である、すなわち、保証コードサブブロックｒi（ｒ１〜ｒ４）およびｒＰを用いて算出した保証コードチェックコード（ＬＲＣ）と保証コードブロックＲに格納されている保証コードチェックコード（ＬＲＣ）とが一致するか否かを判定する。ＣＰＵ１１０は、保証コードブロックＲは正常である、と判定した場合には（ステップＳ４１０２：Ｙｅｓ）、ｉ＝１、カウンタＣｎｔ＝０、変数Ｋ[０]＝Ｋ[１]＝"  "とする（ステップＳ４１０３）。ここで、ｉは１ストライプ列ＳＬに含まれるデータブロックｄiの番号であり、本実施例では１〜４の整数値である。また、カウンタＣｎｔは誤りが発生したデータブロックの数をカウントする変数であり、変数Ｋは誤りが発生したデータブロックを格納する変数である。
【０１４０】
一方、ＣＰＵ１１０は、保証コードブロックＲは正常でないと判定した場合には（ステップＳ４１０２：Ｎｏ）、保証コードブロックＲを用いてデータブロックｄiに生じている誤り（異常）を検出することができない、すなわち、データブロックｄiが正常であるか否かを判定することができないので、ステップＳ４１１０に移行して本処理ルーチンを終了する。
【０１４１】
ＣＰＵ１１０は、保証コードブロックＲからｒiのＬＡとＬＲＣを抽出し（ステップＳ４１０４）、データブロックｄiのＬＡとｒiのＬＡとが一致するか否かを判定する（ステップＳ４１０５）。ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致すると判定した場合には（ステップＳ４１０５：Ｙｅｓ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致するか否かを判定する（ステップＳ４１０６）。
【０１４２】
ＣＰＵ１１０は、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致すると判定した場合には（ステップＳ４１０６：Ｙｅｓ）、ｉを１つインクリメント（ｉ＝ｉ＋１）する（ステップＳ４１０７）。
【０１４３】
ＣＰＵ１１０は、データブロックｄiのＬＡとｒiのＬＡとが一致しないと判定した場合（ステップＳ４１０５：Ｎｏ）、データブロックｄiのＬＲＣとｒiのＬＲＣとが一致しないと判定した場合（ステップＳ４１０６：Ｎｏ）には、データブロックｄiに誤り（データ化け）が発生しているので、変数Ｋに該当データブロックｄiを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ４１０８）。ここで、変数ＫはカウンタＣｎｔと関連付けられており、インクリメントされる前のカウンタＣｎｔの値が変数Ｋの番号となる。例えば、今回初めてデータブロックｄiの誤りが検出された場合にはＫ[0]＝ｄiとなる。ＣＰＵ１１０は、カウンタＣｎｔが３より小さい、すなわち、０、１または２であるか否かを判定し（ステップＳ４１０９）、カウンタＣｎｔが３より小さいと判定した場合には（ステップＳ４１０９：Ｙｅｓ）、ステップＳ４１０７に移行する。
【０１４４】
一方、ＣＰＵ１１０は、カウンタＣｎｔが３以上であると判定した場合には（ステップＳ４１０９：Ｎｏ）、エラー終了して（ステップＳ４１１０）、本処理ルーチンを終了する。すなわち、本実施例において用いられているＲＡＩＤ６では、２つの誤りデータ（データ化け）までは訂正（訂正）可能であるから、誤りデータの数が３以上の場合には訂正は不可能となり、処理を終えてエラー終了する。
【０１４５】
ＣＰＵ１１０は、ｉを１つインクリメントした後、ｉ＝ｎであるか否かを判定する（ステップＳ４１１１）。すなわち、全てのデータブロックｄiについてチェックが完了したか否かを判定する。ここで、本実施例では、ｉは４までであるので、ｎにはｉ＋１に等しい５が指定される。
【０１４６】
ＣＰＵ１１０は、ｉ＝ｎでない、すなわち、全てのデータブロックｄiについてチェックが完了していない、と判定した場合には（ステップＳ４１１１：Ｎｏ）、ステップＳ４１０４〜ステップＳ４１０９を繰り返して実行する。ＣＰＵ１１０は、ｉ＝ｎである、すなわち、全てのデータブロックｄiについてチェックが完了した、と判定した場合には（ステップＳ４１１１：Ｙｅｓ）、パリティブロックＰおよびＱを検査する（ステップＳ４１１２）。具体的には、保証コードブロックＲに含まれる保証コードサブブロックｒＰ、ｒＱに格納されているＬＡおよびＬＲＣと、パリティブロックＰ、Ｑを用いて算出したＬＡおよびＬＲＣとがそれぞれ一致するか否か判定される。
【０１４７】
ＣＰＵ１１０は、パリティブロックＰは誤っているか否かを判定し（ステップＳ４１１３）、パリティブロックＰは誤っている、すなわち、保証コードサブブロックｒＰに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致しない、と判定した場合には（ステップＳ４１１３：Ｎｏ）、変数ＫにパリティブロックＰを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ４１１４）。先に、データブロックｄiの誤りが検出されている場合にはＫ[１]＝Ｐとなり、今回が初めての誤り検出の場合には、Ｋ[０]＝Ｐとなる。また、インクリメント前のカウンタＣｎｔが２の場合には、既にＫ［０］、Ｋ［１］には他の異常なブロックが格納されており、更なるブロックの格納は不可能なため、この処理は無視される。
【０１４８】
ＣＰＵ１１０は、カウンタＣｎｔが３より小さい、すなわち、０、１または２であるか否かを判定し（ステップＳ４１１５）、カウンタＣｎｔが３より小さいと判定した場合には（ステップＳ４１１５：Ｙｅｓ）、ステップＳ４１１６に移行する。
【０１４９】
一方、ＣＰＵ１１０は、カウンタＣｎｔが３以上であると判定した場合には（ステップＳ４１１５：Ｎｏ）、エラー終了して（ステップＳ４１１０）、本処理ルーチンを終了する。
【０１５０】
ＣＰＵ１１０は、パリティブロックＰは正常である、すなわち、保証コードサブブロックｒＰに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致する、と判定した場合には（ステップＳ４１１３：Ｙｅｓ）、ＣＰＵ１１０は、パリティブロックＱは誤っているか否かを判定する（ステップＳ４１１６）。すなわち、保証コードサブブロックｒＱに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致するか否かを判定する。
【０１５１】
ＣＰＵ１１０は、パリティブロックＱは誤っていると判定した場合には（ステップＳ４１１６：Ｎｏ）、変数ＫにパリティブロックＱを格納し、カウンタＣｎｔを１つインクリメント（Ｃｎｔ＝Ｃｎｔ＋１）する（ステップＳ４１１７）。インクリメント前のカウンタＣｎｔ＝２の場合には、既に変数Ｋ[０]、Ｋ[１]には他の異常ブロックが格納されており、更なるブロックの格納は不可能であるため、この処理は無視される。ＣＰＵ１１０は、カウンタＣｎｔが３より小さい、すなわち、０、１または２であるか否かを判定し（ステップＳ４１１８）、カウンタＣｎｔが３より小さいと判定した場合には（ステップＳ４１１８：Ｙｅｓ）、ステップＳ４１１９に移行する。
【０１５２】
一方、ＣＰＵ１１０は、カウンタＣｎｔが３以上であると判定した場合には（ステップＳ４１１８：Ｎｏ）、エラー終了して（ステップＳ４１１０）、本処理ルーチンを終了する。
【０１５３】
ＣＰＵ１１０は、パリティブロックＱは正常である、すなわち、保証コードサブブロックｒＱに格納されているＬＡおよびＬＲＣと、算出したＬＡおよびＬＲＣとがそれぞれ一致する、と判定した場合には（ステップＳ４１１６：Ｙｅｓ）、ステップＳ４１１９に移行する。ステップＳ４１１９では、ＣＰＵ１１０は、変数Ｋに格納されているブロックを計算によって訂正し、正常終了のステータスを残し（ステップＳ４０３）、本処理ルーチンを終了する。変数Ｋに格納されている異常なブロックがデータブロックｄiである場合には、正常なパリティブロックＰまたはＱと、他の正常なブロックデータを用いて訂正が実行され、変数Ｋに格納されている異常なブロックがパリティブロックＰまたはＱである場合には、正常なデータブロックを用いて訂正が実行される。
【０１５４】
以上説明したように、第３の実施例に係るディスクアレイ装置１０によれば、第１の実施例における、保証コードブロックＲを備えることにより得られる効果に加えて、２つのパリティブロックＰおよびＱを用いるので、データブロック、パリティブロックを含むブロックに２つの誤りが発生している場合であっても、検出し、訂正（回復）することができる。
【０１５５】
・その他の実施例：
（１）上記実施例では、ＲＡＩＤ５およびＲＡＩＤ６を例にとって説明したが、第１の実施例および第２の実施例は、ＲＡＩＤ３に対しても適用することができる。すなわち、パリティブロックＰを１つのディスク装置Ｄにまとめて格納しても良い。この場合、保証コードブロックＲは、１つのディスク装置Ｄにまとめて格納されても良く、あるいは、複数のディスク装置Ｄに分散格納されても良い。
【０１５６】
（２）第３の実施例では、デュアルパリティブロックＰ、Ｑに加えて保証コードブロックＲの内容を保証する保証コードチェックコードを用いているが、デュアルパリティブロックＰ、Ｑのみを用いてもよいことは言うまでもない。この場合にも、２つのブロックに発生した誤りを検出、訂正することができる。なお、パリティブロックＰ、Ｑは少なくとも一方が１つのディスク装置Ｄにまとめて格納されても良い。また、保証コードブロックＲは、１つのディスク装置Ｄにまとめて格納されても良く、あるいは、複数のディスク装置Ｄに分散格納されても良い。
【０１５７】
（３）上記実施例では、ディスクアレイ装置の制御処理が制御プログラム（各実行モジュール）の態様にて実行されているが、上記各処理（ステップ）を実行する論理回路を備えたハードウェア回路を用いて実行されてもよい。かかる場合には、ＣＰＵ１１０の負荷を軽減することができると共に、より高速な制御処理を実現することができる。制御処理ハードウェア回路は、例えば、ディスクアレイコントローラ１１、１２に対して実装され得る。
【０１５８】
以上、実施例に基づき本発明に係るディスクアレイ装置、ディスクアレイ装置の制御方法およびディスクアレイ装置の制御プログラムを説明してきたが、上記した発明の実施の形態は、本発明の理解を容易にするためのものであり、本発明を限定するものではない。本発明は、その趣旨並びに特許請求の範囲を逸脱することなく、変更、改良され得ると共に、本発明にはその等価物が含まれることはもちろんである。
【図面の簡単な説明】
【０１５９】
【図１】第１の実施例に係るディスクアレイ装置の概略構成を示す説明図である。
【図２】第１の実施例に係るディスクアレイ装置の外観図である。
【図３】第１の実施例に係るディスクアレイ装置におけるディスクアレイコントローラの機能的構成を示すブロック図である。
【図４】制御プログラムに含まれるモジュールを示す説明図である。
【図５】ＲＡＩＤグループ管理テーブルＴｂ１の一例を示す説明図である。
【図６】論理ユニット管理テーブルＴｂ２の一例を示す説明図である。
【図７】ＲＡＩＤグループの設定処理時に管理画面３２に現れる設定ユーザインターフェースの一例を示す説明図である。
【図８】ＲＡＩＤグループ作成時に設定ユーザインターフェース上に現れるポップアップユーザインターフェースの一例を示す説明図である。
【図９】論理ユニットの設定処理時に管理画面３２に現れる設定ユーザインターフェースの一例を示す説明図である。
【図１０】論理ユニット作成時に設定ユーザインターフェース上に現れるポップアップユーザインターフェースの一例を示す説明図である。
【図１１】ＲＡＩＤグループを構成する複数のディスク装置における各データブロックｄi、パリティブロックＰ、保証コードブロックＲの格納状態を示す説明図である。
【図１２】保証コードブロックＲに含まれる、各データブロック、パリティブロックに対応する保証コードサブブロックを概念的に示す説明図である。
【図１３】保証コードサブブロックの構成を概念的に示す説明図である。
【図１４】第１の実施例に係るディスクアレイ装置におけるデータ書き込み処理において実行される処理ルーチンを示すフローチャートである。
【図１５】第１の実施例に係るディスクアレイ装置におけるデータ読み出し処理において実行される処理ルーチンを示すフローチャートである。
【図１６】第１の実施例に係るディスクアレイ装置における保証コードチェック処理において実行される処理ルーチンを示すフローチャートである。
【図１７】第１の実施例に係るディスクアレイ装置におけるパリティチェック処理において実行される処理ルーチンを示すフローチャートである。
【図１８】変形例におけるＲＡＩＤグループを構成する複数のディスク装置における各データブロックｄi、パリティブロックＰ、保証コードブロックＲの格納状態を示す説明図である。
【図１９】図１８に示すＲＡＩＤグループに対応するＲＡＩＤグループ管理テーブルの一例を示す説明図である。
【図２０】第２の実施例における保証コードの構成を概念的に示す説明図である。
【図２１】第２の実施例に係るディスクアレイ装置における保証コードチェック処理において実行される処理ルーチンを示すフローチャートである。
【図２２】第２の実施例に係るディスクアレイ装置におけるパリティチェック処理において実行される処理ルーチンを示すフローチャートである。
【図２３】第３の実施例におけるＲＡＩＤグループを構成する複数のディスク装置における各データブロックｄi、パリティブロックＰ、保証コードブロックＲの格納状態を示す説明図である。
【図２４】第３の実施例に係るディスクアレイ装置における書き込み処理において実行される処理ルーチンを示すフローチャートである。
【図２５】第３の実施例に係るディスクアレイ装置における保証コードチェック処理において実行される処理ルーチンを示すフローチャートである。
【図２６】第３の実施例に係るディスクアレイ装置におけるデータリカバリ処理において実行される処理ルーチンを示すフローチャートである。
【図２７】第３の実施例に係るディスクアレイ装置におけるパリティチェック処理において実行される処理ルーチンを示すフローチャートである。
【符号の説明】
【０１６０】
１０...ディスクアレイ装置
１０１、１０２、１０３...信号線
１１、１２...ディスクアレイコントローラ
１１０...ＣＰＵ
１１１...メモリ
１１２...フロントエンドＩ／Ｏコントローラ
１１３...バックエンドＩ／Ｏコントローラ
１１４...管理ネットワーク用Ｉ／Ｏコントローラ
１１５...データ転送コントローラ１１５
１１６...信号線
１１７...キャッシュバッファ
１１８...制御プログラム
１３０、１３１、１３２...接続インターフェース
Ｄ００〜Ｄ２Ｎ...ディスク装置
２０、２１、２２...ホスト
３０...管理用ネットワーク
３１...管理用端末装置
４０...ストレージネットワーク
Ｐｒ１...コマンド処理プログラム
Ｐｒ２...Ｉ／Ｏ処理プログラム
Ｐｒ３...ＲＡＩＤ制御プログラム
Ｔｂ１...ＲＡＩＤグループ管理テーブル
Ｔｂ２...論理ユニット管理テーブル
Ｍｄ１...データブロック生成モジュール
Ｍｄ２...アクセス制御モジュール
Ｍｄ３...パリティチェックモジュール
Ｍｄ４...パリティ生成モジュール
Ｍｄ５...第１訂正モジュール
Ｍｄ６...保証コードチェックモジュール
Ｍｄ７...保証コード生成モジュール
Ｍｄ８...第２訂正モジュール
Ｍｄ９...誤り特定モジュールＭｄ９
【図１】
2006107311.tif 000003
【図２】
2006107311.tif 000004
【図３】
2006107311.tif 000005
【図４】
2006107311.tif 000006
【図５】
2006107311.tif 000007
【図６】
2006107311.tif 000008
【図７】
2006107311.tif 000009
【図８】
2006107311.tif 000010
【図９】
2006107311.tif 000011
【図１０】
2006107311.tif 000012
【図１１】
2006107311.tif 000013
【図１２】
2006107311.tif 000014
【図１３】
2006107311.tif 000015
【図１４】
2006107311.tif 000016
【図１５】
2006107311.tif 000017
【図１６】
2006107311.tif 000018
【図１７】
2006107311.tif 000019
【図１８】
2006107311.tif 000020
【図１９】
2006107311.tif 000021
【図２０】
2006107311.tif 000022
【図２１】
2006107311.tif 000023
【図２２】
2006107311.tif 000024
【図２３】
2006107311.tif 000025
【図２４】
2006107311.tif 000026
【図２５】
2006107311.tif 000027
【図２６】
2006107311.tif 000028
【図２７】
2006107311.tif 000029