(57)【要約】【課題】本発明の記憶制御装置は、単一の保証コードでは検出することのできない障害がデータに生じた場合でも、その障害を検出して修復することができる。【解決手段】  記憶制御装置１のコントローラ２は、ホスト４からライトコマンドを受領すると、ライトデータに第１データ保証コードを設定し、ライトデータに関連するパリティに第２データ保証コードを設定する。コントローラ２は、ホスト４からリードコマンドを受領すると、第１データ保証コードに基づいてデータの正誤を判定し、さらに、第１データ保証コードと第２保証コードとを比較することにより、障害の有無を検出する。障害が検出された場合、コントローラ２は、ＲＡＩＤ技術に基づいて障害を回復する。【選択図】図１
2009104420.tif 000002
【特許請求の範囲】
【請求項１】
ホストコンピュータからの要求に応じて、記憶装置にデータを入出力する記憶制御装置であって、
前記ホストコンピュータから受信する第１データに基づいて第１検査用データ及び第２検査用データを生成する検査用データ設定部であって、前記第１検査用データを前記第１データに対応付けて、前記第１データの記憶される第１記憶領域に記憶させ、かつ、前記第２検査用データを、前記第１データに関連付けられる第２データに対応付けて、第２記憶領域に記憶させる検査用データ設定部と、
前記第１データを前記第１記憶領域から読み出す場合に、前記第１記憶領域から読み出される前記第１検査用データと前記第２記憶領域から読み出される前記第２検査用データとが一致するか否かを検査する検査部であって、前記第１検査用データと前記第２検査用データとが一致する場合、前記第１記憶領域から前記第１データが正しく読み出されたと判定し、前記第１検査用データと前記第２検査用データとが不一致の場合は、障害の発生を検出する検査部と、
前記検査部によって障害が検出された場合には、前記第２データを利用して、前記障害を修復する修復部と、
を備える記憶制御装置。
【請求項２】
前記第１検査用データ及び前記第２検査用データには、前記第１記憶領域に記憶される前記第１データの更新順序を示す更新順序情報がそれぞれ含まれており、
前記検査部は、前記第１検査用データと前記第２検査用データとが一致しない場合、前記第１検査用データ内の更新順序情報と前記第２検査用データ内の更新順序情報とを比較して、前記第１データと前記第２データのうちいずれが古いデータであるかを判定し、古い方を誤ったデータであると判定する請求項１に記載の記憶制御装置。
【請求項３】
前記更新順序情報には、前記第１データが前記第１記憶領域に記憶された時刻を示す更新時刻と、前記ホストコンピュータから前記第１データが発行された順番を示すシーケンス番号のうちいずれか一方が含まれている請求項２に記載の記憶制御装置。
【請求項４】
前記更新順序情報には、前記第１データが前記第１記憶領域に記憶された時刻を示す更新時刻と、前記ホストコンピュータから前記第１データが発行された順番を示すシーケンスとの両方が含まれており、
前記検査部は、前記第１検査用データ内の更新時刻と前記第２検査用データ内の更新時刻とに基づいて、前記第１データと前記第２データとのいずれが古いデータであるかを判定し、さらに、前記第１検査用データ内の更新時刻と前記第２検査用データ内の更新時刻とが同一時刻の場合は、前記第１検査用データ内のシーケンス番号と前記第２検査用データ内のシーケンス番号とに基づいて、シーケンス番号の小さい方を古いデータであると判定する請求項２に記載の記憶制御装置。
【請求項５】
前記検査用データ設定部は、前記第１検査用データと前記第２検査用データとを同一のデータとして生成する請求項１〜請求項４のいずれか一項に記載の記憶制御装置。
【請求項６】
前記検査用データ設定部は、前記第２検査用データを、前記第１検査用データの一部から生成する請求項１〜請求項４のいずれか一項に記載の記憶制御装置。
【請求項７】
同一のストライプ上にそれぞれ異なる前記第１データが複数存在し、かつ、前記第２データは、前記各第１データのパリティデータとして生成されている請求項１〜請求項４のいずれか一項に記載の記憶制御装置。
【請求項８】
前記修復部は、ＲＡＩＤ（Redundant Array of Inexpensive
Disks）に従って前記複数の第１データ及び前記第２データを用いることにより、前記ホストコンピュータから読出しを要求された前記第１データ、または、前記ホストコンピュータから更新を要求された前記第１データに応じて更新されるべき前記第２データのいずれか一方または両方を、修復する請求項７に記載の記憶制御装置。
【請求項９】
前記ホストコンピュータが前記第１記憶領域に記憶された前記第１データの更新を要求する場合において、前記障害が検出された場合、前記修復部は、同一ストライプ上の全ての新たな第１データが揃うまで、前記ホストコンピュータから受信した新たな第１データを前記第１記憶領域に記憶させ、かつ、同一ストライプ上の全ての前記新たな第１データが揃った場合に、これら各第１データに基づいて前記第２データを生成させる、請求項７に記載の記憶制御装置。
【請求項１０】
前記ホストコンピュータが前記第１記憶領域に記憶された前記第１データの更新を要求する場合において、ＲＡＩＤで修復できないと判定された前記障害が検出された場合、前記修復部は、同一ストライプ上の全ての新たな第１データが揃うまで、前記ホストコンピュータから受信した新たな第１データを前記第１記憶領域に記憶させ、かつ、同一ストライプ上の全ての前記新たな第１データが揃った場合に、これら各第１データに基づいて前記第２データを生成させる、請求項８に記載の記憶制御装置。
【請求項１１】
前記記憶装置は、記憶済の第１データの記憶先アドレスとは異なるアドレスに新たな第１データを記憶させ、アドレスマッピングを変更することにより、前記記憶済の第１データを前記新たな第１データで更新させる装置として構成されている請求項１〜請求項４のいずれか一項に記載の記憶制御装置。
【請求項１２】
前記記憶装置は、記憶済の第１データの記憶先アドレスと同一のアドレスに新たな第１データを記憶させることにより、前記記憶済の第１データを前記新たな第１データで更新させる装置として構成されている請求項１〜請求項４のいずれか一項に記載の記憶制御装置。
【請求項１３】
前記修復部は、前記第２データを生成するために必要な、前記同一ストライプ上の前記新たな全ての第１データについて、前記ホストコンピュータに通知する、請求項１０に記載の記憶制御装置。
【請求項１４】
記憶装置に記憶されたデータの障害を検出して修復する障害検出方法であって、
ホストコンピュータから受信した第１データを前記記憶装置に書き込む場合に、前記第１データに基づいて第１検査用データを生成し、この第１検査用データを前記第１データに対応付けて、第１記憶領域に記憶させるステップと、
前記第１検査用データに対応する第２検査用データを生成し、この第２検査用データを、前記第１データに関連付けられる第２データに対応付けて第２記憶領域に記憶させるステップと、
前記第１データを前記第１記憶領域から読み出す場合には、前記第１記憶領域から読み出される前記第１検査用データと前記第２記憶領域から読み出される前記第２検査用データとが一致するか否かを検査するステップと、
前記第１検査用データと前記第２検査用データとが一致する場合、前記第１記憶領域から前記第１データが正しく読み出されたと判定するステップと、
前記第１検査用データと前記第２検査用データとが不一致の場合は、障害の発生を検出するステップと、
前記検査部によって障害が検出された場合には、前記第２データを利用して、前記障害を修復するステップと、
をそれぞれ実行する、記憶装置の障害検出方法。
【請求項１５】
前記第１検査用データ及び前記第２検査用データには、前記第１記憶領域に記憶される前記第１データの更新順序を示す更新順序情報がそれぞれ含まれており、
前記第１検査用データと前記第２検査用データとが不一致の場合は、前記第１検査用データ内の更新順序情報と前記第２検査用データ内の更新順序情報とを比較して、前記第１データと前記第２データのうちいずれが古いデータであるかを判定し、古い方のデータに障害が発生したと検出する請求項１４に記載の記憶装置の障害検出方法。
【請求項１６】
ホストコンピュータからの要求に応じて動作する記憶制御装置であって、
前記ホストコンピュータからの要求に応じて、複数の記憶装置を制御するコントローラを備え、
前記コントローラは、
前記ホストコンピュータと通信するための第１通信制御部と、
それぞれ記憶領域を提供する前記各記憶装置と通信するための第２通信制御部と、
前記ホストコンピュータから前記第１通信制御部を介して受信される第１データに基づいて、第１検査用データ及び第２検査用データを生成する検査用データ設定部であって、前記第１検査用データを前記第１データに対応付けて、前記第１データの記憶される第１記憶領域に前記第２通信制御部を介して記憶させ、かつ、前記第２検査用データを、前記第１データと同一ストライプ上の他の第１データとに基づいて生成されるパリティデータに対応付けて、第２記憶領域に前記第２通信制御部を介して記憶させる検査用データ設定部と、
前記第１記憶領域から前記第２通信制御部を介して読み出される前記第１データに対応する前記第１検査用データと前記第２記憶領域から前記第２通信制御部を介して読み出される前記第２検査用データとが一致するか否かを検査する検査部であって、前記第１検査用データと前記第２検査用データとが一致する場合、前記第１記憶領域から前記第１データが正しく読み出されたと判定し、前記第１検査用データと前記第２検査用データとが不一致の場合は、障害の発生を検出する検査部と、
前記検査部によって障害が検出された場合に前記障害を修復する修復部であって、ＲＡＩＤに基づいて前記障害を修復可能な場合には、前記同一ストライプ上の他の第１データ及び前記パリティデータに基づいて、前記障害の生じた第１データを修復し、ＲＡＩＤに基づいて前記障害を修復不能な場合には、同一ストライプ上の全ての新たな第１データが揃うまで、前記ホストコンピュータから受信した新たな第１データを前記第１記憶領域に記憶させ、かつ、同一ストライプ上の全ての前記新たな第１データが揃った場合に、これら各第１データに基づいて新たなパリティデータを生成させる修復部と、
を備える記憶制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶制御装置及び記憶装置の障害検出方法に関する。
【背景技術】
【０００２】
記憶制御装置は、ＲＡＩＤ（Redundant Array of Inexpensive Disks）に基づいて冗長化された記憶領域を、ホストコンピュータに提供する。従って、いずれかの記憶装置に障害が発生した場合でも、パリティデータ等に基づいて、データを復元することができる。
【０００３】
さらに、データ保護の信頼性を高めるべく、データに保証コードを付加して記憶装置に記憶させる技術も知られている（特許文献１，特許文献２，特許文献３）。
例えば、保証コードとしては、論理アドレス（ＬＡ：Logical Address）及びＬＲＣ（Longitudinal Redundancy Check）の組合せが用いられる。論理アドレスとは、ホストコンピュータがアクセス先として指定する論理ブロックのアドレスである。ＬＲＣとは、論理ブロックのデータについて排他的論理和演算を実施して求められる値である。
【０００４】
保証コードは、データに対応付けられて記憶装置に記憶される。記憶装置からデータを読み出す場合、データと一緒に保証コードも読出し、保証コードを検査する。これにより、正しい位置からデータが読み出されたか否か、及び、読み出したデータのビットが変化したか否かを判断することができる。
【０００５】
しかし、記憶装置内の制御回路の異常や機械的振動等により、更新すべき箇所とは別の箇所のデータを更新してしまう場合がある。例えば、ハードディスクデバイスのような、旧データを新データで上書きする装置の場合、目的の位置で新データを旧データに上書きできなければ、書き損じ障害を生じる。
【０００６】
目的の位置では新データに更新されていないため、その目的の位置から読み出されるデータは、旧データのままである。しかし、この旧データに付加されている保証コードは、その旧データが本来の位置から読み出されたものであり、かつ、ビットが変化していないことだけを保証する。従って、更新したはずの位置から旧データが読み出された場合、そのデータが新データではないことを調べる手段がなく、旧データの更新に失敗したことを検出することはできない。これを、本明細書では、書き損じ障害と呼ぶ。
【０００７】
他方、フラッシュメモリデバイスのように、旧データの記憶されているページとは別のページに新データを書込み、新データの書き込まれたページが有効なページとなるようにアドレスマッピングを更新する装置の場合、読み損じ障害を生じる可能性がある。新データを読み出すつもりで、旧データの書き込まれているページから旧データが誤って読み出された場合、この誤りを検出することはできない。
【０００８】
そこで、第２の従来技術（特許文献２）では、第１セクタに記憶されるべきデータの更新に伴って更新される履歴情報を、当該データ及び第２セクタに記憶されるべきデータとにそれぞれ付加し、第１セクタに記憶されているデータに付加された履歴情報と第２セクタに記憶されているデータに付加された履歴情報とを照合する。これにより、第２の従来技術では、第１セクタに記憶されたデータを検証する。
【特許文献１】特開２００４−２８８０７８号公報
【特許文献２】特開２００６−１６４３１９号公報
【特許文献３】特開２００１−３３８４６８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
従来技術では、履歴情報を第１セクタ及び第２セクタにそれぞれ記憶させることにより、記憶されたデータが正しいか否かを検証する。しかし、誤りの検出されたデータを修復する点については、検討されていない。
【００１０】
本発明は、上記の問題点に鑑みてなされたもので、その目的は、記憶装置に記憶されるデータに障害が生じたか否かを検出でき、かつ、検出された障害を修復できるようにした記憶制御装置及び記憶装置の障害検出方法を提供することにある。本発明の他の目的は、ＲＡＩＤに基づいた障害の修復が困難な場合でも、同一ストライプ上の全データが揃うのを待って障害を回復させることのできる記憶制御装置及び記憶装置の障害検出方法を提供することにある。本発明の更なる目的は、後述する実施の形態の記載から明らかになるであろう。
【課題を解決するための手段】
【００１１】
上記課題を解決すべく、本発明の第１観点に従う記憶制御装置は、ホストコンピュータからの要求に応じて、記憶装置にデータを入出力する記憶制御装置であって、ホストコンピュータから受信する第１データに基づいて第１検査用データ及び第２検査用データを生成する検査用データ設定部であって、第１検査用データを第１データに対応付けて、第１データの記憶される第１記憶領域に記憶させ、かつ、第２検査用データを、第１データに関連付けられる第２データに対応付けて、第２記憶領域に記憶させる検査用データ設定部と、第１データを第１記憶領域から読み出す場合に、第１記憶領域から読み出される第１検査用データと第２記憶領域から読み出される第２検査用データとが一致するか否かを検査する検査部であって、第１検査用データと第２検査用データとが一致する場合、第１記憶領域から第１データが正しく読み出されたと判定し、第１検査用データと第２検査用データとが不一致の場合は、障害の発生を検出する検査部と、検査部によって障害が検出された場合には、第２データを利用して、障害を修復する修復部と、を備える。
【００１２】
第２観点では、第１検査用データ及び第２検査用データには、第１記憶領域に記憶される第１データの更新順序を示す更新順序情報がそれぞれ含まれており、検査部は、第１検査用データと第２検査用データとが一致しない場合、第１検査用データ内の更新順序情報と第２検査用データ内の更新順序情報とを比較して、第１データと第２データのうちいずれが古いデータであるかを判定し、古い方を誤ったデータであると判定する。
【００１３】
第３観点では、第２観点において、更新順序情報には、第１データが第１記憶領域に記憶された時刻を示す更新時刻と、ホストコンピュータから第１データが発行された順番を示すシーケンス番号のうちいずれか一方が含まれている。
【００１４】
第４観点では、第２観点において、更新順序情報には、第１データが第１記憶領域に記憶された時刻を示す更新時刻と、ホストコンピュータから第１データが発行された順番を示すシーケンスとの両方が含まれており、検査部は、第１検査用データ内の更新時刻と第２検査用データ内の更新時刻とに基づいて、第１データと第２データとのいずれが古いデータであるかを判定し、さらに、第１検査用データ内の更新時刻と第２検査用データ内の更新時刻とが同一時刻の場合は、第１検査用データ内のシーケンス番号と第２検査用データ内のシーケンス番号とに基づいて、シーケンス番号の小さい方を古いデータであると判定する。
【００１５】
第５観点では、第１観点〜第４観点のいずれかにおいて、検査用データ設定部は、第１検査用データと第２検査用データとを同一のデータとして生成する。
【００１６】
第６観点では、第１観点〜第４観点のいずれかにおいて、検査用データ設定部は、第２検査用データを、第１検査用データの一部から生成する。
【００１７】
第７観点では、第１観点〜第４観点のいずれかにおいて、同一のストライプ上にそれぞれ異なる第１データが複数存在し、かつ、第２データは、各第１データのパリティデータとして生成されている。
【００１８】
第８観点では、第７観点において、修復部は、ＲＡＩＤに従って複数の第１データ及び第２データを用いることにより、ホストコンピュータから読出しを要求された第１データ、または、ホストコンピュータから更新を要求された第１データに応じて更新されるべき第２データのいずれか一方または両方を、修復する。
【００１９】
第９観点では、第７観点において、ホストコンピュータが第１記憶領域に記憶された第１データの更新を要求する場合において、障害が検出された場合、修復部は、同一ストライプ上の全ての新たな第１データが揃うまで、ホストコンピュータから受信した新たな第１データを第１記憶領域に記憶させ、かつ、同一ストライプ上の全ての新たな第１データが揃った場合に、これら各第１データに基づいて第２データを生成させる。
【００２０】
第１０観点では、第８観点において、ホストコンピュータが第１記憶領域に記憶された第１データの更新を要求する場合において、ＲＡＩＤで修復できないと判定された障害が検出された場合、修復部は、同一ストライプ上の全ての新たな第１データが揃うまで、ホストコンピュータから受信した新たな第１データを第１記憶領域に記憶させ、かつ、同一ストライプ上の全ての新たな第１データが揃った場合に、これら各第１データに基づいて第２データを生成させる。
【００２１】
第１１観点では、第１観点〜第４観点のいずれかにおいて、記憶装置は、記憶済の第１データの記憶先アドレスとは異なるアドレスに新たな第１データを記憶させ、アドレスマッピングを変更することにより、記憶済の第１データを新たな第１データで更新させる装置として構成されている。
【００２２】
第１２観点では、第１観点〜第４観点のいずれかにおいて、記憶装置は、記憶済の第１データの記憶先アドレスと同一のアドレスに新たな第１データを記憶させることにより、記憶済の第１データを新たな第１データで更新させる装置として構成されている。
【００２３】
第１３観点では、第１０観点において、修復部は、第２データを生成するために必要な、同一ストライプ上の新たな全ての第１データについて、ホストコンピュータに通知するように構成される。
【００２４】
第１４観点に従う、記憶装置に記憶されたデータの障害を検出して修復する障害検出方法は、ホストコンピュータから受信した第１データを記憶装置に書き込む場合に、第１データに基づいて第１検査用データを生成し、この第１検査用データを第１データに対応付けて、第１記憶領域に記憶させるステップと、第１検査用データに対応する第２検査用データを生成し、この第２検査用データを、第１データに関連付けられる第２データに対応付けて第２記憶領域に記憶させるステップと、第１データを第１記憶領域から読み出す場合には、第１記憶領域から読み出される第１検査用データと第２記憶領域から読み出される第２検査用データとが一致するか否かを検査するステップと、第１検査用データと第２検査用データとが一致する場合、第１記憶領域から第１データが正しく読み出されたと判定するステップと、第１検査用データと第２検査用データとが不一致の場合は、障害の発生を検出するステップと、検査部によって障害が検出された場合には、第２データを利用して、障害を修復するステップと、をそれぞれ実行する。
【００２５】
第１５観点では、第１４観点において、第１検査用データ及び第２検査用データには、第１記憶領域に記憶される第１データの更新順序を示す更新順序情報がそれぞれ含まれており、第１検査用データと第２検査用データとが不一致の場合は、第１検査用データ内の更新順序情報と第２検査用データ内の更新順序情報とを比較して、第１データと第２データのうちいずれが古いデータであるかを判定し、古い方のデータに障害が発生したと検出する。
【００２６】
第１６観点に従う記憶制御装置は、ホストコンピュータからの要求に応じて動作する記憶制御装置であって、ホストコンピュータからの要求に応じて、複数の記憶装置を制御するコントローラを備え、コントローラは、ホストコンピュータと通信するための第１通信制御部と、それぞれ記憶領域を提供する各記憶装置と通信するための第２通信制御部と、ホストコンピュータから第１通信制御部を介して受信される第１データに基づいて、第１検査用データ及び第２検査用データを生成する検査用データ設定部であって、第１検査用データを第１データに対応付けて、第１データの記憶される第１記憶領域に第２通信制御部を介して記憶させ、かつ、第２検査用データを、第１データと同一ストライプ上の他の第１データとに基づいて生成されるパリティデータに対応付けて、第２記憶領域に第２通信制御部を介して記憶させる検査用データ設定部と、第１記憶領域から第２通信制御部を介して読み出される第１データに対応する第１検査用データと第２記憶領域から第２通信制御部を介して読み出される第２検査用データとが一致するか否かを検査する検査部であって、第１検査用データと第２検査用データとが一致する場合、第１記憶領域から第１データが正しく読み出されたと判定し、第１検査用データと第２検査用データとが不一致の場合は、障害の発生を検出する検査部と、検査部によって障害が検出された場合に障害を修復する修復部であって、ＲＡＩＤに基づいて障害を修復可能な場合には、同一ストライプ上の他の第１データ及びパリティデータに基づいて、障害の生じた第１データを修復し、ＲＡＩＤに基づいて障害を修復不能な場合には、同一ストライプ上の全ての新たな第１データが揃うまで、ホストコンピュータから受信した新たな第１データを第１記憶領域に記憶させ、かつ、同一ストライプ上の全ての新たな第１データが揃った場合に、これら各第１データに基づいて新たなパリティデータを生成させる修復部と、を備える。
【００２７】
本発明の各部または各ステップの少なくとも一部は、コンピュータプログラムとして構成される場合がある。このコンピュータプログラムは、記録媒体に固定して配布したり、ネットワークを介して配信することができる。また、各観点は、明示された組合せ以外の組合せで結合させることもでき、そのような組合せも本発明の範囲に含まれる。
【発明を実施するための最良の形態】
【００２８】
以下、図面に基づいて、本発明の実施の形態を説明する。まず最初に、本発明の概念を説明し、その次に、具体的な実施例について説明する。図１は、本発明の概念を模式的に示す説明図である。本実施形態では、以下に説明するように、それぞれ別々の場所に記憶された保証コードを用いて障害の有無を検出し、かつ、検出された障害を修復する。
【００２９】
記憶制御装置１は、コントローラ２と、複数の記憶装置３とを備える。コントローラ２は、例えば、第１通信制御部２Ａと、第２通信制御部２Ｂと、コマンド処理部２Ｃと、キャッシュメモリ２Ｄと、保証コード設定部２Ｅと、保証コード検査部２Ｆとを備えて構成される。
【００３０】
本実施形態の保証コードとは、正しいデータであるか否かを検証するために、データ及びパリティに付加される冗長データである。各データ（Ｄａ１，ＤＡ２）に付加される保証コード（ＧＣ１−Ｄａ１，ＧＣ１−Ｄａ２）は、「第１検査用データ」に該当する。パリティ（Ｐａ）に付加される保証コード（ＧＣ２−Ｄａ１，ＧＣ２−Ｄａ２）は、「第２検査用データ」に該当する。
【００３１】
第１通信制御部２Ａは、ホスト４と通信を行うための回路である。第１通信制御部２Ａは、ホスト４と接続される。ホスト４は、例えば、メインフレームコンピュータ、サーバコンピュータ、パーソナルコンピュータ等のコンピュータ装置として構成される。第１通信制御部２Ａとホスト４とは、例えば、ＦＣ＿ＳＡＮ（Fibre Channel_Storage Area Network）、ＩＰ＿ＳＡＮ（Internet Protocol_SAN）、ＬＡＮ（Local Area Network）等の通信ネットワークＣＮを介して接続される。
【００３２】
ホスト４がメインフレームコンピュータである場合、例えば、ＦＩＣＯＮ（Fibre Connection：登録商標）、ＥＳＣＯＮ（Enterprise System Connection：登録商標）、ＡＣＯＮＡＲＣ（Advanced Connection Architecture：登録商標）、ＦＩＢＡＲＣ（Fibre Connection Architecture：登録商標）のような通信プロトコルが用いられる。ホスト４がサーバコンピュータやパーソナルコンピュータ等である場合、例えば、ＴＣＰ／ＩＰ（Transmission Control
Protocol/Internet Protocol）、ＦＣＰ（Fibre Channel Protocol）、ｉＳＣＳＩ（internet Small Computer System Interface）のような通信プロトコルが用いられる。
【００３３】
第２通信制御部２Ｂは、記憶装置３（１）〜３（３）と通信するための回路である。以下の説明では、特に区別する必要のない場合、記憶装置３と呼ぶ。
【００３４】
記憶装置３としては、例えば、ハードディスクデバイス、半導体メモリデバイス、光ディスクデバイス、光磁気ディスクデバイス、磁気テープデバイス、フレキシブルディスクデバイス等のデータを読み書き可能な種々のデバイスを利用可能である。
【００３５】
記憶装置としてハードディスクデバイスを用いる場合、例えば、ＦＣ（Fibre Channel）ディスク、ＳＣＳＩ（Small Computer System Interface）ディスク、ＳＡＴＡディスク、ＡＴＡ（AT Attachment）ディスク、ＳＡＳ（Serial Attached SCSI）ディスク等を用いることができる。記憶装置として半導体メモリデバイスを用いる場合、例えば、フラッシュメモリ、ＦｅＲＡＭ（Ferroelectric Random Access Memory）、ＭＲＡＭ（Magnetoresistive Random Access Memory）、相変化メモリ（Ovonic Unified Memory）、ＲＲＡＭ（Resistance RAM）」等の種々のメモリデバイスを利用可能である。
【００３６】
本実施形態では、旧データの記憶位置に新データを上書きすることにより、データ更新を行うタイプの記憶装置として、ハードディスクデバイスを例に挙げる。また、本実施形態では、旧データの記憶されている位置と別の位置に新データを書込み、アドレスマッピングを変更することにより、データ更新を行うタイプの記憶装置として、フラッシュメモリデバイスを例に挙げる。アドレスマッピングの変更は、フラッシュメモリデバイスの有するファイルシステムによって行われる。なお、ハードディスクデバイス及びフラッシュメモリデバイスは、一例であって、本発明はこれらに限定されない。
【００３７】
コマンド処理部２Ｃは、ホスト４から発行されたコマンドを処理し、その結果をホスト４に送信させるものである。コマンドとしては、ライトコマンドやリードコマンド等を挙げることができる。キャッシュメモリ２Ｄは、ホスト４から受信したデータや記憶装置３から読み出されたデータを記憶するものである。
【００３８】
保証コード設定部２Ｅは、「検査用データ設定部」に該当する。保証コード設定部２Ｅは、ホスト４から受信したデータに保証コードをそれぞれ設定する。さらに、保証コード設定部２Ｅは、パリティが生成するのを待ち（２Ｅ１）、生成されたパリティに、データに設定された保証コード（Ｇｃ２−Ｄａ１，Ｇｃ２−Ｄａ２）及びパリティ固有の保証コード（Ｇｃ−Ｐａ）をそれぞれ対応付ける。
【００３９】
保証コード検査部２Ｆは、「検査部」に該当する。保証コード検査部２Ｆは、データ及びパリティにそれぞれ設定された保証コードを比較することにより、障害発生の有無を検出するものである。
【００４０】
保証コードの設定方法及び内容を説明する。本実施形態では、説明の便宜上、記憶装置３（１），３（２）にデータを記憶し、記憶装置３（３）にパリティを記憶する場合を述べる。但し、ＲＡＩＤ５やＲＡＩＤ６として知られているように、データとパリティとを複数の記憶装置に分散させて配置する構成でもよい。
【００４１】
記憶装置３（１）には、データ（Ｄａ１）と、このデータに対応する保証コード（Ｇｃ１−Ｄａ１）とがそれぞれ記憶されている。保証コードは、例えば、論理アドレス（ＬＡ）と、ＬＲＣと、更新時刻（ＴＣ）と、シーケンス番号（ＳＥＱ）とを含んでいる。
【００４２】
論理アドレスとは、データ（Ｄａ１）の書込先のアドレスである。ＬＲＣは、データのビット変化を検出するものである。更新時刻とは、データが記憶装置３に書き込まれた時刻を示す。シーケンス番号とは、データの更新順序を示す。
【００４３】
記憶装置３（２）も、記憶装置３（１）と同様に、データ（Ｄａ２）と、このデータに対応する保証コード（Ｇｃ１−Ｄａ２）とがそれぞれ記憶されている。
【００４４】
記憶装置３（３）には、パリティ（Ｐａ）と、各データに設定される第１の保証コード（Ｇｃ１−Ｄａ１，Ｇｃ１−Ｄａ２）に対応する第２の保証コード（Ｇｃ２−Ｄａ１，Ｇｃ２−Ｄａ２）と、パリティに設定される保証コード（Ｇｃ−Ｐａ）とが、それぞれ記憶されている。
【００４５】
データ本体（データ及びパリティを含む）を記憶するためのデータ領域と、データ本体に設定される保証コードを記憶するための保証コード領域とに分けて考察すると、本実施形態では、保証コード領域に複数の保証コードを格納できるように、保証コード領域のサイズが設定される。つまり、例えば、各保証コードのサイズを８バイトとした場合、保証コード領域のサイズは、２４バイト（＝８バイト×３）に設定される。
【００４６】
保証コード領域の全てを保証コードが埋めるのは、パリティを記憶する記憶装置３（３）だけである。データを記憶する記憶装置３（１），３（２）では、保証コード領域内に１個の保証コードのみがそれぞれ記憶される。点線で示す部分は、何も記憶されないブランク領域である。
【００４７】
さらに、本実施形態では、パリティを記憶する記憶装置３（３）の保証コード領域には、各データに設定される保証コード（Ｇｃ１−Ｄａ１，Ｇｃ１−Ｄａ２）と対応する位置に、第２の保証コード（Ｇｃ２−Ｄａ１，Ｇｃ２−Ｄａ２）がそれぞれ記憶される。これにより、本実施形態では、比較的効率よく保証コードの読み書きを行うことができるようになっている。
【００４８】
但し、保証コードの格納位置を揃えるのは、本実施形態の有する一つの利点に過ぎず、本発明は、これに限定されない。即ち、例えば、データの記憶される記憶装置３（１），３（２）内の保証コード領域からブランク領域を取り除いたりする構成でもよい。
【００４９】
ホスト４からリードコマンドまたはライトコマンドが発行された場合の記憶制御装置１の動作を説明する。リードコマンドが発行された場合、コントローラ２は、第２通信制御部２Ｂを介して、ホスト４から要求されたデータを記憶装置３から読み出す。ここでは、説明の便宜上、データ（Ｄａ１）が読み出されるものとする。データを読み出す際に、そのデータに設定されている保証コードも一緒に読み出される。また、パリティ及びパリティに対応付けられている各保証コードも読み出される。
【００５０】
読み出されたデータ（Ｄａ１）は、キャッシュメモリ２Ｄに記憶される。保証コード検査部２Ｆは、データ（Ｄａ１）に設定されている第１の保証コード（Ｇｃ１−Ｄａ１）と、パリティに対応付けられている第２の保証コード（Ｇｃ２−Ｄａ１）とを比較し、両者が一致するか否かを検査する。
【００５１】
両方の保証コードが一致する場合、記憶装置３（１）から読み出されたデータ（Ｄａ１）は正しいデータであり、障害が発生していないと判断することができる。これに対し、両方の保証コードが不一致の場合、データまたはパリティのいずれか又は両方で障害が発生していると判断することができる。
【００５２】
保証コード内にＬＡ及びＬＲＣのみ含まれている場合、データとパリティのいずれに障害が生じているのかを判別することはできない。保証コード内に、更新時刻またはシーケンス番号のいずれか一方が含まれている場合、更新の順番の先後から、いずれに障害が生じているかを判定することができる。ここでは、パリティの更新の方がデータの更新よりも新しい場合を例に挙げる。この場合、パリティの方が新しいため、データに障害が生じていると判定することができる。
【００５３】
そこで、修復部２Ｆ１は、同一ストライプ上の他のデータ（Ｄａ２）とパリティとに基づいて、データ（Ｄａ１）を正しい値に復元する。修復されたデータは、キャッシュメモリ２Ｄに記憶された後、第１通信制御部２Ａを介してホスト４に送信される。さらに、修復されたデータは、第２通信制御部２Ｂを介して記憶装置３（１）に書き込まれる。なお、図１では、便宜上、修復部２Ｆ１を保証コード検査部２Ｆ内に設けるかのように示しているが、保証コード検査部２Ｆの外部に設ける構成でもよい。
【００５４】
ホスト４からライトコマンドが発行された場合を説明する。ここでは、記憶装置３（１）に記憶されているデータ（Ｄａ１）を、新たなデータ（Ｄａ１ｎ）で更新する場合を例に挙げる。記憶済のデータ（Ｄａ１）を旧データと、記憶済のパリティ（Ｐａ）を旧パリティと呼ぶ。
【００５５】
コントローラ２は、記憶装置３（１），３（３）から読み出される旧データ及び旧パリティと、キャッシュメモリ２Ｄに記憶された新データとから、新パリティを生成する。コントローラは、新パリティの生成に先立って、上述のように、旧データに設定されている第１の保証コードと、旧パリティに対応付けられている、旧データの第２の保証コードとを比較し、旧データ及び旧パリティに障害が生じていないことを確認する。
【００５６】
新パリティの生成後、保証コード設定部２Ｅは、新データ及び新パリティにそれぞれ保証コードを設定し、記憶装置３（１）に新データを、記憶装置３（３）に新パリティをそれぞれ記憶させる。
【００５７】
以上が正常な場合の動作である。もしも、旧パリティに障害が発生している場合、旧パリティに対応付けられている各保証コードを利用することはできないため、同一ストライプ上のデータが全て更新されるのを待つ。即ち、ホスト４からの新たなライトコマンドにより、データ（Ｄａ２ｎ）が受信されるまで待機する。新たなデータ（Ｄａ１ｎ）及び（Ｄａ２ｎ）がキャッシュメモリ２Ｄに記憶された場合、これら新データに基づいて、新パリティを生成することができる。
【００５８】
旧データ（Ｄａ１）に障害が生じている場合、同一ストライプ上の他のデータ（Ｄａ２）と新データ（Ｄａ１ｎ）とによって、新パリティを生成することができる。
【００５９】
このように構成される本実施形態によれば、データの正誤を検出する保証コードを、データ及びパリティにそれぞれ対応付けて記憶するため、これら２つの保証コードを比較することにより、いわゆる書き損じ障害や読み損じ障害を検出することができる。
【００６０】
本実施形態によれば、保証コード内に、更新時刻や更新のシーケンス番号を含めるため、データとパリティのいずれに障害が発生しているかを判別することができる。
【００６１】
本実施形態によれば、障害発生時に、ＲＡＩＤに基づいてデータまたはパリティを修復する。従って、記憶制御装置の信頼性及びユーザの使い勝手が向上する。
【００６２】
本実施形態によれば、ＲＡＩＤによる修復ができない場合、同一ストライプ上の全データがキャッシュメモリ２Ｄに記憶されるのを待ってから、新パリティを生成する。従って、ＲＡＩＤによる修復処理ができない場合でも、正しいデータ及びパリティを記憶装置３に記憶させることができる。これにより、記憶制御装置の信頼性及びユーザの使い勝手がさらに向上する。以下、本実施形態を詳細に説明する。
【実施例１】
【００６３】
図２は、記憶制御装置を含むシステムの全体構成を示す説明図である。このシステムは、例えば、記憶制御装置１０と、ホスト２０と、管理サーバ３０と、外部記憶制御装置４０とを備える。先に図１との対応関係を説明する。記憶制御装置１０は図１中の記憶制御装置１に、ホスト２０は図１中のホスト４に、それぞれ対応する。記憶装置２１０は図１中の記憶装置３に、チャネルアダプタ１１０は図１中の第１通信制御部２Ａに、ディスクアダプタ１２０は図１中の第２通信制御部２Ｂに、キャッシュメモリ１３０は図１中のキャッシュメモリ２Ｄに、それぞれ対応する。
【００６４】
コントローラ１００が、チャネルアダプタ１１０及びディスクアダプタ１２０がそれぞれ有するマイクロプロセッサを用いて、所定のプログラムを実行することにより、図１中のコマンド処理部２Ｃ，保証コード設定部２Ｅ，保証コード検査部２Ｆ及び修復部２Ｆ１を、それぞれ実現することができる。なお、保証コードの生成及び設定、保証コードの検査、データまたはパリティの修復という各機能は、ハードウェア回路によってそれぞれ実現することもできる。
【００６５】
記憶制御装置１０の構成を説明する。記憶制御装置１０は、例えば、記憶制御装置１０の動作を制御するコントローラ１００と、コントローラ１００によって制御される記憶部２００とを備える。
【００６６】
コントローラ１００は、例えば、チャネルアダプタ（以下、ＣＨＡ）１１０と、ディスクアダプタ（以下、ＤＫＡ）１２０と、キャッシュメモリ１３０と、共有メモリ１４０と、接続制御部１５０と、サービスプロセッサ１６０とを備えている。
【００６７】
ＣＨＡ１１０は、マイクロプロセッサ及びメモリを備えた制御回路であり、ホスト２０との通信を担当する。ＣＨＡ１１０は、通信ネットワークＣＮ１を介して、ホスト２０に接続される。
【００６８】
ＤＫＡ１２０は、ＣＨＡ１１０と同様に構成される制御回路であり、記憶装置２１０との通信を担当する。ＤＫＡ１２０は、通信ネットワークＣＮ４を介して、記憶部２００内の各記憶装置２１０に接続される。
【００６９】
キャッシュメモリ１３０は、ホスト２０から受信したデータや記憶装置２１０から読み出されたデータ等を記憶する。共有メモリ１４０は、記憶制御装置１０を制御するために必要な各種の制御情報や管理情報を記憶する。
【００７０】
接続制御部１５０は、ＣＨＡ１１０及びＤＫＡ１２０を、キャッシュメモリ１３０及び共有メモリ１４０にそれぞれ接続させる回路である。サービスプロセッサ（以下、ＳＶＰ）１６０は、内部ネットワークＣＮ５を介して各ＣＨＡ１１０に接続されている。ＳＶＰ１６０は、各ＣＨＡ１１０を介して、記憶制御装置１０の各種状態に関する情報を収集し、収集した情報を通信ネットワークＣＮ２を介して管理サーバ３０に送信する。さらに、ＳＶＰ１６０は、管理サーバ３０からの指示に基づいて、記憶制御装置１０の構成を変更する。
【００７１】
記憶部２００は、複数の記憶装置２１０を備えている。記憶装置２１０は、例えば、ハードディスクデバイスやフラッシュメモリデバイス等から構成される。ここでは、主にハードディスクデバイスを例に挙げて説明する。
【００７２】
複数の記憶装置２１０のそれぞれ有する物理的記憶領域をパリティグループ２２０として仮想化することができる。このパリティグループ２２０の物理的記憶領域には、一つまたは複数の論理ボリューム（図中、ＬＤＥＶ）２３０を設定することができる。なお、一つの記憶装置２１０の有する物理的記憶領域に、一つまたは複数の論理ボリューム２３０を設けることもできる。ホスト２０は、論理ボリューム２３０を指定して、データの読み書きを行う。
【００７３】
外部記憶制御装置４０について説明する。記憶制御装置１０から見て、記憶制御装置４０は記憶制御装置１０の外部に存在するため、外部記憶制御装置と呼ぶ。外部記憶制御装置４０は、通信ネットワークＣＮ３を介して、記憶制御装置１０に接続されている。
【００７４】
外部記憶制御装置４０は、記憶制御装置１０と同様に、コントローラ４１と記憶部４２とを備える。記憶制御装置１０は、外部記憶制御装置４０内の論理ボリュームを、記憶制御装置１０内の仮想的な記憶デバイスにマッピングする。これにより、記憶制御装置１０は、外部記憶制御装置４０の有する論理ボリュームを、それがあたかも記憶制御装置１０の記憶資源であるかのように使用することができる。
【００７５】
図３は、コントローラ１００の構成を別の観点から示すブロック図である。各ＣＨＡ１１０、各ＤＫＡ１２０、キャッシュメモリ１３０及び共有メモリ１４０を用いて、コントローラ１００内にメイン処理部１０１を設けることができる。
【００７６】
メイン処理部１０１は、上位通信制御部１１０と、Ｉ／Ｏ処理部１０２と、下位通信制御部１２０と、保証コード設定部１０３と、保証コード検査部１０４とを備える。上位通信制御部１１０は、ＣＨＡ１１０の通信機能が実現するため、同じ符号「１１０」が与えられている。同様に、下位通信制御部１２０は、ＤＫＡ１２０が実現するため、同じ符号「１２０」が与えられる。
【００７７】
Ｉ／Ｏ処理部１０２は、図１中のコマンド処理部２Ｃに対応する。Ｉ／Ｏ処理部１０２は、ホスト２０から発行されるライトコマンド及びリードコマンドを処理して、その結果をホスト２０に送信する。
【００７８】
保証コード設定部１０３は、図１中の保証コード設定部２Ｅに対応する。保証コード設定部１０３は、図５及び図６で後述するように、データ及びパリティに保証コードをそれぞれ設定する。
【００７９】
保証コード検査部１０４は、図１中の保証コード検査部２Ｆに対応する。保証コード検査部１０４は、記憶装置２１０から読み出されるデータ及びパリティに障害が生じているか否かを検査する。
【００８０】
図４は、記憶制御装置の変形例を示す。図２に示す構成に代えて、図４に示す構成を採用することもできる。図４に示す記憶制御装置１０Ａは、コントローラ１００Ａと、記憶部２００とを備える。コントローラ１００Ａは、例えば、ホストインターフェース１１０Ａと、ディスクインターフェース１２０Ａと、キャッシュメモリ１３０と、キャッシュコントローラ１５０Ａと、マイクロプロセッサ１７０と、バスブリッジ１８０と、プログラムメモリ１９０を備える。
【００８１】
ホストインターフェース１１０Ａは、ＣＨＡ１１０と同様に、ホスト２０との通信を担当する制御回路である。ディスクインターフェース１２０Ａは、ＤＫＡ１２０と同様に、各記憶装置２１０との通信を担当する制御回路である。
【００８２】
キャッシュコントローラ１５０Ａは、キャッシュメモリ１３０へのデータ入出力等を制御するものである。キャッシュコントローラ１５０Ａは、例えば、保証コードを設定するための保証コード設定回路１０３Ａと、保証コードを検査するための保証コード検査回路１０４Ａと、を備える。
【００８３】
プログラムメモリ１９０には、ホスト２０からのコマンドを処理するためのＩ／Ｏ処理プログラム１０２Ａが記憶されている。このプログラム１０２Ａは、マイクロプロセッサ１７０によって実行される。バスブリッジ１８０は、マイクロプロセッサ１７０を、プログラムメモリ１９０及びキャッシュコントローラ１５０Ａに接続する。
【００８４】
図５は、保証コードの設定方法の例を示す説明図である。図５の最上段に示すように、ホスト２０から送信されるデータは、５１２バイトのブロックに分割されている。コントローラ１００は、ホスト２０から受信した各ブロックのデータ毎に、それぞれ８バイトずつの保証コード（ＧＣ）を設定する。従って、コントローラ１００のキャッシュメモリ１３０に記憶されるブロックのサイズは、５２０バイトとなる。
【００８５】
図５中の中段に第１例として示すように、例えば、ＦＣディスクのように、５２０バイトに拡張されたブロックをそのまま記憶可能な記憶装置２１０もある。この場合は、保証コード付きのブロックを記憶装置２１０にそのまま記憶させる。
【００８６】
あるいは、ＳＡＴＡディスク等のように、記憶フォーマットが５１２バイトに固定されている記憶装置２１０もある。この場合は、５１２バイトと５２０バイトの最小公倍数をデータ入出力の単位とすることができる。即ち、５１２バイトのブロックが６５個ある場合、この合計サイズは、５２０バイトのブロック６４個分に等しい。
【００８７】
その下に示す第２例では、保証コード付きのブロックを、合計して５１２バイトとなるように分割して書き込む場合が示されている。記憶装置２１０がフラッシュメモリデバイスの場合、例えば、５１２バイトのデータ及び８バイトの保証コードを、フラッシュ論理ページアドレス及びフラッシュライトシーケンス番号と合わせてページサイズ（例えば、５１２バイト）となるように、分割して書き込む。フラッシュメモリデバイスからデータを読み出す際は、２ページ分を読出し、保証コードを検証する。
【００８８】
図５に示す第３例では、データと保証コードとを離して別々に記憶する様子を示す。図５に示したように、いずれかの方法により、または、図示せぬ別の方法により、データと保証コードとを対応付けて、記憶装置２１０に記憶させることができる。
【００８９】
図６は、本実施例による、各記憶装置２１０に記憶されるデータ及び保証コードの様子を示す説明図である。図６は、ＲＡＩＤ５の場合を示している。各データ（Ｄ）には、それぞれの保証コード（ＧＣ−Ｄ）が対応付けられる。各データにそれぞれ対応付けられて記憶されている保証コードを、以下の説明では、第１保証コードと呼ぶ場合がある。
【００９０】
パリティ（Ｐ）には、そのパリティに関連する各データの第２保証コードと、そのパリティ自体の保証コードとがそれぞれ対応付けられる。後述のように、第２保証コードは、第１保証コードと同様に構成することもできるし、第１保証コードの一部から構成することもできる。
【００９１】
図６に示す例では、パリティに、３つのデータの第１保証コードにそれぞれ対応する３つの第２保証コードと、そのパリティを検査するための１つの保証コードとが対応付けられて記憶装置２１０に記憶される。従って、保証コードを格納するための領域は、合計４個の保証コードを記憶できるだけのサイズ（３２バイト＝８バイト×４）を有する。従って、図６に示す例では、データに対応付けられる保証コード格納領域には、２４バイト（＝８バイト×３）の空き領域が形成される。なお、無駄な領域が生じないように、保証コード格納領域を形成してもよい。
【００９２】
図７は、保証コードの内容を示す説明図である。データに直接対応付けられる第１保証コード及びパリティ用の保証コードは、ＬＡ及びＬＲＣを備える。これに対し、パリティと共に記憶される第２保証コードは、ＬＲＣのみを備える。第２保証コードのＬＲＣと第１保証コードのＬＲＣとを比較するだけでも、障害の有無を検出できるためである。
【００９３】
記憶装置２１０からデータが読み出される場合、そのデータに対応付けられている第１保証コードも一緒に読み出される。同様に、記憶装置２１０からパリティが読み出される場合、そのパリティに対応付けられている第２保証コードと、そのパリティ自身を検証するための保証コードとが一緒に読み出される。後述のフローチャートでは、データやパリティを読み出す際に、それらに付随する保証コードもそれぞれ読み出されるものとして説明する。
【００９４】
図８は、キャッシュメモリ上における、データまたはパリティの属性を示す説明図である。コントローラ１００は、各データ及び各パリティの属性（状態）を管理する。未検査状態とは、保証コードに基づいて検査されていない状態である。即ち、記憶装置２１０から読み出された直後のデータやパリティは、未検査状態になる。
【００９５】
第１エラー状態とは、保証コード単体で、エラーが検出された状態を示す。例えば、データに直接的に対応付けられている第１保証コードによって、そのデータが誤った場所に書き込まれた事が判明した場合や、そのデータのビットが変化している事が判明した場合、第１エラー状態となる。パリティの場合も同様に、ＬＡ及びＬＲＣによって、そのパリティ自体にエラーが検出された場合は、第１エラー状態となる。
【００９６】
第２エラー状態とは、第１保証コードと第２保証コードとが一致しない状態を示す。即ち、同一のデータに関する第１保証コードと第２保証コードとが一致せず、そのデータに障害が生じていると判定された場合である。
【００９７】
検査済状態とは、エラーの検出されない状態を示す。保証コードによる検査の結果、エラーが検出されなかった場合、検査済状態となる。また、ホスト２０から受信されたライトデータも、検査済状態となる。記憶装置２１０に書き込まれる前のライトデータには、記憶装置２１０からの入出力に起因する障害が発生しないためである。
【００９８】
待機状態とは、そのデータと同一のストライプ上に存在する他の全てのデータがキャッシュメモリ１３０に記憶されるまで待機する状態である。即ち、待機状態とは、新パリティを生成できるタイミングを待つ状態である。
【００９９】
図９は、本実施例の全体的な動作の流れを簡略化して示すフローチャートである。より詳細な動作については、図１０以降に説明する。図９では、後述の実施例で説明する部分も含めて、データ及びパリティの検証方法と、データ及びパリティの回復方法とが簡略化されて示されている。なお、便宜上、フローチャートでは、記憶装置２１０を「ドライブ」と表現する。
【０１００】
コントローラ１００は、ホスト２０から受信したコマンドを判別する（Ｓ０）。リードコマンドを受信した場合、コントローラ１００は、記憶装置２１０からデータ及びパリティを読出し、データ及びパリティが正しいか否かを判定する。
【０１０１】
以下、保証コードを明確に区別するために、データに直接的に対応付けられている第１保証コードを、第１データ保証コードと呼ぶ。データに間接的に対応付けられている第２保証コードを、第２データ保証コードと呼ぶ。パリティに直接的に対応付けられている保証コードを、パリティ保証コードと呼ぶ。
【０１０２】
Ｓ１では、コントローラ１００は、第１データ保証コードに基づいて、データが正しいか否かを判定する。また、Ｓ１では、コントローラ１００は、パリティ保証コードに基づいて、そのパリティが正しいか否かを判定する。エラーの検出されたデータ及びパリティの属性は、第１エラー状態に変更される。
【０１０３】
次に、コントローラ１００は、第１データ保証コードと第２データ保証コードとを比較することにより、ホスト２０から要求されたデータに障害が生じているか否かを判定する（Ｓ２）。第１データ保証コードと第２データ保証コードとが一致する場合、そのデータに障害が生じていないと判定される。これに対し、第１データ保証コードと第２データ保証コードとが不一致の場合、そのデータに障害が生じていると判定される。障害が検出された場合、そのデータの属性は第２エラー状態に変更される。
【０１０４】
コントローラ１００は、記憶装置２１０から読み出されたデータに障害が検出された場合、ＲＡＩＤ技術に基づいて、そのデータを復元させる（Ｓ３）。即ち、復元対象のデータと同一ストライプ上に存在する他のデータ及びパリティを用いて演算を行うことにより、その復元対象のデータを正しいデータに回復させることができる。なお、ＲＡＩＤ１の場合は、ミラーディスクに記憶されているデータを読み出すことにより、正しいデータを得ることができる。
【０１０５】
コントローラ１００は、復元されたデータを、ホスト２０に送信する（Ｓ４）。なお、読出しを要求されたデータに障害が検出されなかった場合、コントローラ１００は、Ｓ３をスキップして、記憶装置２１０から読み出したデータをホスト２０に送信する。
【０１０６】
コントローラ１００は、ライトコマンドを受信した場合、リードモディファイライト処理を行う。コントローラ１００は、更新対象の旧データと、その旧データに対応付けられている旧パリティとを記憶装置２１０からそれぞれ読出し、保証コードに基づいて、旧データ及び旧パリティを検証する（Ｓ５）。
【０１０７】
続いて、コントローラ１００は、旧データに設定されている第１データ保証コードとその旧データに設定されている第２データ保証コードとを比較し、その旧データに障害が発生しているか否かを検査する（Ｓ６）。
【０１０８】
旧データに障害が検出された場合、コントローラ１００は、前記同様に、ＲＡＩＤ技術を用いて、旧データを正しいデータに回復させる（Ｓ７）。旧データをＲＡＩＤ技術で回復できない場合、コントローラ１００は、同一ストライプ上の全データが更新されるまで待機し、新たなデータが全て揃った時点で、新たなパリティを算出する（Ｓ７）。
【０１０９】
コントローラ１００は、新データ及び新パリティにそれぞれ保証コードを設定し、記憶装置２１０に記憶させる（Ｓ８）。なお、記憶装置２１０から正しい旧データを読み出すことができた場合、コントローラ１００は、旧データと旧パリティ及び新データに基づいて、新パリティを算出し、新データ及び新パリティを記憶装置２１０に記憶させる。
【０１１０】
図１０及び図１１に基づき、複数の保証コードを用いて、データを検証する方法を説明する。図１０はリード処理を示し、図１１はライト処理を示す。なお、以下の各フローチャートは、本発明の理解及び実施に必要な程度で各処理の概要を示しており、実際のコンピュータプログラムとは相違する場合がある。いわゆる当業者であれば、例えば、図示されたステップを別のステップに変更したり、ステップの順番を入れ替えたり、一部のステップを削除したり、新たなステップを追加したりできるであろう。
【０１１１】
図１０を参照してリード処理を説明する。コントローラ１００は、ホスト２０からリードコマンドを受信すると、検査済の対象データがキャッシュメモリ１３０に記憶されているか否かを判定する（Ｓ１０）。検査済の対象データとは、ホスト２０から読出しを要求されたデータであって、その属性が検査済状態に設定されているデータである。
【０１１２】
検査済の対象データがキャッシュメモリ１３０に記憶されている場合（S10:YES）、コントローラ１００は、その検査済の対象データをホスト２０に送信し（Ｓ２１）、リード処理を完了する。
【０１１３】
検査済の対象データがキャッシュメモリ１３０に記憶されていない場合（S10:NO）、コントローラ１００は、対象データを記憶装置２１０から読出す（Ｓ１１）。コントローラ１００は、その対象データに設定されている第１データ保証コードに基づいて、対象データが正しいか否かを判定する（Ｓ１２）。対象データが誤っている場合（S12:NO）、コントローラ１００は、対象データの属性を第１エラー状態に変更し（Ｓ１３）、ホスト２０にエラーを応答する（Ｓ２２）。
【０１１４】
なお、以下の説明では、第１データ保証コードに基づいて、データにエラーが生じているか否かを判定することを、「第１データ保証コードが正しいか否か」または「データが正しいか否か」のように表現する場合がある。
【０１１５】
対象データが正しい場合（S12:YES）、コントローラ１００は、対象データに関連するパリティであって、既に検査が済んでいるパリティが、キャッシュメモリ１３０に記憶されているか否かを判定する（Ｓ１４）。検査済パリティとは、その属性が検査済状態に設定されたパリティである。検査済パリティがキャッシュメモリ１３０に記憶されている場合（S14:YES）、Ｓ１５及びＳ１６をスキップして、Ｓ１８に移る。
【０１１６】
検査済のパリティがキャッシュメモリ１３０に記憶されていない場合（S14:NO）、コントローラ１００は、対象データに関連するパリティを記憶装置２１０から読み出す（Ｓ１５）。コントローラ１００は、パリティ保証コードが正しいか否かを検査し（Ｓ１６）、パリティ保証コードが誤っている場合（S16:NO）、パリティの属性を第１エラー状態に変更する（Ｓ１７）。そして、コントローラ１００は、ホスト２０にエラーを応答する（Ｓ２２）。
【０１１７】
パリティ保証コードが正しい場合（S16:YES）、コントローラ１００は、第１データ保証コードと第２データ保証コードとを比較し、各データ保証コードが一致するか否かを判定する（Ｓ１８）。
【０１１８】
第１データ保証コードと第２データ保証コードとが一致する場合には、各データ保証コードが完全に一致する場合と、各データ保証コードが部分的に一致する場合とがある。部分的に一致する場合としては、例えば、データ保証コードに含まれる情報のうち、ＬＲＣのみが一致する場合を挙げることができる。
【０１１９】
両方のデータ保証コードが不一致の場合（S18:NO）、コントローラは、対象データの属性とパリティの属性とを、それぞれ第２エラー状態に変更し（Ｓ１９）、ホスト２０にエラーを応答する（Ｓ２２）。
【０１２０】
第１データ保証コードと第２データ保証コードとが一致する場合（S18:YES）、コントローラ１００は、対象データの属性を検査済状態に変更し（Ｓ２１）、対象データをホスト２０に送信する（Ｓ２１）。以下、冗長な記載を避けるべく、記憶装置２１０、コントローラ１００及びキャッシュメモリ１３０の符号をそれぞれ割愛し、記憶装置、コントローラ及びキャッシュメモリと表現する場合がある。
【０１２１】
図１１を参照してライト処理を説明する。上述のように、ライト処理では、旧データ及び旧パリティを記憶装置２１０から読み出し、旧データと旧パリティ及び新データとに基づいて新パリティを算出し、新データ及び新パリティを記憶装置２１０に上書きする。
【０１２２】
コントローラは、検査済の旧データがキャッシュメモリに記憶されているか否かを判定する（Ｓ３０）。検査済の旧データがキャッシュメモリに記憶されていない場合（S30:NO）、コントローラは、旧データを記憶装置から読み出す（Ｓ３１）。同様に、コントローラは、検査済の旧パリティがキャッシュメモリに記憶されているか否かを判定する（Ｓ３２）。コントローラは、検査済の旧パリティがキャッシュメモリに記憶されていない場合（S32:NO）、旧パリティを記憶装置から読み出す（Ｓ３３）。
【０１２３】
コントローラは、旧パリティのパリティ保証コードを検査し（Ｓ３４）、パリティ保証コードが誤っている場合（S34:NO）。旧パリティの属性を第１エラー状態に変更する（Ｓ３５）。コントローラは、旧データの第１データ保証コードを検査し（Ｓ３６）、第１データ保証コードが誤っている場合（S36:NO）、旧データの属性を第１エラー状態に変更する（Ｓ３７）。
【０１２４】
コントローラは、旧データに関する、第１データ保証コードと第２データ保証コードとが一致するか否かを判定する（Ｓ３８）。第１データ保証コードと第２データ保証コードとが不一致の場合（S38:NO）、コントローラは、旧パリティの属性及び旧データの属性を、それぞれ第２エラー状態に変更する（Ｓ３９）。
【０１２５】
各保証コードがそれぞれ個別に正しいと判定され（S34:YES、S36:YES）、かつ、第１データ保証コードと第２データ保証コードとが一致すると判定された場合（S38:YES）、コントローラは、旧データと旧パリティと新データとに基づいて新パリティを生成する（Ｓ４０）。
【０１２６】
コントローラは、新パリティに、新たに生成された第２データ保証コードを付加し（Ｓ４１）、さらに、新パリティの属性を検査済状態に設定する（Ｓ４２）。そして、コントローラは、新パリティ及び新データを記憶装置に書き込む（Ｓ４３）。
【０１２７】
一方、第１エラー状態に変更された場合（Ｓ３５，Ｓ３７）、または、第２エラー状態に変更された場合（Ｓ３９）、コントローラは、ホスト２０から受信した新データを、記憶装置に書き込む（Ｓ４４）。新データは、検査済状態として扱われるため、記憶装置に書き込んでも問題はない。但し、この時点では、新データに対応する新パリティは生成されていない。エラー検出時に新パリティを生成する方法は、別図で説明する。
【０１２８】
以上、リード処理及びライト処理の基本的動作を説明した通り、本実施例では、各データの第１データ保証コードにそれぞれ対応する第２データ保証コードを、前記各データに関連付けられるパリティに設定する。従って、各データ及びパリティが正しいか否かを個別に検査することができ、さらに、データまたはパリティに障害が生じているか否かを判定することができる。
【０１２９】
次に、障害が検出された場合の対応方法を説明する。図１２は、改善されたリード処理を示すフローチャートである。図１０中のＳ２２に代えて、本フローチャートでは、データ回復処理を実行する（Ｓ５０）。以下に述べるように、データ回復処理では、対象データと同一のパリティに関連付けられる所定データを検証し、正しい所定データを用いて対象データを回復させる。
【０１３０】
図１３は、データ回復処理の詳細を示すフローチャートである。以下に述べるＳ５１〜Ｓ５７は、同一のパリティに関連する全てのデータについて行われる。後述する他の実施例においても、ＲＡＩＤに基づいてデータを回復させる場合、関連する全データについてそれぞれ正誤の検査が行われる。
【０１３１】
コントローラは、対象データと同一のストライプに属する、検査済の所定データがキャッシュメモリに記憶されているか否かを判定する（Ｓ５１）。所定データとは、対象データと同一のパリティによって管理されるデータである。所定データがキャッシュメモリに記憶されていない場合（S51:NO）、コントローラは、記憶装置から所定データを読み出す（Ｓ５２）。
【０１３２】
コントローラは、所定データの第１データ保証コードが正しいか否かを検査し（Ｓ５３）、第１データ保証コードが誤っている場合（S53:NO）、所定データの属性を第１エラー状態に変更する（Ｓ５４）。この場合は、ＲＡＩＤによって対象データを正しいデータに戻すことができないため、ホスト２０にエラーを応答する（Ｓ６２）。
【０１３３】
所定データの第１データ保証コードが正しい場合（S53:YES）、コントローラは、所定データの第１データ保証コードと所定データの第２データ保証コードとが一致するか否かを判定する（Ｓ５５）。所定データの第１データ保証コードと所定データの第２データ保証コードとが不一致の場合（S55:NO）、コントローラは、所定データの属性及びパリティの属性を第１エラー状態にそれぞれ変更し（Ｓ５６）、ホスト２０にエラーを応答する（Ｓ６２）。
【０１３４】
所定データについて、その第１データ保証コード及び第２データ保証コードが一致する場合（S55:YES）、コントローラは、所定データの属性を検査済状態に変更し（Ｓ５７）、所定データ及びパリティに基づいて、対象データを復元する（Ｓ５８）。
【０１３５】
コントローラは、対象データの属性及びパリティの属性をそれぞれ検査済状態に変更し（Ｓ５９）、対象データをホスト２０に送信する（Ｓ６０）。さらに、コントローラは、復元された対象データを記憶装置に上書きする（Ｓ６１）。
【０１３６】
図１４は、改善されたライト処理を示すフローチャートである。本フローチャートでは、対象データの属性が第１エラー状態に変更された場合（Ｓ３７）、または、旧パリティの属性及び旧データの属性が第２エラー状態に変更された場合（Ｓ３９）、データ回復処理を実行する（Ｓ７０）。
【０１３７】
図１５は、図１４中のデータ回復処理の詳細を示すフローチャートである。コントローラは、対象データと同一のストライプに属する、検査済の所定データがキャッシュメモリに記憶されているか否かを判定する（Ｓ７１）。検査済の所定データがキャッシュメモリに記憶されていない場合（S71:NO）、コントローラは、記憶装置から所定データを読み出す（Ｓ７２）。
【０１３８】
コントローラは、所定データの第１データ保証コードが正しいか否かを検査し（Ｓ７３）、第１データ保証コードが誤っている場合（S73:NO）、所定データの属性を第１エラー状態に変更し（Ｓ７４）、新データを記憶装置に書き込む（Ｓ８２）。
【０１３９】
所定データの第１データ保証コードが正しい場合（S73:YES）、コントローラは、所定データの第１データ保証コードと所定データの第２データ保証コードとが一致するか否かを判定する（Ｓ７５）。両方のデータ保証コードが不一致の場合（S75:NO）、コントローラは、対象データの属性及び旧パリティの属性をそれぞれ第１エラー状態に変更し（Ｓ７６）、ホスト２０にエラーを応答する（Ｓ８２）。
【０１４０】
所定データに障害の発生していないことが確認されると（S75:YES）、コントローラは、所定データの属性を検査済状態に変更し（Ｓ７７）、新データ及び所定データに基づいて新パリティを生成する（Ｓ７８）。
【０１４１】
コントローラは、新パリティに、新データの第２保証コードを付加し（Ｓ７９）、新パリティの属性を検査済状態に変更し（Ｓ８０）、新データ及び新パリティを記憶装置にそれぞれ記憶させる（Ｓ８１）。なお、新パリティには、所定データの第２データ保証コードも付加されている。
【０１４２】
このように構成される本実施例によれば、データの正誤を検出するデータ保証コードを、データ及びパリティにそれぞれ対応付けて記憶するため、各データ保証コードを比較することにより、いわゆる書き損じ障害や読み損じ障害を検出することができる。
【０１４３】
本実施例によれば、障害発生時に、ＲＡＩＤに基づいてデータまたはパリティを修復することができ、記憶制御装置の信頼性及びユーザの使い勝手が向上する。
【実施例２】
【０１４４】
図１６は、第２実施例による記憶制御装置で実行されるライト処理を示す。本実施例では、ＲＡＩＤによる回復を行うことができない場合に、ストライプ上の全データがキャッシュメモリに記憶されるのを待って、新パリティを生成する（Ｓ９０）。なお、以下に述べる各実施例は、第１実施例の変形例に相当する。
【０１４５】
図１７は、図１６中のパリティ生成待ち処理（Ｓ９０）の詳細を示すフローチャートである。コントローラは、新データを記憶装置に書込み（Ｓ９１）、さらに、新データをキャッシュメモリ上で保存しておく（Ｓ９２）。コントローラは、新データと同一ストライプに属する所定データがホスト２０によって書き込まれるまで待機し（Ｓ９３）、同一のストライプに属する全データが検査済状態になったか否かを判定する（Ｓ９４）。同一ストライプ上の全データが更新されるまで、Ｓ９１〜Ｓ９４が繰り返される。
【０１４６】
同一ストライプに属する全データが更新されると（S94:YES）、コントローラは、新しい各データに基づいて新パリティを生成する（Ｓ９５）。コントローラは、新パリティに、各新データの第２データ保証コードをそれぞれ設定し（Ｓ９６）、新パリティの属性を検査済状態に変更する（Ｓ９７）。コントローラは、新パリティと未書込みの新データとを、記憶装置にそれぞれ記憶させる（Ｓ９８）。
【０１４７】
このように構成される本実施例も第１実施例と同様の効果を奏する。さらに、本実施例では、ＲＡＩＤによってデータを回復できない場合でも、ストライプ上の全データがホストによって更新されるのを待つことにより、障害を回復することができる。
【実施例３】
【０１４８】
図１８〜図２３に基づいて第３実施例を説明する。本実施例では、データ保証コード内に、更新順序を示す情報（ＴＣ，ＳＥＱ＃）を含めている。
【０１４９】
図１８は、データ保証コードの内容を示す説明図である。第１データ保証コードは、ＬＡと、ＬＲＣと、更新時刻（ＴＣ）と、更新シーケンス番号（ＳＥＱ＃）とを含んで構成される。更新時刻とは、記憶制御装置がホスト２０から更新を要求された時刻を示す。更新シーケンス番号とは、更新された順番を示す番号である。データが更新されるたびに、更新シーケンス番号は１ずつ増加する。
【０１５０】
図１８の右側に示すように、パリティには、各データに関する第２データ保証コード及びパリティ保証コードが設定される。第２データ保証コード及びパリティ保証コードは、第１データ保証コードと同様に、ＬＡとＬＲＣと更新時刻及び更新シーケンス番号を含んで構成される。
【０１５１】
図１９は、データ保証コードの別の例を示す説明図である。第１データ保証コードは、図１８に示すものと同一である。しかし、図１９に示す第２データ保証コードは、更新時刻及び更新シーケンス番号のみを含み、ＬＡ及びＬＲＣを含まない。データとパリティとの間で、更新順序を示す情報を比較するだけでも、データに障害が生じたか否かを判定可能だからである。なお、更新順序を示す情報として、更新時刻及び更新シーケンス番号の２種類を挙げたが、いずれか一方のみを使用する構成でもよい。また、これら以外の情報を更新順序を示す情報として使用してもよい。
【０１５２】
図２０〜図２３は、リード処理を示す。まず、図２０を参照する。記憶装置から読み出された対象データについて、その第１データ保証コードが誤っている場合（S12:NO）、コントローラは、対象データの属性を第１エラー状態に変更する（Ｓ１００）。そして、コントローラは、図２３に示す処理を実行する。この処理については後述する。
【０１５３】
第１データ保証コードが正しく（S12:YES）、かつ、パリティ保証コードも正しい場合（S16:YES）、コントローラは、第１データ保証コードの更新順位Ｒ１と第２データ保証コードの更新順位Ｒ２とが一致するか否かを判定する（Ｓ１０１）。更新順位Ｒ１を第１更新順位と、更新順位Ｒ２を第２更新順位と、それぞれ呼ぶこともできる。
【０１５４】
更新時刻及び更新シーケンス番号が第１，第２データ保証コード内にそれぞれ存在する場合、コントローラは、最初に更新時刻の先後を判別し、同一時刻の場合には、さらに更新シーケンス番号の大小を判別する（Ｓ１０１）。第１，第２データ保証コード内に更新時刻及び更新シーケンス番号の両方を含む場合、同一時刻に更新された場合でも、その先後を決定することができる。
【０１５５】
第１更新順位Ｒ１と第２更新順位Ｒ２とが一致する場合（S101:YES）、障害が発生していないと判定される。そこで、コントローラは、対象データの属性を検査済状態に変更し（Ｓ２０）、対象データをホスト２０に送信する（Ｓ２１）。
【０１５６】
第１更新順位Ｒ１と第２更新順位Ｒ２とが不一致の場合（S101:NO）、コントローラは、更新順位Ｒ１と更新順位Ｒ２のいずれが新しいかを判定する（Ｓ１０２）。
【０１５７】
Ｒ２よりもＲ１の方が大きい場合は（S102:YES）、データの方が新しく、パリティの方が古い場合である。つまり、データには障害が生じていないが、パリティに障害が生じている場合である。そこで、コントローラは、図２１に示す処理を実行する。この処理については後述する。
【０１５８】
Ｒ１よりもＲ２の方が大きい場合は（S102:NO）、パリティの方が新しく、データの方が古い場合である。即ち、データに障害が生じている場合である。そこで、コントローラは、図２２に示す処理を実行する。この処理については後述する。
【０１５９】
図２１は、図２０中の結合子Ａに続くフローチャートである。即ち、データは正しく、パリティが誤っている場合の処理を示す。
【０１６０】
コントローラは、対象データの属性を検査済状態に変更し（Ｓ１１０）、対象データをホスト２０に送信する（Ｓ１１１）。対象データは正しいため、ホスト２０に送信して、リード処理の完了をホスト２０に通知することができる。引き続いて、コントローラは、パリティの復元を行う。
【０１６１】
コントローラは、検査済の所定データがキャッシュメモリに記憶されているか否かを判定する（Ｓ１１２）。検査済の所定データがキャッシュメモリに記憶されていない場合（S112:NO）、コントローラは、所定データを記憶装置から読み出す（Ｓ１１３）。
【０１６２】
コントローラは、所定データの第１データ保証コードが正しいか否かを判定する（Ｓ１１４）。所定データに設定された第１データ保証コードが誤っている場合（S114:NO）、コントローラは、所定データの属性を第１エラー状態に変更し（Ｓ１１５）、上述したパリティ生成待ち処理（Ｓ９０）を実行する。
【０１６３】
所定データの第１データ保証コードが正しい場合（S114:YES）、コントローラは、所定データに関するＲ１とＲ２とを比較する（Ｓ１１６）。即ち、所定データが正しいデータであるか否かを、データの更新順位Ｒ１とパリティの更新順位Ｒ２とを比較することにより検証する。
【０１６４】
第２更新順位Ｒ２の方が第１更新順位Ｒ１よりも大きい場合は（S116:NO）、所定データの方がパリティよりも古く、所定データの方に障害が生じている場合である。そこで、コントローラは、所定データの属性を第２エラー状態に変更し（Ｓ１１７）、パリティ生成待ち処理（Ｓ９０）を実行する。
【０１６５】
第１更新順位Ｒ１が第２更新順位Ｒ２と等しいか、または、大きい場合（S116:YES）、所定データに障害は生じていないと判定される。そこで、コントローラは、所定データの属性を検査済状態に変更し（Ｓ１１８）、対象データと所定データとに基づいて、新パリティを生成する（Ｓ１１９）。
【０１６６】
コントローラは、新パリティに各データに関する第２データ保証コードをそれぞれ設定し（Ｓ１２０）、新パリティの属性を検査済状態に変更する（Ｓ１２１）。コントローラは、新パリティを記憶装置に記憶させる（Ｓ１２２）。
【０１６７】
図２２は、図２０中の結合子Ｂに続くフローチャートである。即ち、パリティの方が正しく、対象データの方に障害が生じている場合の処理を示す。コントローラは、対象データの属性を第２エラー状態に変更する（Ｓ１３０）。
【０１６８】
コントローラは、検査済の所定データがキャッシュメモリに記憶されているか否かを判定する（Ｓ１３１）。コントローラは、検査済の所定データがキャッシュメモリに記憶されていない場合（S131:NO）、所定データを記憶装置から読み出す（Ｓ１３２）。
【０１６９】
コントローラは、所定データに設定されている第１データ保証コードが正しいか否かを検査する（Ｓ１３３）。コントローラは、第１データ保証コードが間違っていると判定した場合（S133:NO）、所定データの属性を第１エラー状態に変更し（Ｓ１３４）、ホスト２０にエラーを応答する（Ｓ１４２）。そして、コントローラは、パリティ生成待ち処理（Ｓ９０）を実行する。
【０１７０】
所定データの第１データ保証コードが正しい場合（S133:YES）、コントローラは、所定データについて、第１更新順位Ｒ１と第２更新順位Ｒ２とを比較する（Ｓ１３５）。第２更新順位の方が第１更新順位よりも大きい場合（S135:NO）、即ち、所定データに障害が生じている場合、コントローラは、所定データの属性を第２エラー状態に変更する（Ｓ１３６）。コントローラは、ホスト２０にエラーを応答し（Ｓ１４２）、パリティ生成待ち処理（Ｓ９０）を実行する。
【０１７１】
第１更新順位Ｒ１が第２更新順位Ｒ２と等しいか、または大きい場合（S135:YES）、所定データに障害は生じていない。そこで、コントローラは、所定データの属性を検査済状態に変更し（Ｓ１３７）、所定データとパリティとに基づいて対象データを復元する（Ｓ１３８）。
【０１７２】
コントローラは、復元された対象データの属性を検査済状態に変更し（Ｓ１３９）、復元された対象データをホスト２０に送信する（Ｓ１４０）。さらに、コントローラは、復元された対象データを記憶装置に書き込み、古い対象データを正しいデータで上書きする（Ｓ１４１）。
【０１７３】
図２３は、図２０中の結合子Ｃに続くフローチャートである。即ち、ホスト２０から読出しを要求された対象データが、それ単体で間違っている場合の処理を示す。この場合は、図２２で述べたと同様の処理が実行される。
【０１７４】
コントローラは、検査済の所定データがキャッシュメモリに記憶されているか否かを判定し（Ｓ１５０）、検査済の所定データがキャッシュメモリに記憶されていない場合（S150:NO）、所定データを記憶装置から読み出す（Ｓ１５１）。
【０１７５】
コントローラは、所定データに設定されている第１データ保証コードが正しいか否かを検査し（Ｓ１５２）、第１データ保証コードが間違っていると判定した場合（S152:NO）、所定データの属性を第１エラー状態に変更する（Ｓ１５３）。コントローラは、ホスト２０にエラーを応答し（Ｓ１６１）、パリティ生成待ち処理（Ｓ９０）を実行する。
【０１７６】
所定データの第１データ保証コードが正しい場合（S152:YES）、コントローラは、所定データについて、第１更新順位Ｒ１と第２更新順位Ｒ２とを比較する（Ｓ１５４）。第２更新順位の方が第１更新順位よりも大きい場合（S154:NO）、コントローラは、所定データの属性を第２エラー状態に変更する（Ｓ１５５）。コントローラは、ホスト２０にエラーを応答し（Ｓ１６１）、パリティ生成待ち処理（Ｓ９０）を実行する。
【０１７７】
第１更新順位Ｒ１が第２更新順位Ｒ２と等しいか、または、大きい場合（S154:YES）、コントローラは、所定データの属性を検査済状態に変更し（Ｓ１５６）、所定データとパリティとに基づいて対象データを復元する（Ｓ１５７）。
【０１７８】
コントローラは、復元された対象データの属性を検査済状態に変更し（Ｓ１５８）、復元された対象データをホスト２０に送信する（Ｓ１５９）。さらに、コントローラは、復元された対象データを記憶装置に書き込み、古い対象データを正しいデータで上書きする（Ｓ１６０）。
【０１７９】
このように構成される本実施例も第１実施例と同様の効果を奏する。さらに、本実施例では、更新順序を示す情報を、第１データ保証コード及び第２データ保証コードにそれぞれ含めるため、データとパリティのいずれに障害が生じているかを判別できる。そして、障害発生箇所に応じて、適切な回復処理を行うことができる。
【実施例４】
【０１８０】
図２４〜図２９に基づいて第４実施例を説明する。本実施例では、ＲＡＩＤ１＋０の場合を例に挙げて説明する。最初に、図２４〜図２６に基づいて基本的構成を説明し、次に、図２７〜図２９に基づいて、改善された手法を説明する。
【０１８１】
図２４は、ＲＡＩＤ１＋０の構成において、第１データ保証コード及び第２データ保証コードを設定する様子を示す説明図である。図中「ドライブ０」，「ドライブ１」と示す２個の記憶装置は、プライマリの記憶装置である。「ドライブ２」，「ドライブ３」として示す別の２個の記憶装置は、セカンダリの記憶装置である。
【０１８２】
プライマリの記憶装置に記憶されているデータをプライマリデータと呼び、セカンダリの記憶装置に記憶されているデータをミラーデータと呼ぶ。プライマリデータに設定されているデータ保証コードを第１データ保証コードと呼び、ミラーデータに設定されているデータ保証コードを第２データ保証コードと呼ぶ。通常の場合、プライマリの記憶装置とセカンダリの記憶装置の記憶内容は一致している。
【０１８３】
図２５は、リード処理のフローチャートを示す。コントローラは、検査済の対象データがキャッシュメモリに記憶されているか否かを判定する（Ｓ１７０）。検査済の対象データがキャッシュメモリに記憶されている場合（S170:YES）、コントローラは、その検査済の対象データをホスト２０に送信する（Ｓ１７９）。
【０１８４】
検査済の対象データがキャッシュメモリに記憶されていない場合（S170:NO）、コントローラは、プライマリの記憶装置から対象データを読み出し（Ｓ１７１）、対象データの第１データ保証コードが正しいか否かを検査する（Ｓ１７２）。対象データの第１データ保証コードが誤っている場合（S172:NO）、コントローラは、対象データの属性を第１エラー状態に変更し（Ｓ１７３）、ホスト２０にエラーを通知する（Ｓ１８０）。
【０１８５】
第１データ保証コードが正しい場合（S172:YES）、コントローラは、セカンダリの記憶装置から第２データ保証コードを読出し、第２データ保証コードが正しいか否かを検査する（Ｓ１７４）。第２データ保証コードが誤っている場合（S174:NO）、コントローラは、ミラーデータの属性を第１エラー状態に変更し（Ｓ１７５）、ホスト２０にエラーを応答する（Ｓ１８０）。
【０１８６】
第２データ保証コードが正しい場合（S174:YES）、コントローラは、第１データ保証コードと第２データ保証コードとが一致するか否かを判定する（Ｓ１７６）。第１データ保証コードと第２データ保証コードとが不一致の場合（S176:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ１８０）。
【０１８７】
第１データ保証コードと第２データ保証コードとが一致する場合（S176:YES）、コントローラは、対象データの属性とミラーデータの属性とを、それぞれ検査済状態に変更し（Ｓ１７８）、対象データをホスト２０に送信する（Ｓ１７９）。
【０１８８】
図２６は、ライト処理を示すフローチャートである。コントローラは、ホスト２０から受信した新データ及びこの新データに対応付けられるデータ保証コードを、セカンダリ記憶装置用にコピーする（Ｓ１９０）。オリジナルのデータ保証コードは、第１データ保証コードとなり、コピーされたデータ保証コードは、第２データ保証コードとなる。
【０１８９】
コントローラは、新データの属性及び新ミラーデータの属性を、それぞれ検査済状態に変更する（Ｓ１９１）。コントローラは、新データ及び第１データ保証コードをプライマリの記憶装置に書込み（Ｓ１９２）、さらに、新ミラーデータ及び第２データ保証コードをセカンダリの記憶装置に書き込む（Ｓ１９３）。
【０１９０】
図２７は、データ保証コードの別の例を示す説明図である。図２７に示す例では、データ保証コード内に、更新時刻及び更新シーケンス番号が含まれている。
【０１９１】
図２８は、改善されたリード処理のフローチャートである。図２５との相違部分を中心に説明する。第２データ保証コードが正しい場合（S174:YES）、コントローラは、対象データの更新順位Ｒ１とミラーデータの更新順位Ｒ２とが一致するか否かを判定する（Ｓ２００）。
【０１９２】
両方の更新順位Ｒ１，Ｒ２が一致する場合（S200:YES）、障害は発生していないため、コントローラは、対象データの属性及びミラーデータの属性をそれぞれ検査済状態に変更し（Ｓ１７８）、対象データをホスト２０に送信する（Ｓ１７９）。
【０１９３】
対象データの更新順位Ｒ１とミラーデータの更新順位Ｒ２とが不一致の場合（S200:NO）、コントローラは、更新順位Ｒ１と更新順位Ｒ２との大小を比較する（Ｓ２０１）。更新順位Ｒ１の方が更新順位Ｒ２よりも大きい場合は（S201:YES）、対象データの方がミラーデータよりも新しい場合である。
【０１９４】
そこで、コントローラは、対象データをホスト２０に送信し（Ｓ２０２）、対象データをミラーデータにコピーする（Ｓ２０３）。即ち、正しい対象データによって、誤ったミラーデータを上書きすることにより、エラーを解消する。コントローラは、対象データの属性及びミラーデータの属性を、それぞれ検査済状態に変更する（Ｓ２０６）。
【０１９５】
更新順位Ｒ２の方が更新順位Ｒ１よりも大きい場合（S201:NO）、ミラーデータの方が対象データよりも新しい。そこで、コントローラは、ミラーデータをホスト２０に送信し（Ｓ２０４）、ミラーデータを対象データにコピーする（Ｓ２０５）。
【０１９６】
つまり、正しいミラーデータで対象データを上書きすることで、エラーを解消する。コントローラは、対象データの属性及びミラーデータの属性を、それぞれ検査済状態に変更する（Ｓ２０６）。
【０１９７】
図２９は、改善されたライト処理を示すフローチャートである。コントローラは、検査済の旧データまたは検査済の旧ミラーデータがキャッシュメモリに記憶されているか否かを判定する（Ｓ２１０）。
【０１９８】
検査済の旧データ及び検査済の旧ミラーデータのいずれもがキャッシュメモリに記憶されていない場合（S210:NO）、コントローラは、旧データ及び旧ミラーデータを記憶装置から読出し（Ｓ２１１）、更新順位Ｒ１と更新順位Ｒ２とを比較する（Ｓ２１２）。
【０１９９】
更新順位Ｒ１と更新順位Ｒ２とが一致する場合（S212:YES）、コントローラはＲ１またはＲ２のいずれかに１を加算する（Ｓ２１３）。
【０２００】
Ｒ１とＲ２とが不一致の場合（S212:NO）、コントローラは、Ｒ１とＲ２のいずれが大きいかを判定する（Ｓ２１４）。Ｒ１の方がＲ２よりも大きい場合（S214:YES）、コントローラは、Ｒ１に１を加算する（Ｓ２１５）。Ｒ２の方がＲ１よりも大きい場合（S214:NO）、コントローラは、Ｒ２に１を加算する（Ｓ２１６）。
【０２０１】
Ｒ１，Ｒ２に１を加算するとは、更新時刻及び更新シーケンス番号の両方をそれぞれ更新させることを意味する。Ｓ２１１で読み出された旧データの更新順位を更新して、記憶しておくためである。
【０２０２】
その後、図２６で述べたと同様に、コントローラは、新データ及びデータ保証コードを、セカンダリの記憶装置用にコピーし（Ｓ１９０）、新データの属性及び新ミラーデータの属性を検査済状態にそれぞれ変更する（Ｓ１９１）。新データ及び第１データ保証コードは、プライマリの記憶装置に書き込まれ（Ｓ１９２）、ミラーデータ及び第２データ保証コードはセカンダリの記憶装置に書き込まれる（Ｓ１９３）。
【０２０３】
このように構成される本実施例も第１実施例と同様の効果を奏する。
【実施例５】
【０２０４】
図３０〜図３６に基づいて第５実施例を説明する。本実施例及び後述の第６実施例では、本発明をＲＡＩＤ６に適用した場合について述べる。本実施例では、「Ｐ＋Ｑ  ガロア法（Maximum Distance
Separable RAID6）」の場合を説明し、第６実施例では、「２Ｄ−ＸＯＲ法（2Dimensional-XOR
RAID6）」の場合を説明する。
【０２０５】
図３０は、３Ｄ＋２ＰのＲＡＩＤ６において、データ保証コードの格納方法を示す説明図である。「ドライブ０」、「ドライブ１」及び「ドライブ２」は、データを記憶する記憶装置であり、「ドライブ３」はＰパリティを記憶する記憶装置であり、「ドライブ４」はＱパリティを記憶する記憶装置である。データを記憶する記憶装置をデータ記憶装置、Ｐパリティを記憶する記憶装置をＰパリティ記憶装置、Ｑパリティを記憶する記憶装置をＱパリティ記憶装置とそれぞれ呼ぶことができる。また、Ｐパリティ記憶装置とＱパリティ記憶装置の総称として、パリティ記憶装置と呼ぶこともできる。
【０２０６】
データ記憶装置（ドライブ０〜ドライブ２）には、データと、そのデータに対応付けられる第１データ保証コードとがそれぞれ記憶される。Ｐパリティ記憶装置には、Ｐパリティと、各第１データ保証コードにそれぞれ対応する第２データ保証コードと、Ｐパリティの保証コードと、Ｑパリティの保証コードとが記憶される。同様に、Ｑパリティ記憶装置には、Ｑパリティと、各第２データ保証コードと、Ｐパリティの保証コードと、Ｑパリティの保証コードとが記憶される。Ｐパリティの正誤を検査するための保証コードをＰパリティ保証コードと、Ｑパリティの正誤を検査するための保証コードをＱパリティ保証コードと、それぞれ呼ぶことにする。
【０２０７】
図３１は、「Ｐ＋Ｑ  ガロア法」を説明する説明図である。図３１（ａ）は、各記憶装置に格納されるデータ及びパリティの様子を示す。図３１（ｂ）に示すように、Ｐパリティは、ストライプ上のデータに基づいて生成される。図３１（ｃ）に示すように、Ｑパリティも、ストライプ上のデータに基づいて生成される。即ち、Ｐパリティ及びＱパリティは、それぞれ同一のデータ群について算出される。
【０２０８】
図３２〜図３４に基づいてリード処理を説明する。なお、紙面の都合上、データがキャッシュメモリに記憶されているか否かを判定するステップ、ステージングを行うステップ、データやパリティの属性を変更するステップ等を省略して説明する。
【０２０９】
また、紙面の都合上、フローチャートでは、処理の内容を簡略化して表現する。幾つかの簡略化表現について予め説明すると、「Ｄ単体チェック」とは、第１データ保証コードのみに基づいて、そのデータの正誤を検査することを意味する。以下の説明では、データの単体検査と呼ぶことがある。
【０２１０】
同様に、「Ｐ単体チェック」とは、Ｐパリティ保証コードのみに基づいて、Ｐパリティの正誤を検査することを意味し、「Ｑ単体チェック」とは、Ｑパリティ保証コードのみに基づいて、Ｑパリティの正誤を検査することを意味する。以下の説明では、Ｐパリティの単体チェック、Ｑパリティの単体チェックと呼ぶことがある。
【０２１１】
「他Ｄ単体チェック」とは、同一のストライプに属する他のデータ（所定データ）について、その所定データに設定されている第１データ保証コードのみに基づいて、その所定データの正誤を検査することを意味する。以下の説明では、所定データの単体チェックと呼ぶことがある。
【０２１２】
さらに、「Ｄ＆Ｐ比較チェック」とは、データに設定されている第１データ保証コードと、Ｐパリティに設定されている第２データ保証コードとを比較して検査することを意味する。以下の説明では、データとＰパリティとによる比較チェックと呼ぶことがある。「Ｄ＆Ｑ比較チェック」とは、データに設定されている第１データ保証コードと、Ｑパリティに設定されている第２データ保証コードとを比較して検査することを意味する。以下の説明では、データとＱパリティとによる比較チェックと呼ぶことがある。
【０２１３】
以下に述べる、Ｐパリティの単体チェックとＱパリティの単体チェックの実行順序は、いずれが先であってもよい。データとＰパリティによる比較チェックと、データとＱパリティによる比較チェックも、いずれを先に行ってもよいし、同時に行ってもよい。さらに、ＰパリティまたはＱパリティのいずれかが誤っている場合、ホスト２０への応答とは別に、誤ったパリティをデータから回復させるようにしてもよい。
【０２１４】
フローチャート中の「ＯＫ」とは、処理が正常に終了することを意味し、「ＮＧ」とは処理が正常に終了しないことを意味する。それぞれの内容は、図３４に示される。
【０２１５】
リード処理の説明に戻る。コントローラは、第１データ保証コードに基づいて、データを単体でチェックし（Ｓ３００）、データが誤っている場合は結合子１を介して、図３３に移る。図３３の処理は後述する。
【０２１６】
データの単体チェックの結果、そのデータが正しいと判定された場合（S300:YES）、コントローラは、そのデータに関するＰパリティの正誤を、Ｐパリティ保証コードでチェックする（Ｓ３０１）。Ｐパリティが正しい場合（S301:YES）、コントローラは、データとＰパリティによる比較チェックを行い（Ｓ３０２）、障害の有無を判定する。障害が検出されなかった場合（S302:YES）、正常に終了する。図３４に示すように、コントローラは、データをホスト２０に送信する（Ｓ３５０）。
【０２１７】
Ｐパリティが誤っていると判定された場合（S301:NO）、コントローラは、Ｑパリティを単体チェックし（Ｓ３０３）、さらに、データとＱパリティとによる比較チェックを行う（Ｓ３０４）。つまり、Ｐパリティが誤っている場合でも、正しいＱパリティが存在し（S303:YES）、かつ、第１データ保証コードとＱパリティに設定されている第２データ保証コードとが一致する場合（S304:YES）、対象データに障害は発生していないと判断できる。この場合、コントローラは、データをホスト２０に送信し、リード処理を正常に終了する（Ｓ３５０）。
【０２１８】
Ｑパリティ保証コードが誤っている場合（S303:NO）、及び、第１データ保証コードとＱパリティに付随する第２データ保証コードが不一致の場合（S304:NO）、ＲＡＩＤ６に基づいてデータを回復させることはできない。そこで、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２１９】
第１データ保証コードとＰパリティに付随する第２データ保証コードとが不一致の場合（S302:NO）、コントローラは、Ｑパリティを単体でチェックし（Ｓ３０５）、Ｑパリティが正しい場合（S305:YES）、データとＱパリティとによる比較チェックを行う（Ｓ３０６）。第１データ保証コードと正しいＱパリティに付随する第２データ保証コードとが一致する場合（S306:YES）、コントローラは、対象データが正しいものと判定し、ホスト２０に、そのデータを送信する（Ｓ３５０）。
【０２２０】
つまり、データには、ＰパリティとＱパリティとの２種類のパリティが対応付けられているため、Ｐパリティ及びＱパリティのうちいずれか一方を用いた比較チェックで障害が検出された場合でも、他方のパリティを用いた比較チェックで障害が検出されなかった場合は、正しいデータであると判定する。
【０２２１】
Ｑパリティの単体チェックの結果、Ｑパリティが誤っていると判定された場合（S305:NO）、コントローラは、所定データを単体チェックし（Ｓ３０７）、さらに、所定データとＰパリティとによる比較チェックを行う（Ｓ３０８）。
【０２２２】
所定データに障害が生じていない場合（S307:YES、S308:YES）、コントローラは、所定データとＰパリティとに基づいて、対象データを回復させ（Ｓ３０９）、回復したデータをホスト２０に送信する（Ｓ３５０）。
【０２２３】
所定データの第１保証コードが誤っている場合（S307:NO）、及び、所定データに関する第１データ保証コードと第２データ保証コードが一致しない場合（S308:NO）、対象データを回復させることはできない。そこで、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２２４】
第１データ保証コードとＱパリティに付随する第２データ保証コードとが不一致の場合（S306:NO）、コントローラは、対象データと同一のパリティで管理されている他のデータ（所定データ）のそれぞれを、単体でチェックする（Ｓ３１０）。所定データに付随する第１データ保証コードが正しい場合（S310:YES）、コントローラは、所定データの第１データ保証コードと、Ｐパリティに付随する、所定データに関する第２データ保証コードとを比較する（Ｓ３１１）。
【０２２５】
所定データに障害が生じていないことが確認されると（S311:YES）、コントローラは、所定データとＰパリティとに基づいて、対象データを回復する（Ｓ３１２）。コントローラは、回復したデータをホスト２０に送信する（Ｓ３５０）。なお、以下の説明でも同様であるが、データを回復させた場合は、そのデータをホストに送信すると共に、回復させたデータを記憶装置２１０に書き込む。
【０２２６】
所定データの第１データ保証コードが誤っている場合（S310:NO）、コントローラは、エラーの生じている所定データの数が１個であるか否かを判定する（Ｓ３１３）。２個以上の所定データに誤りがある場合（S313:NO）、ＲＡＩＤ６の仕組みを用いて対象データを復元することはできない。この場合、コントローラは、ホストにエラーを応答する（Ｓ３５１）。
【０２２７】
エラーの検出された所定データの数が１個の場合（S313:YES）、コントローラは、エラーの生じていない所定データに付随する第１データ保証コードと、Ｐパリティに付随する第２データ保証コード及びＱパリティに付随する第２データ保証コードとを比較する（Ｓ３１４）。
【０２２８】
エラーの検出されていない所定データに障害が発生していないことが確認されると（S314:YES）、コントローラは、エラーの検出されていない所定データとＰパリティ及びＱパリティに基づいて、対象データを回復させる（Ｓ３１５）。コントローラは、回復されたデータをホスト２０に送信する（Ｓ３５０）。Ｓ３１４でＮＯと判定された場合、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２２９】
所定データの第１データ保証コードと、Ｐパリティに付随する、所定データの第２データ保証コードとが不一致の場合（S311:NO）、コントローラは、所定データの第１データ保証コードと、Ｑパリティに付随する、所定データの第２データ保証コードとが一致するか否かを判定する（Ｓ３１６）。所定データについて、その第１データ保証コードと第２データ保証コードとが不一致の場合（S316:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２３０】
所定データの第１データ保証コードとＱパリティに付随する第２データ保証コードとが一致する場合（S316:YES）、コントローラは、所定データ及びＱパリティに基づいて、対象データを回復させる（Ｓ３１７）。コントローラは、回復したデータをホスト２０に送信し、かつ、その回復したデータを記憶装置２１０に書き込む（Ｓ３５０）。
【０２３１】
図３３を参照する。図３２のＳ３００において、読出し対象のデータの第１データ保証コードに誤りが検出された場合（S300:NO）、コントローラは、Ｐパリティ保証コードを検査する（Ｓ３２０）。
【０２３２】
Ｐパリティ保証コードが正しい場合（S320:YES）、コントローラは、所定データの第１データ保証コードを検査する（Ｓ３２１）。さらに、コントローラは、所定データについて、その第１データ保証コードと、Ｐパリティに付随する第２データ保証コードとを比較する（Ｓ３２２）。
【０２３３】
所定データの第１データ保証コードと、Ｐパリティに付随する、所定データの第２データ保証コードとが一致する場合（S322:YES）、コントローラは、所定データとＰパリティとに基づいて、対象データを回復させる（Ｓ３２３）。コントローラは、回復したデータをホスト２０に送信し、かつ、回復したデータを記憶装置２１０に書き込む（Ｓ３５０）。
【０２３４】
Ｐパリティ保証コードが誤っている場合（S320:NO）、コントローラは、Ｑパリティ保証コードを検査する（Ｓ３２４）。Ｑパリティが誤っている場合（S324:NO）、Ｐパリティ及びＱパリティの両方が誤っているため、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２３５】
Ｑパリティが正常な場合（S324:YES）、コントローラは、所定データの第１データ保証コードを検査する（Ｓ３２５）。所定データのいずれかが誤っている場合（S325:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２３６】
所定データが正常な場合（S325:YES）、コントローラは、所定データについて、第１データ保証コードとＱパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ３２６）。
【０２３７】
所定データについて、第１データ保証コードとＱパリティに付随する第２データ保証コードとが不一致の場合（S326:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５０）。
【０２３８】
所定データについて、第１データ保証コードとＱパリティに付随する第２データ保証コードとが一致する場合（S326:YES）、コントローラは、所定データ及びＱパリティに基づいて、対象データを回復させる（Ｓ３２７）。
【０２３９】
所定データに付随する第１データ保証コードによって、所定データが間違っていると判定された場合（S321:NO）、コントローラは、誤っている所定データの数が１個であるか否かを判定する（Ｓ３２８）。誤っている所定データが２個以上存在する場合（S328:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２４０】
誤っている所定データの数が１個の場合（S328:YES）、コントローラは、Ｑパリティ保証コードに基づいてＱパリティを検査する（Ｓ３２９）。Ｑパリティが正常ではない場合（S329:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２４１】
Ｑパリティが正常な場合（S329:YES）、コントローラは、正常な所定データとＰパリティ及びＱパリティに基づいて、対象データを回復させる（Ｓ３３０）。コントローラは、回復したデータをホスト２０に送信し、かつ、回復したデータを記憶装置２１０に書き込む（Ｓ３５０）。
【０２４２】
所定データについて、第１データ保証コードと、Ｐパリティに付随する第２データ保証コードとが一致しない場合（S322:NO）、コントローラは、Ｑパリティ保証コードに基づいてＱパリティが正常か否かを判定する（Ｓ３３２）。Ｑパリティが正常ではない場合（S332:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２４３】
Ｑパリティが正常な場合（S332:YES）、コントローラは、所定データについて、第１データ保証コードとＱパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ３３３）。所定データに関する、第１データ保証コードと第２データ保証コードとが一致する場合（S333:YES）、コントローラは、所定データとＱパリティとに基づいて、対象データを回復させる（Ｓ３３４）。コントローラは、回復したデータをホスト２０に送信し、かつ、回復したデータを記憶装置２１０に書き込む（Ｓ３５０）。
【０２４４】
所定データについて、その第１データ保証コードと、Ｑパリティに付随する第２データ保証コードとが一致しない場合（S333:NO）、コントローラは、誤った所定データの数が１個に留まっているか否か、及び、正常な所定データの第１データ保証コードがＰパリティ及びＱパリティにそれぞれ付随する第２データ保証コードに一致するか否かを、それぞれ判定する（Ｓ３３５）。
【０２４５】
誤った所定データの数が２個以上の場合または第１データ保証コードと第２データ保証コードとが一致しない場合（S335:NO）、コントローラは、ホスト２０にエラーを応答する（Ｓ３５１）。
【０２４６】
誤った所定データの数が１個であり、かつ、正常な所定データに関して、第１データ保証コードと第２データ保証コードとが一致する場合（S335:YES）、コントローラは、正常な所定データとＰパリティ及びＱパリティに基づいて、対象データを回復させる（Ｓ３３６）。コントローラは、回復したデータをホスト２０に送信し、かつ、回復したデータを記憶装置２１０に書き込む（Ｓ３５０）。
【０２４７】
図３５，図３６は、ライト処理を示すフローチャートである。まず、コントローラは、旧データに付随する第１データ保証コードに基づいて、旧データを単体でチェックする（Ｓ４００）。旧データの第１データ保証コードが誤っている場合（S400:NO）、即ち、旧データが誤っている場合（S400:NO）は、結合子２を介して図３６に示すフローチャートに移動する。このフローチャートについては後述する。
【０２４８】
旧データが正常であると判定された場合（S400:YES）、コントローラは、旧Ｐパリティについて単体チェックを行うと共に、旧データと旧Ｐパリティとによる比較チェックを行う（Ｓ４０１）。即ち、コントローラは、旧Ｐパリティに付随する旧Ｐパリティ保証コードに基づいて、旧Ｐパリティにエラーが生じていないことを確認し、かつ、旧データの第１データ保証コードと旧Ｐパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ４０１）。
【０２４９】
旧Ｐパリティ及び旧データが正しいことが確認されると（S401:YES）、コントローラは、新データと旧データ及びＰパリティとに基づいて、新しいＰパリティを生成する（Ｓ４０３）。
【０２５０】
コントローラは、旧Ｑパリティ保証コードに基づいて旧Ｑパリティにエラーが生じているか否かを判定し、さらに、旧データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ４０３）。
【０２５１】
旧Ｑパリティに障害が生じていないことが確認されると（S403:YES）、コントローラは、新データと旧データ及び旧Ｑパリティとに基づいて、新しいＱパリティを生成する（Ｓ４０４）。そして、コントローラは、ライト処理が正常に完了した旨をホスト２０に通知し、ライト処理を正常に終了する。
【０２５２】
なお、ライト処理が正常に終了する場合、図中では「ＯＫ」で示す。ライト処理が正常に終了しない場合、図中では「ＮＧ」で示す。「ＮＧ」の場合、コントローラは、ホスト２０にエラーを応答する。
【０２５３】
旧Ｐパリティ保証コードに誤りがある場合、または、旧データの第１データ保証コードと旧Ｐパリティに付随する第２データ保証コードとが不一致の場合、のいずれかに該当する場合（S401:NO）、コントローラは、旧Ｑパリティを単体でチェックし、かつ、旧データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが一致するか否かをチェックする（Ｓ４０５）。
【０２５４】
旧Ｑパリティ保証コードに誤りがある場合、または、旧データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが不一致の場合のいずれかである場合（S405:NO）、コントローラは、ホスト２０にエラーを応答する。
【０２５５】
旧パリティ保証コードが正しく、かつ、旧データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが一致する場合（S405:YES）、コントローラは、新データと旧データ及び旧Ｑパリティとに基づいて、新しいＱパリティを生成する（Ｓ４０６）。
【０２５６】
コントローラは、所定データの第１データ保証コードが正しいか否かをチェックし、かつ、所定データの第１データ保証コードと新Ｑパリティに付随する第２データ保証コードとが一致するか否かをチェックする（Ｓ４０７）。
【０２５７】
所定データの第１データ保証コードが正しく、かつ、所定データの第１データ保証コードと新Ｑパリティに付随する第２データ保証コードとが一致する場合（S407:YES）、コントローラは、新データと所定データとに基づいて、新しいＰパリティを生成し（Ｓ４０８）、ライト処理を正常に終了する。
【０２５８】
所定データの第１データ保証コードが誤っている場合、あるいは、所定データの第１データ保証コードと新Ｑパリティに付随する第２データ保証コードとが不一致である場合のいずれかである場合（S407:NO）、コントローラは、誤った所定データの数が１個であるか否かを判定する（Ｓ４０９）。
【０２５９】
誤った所定データの数が２個以上の場合（S409:NO）、コントローラは、ホスト２０にエラーを応答する。誤った所定データの数が１個の場合（S409:YES）、コントローラは、新データと正常な所定データ及び新Ｑパリティとに基づいて、エラーの生じている所定データを正しいデータに回復させる（Ｓ４１０）。コントローラは、新データ及び所定データに基づいて、新Ｐパリティを生成する（Ｓ４０８）。
【０２６０】
旧Ｑパリティ保証コードが誤っている場合、または、旧データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが不一致の場合のいずれかである場合（S403:NO）、コントローラは、所定データを単体チェックし、かつ、所定データと新Ｐパリティとによる比較チェックを行う（Ｓ４１１）。
【０２６１】
所定データにエラーが無く、かつ、所定データの第１データ保証コードと新Ｐパリティに付随する第２データ保証コードとが一致する場合（S411:YES）、コントローラは、新データと所定データとに基づいて、新しいＱパリティを生成する（Ｓ４１２）。
【０２６２】
所定データにエラーが生じている場合、または、所定データの第１データ保証コードと新Ｐパリティに付随する第２データ保証コードとが不一致の場合のいずれかである場合（S411:NO）、コントローラは、エラーの検出された所定データが１個であるか否かを判定する（Ｓ４１３）。
【０２６３】
エラーの生じている所定データの数が２個以上の場合（S413:NO）、コントローラは、ホスト２０にエラーを応答する。エラーの生じている所定データの数が１個の場合（S413:YES）、コントローラは、新データと正常な所定データ及び新Ｐパリティとに基づいて、エラーの生じている所定データを回復させる（Ｓ４１４）。そして、コントローラは、Ｓ４１２に移り、ライト処理を正常に終了する。
【０２６４】
図３６を参照する。旧データの第１データ保証コードにエラーが検出された場合（S400:NO）、結合子２を介して図３６のフローチャートに移る。コントローラは、所定データを単体チェックし、かつ、旧Ｐパリティを単体チェックし、さらに、所定データと旧Ｐパリティとによる比較チェックを行う（Ｓ４２０）。即ち、Ｓ４２０では、所定データの第１データ保証コードが正しいか否かと、旧ＰパリティのＰパリティ保証コードが正しいか否かと、所定データの第１データ保証コードと旧Ｐパリティに付随する第２データ保証コードとが一致するか否かとを、それぞれ判定する。
【０２６５】
Ｓ４２０の各チェックを全て満たした場合（S420:YES）、コントローラは、新データと所定データとによって、新しいＰパリティ及び新しいＱパリティをそれぞれ生成し（Ｓ４２１）、ライト処理を正常に終了する。
【０２６６】
Ｓ４２０の各チェックのいずれか１つでも満たせない場合（S420:NO）、コントローラは、エラーの検出された所定データの数が１個であるか否かを判定する（Ｓ４２２）。エラーの生じている所定データの数が１個の場合（S422:YES）、コントローラは、旧Ｑパリティを単体でチェックし、かつ、旧データと旧Ｑパリティとによる比較チェックを行う（Ｓ４２３）。即ち、Ｓ４２３において、コントローラは、旧ＱパリティのＱパリティ保証コードが正しいか否かをチェックし、かつ、旧データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが一致するか否かをチェックする。
【０２６７】
Ｓ４２３の各チェックを全て満たす場合（S423:YES）、コントローラは、正常な所定データと旧Ｐパリティ及び旧Ｑデータとに基づいて、エラーの検出された所定データを回復させ（Ｓ４２４）、Ｓ４２１に移ってライト処理を正常に終了する。これに対し、Ｓ４２３の各チェックのいずれか１つでも満たせない場合（S423:NO）、コントローラは、ホスト２０にエラーを応答する。
【０２６８】
Ｓ４２２において、エラーの検出された所定データの数が２個以上の場合（S422:NO）、コントローラは、旧ＱパリティのＱパリティ保証コードが正しいか否か、及び、所定データの第１データ保証コードと旧Ｑパリティに付随する第２データ保証コードとが一致するか否かを、それぞれ判定する（Ｓ４２５）。
【０２６９】
Ｓ４２５の各チェックを全て満たす場合（S425:YES）、Ｓ４２１に移ってライト処理を正常に終了させる。Ｓ４２５の各チェックのいずれか１つでも満たせない場合（S425:NO）、コントローラは、ホスト２０にエラーを応答する。
【０２７０】
このように構成される本実施例も第１実施例と同様の効果を奏する。さらに、本実施例では、同一のデータから生成されるＰパリティ及びＱパリティを用いたＲＡＩＤ６に適用するため、ＲＡＩＤ５に適用する場合に比べて、信頼性が向上する。
【実施例６】
【０２７１】
図３７，図３８に基づいて第６実施例を説明する。図３７は、本実施例で使用されるＲＡＩＤ６の方式を示す説明図である。図３７（ａ）に示すように、本方式では、水平パリティ（ＰＨ）と、対角パリティ（ＰＤ）との２種類のパリティを使用する。
【０２７２】
図３７（ｂ）に示すように、水平パリティ（ＰＨ）は、第５実施例で述べたＰパリティまたはＱパリティと同様に、ストライプ上のデータに基づいて生成される。図３７（ｃ）に示すように、対角パリティ（ＰＤ）は、複数の記憶装置と複数のストライプをまたがるように、生成される。
【０２７３】
即ち、水平パリティと対角パリティとは、それぞれ基礎とするデータが異なる。従って、水平パリティのストライプ上で２個のエラーが生じた場合、対角パリティを用いて１つのエラーを回復させた後、水平パリティによって他の１つのエラーを回復させることができる。同様に、対角パリティの基礎となる斜めのストライプ上で２個のエラーが生じた場合、水平パリティを用いて１つのエラーを回復させた後、対角パリティによって他の１つのエラーを回復させることができる。
【０２７４】
第５実施例で述べた「Ｐ＋Ｑ」方式と、本実施例で述べる「２Ｄ−ＸＯＲ」方式との相違点が明確に分かる範囲で、図３８を参照しながらリード処理を説明する。図３８のフローチャートで省略されている部分は、いわゆる当業者であれば、第５実施例の記載及び「２Ｄ−ＸＯＲ」方式に関する技術的知識に基づいて容易に理解することができ、実施することができる。
【０２７５】
水平パリティ（ＰＨ）には、水平パリティの基礎となるストライプ上の全データに関する第２データ保証コードと、水平パリティが正常か否かを検出するための水平パリティ保証コードとが対応付けられる。以下、水平パリティをＰＨパリティと呼ぶ。
【０２７６】
対角パリティ（ＰＤ）には、対角パリティの基礎となる斜めストライプ上の全データに関する第２データ保証コードと、対角パリティが正常か否かを検出するための対角パリティ保証コードとが対応付けられる。以下、対角パリティをＰＤパリティと呼ぶ。
【０２７７】
コントローラは、対象データの第１データ保証コードを検査し、対象データにエラーが生じているか否かを判定する（Ｓ５００）。対象データにエラーが検出された場合の処理は省略する。
【０２７８】
対象データにエラーが検出されなかった場合（S500:YES）、コントローラは、ＰＨパリティ保証コードが正しいか否かを判定する（Ｓ５０１）。ＰＨパリティにエラーが検出された場合の処理は省略する。
【０２７９】
ＰＨパリティにエラーが検出されなかった場合（S501:YES）、コントローラは、対象データの第１データ保証コードとＰＨパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ５０２）。
【０２８０】
対象データの第１データ保証コードとＰＨパリティの第２データ保証コードとが一致する場合（S502:YES）、コントローラは、対象データをホスト２０に送信し、リード処理を正常に終了する。
【０２８１】
対象データの第１データ保証コードとＰＨパリティの第２データ保証コードとが不一致の場合（S502:NO）、コントローラは、ＰＤパリティ保証コードが正しいか否かをチェックする（Ｓ５０３）。ＰＤパリティにエラーが生じている場合の処理は省略する。ＰＤパリティにエラーが検出されなかった場合（S503:YES）、コントローラは、対象データの第１データ保証コードと、その対象データに関してＰＤパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ５０４）。
【０２８２】
対象データの第１データ保証コードとＰＤパリティに付随する第２データ保証コードとが一致する場合（S504:YES）、コントローラは、対象データをホスト２０に送信し、リード処理を正常に終了する。
【０２８３】
対象データの第１データ保証コードとＰＤパリティに付随する第２データ保証コードとが不一致の場合（S504:NO）、コントローラは、ＰＨパリティに関する所定データ（ＰＨパリティの基礎となるストライプ上の他の全データ）について、所定データの第１データ保証コードをチェックする（Ｓ５０５）。
【０２８４】
ＰＨパリティに関する所定データの第１データ保証コードにエラーが検出されない場合（S505:NO）、コントローラは、ＰＨパリティに関する所定データの第１データ保証コードとＰＨパリティの第２データ保証コードが一致するか否かを判定する（Ｓ５０６）。両方のデータ保証コードが一致する場合（S506:YES）、コントローラは、ＰＨパリティに関する所定データとＰＨパリティとに基づいて、対象データを回復する（Ｓ５０７）。コントローラは、回復したデータをホスト２０に送信し、リード処理を完了する。回復されたデータは、記憶装置２１０に書き込まれる。
【０２８５】
Ｓ５０５において、ＰＨパリティに関する所定データにエラーが検出された場合（S505:NO）、コントローラは、エラーの検出された所定データを、ＰＤパリティで回復できたか否かを判定する（Ｓ５０８）。ＰＤパリティによってエラーを回復できない場合（S508:NO）、コントローラは、ホスト２０にエラーを応答する。
【０２８６】
ＰＤパリティによって、エラーの検出された所定データ（ＰＨパリティに関する所定データであって、かつ、第１データ保証コードによりエラーが検出された所定データ）を回復できた場合（S508:YES）、コントローラは、所定データの第１データ保証コードとＰＨパリティの第２データ保証コードとが一致するか否かを判定する（Ｓ５０９）。
【０２８７】
両方のデータ保証コードが不一致の場合（S509:NO）、コントローラは、ホスト２０にエラーを応答する。両方のデータ保証コードが一致する場合（S509:YES）、コントローラは、ＰＨパリティに関する所定データとＰＨパリティとに基づいて、対象データを回復させる（Ｓ５１０）。コントローラは、回復したデータをホスト２０に送信する。回復されたデータは、記憶装置２１０に書き込まれる。
【０２８８】
Ｓ５０６において、ＰＨパリティに関する所定データの第１データ保証コードと、ＰＨパリティに付随する第２データ保証コードとが不一致の場合（S506:NO）、コントローラは、ＰＤパリティに関する所定データの第１データ保証コードが正しいか否かをチェックする（Ｓ５１１）。
【０２８９】
第１データ保証コードにエラーが無い場合（S511:YES）、コントローラは、ＰＤパリティに関する所定データの第１データ保証コードと、ＰＤパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ５１２）。両方のデータ保証コードが不一致の場合（S512:NO）、コントローラは、ホスト２０にエラーを応答する。両方のデータ保証コードが一致する場合（S512:YES）、ＰＤパリティに関する所定データとＰＤパリティとに基づいて、コントローラは、対象データを回復させる（Ｓ５１３）。コントローラは、回復したデータをホスト２０に送信する。回復されたデータは、記憶装置２１０に書き込まれる。
【０２９０】
Ｓ５１１において、ＰＤパリティに関する所定データにエラーが検出された場合（S511:NO）、コントローラは、ＰＤパリティに関する所定データのエラーを、ＰＨパリティによって回復できるか否かを判定する（Ｓ５１４）。
【０２９１】
ＰＨパリティによって、ＰＤパリティに関する所定データのエラーを回復できない場合（S514:NO）、コントローラは、ホスト２０にエラーを応答する。ＰＨパリティによって、ＰＤパリティに関する所定データのエラーを回復できる場合（S514:YES）、コントローラは、ＰＤパリティに関する所定データの第１データ保証コードとＰＤパリティに付随する第２データ保証コードとが一致するか否かを判定する（Ｓ５１５）。
【０２９２】
両方のデータ保証コードが不一致の場合（S515:NO）、コントローラは、ホスト２０にエラーを応答する。両方のデータ保証コードが一致する場合（S515:YES）、コントローラは、ＰＤパリティに関する所定データとＰＤパリティとに基づいて、対象データを回復させる（Ｓ５１６）。コントローラは、回復したデータをホスト２０に送信する。回復されたデータは、記憶装置２１０に書き込まれる。
【０２９３】
このように構成される本実施例も第１実施例及び第５実施例と同様の効果を奏する。
【実施例７】
【０２９４】
図３９のフローチャートに基づいて第７実施例を説明する。図３９は、図１７で述べたパリティ生成待ち処理を改善したフローチャートである。本実施例では、パリティを修復するために必要なデータについて、ホストや管理サーバに通知する（Ｓ６００）。
【０２９５】
即ち、Ｓ６００では、パリティの生成に必要なストライプ上の全データの領域を、コントローラからホスト等に通知する。必要な全データの領域は、例えば、アドレス範囲として示すことができる。この通知によって、ホストが、必要とされるデータを新たに書き込めば、より早くパリティを生成することができる。このように構成される本実施例も前記第１実施例と同様の効果を奏する。
【０２９６】
なお、本発明は、上述した実施形態に限定されない。当業者であれば、本発明の範囲内で、種々の追加や変更等を行うことができる。
【０２９７】
例えば、図１７では、障害時に、同一ストライプ上の全データが揃ってからパリティを生成する場合を述べた。しかし、例えば、キャッシュメモリに空き領域が無くなった場合や、電源停止によってキャッシュメモリ上のデータが失われるような場合には、同一ストライプ上の全データが揃うまで待つことはできない。
【０２９８】
また、障害を検出した場合は、その障害の発生した場所や障害の内容等を管理サーバに通知し、管理サーバの画面に障害の状況を表示させるように構成することもできる。
【図面の簡単な説明】
【０２９９】
【図１】本発明の全体概念を示す説明図である。
【図２】本発明の実施例によるストレージシステムの全体構成を示すブロック図である。
【図３】コントローラの機能に着目したブロック図である。
【図４】記憶制御装置の別の構成例を示すブロック図である。
【図５】データに保証コードを設定するための幾つかの例を示す説明図である。
【図６】パリティに、各データの第１データ保証コードに対応する第２データ保証コードをそれぞれ対応付ける様子を示す説明図である。
【図７】データ保証コードの内容を示す説明図である。
【図８】データまたはパリティの属性を示す説明図である。
【図９】記憶制御装置の全体動作の流れを模式的に示すフローチャートである。
【図１０】リード処理を示すフローチャートである。
【図１１】ライト処理を示すフローチャートである。
【図１２】障害から回復するためのステップが追加された、リード処理を示すフローチャートである。
【図１３】データ回復処理を示すフローチャートである。
【図１４】障害から回復するためのステップが追加された、ライト処理を示すフローチャートである。
【図１５】データ回復処理を示すフローチャートである。
【図１６】第２実施例に係る記憶制御装置により実行される、ライト処理を示すフローチャートである。
【図１７】ストライプ上の全データが更新されるのを待って、新しいパリティを生成する処理を示すフローチャートである。
【図１８】第３実施例に係る記憶制御装置により使用される、データ保証コードの設定方法を示す説明図である。
【図１９】データ保証コードの別の設定方法を示す説明図である。
【図２０】リード処理を示すフローチャートである。
【図２１】図２０に続くフローチャートである。
【図２２】図２０に続く別のフローチャートである。
【図２３】図２０に続くさらに別のフローチャートである。
【図２４】第４実施例に係る記憶制御装置により使用される、データ保証コードの設定方法を示す説明図である。
【図２５】リード処理を示すフローチャートである。
【図２６】ライト処理を示すフローチャートである。
【図２７】データ保証コードの別の設定方法を示す説明図である。
【図２８】リード処理を示すフローチャートである。
【図２９】ライト処理を示すフローチャートである。
【図３０】第５実施例に係る記憶制御装置により使用される、データ保証コードの設定方法を示すフローチャートである。
【図３１】Ｐ＋Ｑ方式のＲＡＩＤ６を示す説明図である。
【図３２】Ｐ＋Ｑ方式のＲＡＩＤ６における、リード処理を示すフローチャートである。
【図３３】図３２に続くフローチャートである。
【図３４】図３２に続く別のフローチャートである。
【図３５】Ｐ＋Ｑ方式のＲＡＩＤ６における、ライト処理を示すフローチャートである。
【図３６】図３５に続くフローチャートである。
【図３７】第６実施例に係る記憶制御装置に適用される、２Ｄ−ＸＯＲ方式のＲＡＩＤ６を示す説明図である。
【図３８】リード処理を示すフローチャートである。
【図３９】第７実施例に係る記憶制御装置により使用される、パリティ生成待ち処理のフローチャートである。
【符号の説明】
【０３００】
１：記憶制御装置、２：コントローラ、２Ａ：第１通信制御部、２Ｂ：第２通信制御部、２Ｃ：コマンド処理部、２Ｄ：キャッシュメモリ、２Ｅ：保証コード設定部、２Ｆ：保証コード検査部、２Ｆ１：修復部、３：記憶装置、４：ホスト、１０，１０Ａ：記憶制御装置、２０：ホスト、３０：管理サーバ、４０：外部記憶制御装置、４１：コントローラ、４２：記憶部、１００，１００Ａ：コントローラ、１０１：メイン処理部、１０２：Ｉ／Ｏ処理部、１０２Ａ：Ｉ／Ｏ処理プログラム、１０３，１０３Ａ：保証コード設定部、１０４，１０４Ａ：保証コード検査部、１１０：チャネルアダプタ（上位通信制御部）、１１０Ａ：ホストインターフェース、１２０：ディスクアダプタ（下位通信制御部）、１２０Ａ：ディスクインターフェース、１３０：キャッシュメモリ、１４０：共有メモリ、１５０：接続制御部、１５０Ａ：キャッシュコントローラ、１６０：サービスプロセッサ、１７０：マイクロプロセッサ、１９０：プログラムメモリ、２００：記憶部、２１０：記憶装置、２２０：パリティグループ、２３０：論理ボリューム
【図１】
2009104420.tif 000003
【図２】
2009104420.tif 000004
【図３】
2009104420.tif 000005
【図４】
2009104420.tif 000006
【図５】
2009104420.tif 000007
【図６】
2009104420.tif 000008
【図７】
2009104420.tif 000009
【図８】
2009104420.tif 000010
【図９】
2009104420.tif 000011
【図１０】
2009104420.tif 000012
【図１１】
2009104420.tif 000013
【図１２】
2009104420.tif 000014
【図１３】
2009104420.tif 000015
【図１４】
2009104420.tif 000016
【図１５】
2009104420.tif 000017
【図１６】
2009104420.tif 000018
【図１７】
2009104420.tif 000019
【図１８】
2009104420.tif 000020
【図１９】
2009104420.tif 000021
【図２０】
2009104420.tif 000022
【図２１】
2009104420.tif 000023
【図２２】
2009104420.tif 000024
【図２３】
2009104420.tif 000025
【図２４】
2009104420.tif 000026
【図２５】
2009104420.tif 000027
【図２６】
2009104420.tif 000028
【図２７】
2009104420.tif 000029
【図２８】
2009104420.tif 000030
【図２９】
2009104420.tif 000031
【図３０】
2009104420.tif 000032
【図３１】
2009104420.tif 000033
【図３２】
2009104420.tif 000034
【図３３】
2009104420.tif 000035
【図３４】
2009104420.tif 000036
【図３５】
2009104420.tif 000037
【図３６】
2009104420.tif 000038
【図３７】
2009104420.tif 000039
【図３８】
2009104420.tif 000040
【図３９】
2009104420.tif 000041