(57)【要約】  ストレージ制御装置（１０１）は、ストレージ装置（Ｓ１）に対する書込要求を受け付ける。ストレージ制御装置（１０１）は、書込要求を受け付けた場合、ストレージ装置（Ｓ１）の記憶領域に記憶されているデータ（Ｄ１）と、データ（Ｄ１）を生成元とするパリティデータ（Ｐ）を、特定の記憶領域（２００）に複写する。ストレージ制御装置（１０１）は、書込要求に対する書込処理が実行されたストレージ装置（Ｓ１）または（Ｓ３）が再起動されたか否かを判断する。ストレージ制御装置（１０１）は、ストレージ装置（Ｓ１）または（Ｓ３）が再起動された場合、特定の記憶領域（２００）に複写されたデータ（Ｄ１）をストレージ装置（Ｓ１）の複写元の記憶領域に書き込む。さらに、ストレージ制御装置（１０１）は、特定の記憶領域（２００）に複写されたパリティデータ（Ｐ）をストレージ装置（Ｓ３）の複写元の記憶領域に書き込む。
2012053085.tif 000002
【特許請求の範囲】
【請求項１】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付部と、
前記受付部が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写部と、
前記複写部によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断部と、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込部と、
を備えることを特徴とするストレージ制御装置。
【請求項２】
前記書込要求に対する書込処理の処理結果に基づいて、前記書込処理が成功したか否かを判定する成否判定部を備え、
前記書込部は、
前記成否判定部によって前記書込処理が失敗したと判定され、かつ、前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする請求項１に記載のストレージ制御装置。
【請求項３】
前記複写部は、
さらに、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記書込部は、
前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込み、かつ、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込んだ後、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする請求項２に記載のストレージ制御装置。
【請求項４】
前記システムの中から、障害が発生したストレージ装置を検出する検出部を備え、
前記複写部は、
前記書込要求を受け付けたストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを生成元とする訂正符号を算出して、前記ストレージ装置の要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置の記憶領域に書き込むことを特徴とする請求項３に記載のストレージ制御装置。
【請求項５】
前記複写部は、
前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むことを特徴とする請求項４に記載のストレージ制御装置。
【請求項６】
前記複写部は、
前記検出部によって検出されたストレージ装置の台数が、前記訂正符号を記憶するストレージ装置の台数未満の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を算出して、前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号を記憶する記憶領域に書き込むことを特徴とする請求項５に記載のストレージ制御装置。
【請求項７】
前記特定の記憶領域は、前記データ群の各データおよび前記データ群から生成される訂正符号の記憶先の記憶領域とは異なる不揮発性の記憶領域であることを特徴とする請求項１〜６のいずれか一つに記載のストレージ制御装置。
【請求項８】
前記特定の記憶領域は、前記システム内の各ストレージ装置に設けられることを特徴とする請求項７に記載のストレージ制御装置。
【請求項９】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付部と、
前記受付部が前記書込要求を受け付けた場合、前記システム内のストレージ装置にアクセスする制御部に対して、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、特定の記憶領域に複写するよう指示する複写指示部と、
前記複写指示部によって指示された前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断部と、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記制御部に対して、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込むよう指示する書込指示部と、
を備えることを特徴とするストレージ制御装置。
【請求項１０】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付工程と、
前記受付工程が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写工程と、
前記複写工程によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断工程と、
前記判断工程によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込工程と、
をコンピュータが実行することを特徴とするストレージ制御方法。
【請求項１１】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付工程と、
前記受付工程によって前記書込要求を受け付けた場合、前記システム内のストレージ装置にアクセスする制御部に対して、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、特定の記憶領域に複写するよう指示する複写指示工程と、
前記複写指示工程によって指示された前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断工程と、
前記判断工程によってストレージ装置が再起動されたと判断された場合、前記制御部に対して、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込むよう指示する書込指示工程と、
をコンピュータが実行することを特徴とするストレージ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置を制御するストレージ制御装置およびストレージ制御方法に関する。
【背景技術】
【０００２】
ＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙ  ｏｆ  Ｉｎｅｘｐｅｎｓｉｖｅ  Ｄｉｓｋｓ）３，５等の冗長化されたストレージシステムは、ディスク装置に障害が発生すると、障害が発生したディスク装置を切り離す。ストレージシステムは、障害が発生したディスク装置が切り離されると、切り離されたディスク装置を除く残余のディスク装置によってデータの記録、更新を行う。【０００３】
また、ストレージシステムは、障害が発生したディスク装置が切り離された後、さらに別のディスク装置に障害が発生すると、新たに障害が発生したディスク装置を切り離す。以下の説明では、ストレージシステム内のディスク装置に障害が発生して冗長化を失った状態から、さらに別のディスク装置を切り離した状態を「マルチデッド状態」という。【０００４】
ここで、ディスク装置の切り離し要因となる障害としては、例えば、サーマル・オフトラック、コンタミネーション、ノイズ、接触不良等がある。ディスク装置のサーマル・オフトラック、コンタミネーション、ノイズ、接触不良等の障害は、ハードリセットや電源切断後の再投入（電源のＯＦＦ／ＯＮ）によって回復することが多い。【０００５】
すなわち、障害が発生して切り離されたディスク装置に対してハードリセットや電源のＯＦＦ／ＯＮを行うことで、該ディスク装置を正常に動作するディスク装置として復帰させることができる。このため、マルチデッド状態となったストレージシステムを復旧する場合、例えば、ストレージシステムのハードリセットを行って、マルチデッド状態となる前の状態に戻すことが行われる。【０００６】
なお、ディスク装置に障害が発生したストレージシステムを復旧するための技術を開示する文献として、例えば、下記特許文献１〜３がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平１１−９５９３３号公報
【特許文献２】特開２００５−７８４３０号公報
【特許文献３】特開２０１０−２６８１２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上述した従来技術では、ストレージシステムの復旧時に、ハードリセット等を行ってストレージシステムをマルチデッド状態となる前の状態に戻しても、ディスク装置間のデータの不整合によりデータ化けが発生する場合があるという問題があった。【０００９】
本発明は、上述した従来技術による問題点を解消するため、ストレージ装置間のデータの整合性を保障することができるストレージ制御装置およびストレージ制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、開示のストレージ制御装置およびストレージ制御方法は、データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付け、前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写し、前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、ストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む。【００１１】
上述した課題を解決し、目的を達成するため、開示のストレージ制御装置およびストレージ制御方法は、データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付け、前記書込要求を受け付けた場合、前記システム内のストレージ装置にアクセスする制御部に対して、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、特定の記憶領域に複写するよう指示し、指示された前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、ストレージ装置が再起動されたと判断された場合、前記制御部に対して、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込むよう指示する。
【発明の効果】
【００１２】
本ストレージ制御装置およびストレージ制御方法によれば、ストレージ装置間のデータの整合性を保障することができるという効果を奏する。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１にかかるストレージシステム１００の一実施例を示す説明図である。
【図２】実施の形態１にかかるストレージ制御手法の一実施例を示す説明図である。
【図３】実施の形態１にかかるストレージシステム３００のハードウェア構成を示すブロック図である。
【図４】管理データ４１０，４２０，４３０の具体例を示す説明図である。
【図５】実施の形態１にかかるストレージ制御装置１０１の機能的構成を示すブロック図である。
【図６】書込要求６００の具体例を示す説明図である。
【図７】書込状態テーブル７００の具体例を示す説明図である。
【図８】書込バッファＢの具体例を示す説明図である。
【図９】管理データ４１０，４２０，４３０の更新例を示す説明図（その１）である。
【図１０】検出結果テーブル１０００の具体例を示す説明図である。
【図１１】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その１）である。
【図１２】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その２）である。
【図１３】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その３）である。
【図１４】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その４）である。
【図１５】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その５）である。
【図１６】実施の形態１にかかるストレージ制御装置のデータ複写処理手順の一例を示すフローチャート（その１）である。
【図１７】実施の形態１にかかるストレージ制御装置のデータ複写処理手順の一例を示すフローチャート（その２）である。
【図１８】実施の形態１にかかるストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。
【図１９】ステップＳ１８０３のデータ書込処理の具体的な処理手順の一例を示すフローチャートである。
【図２０】実施の形態２にかかるストレージシステム２０００のハードウェア構成を示すブロック図である。
【図２１】書込状態テーブル２１００の具体例を示す説明図である。
【図２２】冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その１）である。
【図２３】冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その２）である。
【図２４】冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その３）である。
【図２５】管理データ４１０，４２０，４３０の更新例を示す説明図（その２）である。
【図２６】非冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その１）である。
【図２７】非冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その２）である。
【図２８】管理データ４１０，４２０，４３０の更新例を示す説明図（その３）である。
【図２９】ストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、本発明にかかるストレージ制御装置およびストレージ制御方法の好適な実施の形態を詳細に説明する。
【００１５】
（実施の形態１）
図１は、実施の形態１にかかるストレージシステム１００の一実施例を示す説明図である。図１において、ストレージシステム１００は、ストレージ制御装置１０１とストレージ装置Ｓ１〜Ｓ３と、を含む構成である。ストレージ制御装置１０１は、ストレージ装置Ｓ１〜Ｓ３を制御するコンピュータである。ストレージ装置Ｓ１〜Ｓ３は、データを記憶する記憶装置である。ストレージ装置Ｓ１〜Ｓ３は、例えば、ハードディスク、光ディスク、フラッシュメモリ、磁気テープ等の記憶媒体を含む。
【００１６】
ここで、ストレージシステム１００は、ＲＡＩＤ３，５等の冗長化されたシステムである。ストレージシステム１００は、データ群ごとに、データ群の各データと、該データ群の各データから生成される訂正符号とを、記憶先のストレージ装置が異なるように分散して記憶している。データ群は、互いに関連するデータの集合である。各データは、例えば、ビット単位、バイト単位、ブロック（セクタ）単位のデータである。
【００１７】
訂正符号は、データ群を構成するデータを生成元とする冗長コードである。訂正符号としては、生成元のデータ群のいずれかのデータを、データ群の残余のデータと訂正符号とから復元可能なものを用いることができる。具体的には、例えば、訂正符号は、パリティ、ハミング符号、ＥＣＣ（Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｎｇ  Ｃｏｄｅ）、ＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｈｅｃｋ）コード等を用いて実現される。以下の説明では、訂正符号の一例として、生成元のデータ群を構成する各データの排他的論理和をとったパリティデータを例に挙げて説明する。
【００１８】
図１の例では、データＤ１と、データＤ２と、データＤ１，Ｄ２から生成されるパリティデータＰとが、記憶先のストレージ装置が異なるように分散して記憶されている。パリティデータＰは、データＤ１とデータＤ２の排他的論理和をとったデータである。以下の説明では、例えば、データＤ１とデータＤ２の排他的論理和をとったパリティデータＰを下記式（１）のように表現する。ただし、ｘｏｒは、排他的論理和を表す。
【００１９】
Ｐ＝Ｄ１  ｘｏｒ  Ｄ２      ・・・（１）
【００２０】
ストレージシステム１００では、障害が発生したストレージ装置を切り離す。ストレージ装置を切り離すとは、ストレージ装置に対するアクセスを停止することである。この結果、ストレージシステム１００は、冗長構成から非冗長構成となる。冗長構成とは、データの冗長性が確保されている状態である。非冗長構成とは、冗長構成から、障害が発生したストレージ装置が切り離されて、データの冗長性を失った状態である。
【００２１】
ストレージシステム１００は、冗長構成から非冗長構成となっても、障害が発生して切り離されたストレージ装置に記憶されているデータ（欠損データ）を、パリティデータと他のストレージ装置に記憶されているデータとを利用して復元できる。このため、ストレージシステム１００は、冗長構成から非冗長構成となっても、システムの運用を継続して行うことができる。
【００２２】
例えば、ストレージ装置Ｓ２に障害が発生すると、ストレージシステム１００は冗長構成から非冗長構成となり、ストレージ装置Ｓ２からデータＤ２を読み出せなくなる。この場合、ストレージシステム１００は、下記式（２）のように、ストレージ装置Ｓ１に記憶されているデータＤ１と、ストレージ装置Ｓ３に記憶されているパリティデータＰの排他的論理和をとってデータＤ２を復元する。
【００２３】
Ｄ２＝Ｄ１  ｘｏｒ  Ｐ＝Ｄ１  ｘｏｒ  Ｄ１  ｘｏｒ  Ｄ２      ・・・（２）
【００２４】
また、ストレージシステム１００は、非冗長構成から、さらにストレージ装置が切り離された状態（マルチデッド状態）となった場合、欠損データを復元できなくなるためシステムダウンする。システムダウンとは、データの読出処理および書込処理を正常に行うことができない状態である。
【００２５】
ここで、データの書込処理の一例について説明する。ここでは、ストレージ装置Ｓ２が切り離された非冗長構成のストレージシステム１００において、ストレージ装置Ｓ１に記憶されているデータＤ１をデータＤ１＃に更新する場合について説明する。
【００２６】
具体的には、例えば、まず、ストレージ制御装置１０１が、ストレージ装置Ｓ１からデータＤ１を読み出す。つぎに、ストレージ制御装置１０１が、ストレージ装置Ｓ３からパリティデータＰを読み出す。そして、ストレージ制御装置１０１が、各ストレージ装置から読み出したデータＤ１とパリティデータＰの排他的論理和をとってデータＤ２を算出する。これにより、切り離されたストレージ装置Ｓ２に記憶されているデータＤ２が復元される。
【００２７】
つぎに、ストレージ制御装置１０１が、書込対象のデータＤ１＃と、算出されたデータＤ２の排他的論理和をとって、新たなパリティデータＰ＃を算出する（Ｐ＃＝Ｄ１＃  ｘｏｒ  Ｄ２）。そして、ストレージ制御装置１０１が、データＤ１＃をストレージ装置Ｓ１に書き込む。また、ストレージ制御装置１０１が、パリティデータＰ＃をストレージ装置Ｓ３に書き込む。
【００２８】
このように、ストレージシステム１００では、データＤ１をデータＤ１＃に更新する場合、ストレージ装置間のデータの整合性を確保して欠損データ（上述の例ではデータＤ２）を復元し、パリティデータの更新も合わせて行う。
【００２９】
ここで、ストレージ装置に対するデータの書き込みは、サーマル・オフトラック、コンタミネーション、ノイズ、接触不良等の障害により失敗する場合がある。上述したデータＤ１をデータＤ１＃に更新する場合の書き込み失敗例としては、例えば、下記（ａ）〜（ｃ）がある。
【００３０】
（ａ）ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに失敗して、データＤ１＃の一部をストレージ装置Ｓ１に書き込めなかった場合
【００３１】
この場合、ストレージ装置Ｓ１に記憶されているデータは、データＤ１およびデータＤ１＃のいずれとも異なるデータＤｘとなる（Ｄｘ≠Ｄ１，Ｄ１＃）。また、ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに失敗すると、ストレージシステム１００からストレージ装置Ｓ１が切り離される。この結果、ストレージシステム１００は、非冗長構成からマルチデッド状態となりシステムダウンする。このため、ストレージ装置Ｓ３に記憶されているデータは、パリティデータＰのままである（Ｐ＝Ｄ１  ｘｏｒ  Ｄ２）。
【００３２】
（ｂ）ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに成功した後、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗して、パリティデータＰ＃の一部をストレージ装置Ｓ３に書き込めなかった場合
【００３３】
この場合、ストレージ装置Ｓ１に記憶されているデータは、データＤ１＃となる。一方、ストレージ装置Ｓ３に記憶されているデータは、パリティデータＰおよびパリティデータＰ＃のいずれとも異なるデータＰｘとなる（Ｐｘ≠Ｐ，Ｐ＃）。また、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗すると、ストレージ装置Ｓ３がストレージシステム１００から切り離される。この結果、ストレージシステム１００は、非冗長構成からマルチデッド状態となりシステムダウンする。
【００３４】
（ｃ）ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに成功した後、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗して、パリティデータＰ＃をストレージ装置Ｓ３にまったく書き込めなかった場合
【００３５】
この場合、ストレージ装置Ｓ１に記憶されているデータは、データＤ１＃となる。一方、ストレージ装置Ｓ３に記憶されているデータは、パリティデータＰのままである。また、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗すると、ストレージ装置Ｓ３がストレージシステム１００から切り離される。この結果、ストレージシステム１００は、非冗長構成からマルチデッド状態となりシステムダウンする。
【００３６】
上述したように、上記（ａ）〜（ｃ）のいずれの場合も、ストレージシステム１００は、書込失敗により非冗長構成からマルチデッド状態となりシステムダウンする。ここで、サーマル・オフトラック、コンタミネーション、ノイズ、接触不良等のストレージ装置の障害は、該ストレージ装置に対するハードリセットや電源のＯＦＦ／ＯＮを行うことによって回復することが多い。
【００３７】
このため、ストレージシステム１００では、書き込みに失敗して切り離されたストレージ装置（ストレージ装置Ｓ１またはＳ３）に対するハードリセットや電源のＯＦＦ／ＯＮを行って、システムダウン直前の非冗長構成に戻すことができる。しかし、上記（ａ）〜（ｃ）のいずれの場合も、ストレージシステム１００をシステムダウン直前の非冗長構成に戻したとしても、ストレージ装置Ｓ１，Ｓ３間のデータの整合性がとれていない状態となっている。
【００３８】
上記（ａ）の場合、ストレージ装置Ｓ１に記憶されているデータは「Ｄｘ≠Ｄ１」であり、ストレージ装置Ｓ３に記憶されているパリティデータは、ストレージ装置Ｓ１に記憶されていたデータＤ１に基づく「Ｐ＝Ｄ１  ｘｏｒ  Ｄ２」である。このため、下記式（３）のとおり、データＤｘとパリティデータＰの排他的論理和をとっても、データＤ２を復元することができない。
【００３９】
Ｄ２≠Ｄｘ  ｘｏｒ  Ｐ＝Ｄｘ  ｘｏｒ  Ｄ１  ｘｏｒ  Ｄ２・・・（３）
【００４０】
上記（ｂ）の場合、ストレージ装置Ｓ１に記憶されているデータは「Ｄ１＃」であり、ストレージ装置Ｓ３に記憶されているパリティデータは「Ｐｘ≠Ｐ＃＝Ｄ１＃  ｘｏｒ  Ｄ２」である。このため、下記式（４）のとおり、データＤ１＃とパリティデータＰｘの排他的論理和をとっても、データＤ２を復元することができない。
【００４１】
Ｄ２≠Ｄ１＃  ｘｏｒ  Ｐｘ・・・（４）
【００４２】
上記（ｃ）の場合、ストレージ装置Ｓ１に記憶されているデータは「Ｄ１＃」であり、ストレージ装置Ｓ３に記憶されているパリティデータは、ストレージ装置Ｓ１に記憶されていたＤ１に基づく「Ｐ」である。このため、下記式（５）のとおり、データＤ１＃とパリティデータＰの排他的論理和をとっても、データＤ２を復元することができない。
【００４３】
Ｄ２≠Ｄ１＃  ｘｏｒ  Ｐ＝Ｄ１＃  ｘｏｒ  Ｄ１  ｘｏｒ  Ｄ２・・・（５）
【００４４】
これでは、ストレージシステム１００をシステムダウン直前の非冗長構成、つまりストレージ装置Ｓ２が切り離された状態に戻したとしても、以降において、データＤ２の読み出しが発生した場合に、データＤ２を正しく復元することができない。
【００４５】
そこで、実施の形態１では、パリティデータの更新を伴うデータの更新時に、更新前のデータとパリティデータとを特定の記憶領域に退避しておく。そして、実施の形態１では、書込失敗の後にストレージ装置が再起動されると、退避したデータとパリティデータを退避元にそれぞれ戻して、書込失敗によるストレージ装置間のデータの不整合を防ぐ。以下、図２を用いて、実施の形態１にかかるストレージ制御手法の一実施例について説明する。
【００４６】
（ストレージ制御手法の一実施例）
図２は、実施の形態１にかかるストレージ制御手法の一実施例を示す説明図である。ここでは、図１に示したストレージ装置Ｓ２が切り離された非冗長構成のストレージシステム１００において、ストレージ装置Ｓ１に記憶されているデータＤ１をデータＤ１＃に更新する場合を例に挙げて説明する。
【００４７】
（１）ストレージ制御装置１０１は、書込要求を受け付ける。ここで、書込要求には、ストレージ装置Ｓ１への書込対象となるデータＤ１＃と、要求先のストレージ装置Ｓ１の記憶領域のアドレスが含まれている。ストレージ制御装置１０１は、例えば、外部のコンピュータから書込要求を受け付けてもよく、また、ユーザの操作入力により書込要求を受け付けることにしてもよい。
【００４８】
（２）ストレージ制御装置１０１は、書込要求を受け付けた場合、書込要求に対応するストレージ装置Ｓ１の記憶領域に記憶されているデータＤ１と、データＤ１を生成元とするパリティデータＰとを、特定の記憶領域２００に複写する。具体的には、例えば、ストレージ制御装置１０１が、ストレージ装置Ｓ１からデータＤ１を読み出して特定の記憶領域２００に書き込む。また、ストレージ制御装置１０１が、ストレージ装置Ｓ３からパリティデータＰを読み出して特定の記憶領域２００に書き込む。
【００４９】
ここで、特定の記憶領域２００は、ストレージシステム１００に記憶されているデータ群の各データおよびデータ群から生成されるパリティデータの記憶先の記憶領域とは異なる不揮発性の記憶領域である。特定の記憶領域２００は、例えば、ストレージ制御装置１０１に設けられていてもよく、また、各ストレージ装置Ｓ１〜Ｓ３にそれぞれ設けられていてもよい。
【００５０】
（３）ストレージ制御装置１０１は、受け付けた書込要求に対する書込処理を実行する。具体的には、例えば、ストレージ制御装置１０１が、書込対象のデータＤ１＃を、ストレージ装置Ｓ１の記憶領域に書き込む。また、ストレージ制御装置１０１が、新たなパリティデータＰ＃（Ｐ＃＝Ｄ１＃  ｘｏｒ  Ｄ２）を、ストレージ装置Ｓ３のパリティデータＰの記憶先の記憶領域に書き込む。より具体的には、例えば、まず、ストレージ制御装置１０１が、ストレージ装置Ｓ１のデータＤ１とストレージ装置Ｓ３のパリティデータＰから、切り離されているストレージ装置Ｓ２のデータＤ２を復元する。そして、ストレージ制御装置１０１が、書込対象のデータＤ１＃と復元したデータＤ２から新たなパリティデータＰ＃を算出して、ストレージ装置Ｓ３のパリティデータＰの記憶先の記憶領域に書き込む。
【００５１】
ここで、ストレージ装置Ｓ１またはＳ３に対する書き込みに失敗すると、書き込みを失敗したストレージ装置Ｓ１またはＳ３がストレージシステム１００から切り離されてマルチデッド状態となり、ストレージシステム１００がシステムダウンする。ここでは、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗して、パリティデータＰ＃の一部をストレージ装置Ｓ３に書き込めなかった場合を想定する。
【００５２】
この場合、ストレージシステム１００をシステムダウン直前の非冗長構成に戻すために、切り離されたストレージ装置Ｓ３が再起動される。ここでは、ストレージ装置Ｓ３が再起動された結果、ストレージ装置Ｓ３が正常に動作するストレージ装置として復帰した場合を想定する。
【００５３】
（４）ストレージ制御装置１０１は、（３）で切り離したストレージ装置が再起動されたか否かを判断する。具体的には、例えば、ストレージ制御装置１０１が、ストレージ装置Ｓ３から再起動の完了通知を受け付けることにより、ストレージ装置Ｓ３が再起動されたと判断する。
【００５４】
（５）ストレージ制御装置１０１は、ストレージ装置Ｓ１またはＳ３が再起動された場合、特定の記憶領域２００に複写されたデータＤ１をストレージ装置Ｓ１の複写元の記憶領域に書き込む。さらに、ストレージ制御装置１０１は、特定の記憶領域２００に複写されたパリティデータＰをストレージ装置Ｓ３の複写元の記憶領域に書き込む。
【００５５】
このように、実施の形態１にかかるストレージ制御手法によれば、パリティデータの更新を伴うデータの更新時に、更新前のデータとパリティデータを、特定の記憶領域２００に退避する。また、書込失敗でストレージ装置が再起動されると、特定の記憶領域２００に退避したデータとパリティデータをそれぞれ退避元の記憶領域に戻すことで、書込失敗によるストレージ装置間のデータの不整合を防ぐことができる。
【００５６】
すなわち、実施の形態１では、サーマル・オフトラック等の障害は、ストレージ装置を再起動することで回復することを想定して、書込要求単位で、更新前のデータとパリティデータを特定の記憶領域２００に一時的に退避しておく。これにより、サーマル・オフトラック等の障害によってストレージ装置に対する書き込みに失敗しても、ストレージ装置の再起動後に、退避したデータとパリティデータを退避元の記憶領域に戻すことで、ストレージ装置間のデータの整合性をとることができる。
【００５７】
例えば、上記（３）において、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗すると、ストレージ装置Ｓ１，Ｓ３間のデータの不整合が発生して、ストレージ装置Ｓ２のデータＤ２を復元することができない。そこで、上記（５）において、特定の記憶領域２００に退避したデータＤ１とパリティデータＰをそれぞれ退避元の記憶領域に戻すことで、書込失敗によるストレージ装置Ｓ１，Ｓ３間のデータの不整合を防ぐとともに、戻したデータＤ１とパリティデータＰとによるデータＤ２の復元が可能となる。
【００５８】
（ストレージシステム３００のハードウェア構成）
つぎに、実施の形態１にかかるストレージ制御装置１０１をＲＡＩＤ３のストレージシステム３００に適用した場合について説明する。ＲＡＩＤ３は、データ群を複数のＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）に分割して記録し、データ群から生成されるパリティデータを専用のＨＤＤ（いわゆる、パリティドライブ）に記録する方式である。
【００５９】
以下の図３の例では、ストレージシステム３００内のＨＤＤの台数が、ＨＤＤ１〜ＨＤＤ３の３台の場合を例に挙げて説明するが、ストレージシステム３００に含まれるＨＤＤの台数はこれに限らない。ＲＡＩＤ３のストレージシステム３００の場合、ＨＤＤの台数として、１台のパリティドライブを含む３台以上であれば任意の台数を採用することができる。
【００６０】
図３は、実施の形態１にかかるストレージシステム３００のハードウェア構成を示すブロック図である。図３において、ストレージシステム３００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、メインメモリ３０２と、ディスプレイコントローラ３０３と、ディスプレイ３０４と、通信コントローラ３０５と、ストレージ制御装置１０１と、ＨＤＤ１〜ＨＤＤ３と、を備えている。
【００６１】
ＣＰＵ３０１は、ストレージシステム３００を統括的に制御する。メインメモリ３０２は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）を含む。ＣＰＵ３０１は、例えば、ストレージシステム３００のＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）をメインメモリ３０２上で展開して起動する。
【００６２】
ディスプレイコントローラ３０３は、ＣＰＵ３０１の制御にしたがってディスプレイ３０４の表示制御を行う。ディスプレイ３０４は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報等のデータを表示する。ディスプレイ３０４は、例えば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイ等を採用することができる。
【００６３】
通信コントローラ３０５は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネット等のネットワーク３２０に接続され、ネットワーク３２０を介して外部のコンピュータに接続される。通信コントローラ３０５は、ネットワーク３２０と内部のインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。また、ストレージシステム３００は、キーボードやマウス等の入力装置、スキャナやプリンタ等の出力装置を備えることにしてもよい。
【００６４】
ストレージ制御装置１０１は、プロセッサ３０６と、メモリ３０７と、不揮発性メモリ３０８と、ＨＤＤコントローラ３０９と、バスコントローラ３１０と、を備えている。プロセッサ３０６は、メモリ３０７に格納されている本ストレージ制御プログラム等の各種プログラムを実行する。
【００６５】
プロセッサ３０６は、ＨＤＤコントローラ３０９を介して、ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する。また、プロセッサ３０６は、ＨＤＤコントローラ３０９を介して、ＨＤＤ１〜ＨＤＤ３との接続を制御する。以下の説明では、ストレージ制御装置１０１と各ＨＤＤ１〜ＨＤＤ３とを接続することを「オンライン」、ストレージ制御装置１０１とＨＤＤ１〜ＨＤＤ３とを切り離すことを「オフライン」という。
【００６６】
不揮発性メモリ３０８は、電源からの電力の供給が遮断されても記憶内容が消去されない特性を有する記憶媒体である。不揮発性メモリ３０８は、例えばＮＶＲＡＭ（Ｎｏｎ  Ｖｏｌａｔｉｌｅ  ＲＡＭ）やＦＬＡＳＨメモリ等である。ＨＤＤコントローラ３０９は、プロセッサ３０６の制御にしたがって、ＨＤＤ１〜ＨＤＤ３に対するアクセスを行う。バスコントローラ３１０は、ストレージ制御装置１０１とＣＰＵ３０１とのデータのやりとりを制御する。
【００６７】
ＨＤＤ１〜ＨＤＤ３は、磁性体を塗布した円盤（ハードディスク）を高速回転させることで、磁気ヘッドがデータの読み出し／書き込みを行う記憶装置である。ＨＤＤ１〜ＨＤＤ３は、例えば、上述したストレージ装置Ｓ１〜Ｓ３に相当する。各ＨＤＤ１〜ＨＤＤ３の記憶領域は、データ領域３１１，３１２，３１３とシステム領域３１４，３１５，３１６とに分割されている。
【００６８】
各データ領域３１１，３１２，３１３および各システム領域３１４，３１５，３１６の容量は、各ＨＤＤ１〜ＨＤＤ３のデータ容量の範囲内で可変である。プロセッサ３０６は、オフライン、オンラインに限らず、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６にアクセス可能である。
【００６９】
ストレージシステム３００において、ＨＤＤ１，ＨＤＤ２は、データ群の各データを分散して記憶するＨＤＤであり、ＨＤＤ３は、データ群の各データの排他的論理和であるパリティデータを記憶するＨＤＤ（パリティドライブ）である。ＨＤＤ１，ＨＤＤ２のデータ領域３１１，３１２には、データＤ１〜Ｄｎが分散して記憶されている。また、ＨＤＤ３のデータ領域３１３には、パリティデータＰ１〜Ｐｍが記憶されている。例えば、データＤ１，Ｄ２がＨＤＤ１，ＨＤＤ２のデータ領域３１１，３１２に分散して記憶され、データＤ１，Ｄ２の排他的論理和であるパリティデータＰ１がＨＤＤ３のデータ領域３１３に記憶されている。
【００７０】
ここで、データは、例えば、ストレージシステム３００におけるＯＳ、アプリケーションプログラム、ユーザ情報等を分割したデータである。また、各データのデータサイズは、例えば、ビット単位やバイト単位である。データ群の各データと該データ群から生成されるパリティデータは、例えば、同一のＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓｉｎｇ）番号を割り当てることで管理される。
【００７１】
ＬＢＡとは、ハードディスク内のすべてのセクタに通し番号を振り、その通し番号によってセクタを指定する方式である。すなわち、各ＨＤＤ１〜ＨＤＤ３に対するアクセス（読み出し、書き込み）は、ＬＢＡ単位で行われる。例えば、データＤ１，Ｄ２およびパリティデータＰ１にＬＢＡ１が割り当てられているとする。
【００７２】
この場合、ＨＤＤ１のＬＢＡ１を指定することで、データＤ１が記憶されているＨＤＤ１の記憶領域を特定してアクセスすることができる。また、ＨＤＤ２のＬＢＡ１を指定することで、データＤ２が記憶されているＨＤＤ２の記憶領域を特定してアクセスすることができる。また、ＨＤＤ３のＬＢＡ１を指定することで、パリティデータＰ１が記憶されているＨＤＤ３の記憶領域を特定してアクセスすることができる。
【００７３】
各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６には、例えば、ストレージシステム３００の管理データが記憶されている。管理データは、例えば、各ＨＤＤ１〜ＨＤＤ３に障害が発生しているか否かを示す情報を含む。各管理データは、プロセッサ３０６によりＨＤＤコントローラ３０９を介して更新される。ここで、管理データの具体例について説明する。
【００７４】
（管理データ４１０，４２０，４３０の具体例）
図４は、管理データ４１０，４２０，４３０の具体例を示す説明図である。図４において、管理データ４１０は、ＨＤＤ１のシステム領域３１４に記憶されている管理データである。管理データ４２０は、ＨＤＤ２のシステム領域３１５に記憶されている管理データである。管理データ４３０は、ＨＤＤ３のシステム領域３１６に記憶されている管理データである。
【００７５】
各管理データ４１０，４２０，４３０は、ＨＤＤを識別するＨＤＤ番号と、ＨＤＤの状態とを関連付けて記憶している。ＨＤＤの状態は、初期状態では「正常」であり、ＨＤＤに障害が発生すると「正常」から「異常」に更新される。また、ＨＤＤの状態は、ＨＤＤが障害から復帰すると「異常」から「正常」に更新される。
【００７６】
また、管理データ４１０は、ＨＤＤ１の起動時刻およびアクセスログを記憶している。管理データ４１０のアクセスログは、ＨＤＤコントローラ３０９がＨＤＤ１に最後にアクセスしたアクセス時刻を含む情報である。管理データ４２０は、ＨＤＤ２の起動時刻およびアクセスログを記憶している。管理データ４２０のアクセスログは、ＨＤＤコントローラ３０９がＨＤＤ２に最後にアクセスしたアクセス時刻を含む情報である。
【００７７】
管理データ４３０は、ＨＤＤ３の起動時刻およびアクセスログを記憶している。管理データ４３０のアクセスログは、ＨＤＤコントローラ３０９がＨＤＤ３に最後にアクセスしたアクセス時刻を含む情報である。管理データ４１０，４２０，４３０によれば、障害が発生しているＨＤＤを特定することができる。また、管理データ４１０，４２０，４３０によれば、各ＨＤＤ１〜ＨＤＤ３の起動時刻およびアクセス時刻を特定することができる。
【００７８】
（ストレージ制御装置１０１の機能的構成）
図５は、実施の形態１にかかるストレージ制御装置１０１の機能的構成を示すブロック図である。図５において、ストレージ制御装置１０１は、受付部５０１と、更新部５０２と、制御部５０３と、複写指示部５０４と、実行部５０５と、成否判定部５０６と、検出部５０７と、判断部５０８と、書込指示部５０９と、対象判定部５１０と、を含む構成である。各機能部（受付部５０１〜対象判定部５１０）は、具体的には、例えば、図３に示したメモリ３０７に記憶されたプログラムをプロセッサ３０６に実行させることにより、または、ＨＤＤコントローラ３０９、バスコントローラ３１０により、その機能を実現する。また、各機能部（受付部５０１〜対象判定部５１０）の処理結果は、特に指定する場合を除いて、メモリ３０７に記憶される。
【００７９】
受付部５０１は、ＨＤＤｋのＬＢＡｊに対する書込要求を受け付ける機能を有する（例えば、ｋ＝１，２，３、ｊ＝１，２，…，ｍ）。書込要求は、例えば、要求先のＨＤＤｋを特定するＨＤＤ番号「ｋ」と、要求先のＬＢＡｊを特定するＬＢＡ番号「ｊ」と、書込対象となるデータ（以下、「書込データ」という）と、を含む。具体的には、例えば、受付部５０１が、バスコントローラ３１０を介して、ＣＰＵ３０１から書込要求を受け付ける。書込要求の具体例については、後述の図６を用いて説明する。
【００８０】
更新部５０２は、書込要求を受け付けた場合、書込要求に対する書込処理が正常に完了したか否かを特定するための書込状態情報を更新する機能を有する。ここで、書込処理が正常に完了したとは、書込要求に伴って発生するデータの書き込みが正常に完了したことを表す。書込状態情報を記憶する書込状態テーブルの具体例については、後述の図７を用いて説明する。
【００８１】
図６は、書込要求６００の具体例を示す説明図である。図６において、書込要求６００は、要求先のＨＤＤｋを特定するＨＤＤ番号「１」と、要求先のＬＢＡｊを特定するＬＢＡ番号「１」と、書込データ「Ｄ１＃」と、を含む。図６の書込要求６００は、ＨＤＤ１のＬＢＡ１のデータＤ１を書込データＤ１＃に更新するためのものである。
【００８２】
図７は、書込状態テーブル７００の具体例を示す説明図である。図７において、書込状態テーブル７００は、書込状態フラグ、ＨＤＤ番号、ＬＢＡ番号および書込失敗ＨＤＤ番号のフィールドを有する。各フィールドに情報を設定することで、書込状態情報がレコードとして書込状態テーブル７００に記憶されている。
【００８３】
書込状態フラグは、書込要求に対する書込処理が正常に完了したか否かを示すフラグである。書込状態フラグは、初期状態では「０」であり、書込要求を受け付けると「０」から「１」に変更される。また、書込状態フラグは、書込要求に対する書込処理が正常に完了すると「１」から「０」に変更される。書込状態フラグが「１」である場合、書込要求に対する書込処理中であることを示す。
【００８４】
ＨＤＤ番号は、要求先のＨＤＤｋの識別子である。ＬＢＡ番号は、要求先のＬＢＡｊの識別子である。書込失敗ＨＤＤ番号は、書込要求に対する書込処理が実行された結果、書込要求に伴って発生するデータの書き込みに失敗したＨＤＤの識別子である。
【００８５】
図７中（７−１）は、図６に示した書込要求６００を受け付けた場合の書込状態情報の更新例である。書込要求６００を受け付けた場合、更新部５０２が、書込状態テーブル７００の書込状態フラグを「０」から「１」に変更する。また、更新部５０２が、書込要求６００に含まれるＨＤＤ番号「１」を、書込状態テーブル７００のＨＤＤ番号のフィールドに書き込む。また、更新部５０２が、書込要求６００に含まれるＬＢＡ番号「１」を、書込状態テーブル７００のＬＢＡ番号のフィールドに書き込む。
【００８６】
書込状態テーブル７００によれば、書込要求を受け付けた要求先のＨＤＤ番号とＬＢＡ番号を特定することができる。また、書込状態テーブル７００によれば、書込要求に対する書込処理が成功したか否かを特定することができる。書込状態テーブル７００は、例えば、図３に示した不揮発性メモリ３０８により実現される。
【００８７】
図５の説明に戻り、制御部５０３は、ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する機能を有する。具体的には、例えば、制御部５０３は、後述する複写指示部５０４、実行部５０５および書込指示部５０９の指示にしたがって、ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する。制御部５０３は、例えば、図３に示したＨＤＤコントローラ３０９により実現される。以下の説明では、制御部５０３の一例として、ＨＤＤコントローラ３０９を例に挙げて説明する。
【００８８】
複写指示部５０４は、書込要求を受け付けた場合、ＨＤＤコントローラ３０９に対して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを、書込バッファＢに複写するよう指示する機能を有する（ｉ＝１，２，…，ｎ）。また、複写指示部５０４は、書込要求を受け付けた場合、ＨＤＤコントローラ３０９に対して、データＤｉを生成元とするパリティデータＰｊを、書込バッファＢに複写するよう指示する機能を有する。
【００８９】
ここで、書込バッファＢは、図２に示した「特定の記憶領域２００」に相当し、例えば、各ＨＤＤ１〜ＨＤＤ３のデータ領域３１１，３１２，３１３とは異なる不揮発性の記憶領域である。書込バッファＢは、例えば、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６やストレージ制御装置１０１の不揮発性メモリ３０８に設けられる。
【００９０】
以下の説明では、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６に書込バッファＢがそれぞれ設けられている場合を例に挙げて説明する。ここで、書込バッファＢの具体例について説明する。
【００９１】
図８は、書込バッファＢの具体例を示す説明図である。図８において、書込バッファＢは、書込バッファＢ１と、書込バッファＢ２と、書込バッファＢ３と、を含む構成である。書込バッファＢ１は、書込要求を受け付けた要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉの複写先となる記憶領域である。
【００９２】
書込バッファＢ２は、書込要求を受け付けた要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの複写先となる記憶領域である。書込バッファＢ３は、書込要求に含まれる書込データ（以下、「書込データＤｉ＃」と表記する）の複写先となる記憶領域である。なお、書込バッファＢ３についての詳細な説明は後述する。
【００９３】
例えば、書込要求６００を受け付けた場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を書込バッファＢ１に複写するよう指示する。この結果、ＨＤＤコントローラ３０９が、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出して、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に書き込む。これにより、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１が各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写される。
【００９４】
また、書込要求６００を受け付けた場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を生成元とするパリティデータＰ１を書込バッファＢ２に複写するよう指示する。この結果、ＨＤＤコントローラ３０９が、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１を読み出して、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に書き込む。これにより、パリティデータＰ１が各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写される。
【００９５】
また、複写指示部５０４は、データＤｉを生成元とするパリティデータが複数存在する場合は、ＨＤＤコントローラ３０９に対して、データＤｉを生成元とする各パリティデータを、書込バッファＢに複写するよう指示する。例えば、ＲＡＩＤ６のストレージシステムの場合、パリティデータが２種類存在する。このため、ＲＡＩＤ６のストレージシステムの場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、データＤｉを生成元とする２種類のパリティデータを、書込バッファＢに複写するよう指示する。
【００９６】
以下、説明の簡単化のため、特に指定する場合を除いて、「ＨＤＤコントローラ３０９に対してデータの読み出し／書き込みを指示して、データを読み出す／書き込む」ことを「ＨＤＤコントローラ３０９を介して、データを読み出す／書き込む」と表現する。
【００９７】
図５の説明に戻り、実行部５０５は、データＤｉとパリティデータＰｊとが書込バッファＢに複写された後、書込要求に対する書込処理を実行する機能を有する。ここで、実行部５０５によって実行される書込要求に対する書込処理の具体例（Ａ）〜（Ｃ）について説明する。ただし、書込要求に対する書込処理に成功した場合を例に挙げて説明する。
【００９８】
（Ａ）冗長構成時の書込処理
まず、冗長構成時に実行される書込要求６００に対する書込処理（書込データＤ１＃のストレージ装置Ｓ１への書き込みを要する処理）について説明する。具体的には、例えば、まず、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ２のＬＢＡ１に記憶されているデータＤ２（書き込みを要さないデータ）を読み出す。つぎに、実行部５０５が、書込要求６００に含まれる書込データＤ１＃と、読み出されたデータＤ２との排他的論理和をとって、新たなパリティデータＰ１＃を算出する（Ｐ１＃＝Ｄ１＃  ｘｏｒ  Ｄ２）。
【００９９】
そして、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込データＤ１＃をＨＤＤ１のＬＢＡ１に書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃をＨＤＤ３のＬＢＡ１に書き込む。この結果、ＨＤＤ１のＬＢＡ１のデータＤ１が書込データＤ１＃に更新され、ＨＤＤ３のＬＢＡ１のパリティデータＰ１が新たなパリティデータＰ１＃に更新される。
【０１００】
（Ｂ）非冗長構成時の書込処理（その１）
つぎに、ＨＤＤ２がオフラインとなっている非冗長構成時に実行される書込要求６００に対する書込処理（データＤ１を書込データＤ１＃に更新する処理）について説明する。具体的には、例えば、まず、実行部５０５が、書込要求を受けると、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出す。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１を読み出す。
【０１０１】
そして、実行部５０５が、読み出されたデータＤ１とパリティデータＰ１の排他的論理和をとって、ＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を算出する。これにより、オフラインとなっているＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することができる。このあと、実行部５０５が、書込要求６００に含まれる書込データＤ１＃と、算出されたデータＤ２との排他的論理和をとって、新たなパリティデータＰ１＃を算出する。
【０１０２】
そして、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込データＤ１＃をＨＤＤ１のＬＢＡ１に書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃をＨＤＤ３のＬＢＡ１に書き込む。この結果、ＨＤＤ１のＬＢＡ１のデータＤ１が書込データＤ１＃に更新され、ＨＤＤ３のＬＢＡ１のパリティデータＰ１が新たなパリティデータＰ１＃に更新される。
【０１０３】
（Ｃ）非冗長構成時の書込処理（その２）
つぎに、ＨＤＤ２がオフラインとなっている非冗長構成時に実行される、ＨＤＤ２のＬＢＡ１のデータＤ２を書込データＤ２＃に更新する書込要求に対する書込処理について説明する。この場合、ＨＤＤ２がオフラインとなっているため、以下の手順によりＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１の更新を行う。
【０１０４】
具体的には、例えば、まず、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出す。このあと、実行部５０５が、読み出されたデータＤ１と、書込要求に含まれる書込データＤ２＃との排他的論理和をとって、新たなパリティデータＰ１＃を算出する。
【０１０５】
そして、実行部５０５が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃をＨＤＤ３のＬＢＡ１に書き込む。この結果、ＨＤＤ３のＬＢＡ１のパリティデータＰ１が、データＤ２の更新内容（Ｄ２→Ｄ２＃）が反映された新たなパリティデータＰ１＃に更新される。
【０１０６】
また、受付部５０１は、ＨＤＤｋのＬＢＡｊに対する読出要求を受け付ける機能を有する。ここで、読出要求は、例えば、要求先のＨＤＤｋを特定するＨＤＤ番号「ｋ」と、要求先のＬＢＡｊを特定するＬＢＡ番号「ｊ」と、を含む。具体的には、例えば、受付部５０１が、バスコントローラ３１０を介して、ＣＰＵ３０１から読出要求を受け付ける。
【０１０７】
また、実行部５０５は、受け付けた読出要求に対する読出処理を実行する機能を有する。具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを読み出す。また、要求先のＨＤＤｋがオフラインの場合、実行部５０５が、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊと他のＨＤＤが記憶するデータとを用いて、データＤｉを復元する。ここで、ＨＤＤ２がオフラインとなっている場合を例に挙げて、ＨＤＤ２のＬＢＡ１のデータＤ２を読み出す読出処理について説明する。
【０１０８】
具体的には、例えば、まず、読出要求を受けた実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出す。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１を読み出す。そして、実行部５０５が、読み出されたデータＤ１とパリティデータＰ１の排他的論理和をとって、ＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を算出する。これにより、オフラインとなっているＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元して、読出データとして用いることができる。
【０１０９】
成否判定部５０６は、書込要求に対する書込処理の処理結果に基づいて、書込要求に対する書込処理が成功したか否かを判定する機能を有する。具体的には、例えば、成否判定部５０６が、書込要求に伴って発生するデータの書き込みがすべて正常に完了した場合、書込要求に対する書込処理が成功したと判定する。
【０１１０】
上記（Ａ）および（Ｂ）の例では、書込データＤ１＃およびパリティデータＰ１＃の書き込みが正常に完了した場合、成否判定部５０６が、書込処理が成功したと判定する。一方、書込データＤ１＃またはパリティデータＰ１＃の少なくともいずれか一方の書き込みが正常に完了しなかった場合、成否判定部５０６が、書込処理が失敗したと判定する。
【０１１１】
また、上記（Ｃ）の例では、パリティデータＰ１＃の書き込みが正常に完了した場合、成否判定部５０６が、書込処理が成功したと判定する。一方、パリティデータＰ１＃の書き込みが正常に完了しなかった場合、成否判定部５０６が、書込処理が失敗したと判定する。
【０１１２】
データの書き込みが正常に完了したか否かの判定は、例えば、ＨＤＤｋに対して書き込まれる書込データＤｉ＃のＣＲＣコードと、実際に書き込まれたデータのＣＲＣコードの一致判定により行われる。ここで、ＣＲＣコードが一致する場合、成否判定部５０６が、書込データＤｉ＃の書き込みが正常に完了したと判定する。一方、ＣＲＣコードが不一致の場合、成否判定部５０６が、書込データＤｉ＃の書き込みが正常に完了しなかったと判定する。
【０１１３】
また、更新部５０２は、書込要求に対する書込処理が実行された結果、書込要求に対する書込処理が正常に完了したか否かを特定するための書込状態情報を更新する。具体的には、例えば、更新部５０２が、上記成否判定部５０６によって判定された判定結果に基づいて、図７に示した書込状態テーブル７００を更新する。
【０１１４】
より具体的には、例えば、書込要求に対する書込処理が成功したと判定された場合、更新部５０２が、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。一方、書込要求に対する書込処理が失敗したと判定された場合、更新部５０２が、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに、データの書き込みが正常に完了しなかったＨＤＤｋのＨＤＤ番号を書き込む。
【０１１５】
図７中（７−２）は、書込要求６００に対する書込処理が成功した場合の書込状態情報の更新例である。具体的には、例えば、書込要求６００に対する書込処理が正常に完了した場合、更新部５０２が、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。
【０１１６】
図７中（７−３）は、書込要求６００に対する書込処理が失敗した場合の書込状態情報の更新例である。ここでは、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みが正常に完了しなかった場合を例に挙げて説明する。この場合、更新部５０２が、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに、ＨＤＤ３のＨＤＤ番号「３」を書き込む。
【０１１７】
また、書込要求に対する書込処理が成功した場合、更新部５０２が、書込バッファＢに記憶されているデータＤｉやパリティデータＰｊを削除することにしてもよい。また、新たな書込要求を受け付けた場合に、新たなデータＤｉやパリティデータＰｊを、書込バッファＢに上書きするような構成であってもよい。この場合、書込要求に対する書込処理の成功時に、その都度、書込バッファＢに記憶されているデータＤｉやパリティデータＰｊを削除する必要がなくなる。
【０１１８】
図５の説明に戻り、検出部５０７は、ＨＤＤコントローラ３０９を介して、障害が発生したＨＤＤを検出する機能を有する。具体的には、例えば、検出部５０７が、ＨＤＤ１〜ＨＤＤ３の中から、データの書き込みが正常に行われなかったＨＤＤを、障害が発生したＨＤＤとして検出する。
【０１１９】
例えば、上記（Ａ）の書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みが正常に完了しなかった場合、検出部５０７が、ＨＤＤ１を障害が発生したＨＤＤとして検出する。また、上記（Ａ）の書込処理が実行された結果、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みが正常に完了しなかった場合、検出部５０７が、ＨＤＤ３を障害が発生したＨＤＤとして検出する。
【０１２０】
より具体的には、例えば、検出部５０７が、書込状態テーブル７００を参照して、書込失敗ＨＤＤ番号のフィールドに設定されているＨＤＤ番号のＨＤＤを、障害が発生したＨＤＤとして検出する。これにより、データの書き込みが正常に行われなかったＨＤＤを、障害が発生したＨＤＤとして検出することができる。
【０１２１】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、データの読み出しが正常に行われなかったＨＤＤを、障害が発生したＨＤＤとして検出する。より具体的には、例えば、検出部５０７が、ＨＤＤから読み出されたデータにリードエラーを示す情報が含まれている場合、該ＨＤＤを障害が発生したＨＤＤとして検出する。
【０１２２】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３に診断コマンドを送信することにしてもよい。そして、検出部５０７が、ＨＤＤコントローラ３０９を介して、診断コマンドを送信してから所定時間内に診断コマンドに対する応答信号を各ＨＤＤ１〜ＨＤＤ３から受信したか否かを判断する。
【０１２３】
例えば、まず、検出部５０７が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１に診断コマンドを送信する。このあと、検出部５０７が、所定時間内にＨＤＤ１から診断コマンドに対する応答信号を受信した場合、ＨＤＤ１を障害が発生していないＨＤＤとして検出する。一方、所定時間内に診断コマンドに対する応答信号を受信しなかった場合、検出部５０７が、ＨＤＤ１を障害が発生したＨＤＤとして検出する。
【０１２４】
また、検出部５０７は、障害が発生したＨＤＤを検出した場合、障害が発生したＨＤＤをオフライン（切り離す）にする。また、検出部５０７は、障害が発生したＨＤＤを検出した場合、ＨＤＤコントローラ３０９を介して、図４に示した各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を更新する。ここで、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の更新例について説明する。
【０１２５】
図９は、管理データ４１０，４２０，４３０の更新例を示す説明図（その１）である。図９中（９−１）は、ＨＤＤ２に障害が発生した場合の各管理データ４１０，４２０，４３０の更新例である。検出部５０７は、障害が発生したＨＤＤ２を検出した場合、ＨＤＤコントローラ３０９を介して、管理データ４１０のＨＤＤ２の状態を「正常」から「異常」に更新する。
【０１２６】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、管理データ４２０のＨＤＤ２の状態を「正常」から「異常」に更新する。また、検出部５０７が、ＨＤＤコントローラ３０９を介して、管理データ４３０のＨＤＤ２の状態を「正常」から「異常」に更新する。（９−１）の管理データ４１０，４２０，４３０によれば、ＨＤＤ１〜ＨＤＤ３のうち、ＨＤＤ２の状態が「異常」となっていることを特定することができる。
【０１２７】
ここで、管理データ４２０は、障害が発生したＨＤＤ２のシステム領域３１５に記憶されている。このため、ＨＤＤ２の障害により、ＨＤＤコントローラ３０９がＨＤＤ２のシステム領域３１５にアクセスできず、管理データ４２０を更新できない場合がある。（９−１）に示す管理データ４２０のＨＤＤ２の状態「（異常）」は、ＨＤＤコントローラ３０９が管理データ４２０を更新できた場合に、管理データ４２０内のＨＤＤ２の状態が「異常」となることを表している。
【０１２８】
図９中（９−２）は、ＨＤＤ２に障害が発生した後、さらに、ＨＤＤ３に障害が発生した場合の各管理データ４１０，４３０の更新例である。検出部５０７は、障害が発生したＨＤＤ３を検出した場合、ＨＤＤコントローラ３０９を介して、管理データ４１０のＨＤＤ３の状態を「正常」から「異常」に更新する。
【０１２９】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、管理データ４３０のＨＤＤ３の状態を「正常」から「異常」に更新する。ここでは、ＨＤＤ２は切り離されているため、既に障害が発生しているＨＤＤ２の管理データ４２０は更新しない。（９−２）の管理データ４１０，４３０によれば、ＨＤＤ１〜ＨＤＤ３のうち、ＨＤＤ２およびＨＤＤ３の状態が「異常」となっていることを特定することができる。
【０１３０】
ここで、管理データ４３０は、障害が発生したＨＤＤ３のシステム領域３１６に記憶されている。このため、ＨＤＤ３の障害により、ＨＤＤコントローラ３０９がＨＤＤ３のシステム領域３１６にアクセスできず、管理データ４３０を更新できない場合がある。（９−２）に示す管理データ４３０のＨＤＤ３の状態「（異常）」は、ＨＤＤコントローラ３０９が管理データ４３０を更新できた場合に、管理データ４３０内のＨＤＤ３の状態が「異常」となることを表している。
【０１３１】
また、検出された検出結果は、例えば、図１０に示す検出結果テーブル１０００に記憶することにしてもよい。検出結果テーブル１０００は、例えば、メモリ３０７によって実現される。ここで、検出結果テーブル１０００の具体例について説明する。
【０１３２】
図１０は、検出結果テーブル１０００の具体例を示す説明図である。図１０において、検出結果テーブル１０００は、ＨＤＤ番号および検出時刻のフィールドを有し、各フィールドに情報を設定することで、検出結果をレコードとして記憶する。ここで、ＨＤＤ番号は、障害が発生したＨＤＤの識別子である。検出時刻は、障害が発生したＨＤＤが検出された時刻である。
【０１３３】
図１０中（１０−１）は、障害が発生したＨＤＤとして、ＨＤＤ２が検出された場合の検出結果テーブル１０００の更新例である。この場合、検出部５０７が、検出結果テーブル１０００のＨＤＤ番号のフィールドに、ＨＤＤ２のＨＤＤ番号「２」を書き込む。また、検出部５０７が、検出結果テーブル１０００の検出時刻のフィールドに、ＨＤＤ２を検出した検出時刻「２０１０／０８／２３  ０２：１１：５５」を書き込む。
【０１３４】
図１０中（１０−２）は、障害が発生したＨＤＤとして、さらに、ＨＤＤ３が検出された場合の検出結果テーブル１０００の更新例である。この場合、検出部５０７が、検出結果テーブル１０００のＨＤＤ番号のフィールドに、ＨＤＤ３のＨＤＤ番号「３」を書き込む。また、検出部５０７が、検出結果テーブル１０００の検出時刻のフィールドに、ＨＤＤ３を検出した検出時刻「２０１０／０８／２４  １２：０９：２２」を書き込む。
【０１３５】
ここで、ストレージシステム３００は、障害が発生したＨＤＤの台数が２台以上（マルチデッド状態）になると、障害が発生しているＨＤＤのデータを復元できなくなるためシステムダウンする。そこで、判断部５０８により、ストレージシステム３００のシステムダウンの要否を判断する。
【０１３６】
判断部５０８は、検出された検出結果に基づいて、障害が発生したＨＤＤの台数ｘが、所定数Ｘ以上か否かを判断する機能を有する。ここで、所定数Ｘは、障害が発生したＨＤＤの台数がＸ台以上となると、ストレージシステム３００がマルチデッド状態となる値に設定される。具体的には、例えば、所定数Ｘは、パリティドライブの台数Ｙに１を加算した値「Ｘ＝Ｙ＋１」に設定される。
【０１３７】
ストレージシステム３００はＲＡＩＤ３のため、パリティドライブの台数Ｙは「Ｙ＝１」である。このため、所定数Ｘは「Ｘ＝２」となる。また、ＲＡＩＤ５のストレージシステム（例えば、後述するストレージシステム２０００）の場合、パリティドライブの台数Ｙは「Ｙ＝１」である。このため、所定数Ｘは「Ｘ＝２」となる。また、ＲＡＩＤ６のストレージシステムの場合、パリティドライブの台数Ｙは「Ｙ＝２」である。このため、所定数Ｘは「Ｘ＝３」となる。
【０１３８】
具体的には、例えば、まず、判断部５０８が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数ｘ１，ｘ２，ｘ３をそれぞれ特定する。
【０１３９】
図９に示した（９−１）の例では、判断部５０８が、ＨＤＤ１の管理データ４１０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ１＝１」を特定する。また、判断部５０８が、ＨＤＤ２の管理データ４２０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ２＝１」を特定する。また、判断部５０８が、ＨＤＤ３の管理データ４３０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ３＝１」を特定する。
【０１４０】
そして、判断部５０８が、台数ｘ１，ｘ２，ｘ３のうち最大の値を、障害が発生したＨＤＤの台数ｘとして特定する。ここでは、台数ｘ１，ｘ２，ｘ３のすべての値が「１」のため、障害が発生したＨＤＤの台数ｘは「ｘ＝１」となる。このため、判断部５０８が、障害が発生したＨＤＤの台数ｘ（ｘ＝１）が所定数Ｘ（Ｘ＝２）未満と判断する。
【０１４１】
また、図９に示した（９−２）の例では、判断部５０８が、ＨＤＤ１の管理データ４１０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ１＝２」を特定する。また、判断部５０８が、ＨＤＤ２の管理データ４２０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ２＝１」を特定する。また、判断部５０８が、ＨＤＤ３の管理データ４３０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ３＝２」を特定する。
【０１４２】
そして、判断部５０８が、台数ｘ１，ｘ２，ｘ３のうち最大の値を、障害が発生したＨＤＤの台数ｘとして特定する。ここでは、管理データ４１０あるいは管理データ４３０に記録されている台数ｘ１，ｘ３の値が「２」で最大のため、障害が発生したＨＤＤの台数ｘは「ｘ＝２」となる。このため、判断部５０８が、障害が発生したＨＤＤの台数ｘ（ｘ＝２）が所定数Ｘ（Ｘ＝２）以上と判断する。
【０１４３】
また、障害が発生したＨＤＤの台数ｘが所定数Ｘ以上となった場合、判断部５０８が、障害が発生したＨＤＤの台数ｘが所定数Ｘ以上となったことをＣＰＵ３０１に通知する。すなわち、ストレージシステム３００がマルチデッド状態となったため、判断部５０８が、ストレージシステム３００をシステムダウンさせるようＣＰＵ３０１に要求する。
【０１４４】
ＣＰＵ３０１は、障害が発生したＨＤＤの台数ｘが所定数Ｘ以上となったことが通知された場合、ストレージシステム３００をシステムダウンさせる。すなわち、ＣＰＵ３０１は、ストレージシステム３００がマルチデッド状態となったため、ストレージシステム３００をシステムダウンさせる。
【０１４５】
また、システムダウンしたストレージシステム３００を復旧する場合、例えば、ストレージシステム３００をシステムダウン直前の非冗長構成に戻す。具体的には、例えば、まず、ＣＰＵ３０１またはユーザの操作入力により、ストレージシステム３００のハードリセット（または、電源のＯＦＦ／ＯＮ）を行う。
【０１４６】
つぎに、プロセッサ３０６により、障害が発生した複数のＨＤＤについて、障害が発生した順序を特定する。障害が発生したＨＤＤの順序を特定する具体的な処理内容については後述する。このあと、プロセッサ３０６により、障害が発生した複数のＨＤＤのうち、最後に障害が発生したＨＤＤ以外のＨＤＤをオフラインにする。すなわち、プロセッサ３０６により、障害が発生した複数のＨＤＤのうち、最後に障害が発生したＨＤＤのみをオンラインにする。
【０１４７】
この際、プロセッサ３０６により、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０内の最後に障害が発生したＨＤＤの状態を更新する。ただし、更新対象となる管理データは、オンラインとなっているＨＤＤの管理データである。図９の（９−２）に示した例では、プロセッサ３０６が、オンラインのＨＤＤ１，ＨＤＤ３の管理データ４１０，４３０のＨＤＤ３の状態を「異常」から「正常」に変更する。
【０１４８】
そして、ＣＰＵ３０１またはユーザの操作入力により、ストレージシステム３００を再起動する。この際、ＣＰＵ３０１が、ストレージシステム３００の起動通知をプロセッサ３０６に出力することにしてもよい。これにより、ストレージシステム３００をシステムダウン直前の非冗長構成に戻すことができる。なお、ここではＣＰＵ３０１またはユーザの操作入力によってストレージシステム３００を再起動することにしたが、プロセッサ３０６がストレージシステム３００の再起動を行うことにしてもよい。
【０１４９】
また、判断部５０８は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する機能を有する。ここで、書込要求に対する書込処理が実行されたＨＤＤは、例えば、上記（Ａ）および（Ｂ）の書込処理の場合、ＨＤＤ１，ＨＤＤ３である。また、上記（Ｃ）の書込処理の場合、書込要求に対する書込処理が実行されたＨＤＤはＨＤＤ３である。
【０１５０】
具体的には、例えば、判断部５０８が、ストレージシステム３００の起動通知をＣＰＵ３０１から受け付けた場合、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断する。また、判断部５０８が、書込要求に対する書込処理が実行されたＨＤＤから起動完了通知を受け付けた場合、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断することにしてもよい。
【０１５１】
書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写されたデータＤｉを複写元のＬＢＡに書き込むよう指示する機能を有する。ここで、データＤｉの複写元のＬＢＡとは、書込要求の要求先のＨＤＤｋのＬＢＡｊである。
【０１５２】
また、書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡに書き込むよう指示する機能を有する。ここで、パリティデータＰｊの複写元のＬＢＡは、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの記憶先のＬＢＡｊである。
【０１５３】
図８に示した例では、書込指示部５０９が、ＨＤＤコントローラ３０９に対して、書込バッファＢ１に複写されたデータＤ１をＨＤＤ１のＬＢＡ１に書き込むよう指示する。この結果、ＨＤＤコントローラ３０９が、書込バッファＢ１に記憶されているデータＤ１を読み出して、ＨＤＤ１のＬＢＡ１に書き込む。この際、ＨＤＤコントローラ３０９は、例えば、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１のうち、アクセス可能な任意の書込バッファＢ１からデータＤ１を読み出す。これにより、データＤ１がＨＤＤ１の複写元のＬＢＡ１に書き戻される。
【０１５４】
また、書込指示部５０９が、ＨＤＤコントローラ３０９に対して、書込バッファＢ２に複写されたパリティデータＰ１をＨＤＤ３のＬＢＡ１に書き込むよう指示する。この結果、ＨＤＤコントローラ３０９が、書込バッファＢ２に記憶されているパリティデータＰ１を読み出して、ＨＤＤ３のＬＢＡ１に書き込む。この際、ＨＤＤコントローラ３０９は、例えば、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２のうち、アクセス可能な任意の書込バッファＢ２からパリティデータＰ１を読み出す。これにより、パリティデータＰ１がＨＤＤ３の複写元のＬＢＡ１に書き戻される。この結果、ＨＤＤ１とＨＤＤ３との間のデータの整合性をとることができる。
【０１５５】
なお、書込指示部５０９は、書込バッファＢに複数のパリティデータが複写されている場合、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写された複数のパリティデータを複写元のＬＢＡにそれぞれ書き込むよう指示する。例えば、ＲＡＩＤ６のストレージシステムの場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写された２種類のパリティデータを複写元のＬＢＡにそれぞれ書き込むよう指示する。
【０１５６】
ここで、ストレージシステム３００をマルチデッド状態から非冗長構成に戻す場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、ＨＤＤ２がオフラインとなっている非冗長構成のストレージシステム３００において、書込要求６００に対する書込処理（上記（Ｂ））が実行された場合を例に挙げて説明する。
【０１５７】
図１１は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その１）である。図１１の（１１−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに成功し、ＨＤＤ３のＬＢＡ１に対する新たなパリティデータＰ１＃の書き込みに失敗している。
【０１５８】
具体的には、ＨＤＤ３のＬＢＡ１に対してパリティデータＰ１＃の一部を書き込めなかったため、ＨＤＤ３のＬＢＡ１の記憶内容がパリティデータＰ１＃とは異なるパリティデータＰｘとなっている。この場合、ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０１５９】
図１１の（１１−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ３が再起動されて、ストレージシステム３００がマルチデッド状態から非冗長構成に復旧されている。ここで、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、本来のパリティデータＰ１＃とは異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０１６０】
図１１の（１１−３）において、書込バッファＢ１に複写されたデータＤ１がＨＤＤ１のＬＢＡ１に書き込まれ、書込バッファＢ２に複写されたパリティデータＰ１がＨＤＤ３のＬＢＡ１に書き込まれる。この結果、ＨＤＤ１、ＨＤＤ３は書込み処理開始前の状態に復帰するので、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保され、オフラインとなっているＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することが可能となる。
【０１６１】
＜書込失敗時に、複写したデータＤｉとパリティデータＰｊを書き戻す＞
上述した説明では、書込要求に対する書込処理が実行されたＨＤＤが再起動されると、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡに書き込むことにしたが、これに限らない。
【０１６２】
ストレージシステム３００の電源のＯＦＦ／ＯＮは、瞬時停電などが原因で発生する場合がある。このため、書込要求に対する書込処理が正常に完了した後、瞬時停電によりストレージシステム３００の電源がＯＦＦ／ＯＮされ、ストレージシステム３００が再起動される場合がある。この場合、書込バッファＢに複写されたデータＤｉとパリティデータＰｊとが再起動後に複写元のＬＢＡに書き込まれると、複写元のＬＢＡの記憶内容が、書込要求に対する書込処理が実行される前の状態に戻ってしまう。
【０１６３】
そこで、書込指示部５０９は、成否判定部５０６によって書込処理が失敗したと判定され、かつ、判断部５０８によってＨＤＤが再起動されたと判断された場合に、書込バッファＢに複写されたデータＤｉを複写元のＬＢＡに書き込むことにしてもよい。同様に、書込指示部５０９は、成否判定部５０６によって書込処理が失敗したと判定され、かつ、判断部５０８によってＨＤＤが再起動されたと判断された場合に、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡに書き込むことにしてもよい。
【０１６４】
具体的には、例えば、まず、書込指示部５０９が、図７に示した書込状態テーブル７００の書込状態フラグが「０」となっているか否かを判断する。ここで、書込状態フラグが「０」の場合には、書込処理が行なわれていない状態にあるため、書込指示部５０９は、判断部５０８によってＨＤＤが再起動されたと判断されても、書込バッファＢに複写されたデータＤｉとパリティデータＰｊの複写元のＬＢＡに対する書き込みを行わない。
【０１６５】
一方、書込状態テーブル７００の書込状態フラグが「１」で、かつ、判断部５０８によってＨＤＤが再起動されたと判断された場合、書込処理中にＨＤＤが再起動され、書込要求に対する書込処理が正常に完了していないことを意味する。そのため書込指示部５０９が、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡに書き込む。これにより、書込要求に対する書込処理が成功した後、瞬時停電等の理由でＨＤＤが再起動された場合であっても、書込バッファＢに複写したデータＤｉとパリティデータＰｊを複写元のＬＢＡに書き戻すことを防ぐことができる。
【０１６６】
＜マルチデッド状態から冗長構成への復旧＞
また、上述した説明では、システムダウンしたストレージシステム３００を復旧する場合、ストレージシステム３００をシステムダウン直前の非冗長構成に戻す場合について説明したが、これに限らない。
【０１６７】
例えば、上記（Ａ）の冗長構成時の書込処理において、ＨＤＤ１に対する書込データＤ１＃の書き込みに失敗し、かつ、ＨＤＤ３に対するパリティデータＰ１＃の書き込みに失敗して、ストレージシステム３００がマルチデッド状態となる場合がある。この場合、システムダウンしたストレージシステム３００を復旧する際に、ストレージシステム３００をマルチデッド状態から冗長構成に戻すことにしてもよい。
【０１６８】
具体的には、例えば、まず、ＣＰＵ３０１またはユーザの操作入力により、システムダウンしたストレージシステム３００のハードリセットを行う。つぎに、ＣＰＵ３０１またはユーザの操作入力により、ストレージシステム３００を再起動する。この際、障害が発生したＨＤＤ１，ＨＤＤ３の両方をオンラインにする。これにより、ストレージシステム３００を冗長構成に戻すことができる。
【０１６９】
このあと、書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込処理の開始時に書込バッファＢに複写されたデータＤｉを複写元のＬＢＡに書き込む。また、書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡに書き込む。
【０１７０】
ここで、ストレージシステム３００をマルチデッド状態から冗長構成に戻す場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、冗長構成のストレージシステム３００において、書込要求６００に対する書込処理（上記（Ａ））が実行された場合を例に挙げて説明する。
【０１７１】
図１２は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その２）である。図１２の（１２−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに失敗し、同時にＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みに失敗している。
【０１７２】
具体的には、ＨＤＤ１のＬＢＡ１に対して書込データＤ１＃の一部を書き込めなかったため、ＨＤＤ１のＬＢＡ１の記憶内容が書込データＤ１＃とは異なるデータＤｘとなっている。また、ＨＤＤ３のＬＢＡ１に対してパリティデータＰ１＃の一部を書き込めなかったため、ＨＤＤ３のＬＢＡ１の記憶内容がパリティデータＰ１＃とは異なるパリティデータＰｘとなっている。この場合、ＨＤＤ１，ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０１７３】
図１２の（１２−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ１，３が再起動されて、ストレージシステム３００がマルチデッド状態から冗長構成に復旧されている。ここで、ＨＤＤ１のＬＢＡ１に記憶されているデータＤｘは、当初ＨＤＤ１に記憶されていたデータＤ１および書込データＤ１＃のいずれとも異なるデータである。また、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、当初ＨＤＤ３に記憶されていたパリティデータＰ１およびパリティデータＰ１＃のいずれとも異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０１７４】
図１２の（１２−３）において、書込処理の開始時に書込バッファＢ１に複写されたデータＤ１がＨＤＤ１のＬＢＡ１に書き込まれ、書込バッファＢ２に複写されたパリティデータＰ１がＨＤＤ３のＬＢＡ１に書き込まれている。この結果、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保される。また、以降ＨＤＤ２がオフラインとなってもＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することが可能となる。
【０１７５】
また、冗長構成時の書込要求に対する書込処理において、要求先のＨＤＤｋに対するデータＤｉまたはパリティドライブに対するパリティデータＰｊの書き込みに失敗して非冗長構成となっても、システムの運用が可能である。このため、書込要求に対する書込処理が実行された結果、ストレージシステム３００が冗長構成から非冗長構成となっても、更新部５０２が、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。
【０１７６】
＜書込要求の要求先のＨＤＤｋがオフライン＞
また、上記（Ｃ）のように、オフラインとなっているＨＤＤ２のＬＢＡ１のデータＤ２を書込データＤ２＃に更新する場合、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１のみの更新が行われる。このため、オフラインのＨＤＤ２に対する書込要求があった場合は、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１のみの書込バッファへの複写を行えばよい。
【０１７７】
対象判定部５１０は、検出された検出結果に基づいて、書込要求の要求先のＨＤＤｋに障害が発生しているか否かを判定する機能を有する。具体的には、例えば、対象判定部５１０が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照して、要求先のＨＤＤｋの状態が「異常」となっているか否かを判定する。
【０１７８】
ここで、管理データ４１０，４２０，４３０うち少なくともいずれかの管理データにおいて、要求先のＨＤＤｋの状態が「異常」となっている場合、対象判定部５１０が、ＨＤＤｋに障害が発生していると判定する。一方、すべての管理データ４１０，４２０，４３０で、要求先のＨＤＤｋの状態が「正常」となっている場合、対象判定部５１０が、ＨＤＤｋに障害が発生していないと判定する。
【０１７９】
また、対象判定部５１０は、図１０に示した検出結果テーブル１０００を参照して、要求先のＨＤＤｋに障害が発生しているか否かを判定することにしてもよい。具体的には、例えば、検出結果テーブル１０００の中に、書込要求に含まれるＨＤＤ番号に対応するレコードがあるか否かを判定する。
【０１８０】
ここで、書込要求に含まれるＨＤＤ番号に対応するレコードがある場合、対象判定部５１０が、要求先のＨＤＤｋに障害が発生していると判定する。一方、検出結果テーブル１０００の中に、書込要求に含まれるＨＤＤ番号に対応するレコードがない場合、対象判定部５１０が、要求先のＨＤＤｋに障害が発生していないと判定する。
【０１８１】
複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊを書込バッファＢに複写する。また、複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉの書込バッファＢへの複写は行わない。
【０１８２】
この場合、判断部５０８は、パリティデータＰｊが書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、例えば、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込む。
【０１８３】
＜パリティドライブがオフライン＞
また、パリティドライブがオフラインとなっている場合、書込要求の要求先のＨＤＤｋのＬＢＡｊのデータＤｉのみの更新が行われる。このため、パリティドライブがオフラインとなっている場合は、書込要求の要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉのみの複写を行えばよい。
【０１８４】
対象判定部５１０は、検出された検出結果に基づいて、書込要求の要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの記憶先のＨＤＤに障害が発生しているか否かを判定する機能を有する。具体的には、例えば、対象判定部５１０が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照して、パリティドライブ（ＨＤＤ３）の状態が「異常」となっているか否かを判定する。
【０１８５】
ここで、管理データ４１０，４２０，４３０のうち少なくともいずれかの管理データにおいて、パリティドライブの状態が「異常」となっている場合、対象判定部５１０が、パリティドライブに障害が発生していると判定する。一方、すべての管理データ４１０，４２０，４３０において、パリティドライブの状態が「正常」となっている場合、対象判定部５１０が、パリティドライブに障害が発生していないと判定する。
【０１８６】
また、対象判定部５１０は、図１０に示した検出結果テーブル１０００を参照して、パリティドライブに障害が発生しているか否かを判定することにしてもよい。具体的には、例えば、検出結果テーブル１０００の中に、パリティドライブであるＨＤＤ３のＨＤＤ番号「３」に対応するレコードがあるか否かを判定する。
【０１８７】
ここで、ＨＤＤ３のＨＤＤ番号「３」に対応するレコードがある場合、対象判定部５１０が、パリティドライブに障害が発生していると判定する。一方、検出結果テーブル１０００の中に、ＨＤＤ３のＨＤＤ番号「３」に対応するレコードがない場合、対象判定部５１０が、パリティドライブに障害が発生していないと判定する。
【０１８８】
複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを書込バッファＢに複写する。また、複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの書込バッファＢへの複写は行わない。
【０１８９】
この場合、判断部５０８は、データＤｉが書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、例えば、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたデータＤｉを要求先のＨＤＤｋのＬＢＡｊに書き込む。
【０１９０】
＜書込データＤｉ＃の書込バッファＢへの複写＞
また、複写指示部５０４は、さらに、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写することにしてもよい。例えば、書込要求６００を受け付けた場合、複写指示部５０４が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写する。また、複写指示部５０４が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を生成元とするパリティデータＰ１を各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写する。さらに、複写指示部５０４が、ＨＤＤコントローラ３０９を介して、書込要求６００に含まれる書込データＤ１＃を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３（図８参照）に複写する。
【０１９１】
この場合、判断部５０８は、データＤｉ、パリティデータＰｊおよび書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。例えば、判断部５０８が、データＤ１、パリティデータＰ１および書込データＤ１＃が書込バッファＢ１〜Ｂ３にそれぞれ複写された後、書込要求６００に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。
【０１９２】
そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたデータＤｉを要求先のＬＢＡｊに書き込む。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込む。
【０１９３】
このあと、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込データＤｉ＃を生成元とするパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込む。
【０１９４】
例えば、書込要求６００に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータＤ１を要求先のＨＤＤ１のＬＢＡ１に書き込む。また、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ２に複写されたパリティデータＰ１を複写元のＨＤＤ３のＬＢＡ１に書き込む。
【０１９５】
このあと、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤ１＃を生成元とするパリティデータＰ１＃を算出する。そして、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤ１＃を要求先のＨＤＤ１のＬＢＡ１に書き込む。また、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃を、パリティデータＰ１の複写元のＨＤＤ３のＬＢＡ１に書き込む。
【０１９６】
これにより、書込バッファＢに複写したデータＤｉとパリティデータＰｊを書き戻して再起動後のＨＤＤ間のデータの整合性を確保した後、書込バッファＢに複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０１９７】
また、更新部５０２は、上記書込指示部５０９によって指示された各種データの書込処理（以下、「データ書込処理」という）が成功した場合、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。すなわち、例えば、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き戻したことで、ＨＤＤ間のデータの整合性が確保されたため、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。
【０１９８】
また、更新部５０２は、書込状態テーブル７００の書込状態フラグが「１」から「０」に変更された場合、書込バッファＢを初期化することにしてもよい。すなわち、書込要求に対する書込処理またはデータ書込処理に成功した場合、更新部５０２が、書込バッファＢ１〜Ｂ３に複写されたデータＤｉ、パリティデータＰｊおよび書込データＤｉ＃を破棄する。
【０１９９】
また、上記書込指示部５０９によって指示されたデータ書込処理に失敗した場合、以降において、データＤｉの読出時に、書込バッファＢに複写されたデータＤｉを読出データとして用いることにしてもよい。また、データ書込処理に失敗した場合、以降において、パリティデータＰｊの読出時に、書込バッファＢに複写されたパリティデータＰｊを読出データとして用いることにしてもよい。また、データ書込処理に失敗した場合、以降において、書込データＤｉ＃の読出時に、書込バッファＢに複写された書込データＤｉ＃を読出データとして用いることにしてもよい。これにより、新たな書込要求を受け付けるまでの間、ストレージシステム３００を正常に運用することができる。
【０２００】
＜データＤｉとパリティデータＰｊの複写が不要なパターン＞
また、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する場合、要求先のＨＤＤｋのＬＢＡｊのデータＤｉと、データＤｉを生成元とするパリティデータＰｊの書込バッファＢへの複写が不要となる場合がある。すなわち、データＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き戻して書込要求を受け付ける直前の状態に戻すことなく、書込要求に対する書込処理を再実行することができる場合がある。
【０２０１】
具体的には、書込要求に対する書込処理の実行時に、オフラインとなっているＨＤＤのデータを復元する必要がない場合は、データＤｉとパリティデータＰｊの書込バッファＢへの複写が不要となる。ここで、データＤｉとパリティデータＰｊの書込バッファＢへの複写が不要となるパターン１〜パターン３について説明する。
【０２０２】
（パターン１）冗長構成時に書込要求を受け付けた場合
ストレージシステム３００が冗長構成の場合、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き込むことなく、書込バッファＢに複写された書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。そこで、上記判断部５０８により、ストレージシステム３００が冗長構成か否かを判断する。
【０２０３】
ここで、ＲＡＩＤ３，５，６等のストレージシステムは、障害が発生したＨＤＤの台数ｘが、パリティドライブの台数Ｙ未満の場合に冗長構成となる。このため、判断部５０８が、検出された検出結果に基づいて、障害が発生したＨＤＤの台数ｘがパリティドライブの台数Ｙ未満か否かを判断する。ストレージシステム３００のパリティドライブの台数Ｙは「Ｙ＝１」のため、判断部５０８が、障害が発生したＨＤＤの台数ｘが「ｘ＝０」か否かを判断する。
【０２０４】
そして、複写指示部５０４は、障害が発生したＨＤＤの台数ｘがパリティドライブの台数Ｙ未満と判断された場合、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する。また、複写指示部５０４は、障害が発生したＨＤＤの台数ｘがパリティドライブの台数Ｙ未満と判断された場合、データＤｉとパリティデータＰｊの書込バッファＢへの複写は行わない。
【０２０５】
この場合、判断部５０８は、書込要求に含まれる書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込データＤｉ＃を生成元とするパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込む。
【０２０６】
これにより、データＤｉおよびパリティデータＰｊの書込バッファＢに対する複写処理、および書込バッファＢに複写されたデータＤｉおよびパリティデータＰｊの複写元のＬＢＡｊに対するデータ書込処理を削減できる。
【０２０７】
ここで、冗長構成時に書込要求を受け付けた場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、冗長構成のストレージシステム３００において、書込要求６００に対する書込処理（上記（Ａ））が実行された場合を例に挙げて説明する。
【０２０８】
図１３は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その３）である。図１３の（１３−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに失敗し、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みに失敗している。この場合、ＨＤＤ１，ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０２０９】
図１３の（１３−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ１，３が再起動されて、ストレージシステム３００がマルチデッド状態から冗長構成に復旧されている。ここで、ＨＤＤ１のＬＢＡ１に記憶されているデータＤｘは、データＤ１および書込データＤ１＃のいずれとも異なるデータである。また、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、パリティデータＰ１およびパリティデータＰ１＃のいずれとも異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０２１０】
図１３の（１３−３）において、書込バッファＢ３に複写された書込データＤ１＃がＨＤＤ１のＬＢＡ１に書き込まれている。また、書込バッファＢ３に複写された書込データＤ１＃を生成元とするパリティデータＰ１＃（Ｐ１＃＝Ｄ１＃  ｘｏｒ  Ｄ２）がＨＤＤ３のＬＢＡ１に書き込まれている。この結果、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保され、ＨＤＤ２がオフラインとなってもＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することが可能となる。
【０２１１】
（パターン２）要求先のＨＤＤｋがオフライン
要求先のＨＤＤｋがオフラインの場合、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込むことなく、書込バッファＢに複写された書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２１２】
そこで、複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する。また、複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、データＤｉとパリティデータＰｊの書込バッファＢへの複写は行わない。
【０２１３】
この場合、判断部５０８は、書込要求に含まれる書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込データＤｉ＃を生成元とするパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込む。
【０２１４】
これにより、パリティデータＰｊの書込バッファＢに対する複写処理、および書込バッファＢに複写されたパリティデータＰｊの複写元のＬＢＡｊに対するデータ書込処理を削減できる。
【０２１５】
ここで、要求先のＨＤＤｋがオフラインの書込要求を受け付けた場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、ＨＤＤ２がオフラインとなっている非冗長構成時に、ＨＤＤ２のＬＢＡ１のデータＤ２を書込データＤ２＃に更新する書込要求に対する書込処理（上記（Ｃ））が実行された場合を例に挙げて説明する。
【０２１６】
図１４は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その４）である。図１４の（１４−１）において、ＨＤＤ２のＬＢＡ１のデータＤ２をデータＤ２＃に更新する書込要求に対する書込処理が実行された結果、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みに失敗している。この場合、ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０２１７】
図１４の（１４−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ３が再起動されて、ストレージシステム３００がマルチデッド状態から非冗長構成に復旧されている。ここで、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、パリティデータＰ１と異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０２１８】
図１４の（１４−３）において、書込バッファＢ３に複写された書込データＤ２＃を生成元とするパリティデータＰ１＃（Ｐ１＃＝Ｄ１  ｘｏｒ  Ｄ２＃）がＨＤＤ３のＬＢＡ１に書き込まれている。この結果、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保され、以降において、オフラインとなっているＨＤＤ２のＬＢＡ１の書込データＤ２＃を復元することが可能となる。
【０２１９】
（パターン３）パリティドライブがオフライン
パリティドライブがオフラインの場合、書込バッファＢに複写されたデータＤｉを複写元のＬＢＡｊに書き込むことなく、書込バッファＢに複写された書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２２０】
そこで、複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する。また、複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、データＤｉとパリティデータＰｊの書込バッファＢへの複写は行わない。
【０２２１】
この場合、判断部５０８は、書込要求に含まれる書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む。これにより、データＤｉの書込バッファＢに対する複写処理、および書込バッファＢに複写されたデータＤｉの複写元のＬＢＡｊに対するデータ書込処理を削減できる。
【０２２２】
ここで、パリティドライブがオフラインのときに書込要求を受け付けた場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、ＨＤＤ３がオフラインとなっている非冗長構成時に、書込要求６００に対する書込処理が実行された場合を例に挙げて説明する。
【０２２３】
図１５は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その５）である。図１５の（１５−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに失敗している。この場合、ＨＤＤ１が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０２２４】
図１５の（１５−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ１が再起動されて、ストレージシステム３００がマルチデッド状態から非冗長構成に復旧されている。ここで、ＨＤＤ１のＬＢＡ１に記憶されているデータＤｘは、データＤ１および書込データＤ１＃のいずれとも異なるデータである。
【０２２５】
図１５の（１５−３）において、書込バッファＢ３に複写された書込データＤ１＃がＨＤＤ１のＬＢＡ１に書き込まれている。
【０２２６】
また、上述した説明では、書込バッファＢを、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６にそれぞれ設ける場合を例に挙げて説明したが、不揮発性メモリ３０８に設けることにしてもよい。不揮発性メモリ３０８に書込バッファＢを設けた場合、複写指示部５０４や書込指示部５０９が、ＨＤＤコントローラ３０９を介すことなく、書込バッファＢに直接アクセスできる。また、複写指示部５０４が、データＤｉやパリティデータＰｊ等を書込バッファＢに複写するために、複数のＨＤＤ１〜ＨＤＤ３にアクセスする必要がない。
【０２２７】
このため、不揮発性メモリ３０８に書込バッファＢを設ける場合、各ＨＤＤ１〜ＨＤＤ３に書込バッファＢを設ける場合に比べて、複写指示部５０４によるデータ複写処理および書込指示部５０９によるデータ書込処理の高速化を図ることができる。一方、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６に書込バッファＢを設ける場合は、不揮発性メモリ３０８に記憶するデータ量を抑えることができる。
【０２２８】
＜障害が発生したＨＤＤの順序特定＞
ここで、障害が発生した複数のＨＤＤについて、障害が発生した順序を特定する具体的な処理内容の一例について説明する。まず、図９中（９−２）に示した各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を用いて、障害が発生した順序を特定する場合について説明する。
【０２２９】
具体的には、例えば、プロセッサ３０６が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照する。そして、プロセッサ３０６が、管理データ４１０，４２０，４３０の少なくともいずれかの管理データにおいて、状態が「異常」となっているＨＤＤ２，ＨＤＤ３を特定する。
【０２３０】
つぎに、プロセッサ３０６が、ＨＤＤコントローラ３０９を介して、特定されたＨＤＤ２の管理データ４２０のアクセスログを参照して、ＨＤＤ２に最後にアクセスしたアクセス時刻（以下、「アクセス時刻ｔ１」という）を特定する。また、プロセッサ３０６が、ＨＤＤコントローラ３０９を介して、特定されたＨＤＤ３の管理データ４３０のアクセスログを参照して、ＨＤＤ３に最後にアクセスしたアクセス時刻（以下、「アクセス時刻ｔ２」という）を特定する。
【０２３１】
そして、プロセッサ３０６が、特定されたアクセス時刻ｔ１とアクセス時刻ｔ２とを比較して、ＨＤＤ２，ＨＤＤ３について、障害が発生した順序を特定する。具体的には、例えば、プロセッサ３０６が、ＨＤＤ２，ＨＤＤ３について、アクセス時刻が古い順に障害が発生したと特定する。
【０２３２】
ここでは、アクセス時刻ｔ１のほうがアクセス時刻ｔ２に比べて古い場合を想定する。このため、プロセッサ３０６が、ＨＤＤ２に障害が発生した後、ＨＤＤ３に障害が発生したことを特定する。また、管理データ４１０，４２０，４３０のアクセスログから障害が発生した順序を特定する場合を例に挙げて説明したが、各ＨＤＤ１〜ＨＤＤ３の起動時刻から障害が発生した順序を特定することにしてもよい。具体的には、例えば、プロセッサ３０６が、ＨＤＤ２，ＨＤＤ３について、起動時刻が古い順に障害が発生したと特定することにしてもよい。
【０２３３】
つぎに、図１０に示した検出結果テーブル１０００を用いて、障害が発生した順序を特定する場合について説明する。各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０は、ＨＤＤの障害により適切に更新されていない場合がある。このため、プロセッサ３０６は、検出結果テーブル１０００を参照して、障害が発生した複数のＨＤＤについて、障害が発生した順序を特定することにしてもよい。
【０２３４】
図１０に示した（１０−２）の例では、まず、プロセッサ３０６が、検出結果テーブル１０００のＨＤＤ番号を参照して、障害が発生したＨＤＤ２，ＨＤＤ３を特定する。そして、プロセッサ３０６が、検出結果テーブル１０００の検出時刻を参照して、障害が発生した複数のＨＤＤ２，ＨＤＤ３について、障害が発生した順序を特定する。
【０２３５】
具体的には、例えば、プロセッサ３０６が、ＨＤＤ２，ＨＤＤ３について、検出時刻が古い順に障害が発生したと特定する。ここでは、ＨＤＤ２の検出時刻「２０１０／０８／２３  ０２：１１：５５」のほうが、ＨＤＤ３の検出時刻「２０１０／０８／２４  １２：０９：２２」に比べて古い。このため、プロセッサ３０６が、ＨＤＤ２に障害が発生した後、ＨＤＤ３に障害が発生したことを特定する。
【０２３６】
（ストレージ制御装置１０１のストレージ制御処理手順）
つぎに、実施の形態１にかかるストレージ制御装置１０１のストレージ制御処理手順について説明する。
【０２３７】
図１６および図１７は、実施の形態１にかかるストレージ制御装置のデータ複写処理手順の一例を示すフローチャートである。図１６のフローチャートにおいて、まず、受付部５０１により、ＨＤＤｋのＬＢＡｊに対する書込要求を受け付けたか否かを判断する（ステップＳ１６０１）。
【０２３８】
ここで、書込要求を受け付けるのを待って（ステップＳ１６０１：Ｎｏ）、受け付けた場合（ステップＳ１６０１：Ｙｅｓ）、判断部５０８により、障害が発生したＨＤＤの台数ｘが「ｘ＝０」か否かを判断する（ステップＳ１６０２）。
【０２３９】
ここで、「ｘ＝０」の場合（ステップＳ１６０２：Ｙｅｓ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「０」から「１」に変更する（ステップＳ１６０３）。さらに、更新部５０２により、受け付けた書込要求に含まれるＨＤＤ番号「ｋ」とＬＢＡ番号「ｊ」を、書込状態テーブル７００に書き込む（ステップＳ１６０４）。
【０２４０】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ１６０５）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行して（ステップＳ１６０６）、図１７に示すステップＳ１７０１に移行する。
【０２４１】
また、ステップＳ１６０２において、障害が発生したＨＤＤの台数ｘが「ｘ≠０」の場合（ステップＳ１６０２：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込状態フラグが「１」か否かを判断する（ステップＳ１６０７）。
【０２４２】
ここで、書込状態フラグが「０」の場合（ステップＳ１６０７：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「０」から「１」に変更する（ステップＳ１６０８）。さらに、更新部５０２により、受け付けた書込要求に含まれるＨＤＤ番号「ｋ」とＬＢＡ番号「ｊ」を、書込状態テーブル７００に書き込む（ステップＳ１６０９）。
【０２４３】
つぎに、対象判定部５１０により、パリティドライブに障害が発生しているか否かを判定する（ステップＳ１６１０）。ここで、パリティドライブに障害が発生している場合（ステップＳ１６１０：Ｙｅｓ）、ステップＳ１６０５に移行する。
【０２４４】
一方、パリティドライブに障害が発生していない場合（ステップＳ１６１０：Ｎｏ）、対象判定部５１０により、書込要求の要求先のＨＤＤｋに障害が発生しているか否かを判定する（ステップＳ１６１１）。ここで、書込要求の要求先のＨＤＤｋに障害が発生している場合（ステップＳ１６１１：Ｙｅｓ）、ステップＳ１６０５に移行する。
【０２４５】
一方、書込要求の要求先のＨＤＤｋに障害が発生していない場合（ステップＳ１６１１：Ｎｏ）、ステップＳ１６１２に移行する。そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求の要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写する（ステップＳ１６１２）。
【０２４６】
また、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータＤｉを生成元とするパリティデータＰｊを、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写する（ステップＳ１６１３）。さらに、複写指示部５０４により、書込要求に含まれる書込データＤｉ＃を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写して（ステップＳ１６１４）、ステップＳ１６０６に移行する。
【０２４７】
また、ステップＳ１６０７において、書込状態フラグが「１」の場合（ステップＳ１６０７：Ｙｅｓ）、ステップＳ１６１５に移行する。そして、検出部５０７により、ＨＤＤコントローラ３０９を介して、オンラインのＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の、書き込みに失敗したＨＤＤの状態を「正常」から「異常」に変更する（ステップＳ１６１５）。書き込みに失敗したＨＤＤは、例えば、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに設定されているＨＤＤ番号から特定される。
【０２４８】
このあと、検出部５０７により、書き込みに失敗したＨＤＤをオフラインにする（ステップＳ１６１６）。そして、判断部５０８により、障害が発生したＨＤＤの台数が２台以上となったことをＣＰＵ３０１に通知することで、ストレージシステム３００がシステムダウンして（ステップＳ１６１７）、本フローチャートによる一連の処理を終了する。
【０２４９】
なお、ステップＳ１６０７において、書込状態フラグが「１」となるのは（ステップＳ１６０７：Ｙｅｓ）、後述する図１８に示すステップＳ１８０４において、データ書込処理に失敗した場合（ステップＳ１８０４：Ｎｏ）である。
【０２５０】
図１７のフローチャートにおいて、まず、成否判定部５０６により、図１６に示したステップＳ１６０６において実行された書込要求に対する書込処理が成功したか否かを判定する（ステップＳ１７０１）。ここで、書込要求に対する書込処理が成功した場合（ステップＳ１７０１：Ｙｅｓ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更して（ステップＳ１７０２）、ステップＳ１７０４に移行する。
【０２５１】
一方、書込要求に対する書込処理が失敗した場合（ステップＳ１７０１：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに、データの書き込みに失敗したＨＤＤのＨＤＤ番号を書き込む（ステップＳ１７０３）。このあと、検出部５０７により、障害が発生したＨＤＤが検出されたか否かを判断する（ステップＳ１７０４）。
【０２５２】
ここで、障害が発生したＨＤＤが検出されなかった場合（ステップＳ１７０４：Ｎｏ）、本フローチャートによる一連の処理を終了する。一方、障害が発生したＨＤＤが検出された場合（ステップＳ１７０４：Ｙｅｓ）、ステップＳ１７０５に移行する。そして、検出部５０７により、ＨＤＤコントローラ３０９を介して、オンラインのＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の、障害が発生したＨＤＤの状態を「正常」から「異常」に変更する（ステップＳ１７０５）。
【０２５３】
このあと、検出部５０７により、ＨＤＤコントローラ３０９を介して、障害が発生したＨＤＤをオフラインにする（ステップＳ１７０６）。そして、判断部５０８により、障害が発生したＨＤＤの台数ｘが「ｘ≧２」か否かを判断する（ステップＳ１７０７）。ここで、「ｘ＜２」の場合（ステップＳ１７０７：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更して（ステップＳ１７０８）、本フローチャートによる一連の処理を終了する。
【０２５４】
一方、「ｘ≧２」の場合（ステップＳ１７０７：Ｙｅｓ）、ステップＳ１７０９に移行する。そして、判断部５０８により、障害が発生したＨＤＤの台数が２台以上となったことをＣＰＵ３０１に通知することで、ストレージシステム３００がシステムダウンして（ステップＳ１７０９）、本フローチャートによる一連の処理を終了する。
【０２５５】
これにより、パリティデータＰｊの更新を伴うデータＤｉの更新時に、更新前のデータＤｉ、パリティデータＰｊおよび書込データＤｉ＃を書込バッファＢに退避しておくことができる。また、冗長構成時に書込要求を受け付けた場合は、書込データＤｉ＃のみを書込バッファＢに退避しておくことができる。また、要求先のＨＤＤｋまたはパリティドライブがオフラインの場合は、書込データＤｉ＃のみを書込バッファＢに退避しておくことができる。
【０２５６】
つぎに、実施の形態１にかかるストレージ制御装置１０１のシステム復旧処理手順について説明する。ここでは、システムダウンしたストレージシステム３００をシステムダウン直前の非冗長構成に復旧する場合を例に挙げて説明する。ただし、ストレージシステム３００のハードリセットが行われた後、障害が発生した複数のＨＤＤのうち最後にオフラインとなったＨＤＤをオンラインにして、ストレージシステム３００が再起動された場合を想定する。
【０２５７】
図１８は、実施の形態１にかかるストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。図１８のフローチャートにおいて、まず、判断部５０８により、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する（ステップＳ１８０１）。
【０２５８】
ここで、ＨＤＤが再起動されるのを待って（ステップＳ１８０１：Ｎｏ）、再起動された場合（ステップＳ１８０１：Ｙｅｓ）、書込指示部５０９により、書込状態テーブル７００の書込状態フラグが「１」か否かを判断する（ステップＳ１８０２）。ここで、書込状態フラグが「０」の場合（ステップＳ１８０２：Ｎｏ）、本フローチャートによる一連の処理を終了する。
【０２５９】
一方、書込状態フラグが「１」の場合（ステップＳ１８０２：Ｙｅｓ）、書込指示部５０９により、データ書込処理を実行する（ステップＳ１８０３）。データ書込処理の具体的な処理手順については後述する。このあと、成否判定部５０６により、データ書込処理が成功したか否かを判断する（ステップＳ１８０４）。
【０２６０】
ここで、データ書込処理に成功した場合（ステップＳ１８０４：Ｙｅｓ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更して（ステップＳ１８０５）、本フローチャートによる一連の処理を終了する。一方、データ書込処理に失敗した場合（ステップＳ１８０４：Ｎｏ）、本フローチャートによる一連の処理を終了する。
【０２６１】
つぎに、ステップＳ１８０３のデータ書込処理の具体的な処理手順の一例について説明する。ステップＳ１８０３のデータ書込処理は、図１６に示したステップＳ１６０６の書込処理を、どのステップを経由して実行したかによって異なる。ここでは一例として、図１６に示した（ステップＳ１６１１：Ｎｏ）を経由した場合のデータ書込処理の具体的な処理手順について説明する。
【０２６２】
図１９は、ステップＳ１８０３のデータ書込処理の具体的な処理手順の一例を示すフローチャートである。図１９のフローチャートにおいて、まず、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータＤｉを要求先のＬＢＡｊに書き込む（ステップＳ１９０１）。
【０２６３】
つぎに、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ２に複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込む（ステップＳ１９０２）。このあと、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤｉ＃を生成元とするパリティデータＰｊ＃を算出する（ステップＳ１９０３）。
【０２６４】
つぎに、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む（ステップＳ１９０４）。そして、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込んで（ステップＳ１９０５）、図１８に示したステップＳ１８０４に移行する。
【０２６５】
これにより、書込バッファＢに退避したデータＤｉとパリティデータＰｊを退避元に書き戻して再起動後のＨＤＤ間のデータの整合性を確保した後、書込バッファＢに退避した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２６６】
また、ステップＳ１８０４のデータ書込処理に失敗した場合は、新たな書込要求を受け付けるまでの間、書込バッファＢに退避されたデータＤｉ、パリティデータＰｊおよび書込データＤｉ＃を読出データとして用いることができる。また、ステップＳ１８０４のデータ書込処理に失敗した場合、ＨＤＤを再起動しても書込要求に対する書込処理に失敗したことを示すメッセージを、図３に示したディスプレイ３０４に表示して、ユーザに報知することにしてもよい。なお、上述したシステム復旧処理の実行後、障害が発生しているＨＤＤを交換してリビルドを行うことにより、ストレージシステム３００を冗長構成に戻すことにしてもよい。
【０２６７】
以上説明した実施の形態１にかかるストレージ制御装置１０１によれば、書込要求に対する書込処理の実行前に、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを書込バッファＢに複写することができる。また、ストレージ制御装置１０１によれば、書込要求に対する書込処理の実行前に、データＤｉを生成元とするパリティデータＰｊを書込バッファＢに複写することができる。これにより、パリティデータＰｊの更新を伴うデータＤｉの更新時に、更新前のデータＤｉとパリティデータＰｊを書込バッファＢに退避しておくことができる。
【０２６８】
また、ストレージ制御装置１０１によれば、書込要求に対する書込処理が実行されたＨＤＤが再起動された場合、書込バッファＢに複写されたデータＤｉを要求先のＨＤＤｋのＬＢＡｊに書き込むことができる。また、ストレージ制御装置１０１によれば、書込要求に対する書込処理が実行されたＨＤＤが再起動された場合、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込むことができる。これにより、サーマル・オフトラック等の障害によりＨＤＤに対する書き込みに失敗しても、ＨＤＤの再起動後に、書込バッファＢに退避したデータＤｉとパリティデータＰｊを退避元のＬＢＡｊに書き戻して、ＨＤＤ間のデータの整合性をとることができる。
【０２６９】
また、ストレージ制御装置１０１によれば、書込要求に対する書込処理に失敗し、かつ、書込処理が実行されたＨＤＤが再起動された場合に、書込バッファＢに複写したデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き込むことができる。これにより、書込要求に対する書込処理が成功した後、瞬時停電等の理由でＨＤＤが再起動されたとしても、書込バッファＢに退避したデータＤｉとパリティデータＰｊを退避元のＬＢＡｊに書き戻すことを防ぐことができる。
【０２７０】
また、ストレージ制御装置１０１によれば、書込要求に対する書込処理の実行前に、書込要求に含まれる書込データＤｉ＃を、書込バッファＢに複写することができる。また、ストレージ制御装置１０１によれば、書込バッファＢに複写したデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き戻した後、書込バッファＢに複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。これにより、データＤｉとパリティデータＰｊを退避元に書き戻して再起動後のＨＤＤ間のデータの整合性を確保した後、書込要求に対する書込処理を再実行することができる。
【０２７１】
また、ストレージ制御装置１０１によれば、要求先のＨＤＤｋがオフラインの場合、書込データＤｉ＃を書込バッファＢに複写し、書込失敗によるＨＤＤの再起動後に、複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２７２】
また、ストレージ制御装置１０１によれば、パリティドライブがオフラインの場合、書込データＤｉ＃を書込バッファＢに複写し、書込失敗によるＨＤＤの再起動後に、複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２７３】
また、ストレージ制御装置１０１によれば、冗長構成時に書込要求を受け付けた場合、書込データＤｉ＃を書込バッファＢに複写し、書込失敗によるＨＤＤの再起動後に、複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２７４】
これらのことから、実施の形態１にかかるストレージ制御装置１０１によれば、ストレージシステムの復旧時におけるＨＤＤ間のデータの整合性を保障することができる。これにより、書込失敗によるＨＤＤ間のデータの不整合が原因で発生する読出データのデータ化けを防いで、システムが起動しなくなったり、システムが誤動作することを回避することができる。
【０２７５】
なお、上述した説明では、ストレージ制御装置１０１が制御部５０３を備えることとしたが、各ＨＤＤ１〜ＨＤＤ３が制御部５０３を備えることにしてもよい。この場合、各ＨＤＤ１〜ＨＤＤ３の制御部５０３は、例えば、ストレージ制御装置１０１の複写指示部５０４、実行部５０５および書込指示部５０９の指示にしたがって、各ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する。
【０２７６】
（実施の形態２）
つぎに、実施の形態２にかかるストレージ制御装置１０１について説明する。実施の形態２では、ストレージ制御装置１０１をＲＡＩＤ５のストレージシステム２０００に適用する。ＲＡＩＤ５は、データ群の各データを複数のＨＤＤに分散して記録するとともに、データ群から生成されるパリティデータを複数のＨＤＤに分散して記録する方式である。
【０２７７】
すなわち、ＲＡＩＤ５のストレージシステム２０００では、ＲＡＩＤ３のストレージシステムのようにパリティデータを専用のＨＤＤ（パリティドライブ）に記録するのではなく、複数のＨＤＤにパリティデータを分散して記録する。なお、実施の形態１で説明した箇所と同一箇所については、同一符号を付して図示および説明を省略する。
【０２７８】
（ストレージシステム２０００のハードウェア構成）
図２０は、実施の形態２にかかるストレージシステム２０００のハードウェア構成を示すブロック図である。図２０において、ストレージシステム２０００は、ＣＰＵ３０１と、メインメモリ３０２と、ディスプレイコントローラ３０３と、ディスプレイ３０４と、通信コントローラ３０５と、ストレージ制御装置１０１と、ＨＤＤ１〜ＨＤＤ３と、を備えている。ストレージ制御装置１０１は、プロセッサ３０６と、メモリ３０７と、不揮発性メモリ３０８と、ＨＤＤコントローラ３０９と、バスコントローラ３１０と、を備えている。
【０２７９】
ストレージシステム２０００において、各ＨＤＤ１〜ＨＤＤ３に対するアクセスはストリップ単位で行われる。ここで、ストリップとは、ハードディスクの複数のブロックを束ねた記憶領域である。ブロックとは、ハードディスクを同心円状に区切ったトラックから分割された複数のセクタを束ねた記憶領域である。
【０２８０】
図２０において、ＨＤＤ１のデータ領域３１１は、ストリップＡ、ストリップＣおよびストリップＰ３を含む構成である。また、ＨＤＤ２のデータ領域３１２は、ストリップＢ、ストリップＰ２およびストリップＥを含む構成である。また、ＨＤＤ３のデータ領域３１３は、ストリップＰ１、ストリップＤおよびストリップＦを含む構成である。
【０２８１】
ここで、ＨＤＤ１のストリップＡにはデータａ０が記憶されている。また、ＨＤＤ２のストリップＢにはデータｂ０が記憶されている。そして、ＨＤＤ３のストリップＰ１には、ストリップＡのデータａ０とストリップＢのデータｂ０の排他的論理和をとったパリティデータｐ１が記憶されている。
【０２８２】
ＨＤＤ１のストリップＣにはデータｃ０が記憶されている。また、ＨＤＤ３のストリップＤにはデータｄ０が記憶されている。そして、ＨＤＤ２のストリップＰ２には、ストリップＣのデータｃ０とストリップＤのデータｄ０の排他的論理和をとったパリティデータｐ２が記憶されている。
【０２８３】
ＨＤＤ２のストリップＥにはデータｅ０が記憶されている。また、ＨＤＤ３のストリップＦにはデータｆ０が記憶されている。そして、ＨＤＤ１のストリップＰ３には、ストリップＥのデータｅ０とストリップＦのデータｆ０の排他的論理和をとったパリティデータｐ３が記憶されている。
【０２８４】
（書込状態テーブル２１００の具体例）
つぎに、実施の形態２にかかる書込状態テーブル２１００の具体例について説明する。書込状態テーブル２１００は、書込要求に対する書込処理が正常に完了したか否かを特定するための書込状態情報を記憶する。また、書込状態テーブル２１００は、例えば、図２０に示した不揮発性メモリ３０８により実現される。
【０２８５】
図２１は、書込状態テーブル２１００の具体例を示す説明図である。図２１において、書込状態テーブル２１００は、書込状態フラグおよびストリップ番号のフィールドを有する。各フィールドに情報を設定することで、書込状態情報がレコードとして記憶されている。
【０２８６】
書込状態フラグは、書込要求に対する書込処理が正常に完了したか否かを示すフラグである。書込状態フラグは、初期状態では「０」であり、書込要求を受け付けると「０」から「１」に変更される。また、書込状態フラグは、書込要求に対する書込処理が正常に完了すると「１」から「０」に変更される。ストリップ番号は、書込要求の要求先のストリップの識別子である。
【０２８７】
（ストレージ制御装置１０１のストレージ制御処理手順）
つぎに、実施の形態２にかかるストレージ制御装置１０１のストレージ制御処理手順について説明する。ここでは、ストレージシステム２０００を銀行等のオンラインシステムに適用して、ユーザがＡＴＭ（Ａｕｔｏｍａｔｅｄ  Ｔｅｌｌｅｒ  Ｍａｃｈｉｎｅ）を用いて現金の入出金を行う場合を例に挙げて説明する。
【０２８８】
前提として、ストレージシステム２０００の電源が投入された結果、ストリップＡのデータａ０とストリップＢのデータｂ０が読み込まれてＯＳが正常に起動した場合を想定する。また、初期状態において、各ＨＤＤ１〜ＨＤＤ３の状態は「正常」である。以下、冗長構成時のストレージ制御装置１０１のストレージ制御処理手順について説明する。
【０２８９】
＜冗長構成時のストレージ制御処理手順＞
図２２〜図２４は、冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャートである。図２２のフローチャートにおいて、まず、受付部５０１により、ストリップＢのデータｂ０をデータｂ１に更新するための書込要求を受け付ける（ステップＳ２２０１）。書込要求は、要求先のストリップＢのストリップ番号「Ｂ」と、書込対象となるデータｂ１を含む。この例では、データｂ１は、ＯＳが起動したことを示すイベントログである。
【０２９０】
つぎに、更新部５０２により、図２１に示した書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２２０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｂ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２２０３）。
【０２９１】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｂ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２２０４）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２２０５）。
【０２９２】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｂ１をストリップＢに書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｂ１とストリップＡに記録されているデータａ０との排他的論理和をとったパリティデータｐ１（＃１）をストリップＰ１に書き込む。ここでは、書込要求に対する書込処理に成功した場合を想定する。
【０２９３】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更する（ステップＳ２２０６）。このあと、プロセッサ３０６により、ストリップＡのデータａ０とストリップＢのデータｂ１を読み込んで、運用プログラムを起動して（ステップＳ２２０７）、図２３に示すステップＳ２３０１に移行する。
【０２９４】
図２３のフローチャートにおいて、まず、受付部５０１により、ストリップＣのデータｃ０をデータｃ１に更新するための書込要求を受け付ける（ステップＳ２３０１）。書込要求は、要求先のストリップＣのストリップ番号「Ｃ」と、書込対象となるデータｃ１を含む。この例では、データｃ１は、１００，０００円の入金データである。
【０２９５】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２３０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｃ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２３０３）。
【０２９６】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２３０４）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２３０５）。
【０２９７】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ１をストリップＣに書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ１とストリップＤに記録されているデータｄ０との排他的論理和をとったパリティデータｐ２（＃１）を計算して、ストリップＰ２に書き込む。ここでは、書込要求に対する書込処理に成功した場合を想定する。
【０２９８】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２３０６）、図２４に示すステップＳ２４０１に移行する。この結果、ストリップＣに１００，０００円の入金データが記録される。
【０２９９】
図２４のフローチャートにおいて、まず、受付部５０１により、ストリップＤのデータｄ０をデータｄ１に更新するための書込要求を受け付ける（ステップＳ２４０１）。書込要求は、要求先のストリップＤのストリップ番号「Ｄ」と、書込対象となるデータｄ１を含む。データｄ１は、５，０００円の出金データである。
【０３００】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２４０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｄ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２４０３）。
【０３０１】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２４０４）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２４０５）。
【０３０２】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ１をストリップＤに書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ１とストリップＣに記録されているデータｃ１との排他的論理和をとったパリティデータｐ２（＃２）を計算して、ストリップＰ２に書き込む。
【０３０３】
ここでは、書込要求に対する書込処理に成功する場合と、書込要求に対する書込処理に失敗する場合の両方を想定する。失敗例として、ストリップＤに対する書込要求に含まれるデータｄ１の書込中に、瞬時停電などによりストレージシステム２０００の電源が切断されて、データｄ１の一部をストリップＤに書き込めなかった場合を想定する。
【０３０４】
この場合、ストリップＤに記憶されているデータは、データｄ０およびデータｄ１のいずれとも異なるデータｄｘである。一方、ストリップＰ２へのパリティデータ書込みが成功した場合、ストリップＰ２に記憶されているパリティデータｐ２（＃２）は、データｄ１を用いて計算されたものである。したがって、この時点では、ストリップＤとストリップＰ２との間でデータの不整合が発生している。また、瞬時停電によりストレージシステム２０００の電源が切断された場合、ＣＰＵ３０１によってストレージシステム２０００の電源が再投入されて、ＨＤＤ１〜ＨＤＤ３が再起動される。
【０３０５】
図２４のフローチャートの説明に戻り、このあと、判断部５０８により、ＨＤＤが再起動されたか否かを判断する（ステップＳ２４０６）。ここで、ＨＤＤが再起動された場合（ステップＳ２４０６：Ｙｅｓ）、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写されたデータｄ１をストリップＤに書き込む（ステップＳ２４０７）。
【０３０６】
さらに、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、パリティデータｐ２（＃２）を計算してストリップＰ２に書き込む（ステップＳ２４０８）。パリティデータｐ２（＃２）は、書込バッファＢ３に複写されたデータｄ１と、ストリップＣに記憶されているデータｃ１とから計算される。そして、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２４０９）、本フローチャートによる一連の処理を終了する。
【０３０７】
一方、ステップＳ２４０６において、ＨＤＤが再起動されなかった場合（ステップＳ２４０６：Ｎｏ）、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２４０９）、本フローチャートによる一連の処理を終了する。
【０３０８】
このように、書込要求に対する書込処理の実行中に、瞬時停電等により電源が切断された場合であっても、電源投入後に、書込バッファＢ３に複写されたデータｄ１を用いて、書込要求に対する書込処理を再実行することができる。書込処理の再実行の結果、ストリップＤに５，０００円の出金データが記録される。このため、以降において、残高照会があった場合、ストリップＣのデータｃ１とストリップＤのデータｄ１から９５，０００円の残高データを参照することができる。
【０３０９】
＜非冗長構成時のストレージ制御処理手順＞
つぎに、非冗長構成時のストレージ制御装置１０１のストレージ制御処理手順について説明する。ここでは、ＨＤＤ１が故障してアクセス不能となった場合を例に挙げて説明する。ここで、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６に記憶されている管理データ４１０，４２０，４３０の更新例について説明する。
【０３１０】
図２５は、管理データ４１０，４２０，４３０の更新例を示す説明図（その２）である。図２５において、ＨＤＤ１に障害が発生した場合の各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の更新例が示されている。図２５中、上段はＨＤＤ１〜ＨＤＤ３が正常の状態であるときの管理データ４１０，４２０，４３０であり、下段はＨＤＤ１に障害が発生した後の管理データ４１０，４２０，４３０である。
【０３１１】
具体的には、管理データ４１０のＨＤＤ１の状態が「正常」から「（異常）」に更新されている。なお、「（異常）」は、ＨＤＤコントローラ３０９が管理データ４１０を更新できた場合に、管理データ４１０内のＨＤＤ１の状態が「異常」となることを表している。また、管理データ４２０のＨＤＤ１の状態が「正常」から「異常」に更新されている。また、管理データ４３０のＨＤＤ１の状態が「正常」から「異常」に更新されている。
【０３１２】
図２６および図２７は、非冗長構成時（ＨＤＤ１異常時）のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャートである。図２６のフローチャートにおいて、まず、受付部５０１により、ストリップＣのデータｃ１をデータｃ２に更新するための書込要求を受け付ける（ステップＳ２６０１）。書込要求は、要求先のストリップＣのストリップ番号「Ｃ」と、書込対象となるデータｃ２を含む。データｃ２は、５００，０００円の入金データである。
【０３１３】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２６０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｃ」を、「１」に変更された書込み状態フラグに対応する書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２６０３）。
【０３１４】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ２を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２６０４）。ただし、ＨＤＤ１の書込バッファＢ３にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ３に対するデータｃ２の複写は行われない。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２６０５）。
【０３１５】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、ストリップＤからデータｄ１を読み出す。そして、実行部５０５が、データｄ１と書込要求に含まれるデータｃ２との排他的論理和をとったパリティデータｐ２（＃３）を計算して、ストリップＰ２に書き込む。ここでは、書込要求に対する書込処理に成功した場合を想定する。
【０３１６】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２６０６）、図２７に示すステップＳ２７０１に移行する。この結果、ストリップＰ２に５００，０００円の入金データが反映されたパリティデータｐ２（＃３）が書き込まれる。
【０３１７】
図２７のフローチャートにおいて、まず、受付部５０１により、ストリップＤのデータｄ１をデータｄ２に更新するための書込要求を受け付ける（ステップＳ２７０１）。書込要求は、要求先のストリップＤのストリップ番号「Ｄ」と、書込対象となるデータｄ２を含む。データｄ２は、１００，０００円の出金データである。
【０３１８】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２７０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｄ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２７０３）。
【０３１９】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求の要求先のストリップＤに記憶されているデータｄ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写する（ステップＳ２７０４）。ただし、ＨＤＤ１の書込バッファＢ１にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ１に対するデータｄ１の複写は行われない。
【０３２０】
また、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、ストリップＤのデータｄ１を生成元とするストリップＰ２に記録されているパリティデータｐ２（＃３）を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写する（ステップＳ２７０５）。ただし、ＨＤＤ１の書込バッファＢ２にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ２に対するパリティデータｐ２（＃３）の複写は行われない。
【０３２１】
さらに、複写指示部５０４により、書込要求に含まれるデータｄ２を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２７０６）。上記同様に、ＨＤＤ１の書込バッファＢ３にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ３に対するデータｄ２の複写は行われない。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２７０７）。
【０３２２】
具体的には、例えば、実行部５０５が、ストリップＰ２に記録されているパリティデータｐ２（＃３）とストリップＤに記憶されているデータｄ１との排他的論理和をとって、ストリップＣのデータｃ２を復元する。つぎに、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ２をストリップＤに書き込む。さらに、実行部５０５が、ＨＤＤコントローラ３０９を介して、復元されたデータｃ２と書込要求に含まれるデータｄ２との排他的論理和をとったパリティデータｐ２（＃４）を計算して、ストリップＰ２に書き込む。
【０３２３】
図２７のフローチャートに戻り、つぎに、成否判定部５０６により、書込要求に対する書込処理が成功したか否かを判定する（ステップＳ２７０８）。ここで、書込要求に対する書込処理が成功した場合（ステップＳ２７０８：Ｙｅｓ）、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２７０９）、本フローチャートによる一連の処理を終了する。
【０３２４】
この結果、ストリップＤに１０，０００円の出金データが記録される。このため、以降において、残高照会があった場合は、ストリップＤのデータｄ２とストリップＰ２のパリティデータｐ２（＃３）から４９５，０００円の残高データを復元、参照することができる。
【０３２５】
一方、書込要求に対する書込処理が失敗した場合（ステップＳ２７０８：Ｎｏ）、検出部５０７により、書き込みに失敗したＨＤＤを障害が発生したＨＤＤとして検出する（ステップＳ２７１０）。そして、検出部５０７により、ＨＤＤコントローラ３０９を介して、オンラインのＨＤＤの管理データの障害が発生したＨＤＤの状態を「正常」から「異常」に変更する（ステップＳ２７１１）。
【０３２６】
つぎに、検出部５０７により、ＨＤＤコントローラ３０９を介して、障害が発生したＨＤＤをオフラインにする（ステップＳ２７１２）。そして、判断部５０８により、障害が発生したＨＤＤの台数ｘが「ｘ≧２」となったか否かを判断する。図２７の例では、ＨＤＤの台数ｘが２以上になったと判断されている（ステップＳ２７１３）。最後に、判断部５０８により、障害が発生したＨＤＤの台数が２台以上となったことをＣＰＵ３０１に通知することで、ストレージシステム２０００がシステムダウンする（ステップＳ２７１４）。
【０３２７】
ここで、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６に記憶されている管理データ４１０，４２０，４３０の更新例について説明する。ここでは、図２７に示したステップＳ２７０７において、ＨＤＤ２に障害が発生して、ストリップＰ２に対するパリティデータｐ２（＃４）の書き込みに失敗した場合を例に挙げて説明する。具体的には、ＨＤＤ２のストリップＰ２にパリティデータｐ２（＃４）の一部を書き込めなかったため、ストリップＰ２の記憶内容がパリティデータｐ２（＃４）とは異なるパリティデータｐ２ｘとなっている。この場合、ＨＤＤ２が、障害が発生したＨＤＤとして検出されてオフラインとなる。
【０３２８】
図２８は、管理データ４１０，４２０，４３０の更新例を示す説明図（その３）である。図２８において、ＨＤＤ２に障害が発生した場合の各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の更新例が示されている。図２８中、上段はＨＤＤ２に障害が発生する前の管理データ４１０，４２０，４３０であり、下段はＨＤＤ２に障害が発生した後の管理データ４１０，４２０，４３０である。
【０３２９】
具体的には、管理データ４２０のＨＤＤ２の状態が「正常」から「（異常）」に更新されている。なお、「（異常）」は、ＨＤＤコントローラ３０９が管理データ４２０を更新できた場合に、管理データ４２０内のＨＤＤ２の状態が「異常」となることを表している。また、管理データ４３０のＨＤＤ２の状態が「正常」から「異常」に更新されている。一方、既に切り離されているＨＤＤ１では、管理データ４１０のＨＤＤ２の状態は「正常」のままとなっている。
【０３３０】
＜システム復旧処理手順＞
つぎに、ストレージ制御装置１０１のシステム復旧処理手順について説明する。ここでは、システムダウンしたストレージシステム２０００を非冗長構成に復旧する場合を例に挙げて説明する。前提として、ストレージシステム２０００のハードリセットを行った後、最後にオフラインとなったＨＤＤ２をオンラインにして再起動する場合を想定する。この場合、各ＨＤＤ２，ＨＤＤ３の管理データ４２０，４３０のＨＤＤ２の状態が「異常」から「正常」に変更される。なお、ＨＤＤ１の管理データ４１０のＨＤＤ２の状態は「正常」のままである。
【０３３１】
図２９は、ストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。図２９のフローチャートにおいて、まず、判断部５０８により、書込要求に対する書込処理が実行されたＨＤＤ、この例ではＨＤＤ２が再起動されたか否かを判断する（ステップＳ２９０１）。
【０３３２】
ここで、ＨＤＤ２が再起動されるのを待って（ステップＳ２９０１：Ｎｏ）、ＨＤＤ２が再起動された場合（ステップＳ２９０１：Ｙｅｓ）、書込指示部５０９により、書込状態テーブル２１００の書込状態フラグが「１」か否かを判断する（ステップＳ２９０２）。ここで、書込状態フラグが「０」の場合（ステップＳ２９０２：Ｎｏ）、本フローチャートによる一連の処理を終了する。
【０３３３】
一方、書込状態フラグが「１」の場合（ステップＳ２９０２：Ｙｅｓ）、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータｄ１をＨＤＤ３のストリップＤに書き込む（ステップＳ２９０３）。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢ２に複写されたパリティデータｐ２（＃３）を、再起動したＨＤＤ２のストリップＰ２に書き込む（ステップＳ２９０４）。
【０３３４】
このあと、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写されたデータｄ２をストリップＤに書き込む（ステップＳ２９０５）。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、データｄ２を生成元とするパリティデータｐ２（＃４）を計算してストリップＰ２に書き込む（ステップＳ２９０６）。
【０３３５】
そして、成否判定部５０６により、ステップＳ２９０３〜ステップＳ２９０６のデータ書込処理が成功したか否かを判断する（ステップＳ２９０７）。ここで、データ書込処理が成功した場合（ステップＳ２９０７：Ｙｅｓ）、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２９０８）、本フローチャートによる一連の処理を終了する。
【０３３６】
この結果、ストリップＤに１０，０００円の出金データが記録される。このため、以降において、残高照会があった場合は、ストリップＤのデータｄ２とストリップＰ２のパリティデータｐ２（＃４）から４９５，０００円の残高データを参照することができる。
【０３３７】
一方、ステップＳ２９０７において、データ書込処理が失敗した場合（ステップＳ２９０７：Ｎｏ）、本フローチャートによる一連の処理を終了する。この場合、書込バッファＢ１〜Ｂ３に複写されたデータｄ１、パリティデータｐ２（＃３）およびデータｄ２を読出データとして用いることができる。例えば、ストリップＣの読出要求を受け付けた場合、書込バッファＢ１に複写されたデータｄ１と書込バッファＢ２に複写されたパリティデータｐ２（＃３）からストリップＣのデータｃ２を復元することができる。
【０３３８】
以上説明した実施の形態２にかかるストレージ制御装置１０１によれば、パリティデータの更新を伴うデータの更新時に、更新前のデータとパリティデータを書込バッファＢ１，Ｂ２に退避しておくことができる。また、ストレージ制御装置１０１によれば、書込失敗によるＨＤＤの再起動後に、書込バッファＢ１，Ｂ２に退避したデータとパリティデータを退避元のストリップに書き戻して、ＨＤＤ間のデータの整合性をとることができる。また、ストレージ制御装置１０１によれば、書込バッファＢ１，Ｂ２に退避したデータとパリティデータを退避元のストリップに書き戻した後、書込バッファＢ３に退避したデータを用いて、書込要求に対する書込処理を再実行することができる。
【０３３９】
なお、本実施の形態で説明したストレージ制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ストレージ制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本ストレージ制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【０３４０】
また、本実施の形態で説明したストレージ制御装置１０１は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）等の特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡ等のＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、例えば、上述したストレージ制御装置１０１の機能をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、ストレージ制御装置１０１を製造することができる。
【符号の説明】
【０３４１】
１００，３００，２０００  ストレージシステム
１０１  ストレージ制御装置
４１０，４２０，４３０  管理データ
５０１  受付部
５０２  更新部
５０３  制御部
５０４  複写指示部
５０５  実行部
５０６  成否判定部
５０７  検出部
５０８  判断部
５０９  書込指示部
５１０  対象判定部
７００，２１００  書込状態テーブル
Ｂ，Ｂ１，Ｂ２，Ｂ３  書込バッファ
Ｓ１〜Ｓ３  ストレージ装置
【図１】
2012053085.tif 000003
【図２】
2012053085.tif 000004
【図３】
2012053085.tif 000005
【図４】
2012053085.tif 000006
【図５】
2012053085.tif 000007
【図６】
2012053085.tif 000008
【図７】
2012053085.tif 000009
【図８】
2012053085.tif 000010
【図９】
2012053085.tif 000011
【図１０】
2012053085.tif 000012
【図１１】
2012053085.tif 000013
【図１２】
2012053085.tif 000014
【図１３】
2012053085.tif 000015
【図１４】
2012053085.tif 000016
【図１５】
2012053085.tif 000017
【図１６】
2012053085.tif 000018
【図１７】
2012053085.tif 000019
【図１８】
2012053085.tif 000020
【図１９】
2012053085.tif 000021
【図２０】
2012053085.tif 000022
【図２１】
2012053085.tif 000023
【図２２】
2012053085.tif 000024
【図２３】
2012053085.tif 000025
【図２４】
2012053085.tif 000026
【図２５】
2012053085.tif 000027
【図２６】
2012053085.tif 000028
【図２７】
2012053085.tif 000029
【図２８】
2012053085.tif 000030
【図２９】
2012053085.tif 000031
【手続補正書】
【提出日】平成25年4月18日(2013.4.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付部と、
前記受付部が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写部と、
前記複写部によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断部と、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込部と、
を備えることを特徴とするストレージ制御装置。
【請求項２】
前記書込要求に対する書込処理の処理結果に基づいて、前記書込処理が成功したか否かを判定する成否判定部を備え、
前記書込部は、
前記成否判定部によって前記書込処理が失敗したと判定され、かつ、前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする請求項１に記載のストレージ制御装置。
【請求項３】
前記複写部は、
さらに、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記書込部は、
前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込み、かつ、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込んだ後、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする請求項２に記載のストレージ制御装置。
【請求項４】
前記システムの中から、障害が発生したストレージ装置を検出する検出部を備え、
前記複写部は、
前記書込要求を受け付けたストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを生成元とする訂正符号を算出して、前記ストレージ装置の要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置の記憶領域に書き込むことを特徴とする請求項３に記載のストレージ制御装置。
【請求項５】
前記複写部は、
前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むことを特徴とする請求項４に記載のストレージ制御装置。
【請求項６】
前記複写部は、
前記検出部によって検出されたストレージ装置の台数が、前記訂正符号を記憶するストレージ装置の台数未満の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を算出して、前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号を記憶する記憶領域に書き込むことを特徴とする請求項５に記載のストレージ制御装置。
【請求項７】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付工程と、
前記受付工程が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写工程と、
前記複写工程によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断工程と、
前記判断工程によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込工程と、
をコンピュータが実行することを特徴とするストレージ制御方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置を制御するストレージ制御装置およびストレージ制御方法に関する。
【背景技術】
【０００２】
ＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙ  ｏｆ  Ｉｎｅｘｐｅｎｓｉｖｅ  Ｄｉｓｋｓ）３，５等の冗長化されたストレージシステムは、ディスク装置に障害が発生すると、障害が発生したディスク装置を切り離す。ストレージシステムは、障害が発生したディスク装置が切り離されると、切り離されたディスク装置を除く残余のディスク装置によってデータの記録、更新を行う。
【０００３】
また、ストレージシステムは、障害が発生したディスク装置が切り離された後、さらに別のディスク装置に障害が発生すると、新たに障害が発生したディスク装置を切り離す。以下の説明では、ストレージシステム内のディスク装置に障害が発生して冗長化を失った状態から、さらに別のディスク装置を切り離した状態を「マルチデッド状態」という。
【０００４】
ここで、ディスク装置の切り離し要因となる障害としては、例えば、サーマル・オフトラック、コンタミネーション、ノイズ、接触不良等がある。ディスク装置のサーマル・オフトラック、コンタミネーション、ノイズ、接触不良等の障害は、ハードリセットや電源切断後の再投入（電源のＯＦＦ／ＯＮ）によって回復することが多い。
【０００５】
すなわち、障害が発生して切り離されたディスク装置に対してハードリセットや電源のＯＦＦ／ＯＮを行うことで、該ディスク装置を正常に動作するディスク装置として復帰させることができる。このため、マルチデッド状態となったストレージシステムを復旧する場合、例えば、ストレージシステムのハードリセットを行って、マルチデッド状態となる前の状態に戻すことが行われる。
【０００６】
なお、ディスク装置に障害が発生したストレージシステムを復旧するための技術を開示する文献として、例えば、下記特許文献１〜３がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平１１−９５９３３号公報
【特許文献２】特開２００５−７８４３０号公報
【特許文献３】特開２０１０−２６８１２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上述した従来技術では、ストレージシステムの復旧時に、ハードリセット等を行ってストレージシステムをマルチデッド状態となる前の状態に戻しても、ディスク装置間のデータの不整合によりデータ化けが発生する場合があるという問題があった。
【０００９】
本発明は、上述した従来技術による問題点を解消するため、ストレージ装置間のデータの整合性を保障することができるストレージ制御装置およびストレージ制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、開示のストレージ制御装置およびストレージ制御方法は、データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付け、前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写し、前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、ストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む。
【００１１】
上述した課題を解決し、目的を達成するため、開示のストレージ制御装置およびストレージ制御方法は、データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付け、前記書込要求を受け付けた場合、前記システム内のストレージ装置にアクセスする制御部に対して、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、特定の記憶領域に複写するよう指示し、指示された前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、ストレージ装置が再起動されたと判断された場合、前記制御部に対して、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込むよう指示する。
【発明の効果】
【００１２】
本ストレージ制御装置およびストレージ制御方法によれば、ストレージ装置間のデータの整合性を保障することができるという効果を奏する。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１にかかるストレージシステム１００の一実施例を示す説明図である。
【図２】実施の形態１にかかるストレージ制御手法の一実施例を示す説明図である。
【図３】実施の形態１にかかるストレージシステム３００のハードウェア構成を示すブロック図である。
【図４】管理データ４１０，４２０，４３０の具体例を示す説明図である。
【図５】実施の形態１にかかるストレージ制御装置１０１の機能的構成を示すブロック図である。
【図６】書込要求６００の具体例を示す説明図である。
【図７】書込状態テーブル７００の具体例を示す説明図である。
【図８】書込バッファＢの具体例を示す説明図である。
【図９】管理データ４１０，４２０，４３０の更新例を示す説明図（その１）である。
【図１０】検出結果テーブル１０００の具体例を示す説明図である。
【図１１】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その１）である。
【図１２】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その２）である。
【図１３】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その３）である。
【図１４】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その４）である。
【図１５】ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その５）である。
【図１６】実施の形態１にかかるストレージ制御装置のデータ複写処理手順の一例を示すフローチャート（その１）である。
【図１７】実施の形態１にかかるストレージ制御装置のデータ複写処理手順の一例を示すフローチャート（その２）である。
【図１８】実施の形態１にかかるストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。
【図１９】ステップＳ１８０３のデータ書込処理の具体的な処理手順の一例を示すフローチャートである。
【図２０】実施の形態２にかかるストレージシステム２０００のハードウェア構成を示すブロック図である。
【図２１】書込状態テーブル２１００の具体例を示す説明図である。
【図２２】冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その１）である。
【図２３】冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その２）である。
【図２４】冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その３）である。
【図２５】管理データ４１０，４２０，４３０の更新例を示す説明図（その２）である。
【図２６】非冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その１）である。
【図２７】非冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャート（その２）である。
【図２８】管理データ４１０，４２０，４３０の更新例を示す説明図（その３）である。
【図２９】ストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、本発明にかかるストレージ制御装置およびストレージ制御方法の好適な実施の形態を詳細に説明する。
【００１５】
（実施の形態１）
図１は、実施の形態１にかかるストレージシステム１００の一実施例を示す説明図である。図１において、ストレージシステム１００は、ストレージ制御装置１０１とストレージ装置Ｓ１〜Ｓ３と、を含む構成である。ストレージ制御装置１０１は、ストレージ装置Ｓ１〜Ｓ３を制御するコンピュータである。ストレージ装置Ｓ１〜Ｓ３は、データを記憶する記憶装置である。ストレージ装置Ｓ１〜Ｓ３は、例えば、ハードディスク、光ディスク、フラッシュメモリ、磁気テープ等の記憶媒体を含む。
【００１６】
ここで、ストレージシステム１００は、ＲＡＩＤ３，５等の冗長化されたシステムである。ストレージシステム１００は、データ群ごとに、データ群の各データと、該データ群の各データから生成される訂正符号とを、記憶先のストレージ装置が異なるように分散して記憶している。データ群は、互いに関連するデータの集合である。各データは、例えば、ビット単位、バイト単位、ブロック（セクタ）単位のデータである。
【００１７】
訂正符号は、データ群を構成するデータを生成元とする冗長コードである。訂正符号としては、生成元のデータ群のいずれかのデータを、データ群の残余のデータと訂正符号とから復元可能なものを用いることができる。具体的には、例えば、訂正符号は、パリティ、ハミング符号、ＥＣＣ（Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｎｇ  Ｃｏｄｅ）、ＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｈｅｃｋ）コード等を用いて実現される。以下の説明では、訂正符号の一例として、生成元のデータ群を構成する各データの排他的論理和をとったパリティデータを例に挙げて説明する。
【００１８】
図１の例では、データＤ１と、データＤ２と、データＤ１，Ｄ２から生成されるパリティデータＰとが、記憶先のストレージ装置が異なるように分散して記憶されている。パリティデータＰは、データＤ１とデータＤ２の排他的論理和をとったデータである。以下の説明では、例えば、データＤ１とデータＤ２の排他的論理和をとったパリティデータＰを下記式（１）のように表現する。ただし、ｘｏｒは、排他的論理和を表す。
【００１９】
Ｐ＝Ｄ１  ｘｏｒ  Ｄ２      ・・・（１）
【００２０】
ストレージシステム１００では、障害が発生したストレージ装置を切り離す。ストレージ装置を切り離すとは、ストレージ装置に対するアクセスを停止することである。この結果、ストレージシステム１００は、冗長構成から非冗長構成となる。冗長構成とは、データの冗長性が確保されている状態である。非冗長構成とは、冗長構成から、障害が発生したストレージ装置が切り離されて、データの冗長性を失った状態である。
【００２１】
ストレージシステム１００は、冗長構成から非冗長構成となっても、障害が発生して切り離されたストレージ装置に記憶されているデータ（欠損データ）を、パリティデータと他のストレージ装置に記憶されているデータとを利用して復元できる。このため、ストレージシステム１００は、冗長構成から非冗長構成となっても、システムの運用を継続して行うことができる。
【００２２】
例えば、ストレージ装置Ｓ２に障害が発生すると、ストレージシステム１００は冗長構成から非冗長構成となり、ストレージ装置Ｓ２からデータＤ２を読み出せなくなる。この場合、ストレージシステム１００は、下記式（２）のように、ストレージ装置Ｓ１に記憶されているデータＤ１と、ストレージ装置Ｓ３に記憶されているパリティデータＰの排他的論理和をとってデータＤ２を復元する。
【００２３】
Ｄ２＝Ｄ１  ｘｏｒ  Ｐ＝Ｄ１  ｘｏｒ  Ｄ１  ｘｏｒ  Ｄ２      ・・・（２）
【００２４】
また、ストレージシステム１００は、非冗長構成から、さらにストレージ装置が切り離された状態（マルチデッド状態）となった場合、欠損データを復元できなくなるためシステムダウンする。システムダウンとは、データの読出処理および書込処理を正常に行うことができない状態である。
【００２５】
ここで、データの書込処理の一例について説明する。ここでは、ストレージ装置Ｓ２が切り離された非冗長構成のストレージシステム１００において、ストレージ装置Ｓ１に記憶されているデータＤ１をデータＤ１＃に更新する場合について説明する。
【００２６】
具体的には、例えば、まず、ストレージ制御装置１０１が、ストレージ装置Ｓ１からデータＤ１を読み出す。つぎに、ストレージ制御装置１０１が、ストレージ装置Ｓ３からパリティデータＰを読み出す。そして、ストレージ制御装置１０１が、各ストレージ装置から読み出したデータＤ１とパリティデータＰの排他的論理和をとってデータＤ２を算出する。これにより、切り離されたストレージ装置Ｓ２に記憶されているデータＤ２が復元される。
【００２７】
つぎに、ストレージ制御装置１０１が、書込対象のデータＤ１＃と、算出されたデータＤ２の排他的論理和をとって、新たなパリティデータＰ＃を算出する（Ｐ＃＝Ｄ１＃  ｘｏｒ  Ｄ２）。そして、ストレージ制御装置１０１が、データＤ１＃をストレージ装置Ｓ１に書き込む。また、ストレージ制御装置１０１が、パリティデータＰ＃をストレージ装置Ｓ３に書き込む。
【００２８】
このように、ストレージシステム１００では、データＤ１をデータＤ１＃に更新する場合、ストレージ装置間のデータの整合性を確保して欠損データ（上述の例ではデータＤ２）を復元し、パリティデータの更新も合わせて行う。
【００２９】
ここで、ストレージ装置に対するデータの書き込みは、サーマル・オフトラック、コンタミネーション、ノイズ、接触不良等の障害により失敗する場合がある。上述したデータＤ１をデータＤ１＃に更新する場合の書き込み失敗例としては、例えば、下記（ａ）〜（ｃ）がある。
【００３０】
（ａ）ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに失敗して、データＤ１＃の一部をストレージ装置Ｓ１に書き込めなかった場合
【００３１】
この場合、ストレージ装置Ｓ１に記憶されているデータは、データＤ１およびデータＤ１＃のいずれとも異なるデータＤｘとなる（Ｄｘ≠Ｄ１，Ｄ１＃）。また、ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに失敗すると、ストレージシステム１００からストレージ装置Ｓ１が切り離される。この結果、ストレージシステム１００は、非冗長構成からマルチデッド状態となりシステムダウンする。このため、ストレージ装置Ｓ３に記憶されているデータは、パリティデータＰのままである（Ｐ＝Ｄ１  ｘｏｒ  Ｄ２）。
【００３２】
（ｂ）ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに成功した後、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗して、パリティデータＰ＃の一部をストレージ装置Ｓ３に書き込めなかった場合
【００３３】
この場合、ストレージ装置Ｓ１に記憶されているデータは、データＤ１＃となる。一方、ストレージ装置Ｓ３に記憶されているデータは、パリティデータＰおよびパリティデータＰ＃のいずれとも異なるデータＰｘとなる（Ｐｘ≠Ｐ，Ｐ＃）。また、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗すると、ストレージ装置Ｓ３がストレージシステム１００から切り離される。この結果、ストレージシステム１００は、非冗長構成からマルチデッド状態となりシステムダウンする。
【００３４】
（ｃ）ストレージ装置Ｓ１に対するデータＤ１＃の書き込みに成功した後、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗して、パリティデータＰ＃をストレージ装置Ｓ３にまったく書き込めなかった場合
【００３５】
この場合、ストレージ装置Ｓ１に記憶されているデータは、データＤ１＃となる。一方、ストレージ装置Ｓ３に記憶されているデータは、パリティデータＰのままである。また、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗すると、ストレージ装置Ｓ３がストレージシステム１００から切り離される。この結果、ストレージシステム１００は、非冗長構成からマルチデッド状態となりシステムダウンする。
【００３６】
上述したように、上記（ａ）〜（ｃ）のいずれの場合も、ストレージシステム１００は、書込失敗により非冗長構成からマルチデッド状態となりシステムダウンする。ここで、サーマル・オフトラック、コンタミネーション、ノイズ、接触不良等のストレージ装置の障害は、該ストレージ装置に対するハードリセットや電源のＯＦＦ／ＯＮを行うことによって回復することが多い。
【００３７】
このため、ストレージシステム１００では、書き込みに失敗して切り離されたストレージ装置（ストレージ装置Ｓ１またはＳ３）に対するハードリセットや電源のＯＦＦ／ＯＮを行って、システムダウン直前の非冗長構成に戻すことができる。しかし、上記（ａ）〜（ｃ）のいずれの場合も、ストレージシステム１００をシステムダウン直前の非冗長構成に戻したとしても、ストレージ装置Ｓ１，Ｓ３間のデータの整合性がとれていない状態となっている。
【００３８】
上記（ａ）の場合、ストレージ装置Ｓ１に記憶されているデータは「Ｄｘ≠Ｄ１」であり、ストレージ装置Ｓ３に記憶されているパリティデータは、ストレージ装置Ｓ１に記憶されていたデータＤ１に基づく「Ｐ＝Ｄ１  ｘｏｒ  Ｄ２」である。このため、下記式（３）のとおり、データＤｘとパリティデータＰの排他的論理和をとっても、データＤ２を復元することができない。
【００３９】
Ｄ２≠Ｄｘ  ｘｏｒ  Ｐ＝Ｄｘ  ｘｏｒ  Ｄ１  ｘｏｒ  Ｄ２・・・（３）
【００４０】
上記（ｂ）の場合、ストレージ装置Ｓ１に記憶されているデータは「Ｄ１＃」であり、ストレージ装置Ｓ３に記憶されているパリティデータは「Ｐｘ≠Ｐ＃＝Ｄ１＃  ｘｏｒ  Ｄ２」である。このため、下記式（４）のとおり、データＤ１＃とパリティデータＰｘの排他的論理和をとっても、データＤ２を復元することができない。
【００４１】
Ｄ２≠Ｄ１＃  ｘｏｒ  Ｐｘ・・・（４）
【００４２】
上記（ｃ）の場合、ストレージ装置Ｓ１に記憶されているデータは「Ｄ１＃」であり、ストレージ装置Ｓ３に記憶されているパリティデータは、ストレージ装置Ｓ１に記憶されていたＤ１に基づく「Ｐ」である。このため、下記式（５）のとおり、データＤ１＃とパリティデータＰの排他的論理和をとっても、データＤ２を復元することができない。
【００４３】
Ｄ２≠Ｄ１＃  ｘｏｒ  Ｐ＝Ｄ１＃  ｘｏｒ  Ｄ１  ｘｏｒ  Ｄ２・・・（５）
【００４４】
これでは、ストレージシステム１００をシステムダウン直前の非冗長構成、つまりストレージ装置Ｓ２が切り離された状態に戻したとしても、以降において、データＤ２の読み出しが発生した場合に、データＤ２を正しく復元することができない。
【００４５】
そこで、実施の形態１では、パリティデータの更新を伴うデータの更新時に、更新前のデータとパリティデータとを特定の記憶領域に退避しておく。そして、実施の形態１では、書込失敗の後にストレージ装置が再起動されると、退避したデータとパリティデータを退避元にそれぞれ戻して、書込失敗によるストレージ装置間のデータの不整合を防ぐ。以下、図２を用いて、実施の形態１にかかるストレージ制御手法の一実施例について説明する。
【００４６】
（ストレージ制御手法の一実施例）
図２は、実施の形態１にかかるストレージ制御手法の一実施例を示す説明図である。ここでは、図１に示したストレージ装置Ｓ２が切り離された非冗長構成のストレージシステム１００において、ストレージ装置Ｓ１に記憶されているデータＤ１をデータＤ１＃に更新する場合を例に挙げて説明する。
【００４７】
（１）ストレージ制御装置１０１は、書込要求を受け付ける。ここで、書込要求には、ストレージ装置Ｓ１への書込対象となるデータＤ１＃と、要求先のストレージ装置Ｓ１の記憶領域のアドレスが含まれている。ストレージ制御装置１０１は、例えば、外部のコンピュータから書込要求を受け付けてもよく、また、ユーザの操作入力により書込要求を受け付けることにしてもよい。
【００４８】
（２）ストレージ制御装置１０１は、書込要求を受け付けた場合、書込要求に対応するストレージ装置Ｓ１の記憶領域に記憶されているデータＤ１と、データＤ１を生成元とするパリティデータＰとを、特定の記憶領域２００に複写する。具体的には、例えば、ストレージ制御装置１０１が、ストレージ装置Ｓ１からデータＤ１を読み出して特定の記憶領域２００に書き込む。また、ストレージ制御装置１０１が、ストレージ装置Ｓ３からパリティデータＰを読み出して特定の記憶領域２００に書き込む。
【００４９】
ここで、特定の記憶領域２００は、ストレージシステム１００に記憶されているデータ群の各データおよびデータ群から生成されるパリティデータの記憶先の記憶領域とは異なる不揮発性の記憶領域である。特定の記憶領域２００は、例えば、ストレージ制御装置１０１に設けられていてもよく、また、各ストレージ装置Ｓ１〜Ｓ３にそれぞれ設けられていてもよい。
【００５０】
（３）ストレージ制御装置１０１は、受け付けた書込要求に対する書込処理を実行する。具体的には、例えば、ストレージ制御装置１０１が、書込対象のデータＤ１＃を、ストレージ装置Ｓ１の記憶領域に書き込む。また、ストレージ制御装置１０１が、新たなパリティデータＰ＃（Ｐ＃＝Ｄ１＃  ｘｏｒ  Ｄ２）を、ストレージ装置Ｓ３のパリティデータＰの記憶先の記憶領域に書き込む。より具体的には、例えば、まず、ストレージ制御装置１０１が、ストレージ装置Ｓ１のデータＤ１とストレージ装置Ｓ３のパリティデータＰから、切り離されているストレージ装置Ｓ２のデータＤ２を復元する。そして、ストレージ制御装置１０１が、書込対象のデータＤ１＃と復元したデータＤ２から新たなパリティデータＰ＃を算出して、ストレージ装置Ｓ３のパリティデータＰの記憶先の記憶領域に書き込む。
【００５１】
ここで、ストレージ装置Ｓ１またはＳ３に対する書き込みに失敗すると、書き込みを失敗したストレージ装置Ｓ１またはＳ３がストレージシステム１００から切り離されてマルチデッド状態となり、ストレージシステム１００がシステムダウンする。ここでは、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗して、パリティデータＰ＃の一部をストレージ装置Ｓ３に書き込めなかった場合を想定する。
【００５２】
この場合、ストレージシステム１００をシステムダウン直前の非冗長構成に戻すために、切り離されたストレージ装置Ｓ３が再起動される。ここでは、ストレージ装置Ｓ３が再起動された結果、ストレージ装置Ｓ３が正常に動作するストレージ装置として復帰した場合を想定する。
【００５３】
（４）ストレージ制御装置１０１は、（３）で切り離したストレージ装置が再起動されたか否かを判断する。具体的には、例えば、ストレージ制御装置１０１が、ストレージ装置Ｓ３から再起動の完了通知を受け付けることにより、ストレージ装置Ｓ３が再起動されたと判断する。
【００５４】
（５）ストレージ制御装置１０１は、ストレージ装置Ｓ１またはＳ３が再起動された場合、特定の記憶領域２００に複写されたデータＤ１をストレージ装置Ｓ１の複写元の記憶領域に書き込む。さらに、ストレージ制御装置１０１は、特定の記憶領域２００に複写されたパリティデータＰをストレージ装置Ｓ３の複写元の記憶領域に書き込む。
【００５５】
このように、実施の形態１にかかるストレージ制御手法によれば、パリティデータの更新を伴うデータの更新時に、更新前のデータとパリティデータを、特定の記憶領域２００に退避する。また、書込失敗でストレージ装置が再起動されると、特定の記憶領域２００に退避したデータとパリティデータをそれぞれ退避元の記憶領域に戻すことで、書込失敗によるストレージ装置間のデータの不整合を防ぐことができる。
【００５６】
すなわち、実施の形態１では、サーマル・オフトラック等の障害は、ストレージ装置を再起動することで回復することを想定して、書込要求単位で、更新前のデータとパリティデータを特定の記憶領域２００に一時的に退避しておく。これにより、サーマル・オフトラック等の障害によってストレージ装置に対する書き込みに失敗しても、ストレージ装置の再起動後に、退避したデータとパリティデータを退避元の記憶領域に戻すことで、ストレージ装置間のデータの整合性をとることができる。
【００５７】
例えば、上記（３）において、ストレージ装置Ｓ３に対するパリティデータＰ＃の書き込みに失敗すると、ストレージ装置Ｓ１，Ｓ３間のデータの不整合が発生して、ストレージ装置Ｓ２のデータＤ２を復元することができない。そこで、上記（５）において、特定の記憶領域２００に退避したデータＤ１とパリティデータＰをそれぞれ退避元の記憶領域に戻すことで、書込失敗によるストレージ装置Ｓ１，Ｓ３間のデータの不整合を防ぐとともに、戻したデータＤ１とパリティデータＰとによるデータＤ２の復元が可能となる。
【００５８】
（ストレージシステム３００のハードウェア構成）
つぎに、実施の形態１にかかるストレージ制御装置１０１をＲＡＩＤ３のストレージシステム３００に適用した場合について説明する。ＲＡＩＤ３は、データ群を複数のＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）に分割して記録し、データ群から生成されるパリティデータを専用のＨＤＤ（いわゆる、パリティドライブ）に記録する方式である。
【００５９】
以下の図３の例では、ストレージシステム３００内のＨＤＤの台数が、ＨＤＤ１〜ＨＤＤ３の３台の場合を例に挙げて説明するが、ストレージシステム３００に含まれるＨＤＤの台数はこれに限らない。ＲＡＩＤ３のストレージシステム３００の場合、ＨＤＤの台数として、１台のパリティドライブを含む３台以上であれば任意の台数を採用することができる。
【００６０】
図３は、実施の形態１にかかるストレージシステム３００のハードウェア構成を示すブロック図である。図３において、ストレージシステム３００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、メインメモリ３０２と、ディスプレイコントローラ３０３と、ディスプレイ３０４と、通信コントローラ３０５と、ストレージ制御装置１０１と、ＨＤＤ１〜ＨＤＤ３と、を備えている。
【００６１】
ＣＰＵ３０１は、ストレージシステム３００を統括的に制御する。メインメモリ３０２は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）を含む。ＣＰＵ３０１は、例えば、ストレージシステム３００のＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）をメインメモリ３０２上で展開して起動する。
【００６２】
ディスプレイコントローラ３０３は、ＣＰＵ３０１の制御にしたがってディスプレイ３０４の表示制御を行う。ディスプレイ３０４は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報等のデータを表示する。ディスプレイ３０４は、例えば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイ等を採用することができる。
【００６３】
通信コントローラ３０５は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネット等のネットワーク３２０に接続され、ネットワーク３２０を介して外部のコンピュータに接続される。通信コントローラ３０５は、ネットワーク３２０と内部のインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。また、ストレージシステム３００は、キーボードやマウス等の入力装置、スキャナやプリンタ等の出力装置を備えることにしてもよい。
【００６４】
ストレージ制御装置１０１は、プロセッサ３０６と、メモリ３０７と、不揮発性メモリ３０８と、ＨＤＤコントローラ３０９と、バスコントローラ３１０と、を備えている。プロセッサ３０６は、メモリ３０７に格納されている本ストレージ制御プログラム等の各種プログラムを実行する。
【００６５】
プロセッサ３０６は、ＨＤＤコントローラ３０９を介して、ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する。また、プロセッサ３０６は、ＨＤＤコントローラ３０９を介して、ＨＤＤ１〜ＨＤＤ３との接続を制御する。以下の説明では、ストレージ制御装置１０１と各ＨＤＤ１〜ＨＤＤ３とを接続することを「オンライン」、ストレージ制御装置１０１とＨＤＤ１〜ＨＤＤ３とを切り離すことを「オフライン」という。
【００６６】
不揮発性メモリ３０８は、電源からの電力の供給が遮断されても記憶内容が消去されない特性を有する記憶媒体である。不揮発性メモリ３０８は、例えばＮＶＲＡＭ（Ｎｏｎ  Ｖｏｌａｔｉｌｅ  ＲＡＭ）やＦＬＡＳＨメモリ等である。ＨＤＤコントローラ３０９は、プロセッサ３０６の制御にしたがって、ＨＤＤ１〜ＨＤＤ３に対するアクセスを行う。バスコントローラ３１０は、ストレージ制御装置１０１とＣＰＵ３０１とのデータのやりとりを制御する。
【００６７】
ＨＤＤ１〜ＨＤＤ３は、磁性体を塗布した円盤（ハードディスク）を高速回転させることで、磁気ヘッドがデータの読み出し／書き込みを行う記憶装置である。ＨＤＤ１〜ＨＤＤ３は、例えば、上述したストレージ装置Ｓ１〜Ｓ３に相当する。各ＨＤＤ１〜ＨＤＤ３の記憶領域は、データ領域３１１，３１２，３１３とシステム領域３１４，３１５，３１６とに分割されている。
【００６８】
各データ領域３１１，３１２，３１３および各システム領域３１４，３１５，３１６の容量は、各ＨＤＤ１〜ＨＤＤ３のデータ容量の範囲内で可変である。プロセッサ３０６は、オフライン、オンラインに限らず、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６にアクセス可能である。
【００６９】
ストレージシステム３００において、ＨＤＤ１，ＨＤＤ２は、データ群の各データを分散して記憶するＨＤＤであり、ＨＤＤ３は、データ群の各データの排他的論理和であるパリティデータを記憶するＨＤＤ（パリティドライブ）である。ＨＤＤ１，ＨＤＤ２のデータ領域３１１，３１２には、データＤ１〜Ｄｎが分散して記憶されている。また、ＨＤＤ３のデータ領域３１３には、パリティデータＰ１〜Ｐｍが記憶されている。例えば、データＤ１，Ｄ２がＨＤＤ１，ＨＤＤ２のデータ領域３１１，３１２に分散して記憶され、データＤ１，Ｄ２の排他的論理和であるパリティデータＰ１がＨＤＤ３のデータ領域３１３に記憶されている。
【００７０】
ここで、データは、例えば、ストレージシステム３００におけるＯＳ、アプリケーションプログラム、ユーザ情報等を分割したデータである。また、各データのデータサイズは、例えば、ビット単位やバイト単位である。データ群の各データと該データ群から生成されるパリティデータは、例えば、同一のＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓｉｎｇ）番号を割り当てることで管理される。
【００７１】
ＬＢＡとは、ハードディスク内のすべてのセクタに通し番号を振り、その通し番号によってセクタを指定する方式である。すなわち、各ＨＤＤ１〜ＨＤＤ３に対するアクセス（読み出し、書き込み）は、ＬＢＡ単位で行われる。例えば、データＤ１，Ｄ２およびパリティデータＰ１にＬＢＡ１が割り当てられているとする。
【００７２】
この場合、ＨＤＤ１のＬＢＡ１を指定することで、データＤ１が記憶されているＨＤＤ１の記憶領域を特定してアクセスすることができる。また、ＨＤＤ２のＬＢＡ１を指定することで、データＤ２が記憶されているＨＤＤ２の記憶領域を特定してアクセスすることができる。また、ＨＤＤ３のＬＢＡ１を指定することで、パリティデータＰ１が記憶されているＨＤＤ３の記憶領域を特定してアクセスすることができる。
【００７３】
各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６には、例えば、ストレージシステム３００の管理データが記憶されている。管理データは、例えば、各ＨＤＤ１〜ＨＤＤ３に障害が発生しているか否かを示す情報を含む。各管理データは、プロセッサ３０６によりＨＤＤコントローラ３０９を介して更新される。ここで、管理データの具体例について説明する。
【００７４】
（管理データ４１０，４２０，４３０の具体例）
図４は、管理データ４１０，４２０，４３０の具体例を示す説明図である。図４において、管理データ４１０は、ＨＤＤ１のシステム領域３１４に記憶されている管理データである。管理データ４２０は、ＨＤＤ２のシステム領域３１５に記憶されている管理データである。管理データ４３０は、ＨＤＤ３のシステム領域３１６に記憶されている管理データである。
【００７５】
各管理データ４１０，４２０，４３０は、ＨＤＤを識別するＨＤＤ番号と、ＨＤＤの状態とを関連付けて記憶している。ＨＤＤの状態は、初期状態では「正常」であり、ＨＤＤに障害が発生すると「正常」から「異常」に更新される。また、ＨＤＤの状態は、ＨＤＤが障害から復帰すると「異常」から「正常」に更新される。
【００７６】
また、管理データ４１０は、ＨＤＤ１の起動時刻およびアクセスログを記憶している。管理データ４１０のアクセスログは、ＨＤＤコントローラ３０９がＨＤＤ１に最後にアクセスしたアクセス時刻を含む情報である。管理データ４２０は、ＨＤＤ２の起動時刻およびアクセスログを記憶している。管理データ４２０のアクセスログは、ＨＤＤコントローラ３０９がＨＤＤ２に最後にアクセスしたアクセス時刻を含む情報である。
【００７７】
管理データ４３０は、ＨＤＤ３の起動時刻およびアクセスログを記憶している。管理データ４３０のアクセスログは、ＨＤＤコントローラ３０９がＨＤＤ３に最後にアクセスしたアクセス時刻を含む情報である。管理データ４１０，４２０，４３０によれば、障害が発生しているＨＤＤを特定することができる。また、管理データ４１０，４２０，４３０によれば、各ＨＤＤ１〜ＨＤＤ３の起動時刻およびアクセス時刻を特定することができる。
【００７８】
（ストレージ制御装置１０１の機能的構成）
図５は、実施の形態１にかかるストレージ制御装置１０１の機能的構成を示すブロック図である。図５において、ストレージ制御装置１０１は、受付部５０１と、更新部５０２と、制御部５０３と、複写指示部５０４と、実行部５０５と、成否判定部５０６と、検出部５０７と、判断部５０８と、書込指示部５０９と、対象判定部５１０と、を含む構成である。各機能部（受付部５０１〜対象判定部５１０）は、具体的には、例えば、図３に示したメモリ３０７に記憶されたプログラムをプロセッサ３０６に実行させることにより、または、ＨＤＤコントローラ３０９、バスコントローラ３１０により、その機能を実現する。また、各機能部（受付部５０１〜対象判定部５１０）の処理結果は、特に指定する場合を除いて、メモリ３０７に記憶される。
【００７９】
受付部５０１は、ＨＤＤｋのＬＢＡｊに対する書込要求を受け付ける機能を有する（例えば、ｋ＝１，２，３、ｊ＝１，２，…，ｍ）。書込要求は、例えば、要求先のＨＤＤｋを特定するＨＤＤ番号「ｋ」と、要求先のＬＢＡｊを特定するＬＢＡ番号「ｊ」と、書込対象となるデータ（以下、「書込データ」という）と、を含む。具体的には、例えば、受付部５０１が、バスコントローラ３１０を介して、ＣＰＵ３０１から書込要求を受け付ける。書込要求の具体例については、後述の図６を用いて説明する。
【００８０】
更新部５０２は、書込要求を受け付けた場合、書込要求に対する書込処理が正常に完了したか否かを特定するための書込状態情報を更新する機能を有する。ここで、書込処理が正常に完了したとは、書込要求に伴って発生するデータの書き込みが正常に完了したことを表す。書込状態情報を記憶する書込状態テーブルの具体例については、後述の図７を用いて説明する。
【００８１】
図６は、書込要求６００の具体例を示す説明図である。図６において、書込要求６００は、要求先のＨＤＤｋを特定するＨＤＤ番号「１」と、要求先のＬＢＡｊを特定するＬＢＡ番号「１」と、書込データ「Ｄ１＃」と、を含む。図６の書込要求６００は、ＨＤＤ１のＬＢＡ１のデータＤ１を書込データＤ１＃に更新するためのものである。
【００８２】
図７は、書込状態テーブル７００の具体例を示す説明図である。図７において、書込状態テーブル７００は、書込状態フラグ、ＨＤＤ番号、ＬＢＡ番号および書込失敗ＨＤＤ番号のフィールドを有する。各フィールドに情報を設定することで、書込状態情報がレコードとして書込状態テーブル７００に記憶されている。
【００８３】
書込状態フラグは、書込要求に対する書込処理が正常に完了したか否かを示すフラグである。書込状態フラグは、初期状態では「０」であり、書込要求を受け付けると「０」から「１」に変更される。また、書込状態フラグは、書込要求に対する書込処理が正常に完了すると「１」から「０」に変更される。書込状態フラグが「１」である場合、書込要求に対する書込処理中であることを示す。
【００８４】
ＨＤＤ番号は、要求先のＨＤＤｋの識別子である。ＬＢＡ番号は、要求先のＬＢＡｊの識別子である。書込失敗ＨＤＤ番号は、書込要求に対する書込処理が実行された結果、書込要求に伴って発生するデータの書き込みに失敗したＨＤＤの識別子である。
【００８５】
図７中（７−１）は、図６に示した書込要求６００を受け付けた場合の書込状態情報の更新例である。書込要求６００を受け付けた場合、更新部５０２が、書込状態テーブル７００の書込状態フラグを「０」から「１」に変更する。また、更新部５０２が、書込要求６００に含まれるＨＤＤ番号「１」を、書込状態テーブル７００のＨＤＤ番号のフィールドに書き込む。また、更新部５０２が、書込要求６００に含まれるＬＢＡ番号「１」を、書込状態テーブル７００のＬＢＡ番号のフィールドに書き込む。
【００８６】
書込状態テーブル７００によれば、書込要求を受け付けた要求先のＨＤＤ番号とＬＢＡ番号を特定することができる。また、書込状態テーブル７００によれば、書込要求に対する書込処理が成功したか否かを特定することができる。書込状態テーブル７００は、例えば、図３に示した不揮発性メモリ３０８により実現される。
【００８７】
図５の説明に戻り、制御部５０３は、ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する機能を有する。具体的には、例えば、制御部５０３は、後述する複写指示部５０４、実行部５０５および書込指示部５０９の指示にしたがって、ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する。制御部５０３は、例えば、図３に示したＨＤＤコントローラ３０９により実現される。以下の説明では、制御部５０３の一例として、ＨＤＤコントローラ３０９を例に挙げて説明する。
【００８８】
複写指示部５０４は、書込要求を受け付けた場合、ＨＤＤコントローラ３０９に対して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを、書込バッファＢに複写するよう指示する機能を有する（ｉ＝１，２，…，ｎ）。また、複写指示部５０４は、書込要求を受け付けた場合、ＨＤＤコントローラ３０９に対して、データＤｉを生成元とするパリティデータＰｊを、書込バッファＢに複写するよう指示する機能を有する。
【００８９】
ここで、書込バッファＢは、図２に示した「特定の記憶領域２００」に相当し、例えば、各ＨＤＤ１〜ＨＤＤ３のデータ領域３１１，３１２，３１３とは異なる不揮発性の記憶領域である。書込バッファＢは、例えば、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６やストレージ制御装置１０１の不揮発性メモリ３０８に設けられる。
【００９０】
以下の説明では、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６に書込バッファＢがそれぞれ設けられている場合を例に挙げて説明する。ここで、書込バッファＢの具体例について説明する。
【００９１】
図８は、書込バッファＢの具体例を示す説明図である。図８において、書込バッファＢは、書込バッファＢ１と、書込バッファＢ２と、書込バッファＢ３と、を含む構成である。書込バッファＢ１は、書込要求を受け付けた要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉの複写先となる記憶領域である。
【００９２】
書込バッファＢ２は、書込要求を受け付けた要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの複写先となる記憶領域である。書込バッファＢ３は、書込要求に含まれる書込データ（以下、「書込データＤｉ＃」と表記する）の複写先となる記憶領域である。なお、書込バッファＢ３についての詳細な説明は後述する。
【００９３】
例えば、書込要求６００を受け付けた場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を書込バッファＢ１に複写するよう指示する。この結果、ＨＤＤコントローラ３０９が、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出して、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に書き込む。これにより、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１が各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写される。
【００９４】
また、書込要求６００を受け付けた場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を生成元とするパリティデータＰ１を書込バッファＢ２に複写するよう指示する。この結果、ＨＤＤコントローラ３０９が、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１を読み出して、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に書き込む。これにより、パリティデータＰ１が各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写される。
【００９５】
また、複写指示部５０４は、データＤｉを生成元とするパリティデータが複数存在する場合は、ＨＤＤコントローラ３０９に対して、データＤｉを生成元とする各パリティデータを、書込バッファＢに複写するよう指示する。例えば、ＲＡＩＤ６のストレージシステムの場合、パリティデータが２種類存在する。このため、ＲＡＩＤ６のストレージシステムの場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、データＤｉを生成元とする２種類のパリティデータを、書込バッファＢに複写するよう指示する。
【００９６】
以下、説明の簡単化のため、特に指定する場合を除いて、「ＨＤＤコントローラ３０９に対してデータの読み出し／書き込みを指示して、データを読み出す／書き込む」ことを「ＨＤＤコントローラ３０９を介して、データを読み出す／書き込む」と表現する。
【００９７】
図５の説明に戻り、実行部５０５は、データＤｉとパリティデータＰｊとが書込バッファＢに複写された後、書込要求に対する書込処理を実行する機能を有する。ここで、実行部５０５によって実行される書込要求に対する書込処理の具体例（Ａ）〜（Ｃ）について説明する。ただし、書込要求に対する書込処理に成功した場合を例に挙げて説明する。
【００９８】
（Ａ）冗長構成時の書込処理
まず、冗長構成時に実行される書込要求６００に対する書込処理（書込データＤ１＃のストレージ装置Ｓ１への書き込みを要する処理）について説明する。具体的には、例えば、まず、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ２のＬＢＡ１に記憶されているデータＤ２（書き込みを要さないデータ）を読み出す。つぎに、実行部５０５が、書込要求６００に含まれる書込データＤ１＃と、読み出されたデータＤ２との排他的論理和をとって、新たなパリティデータＰ１＃を算出する（Ｐ１＃＝Ｄ１＃  ｘｏｒ  Ｄ２）。
【００９９】
そして、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込データＤ１＃をＨＤＤ１のＬＢＡ１に書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃をＨＤＤ３のＬＢＡ１に書き込む。この結果、ＨＤＤ１のＬＢＡ１のデータＤ１が書込データＤ１＃に更新され、ＨＤＤ３のＬＢＡ１のパリティデータＰ１が新たなパリティデータＰ１＃に更新される。
【０１００】
（Ｂ）非冗長構成時の書込処理（その１）
つぎに、ＨＤＤ２がオフラインとなっている非冗長構成時に実行される書込要求６００に対する書込処理（データＤ１を書込データＤ１＃に更新する処理）について説明する。具体的には、例えば、まず、実行部５０５が、書込要求を受けると、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出す。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１を読み出す。
【０１０１】
そして、実行部５０５が、読み出されたデータＤ１とパリティデータＰ１の排他的論理和をとって、ＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を算出する。これにより、オフラインとなっているＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することができる。このあと、実行部５０５が、書込要求６００に含まれる書込データＤ１＃と、算出されたデータＤ２との排他的論理和をとって、新たなパリティデータＰ１＃を算出する。
【０１０２】
そして、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込データＤ１＃をＨＤＤ１のＬＢＡ１に書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃をＨＤＤ３のＬＢＡ１に書き込む。この結果、ＨＤＤ１のＬＢＡ１のデータＤ１が書込データＤ１＃に更新され、ＨＤＤ３のＬＢＡ１のパリティデータＰ１が新たなパリティデータＰ１＃に更新される。
【０１０３】
（Ｃ）非冗長構成時の書込処理（その２）
つぎに、ＨＤＤ２がオフラインとなっている非冗長構成時に実行される、ＨＤＤ２のＬＢＡ１のデータＤ２を書込データＤ２＃に更新する書込要求に対する書込処理について説明する。この場合、ＨＤＤ２がオフラインとなっているため、以下の手順によりＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１の更新を行う。
【０１０４】
具体的には、例えば、まず、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出す。このあと、実行部５０５が、読み出されたデータＤ１と、書込要求に含まれる書込データＤ２＃との排他的論理和をとって、新たなパリティデータＰ１＃を算出する。
【０１０５】
そして、実行部５０５が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃をＨＤＤ３のＬＢＡ１に書き込む。この結果、ＨＤＤ３のＬＢＡ１のパリティデータＰ１が、データＤ２の更新内容（Ｄ２→Ｄ２＃）が反映された新たなパリティデータＰ１＃に更新される。
【０１０６】
また、受付部５０１は、ＨＤＤｋのＬＢＡｊに対する読出要求を受け付ける機能を有する。ここで、読出要求は、例えば、要求先のＨＤＤｋを特定するＨＤＤ番号「ｋ」と、要求先のＬＢＡｊを特定するＬＢＡ番号「ｊ」と、を含む。具体的には、例えば、受付部５０１が、バスコントローラ３１０を介して、ＣＰＵ３０１から読出要求を受け付ける。
【０１０７】
また、実行部５０５は、受け付けた読出要求に対する読出処理を実行する機能を有する。具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを読み出す。また、要求先のＨＤＤｋがオフラインの場合、実行部５０５が、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊと他のＨＤＤが記憶するデータとを用いて、データＤｉを復元する。ここで、ＨＤＤ２がオフラインとなっている場合を例に挙げて、ＨＤＤ２のＬＢＡ１のデータＤ２を読み出す読出処理について説明する。
【０１０８】
具体的には、例えば、まず、読出要求を受けた実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を読み出す。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１を読み出す。そして、実行部５０５が、読み出されたデータＤ１とパリティデータＰ１の排他的論理和をとって、ＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を算出する。これにより、オフラインとなっているＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元して、読出データとして用いることができる。
【０１０９】
成否判定部５０６は、書込要求に対する書込処理の処理結果に基づいて、書込要求に対する書込処理が成功したか否かを判定する機能を有する。具体的には、例えば、成否判定部５０６が、書込要求に伴って発生するデータの書き込みがすべて正常に完了した場合、書込要求に対する書込処理が成功したと判定する。
【０１１０】
上記（Ａ）および（Ｂ）の例では、書込データＤ１＃およびパリティデータＰ１＃の書き込みが正常に完了した場合、成否判定部５０６が、書込処理が成功したと判定する。一方、書込データＤ１＃またはパリティデータＰ１＃の少なくともいずれか一方の書き込みが正常に完了しなかった場合、成否判定部５０６が、書込処理が失敗したと判定する。
【０１１１】
また、上記（Ｃ）の例では、パリティデータＰ１＃の書き込みが正常に完了した場合、成否判定部５０６が、書込処理が成功したと判定する。一方、パリティデータＰ１＃の書き込みが正常に完了しなかった場合、成否判定部５０６が、書込処理が失敗したと判定する。
【０１１２】
データの書き込みが正常に完了したか否かの判定は、例えば、ＨＤＤｋに対して書き込まれる書込データＤｉ＃のＣＲＣコードと、実際に書き込まれたデータのＣＲＣコードの一致判定により行われる。ここで、ＣＲＣコードが一致する場合、成否判定部５０６が、書込データＤｉ＃の書き込みが正常に完了したと判定する。一方、ＣＲＣコードが不一致の場合、成否判定部５０６が、書込データＤｉ＃の書き込みが正常に完了しなかったと判定する。
【０１１３】
また、更新部５０２は、書込要求に対する書込処理が実行された結果、書込要求に対する書込処理が正常に完了したか否かを特定するための書込状態情報を更新する。具体的には、例えば、更新部５０２が、上記成否判定部５０６によって判定された判定結果に基づいて、図７に示した書込状態テーブル７００を更新する。
【０１１４】
より具体的には、例えば、書込要求に対する書込処理が成功したと判定された場合、更新部５０２が、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。一方、書込要求に対する書込処理が失敗したと判定された場合、更新部５０２が、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに、データの書き込みが正常に完了しなかったＨＤＤｋのＨＤＤ番号を書き込む。
【０１１５】
図７中（７−２）は、書込要求６００に対する書込処理が成功した場合の書込状態情報の更新例である。具体的には、例えば、書込要求６００に対する書込処理が正常に完了した場合、更新部５０２が、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。
【０１１６】
図７中（７−３）は、書込要求６００に対する書込処理が失敗した場合の書込状態情報の更新例である。ここでは、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みが正常に完了しなかった場合を例に挙げて説明する。この場合、更新部５０２が、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに、ＨＤＤ３のＨＤＤ番号「３」を書き込む。
【０１１７】
また、書込要求に対する書込処理が成功した場合、更新部５０２が、書込バッファＢに記憶されているデータＤｉやパリティデータＰｊを削除することにしてもよい。また、新たな書込要求を受け付けた場合に、新たなデータＤｉやパリティデータＰｊを、書込バッファＢに上書きするような構成であってもよい。この場合、書込要求に対する書込処理の成功時に、その都度、書込バッファＢに記憶されているデータＤｉやパリティデータＰｊを削除する必要がなくなる。
【０１１８】
図５の説明に戻り、検出部５０７は、ＨＤＤコントローラ３０９を介して、障害が発生したＨＤＤを検出する機能を有する。具体的には、例えば、検出部５０７が、ＨＤＤ１〜ＨＤＤ３の中から、データの書き込みが正常に行われなかったＨＤＤを、障害が発生したＨＤＤとして検出する。
【０１１９】
例えば、上記（Ａ）の書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みが正常に完了しなかった場合、検出部５０７が、ＨＤＤ１を障害が発生したＨＤＤとして検出する。また、上記（Ａ）の書込処理が実行された結果、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みが正常に完了しなかった場合、検出部５０７が、ＨＤＤ３を障害が発生したＨＤＤとして検出する。
【０１２０】
より具体的には、例えば、検出部５０７が、書込状態テーブル７００を参照して、書込失敗ＨＤＤ番号のフィールドに設定されているＨＤＤ番号のＨＤＤを、障害が発生したＨＤＤとして検出する。これにより、データの書き込みが正常に行われなかったＨＤＤを、障害が発生したＨＤＤとして検出することができる。
【０１２１】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、データの読み出しが正常に行われなかったＨＤＤを、障害が発生したＨＤＤとして検出する。より具体的には、例えば、検出部５０７が、ＨＤＤから読み出されたデータにリードエラーを示す情報が含まれている場合、該ＨＤＤを障害が発生したＨＤＤとして検出する。
【０１２２】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３に診断コマンドを送信することにしてもよい。そして、検出部５０７が、ＨＤＤコントローラ３０９を介して、診断コマンドを送信してから所定時間内に診断コマンドに対する応答信号を各ＨＤＤ１〜ＨＤＤ３から受信したか否かを判断する。
【０１２３】
例えば、まず、検出部５０７が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１に診断コマンドを送信する。このあと、検出部５０７が、所定時間内にＨＤＤ１から診断コマンドに対する応答信号を受信した場合、ＨＤＤ１を障害が発生していないＨＤＤとして検出する。一方、所定時間内に診断コマンドに対する応答信号を受信しなかった場合、検出部５０７が、ＨＤＤ１を障害が発生したＨＤＤとして検出する。
【０１２４】
また、検出部５０７は、障害が発生したＨＤＤを検出した場合、障害が発生したＨＤＤをオフライン（切り離す）にする。また、検出部５０７は、障害が発生したＨＤＤを検出した場合、ＨＤＤコントローラ３０９を介して、図４に示した各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を更新する。ここで、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の更新例について説明する。
【０１２５】
図９は、管理データ４１０，４２０，４３０の更新例を示す説明図（その１）である。図９中（９−１）は、ＨＤＤ２に障害が発生した場合の各管理データ４１０，４２０，４３０の更新例である。検出部５０７は、障害が発生したＨＤＤ２を検出した場合、ＨＤＤコントローラ３０９を介して、管理データ４１０のＨＤＤ２の状態を「正常」から「異常」に更新する。
【０１２６】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、管理データ４２０のＨＤＤ２の状態を「正常」から「異常」に更新する。また、検出部５０７が、ＨＤＤコントローラ３０９を介して、管理データ４３０のＨＤＤ２の状態を「正常」から「異常」に更新する。（９−１）の管理データ４１０，４２０，４３０によれば、ＨＤＤ１〜ＨＤＤ３のうち、ＨＤＤ２の状態が「異常」となっていることを特定することができる。
【０１２７】
ここで、管理データ４２０は、障害が発生したＨＤＤ２のシステム領域３１５に記憶されている。このため、ＨＤＤ２の障害により、ＨＤＤコントローラ３０９がＨＤＤ２のシステム領域３１５にアクセスできず、管理データ４２０を更新できない場合がある。（９−１）に示す管理データ４２０のＨＤＤ２の状態「（異常）」は、ＨＤＤコントローラ３０９が管理データ４２０を更新できた場合に、管理データ４２０内のＨＤＤ２の状態が「異常」となることを表している。
【０１２８】
図９中（９−２）は、ＨＤＤ２に障害が発生した後、さらに、ＨＤＤ３に障害が発生した場合の各管理データ４１０，４３０の更新例である。検出部５０７は、障害が発生したＨＤＤ３を検出した場合、ＨＤＤコントローラ３０９を介して、管理データ４１０のＨＤＤ３の状態を「正常」から「異常」に更新する。
【０１２９】
また、検出部５０７が、ＨＤＤコントローラ３０９を介して、管理データ４３０のＨＤＤ３の状態を「正常」から「異常」に更新する。ここでは、ＨＤＤ２は切り離されているため、既に障害が発生しているＨＤＤ２の管理データ４２０は更新しない。（９−２）の管理データ４１０，４３０によれば、ＨＤＤ１〜ＨＤＤ３のうち、ＨＤＤ２およびＨＤＤ３の状態が「異常」となっていることを特定することができる。
【０１３０】
ここで、管理データ４３０は、障害が発生したＨＤＤ３のシステム領域３１６に記憶されている。このため、ＨＤＤ３の障害により、ＨＤＤコントローラ３０９がＨＤＤ３のシステム領域３１６にアクセスできず、管理データ４３０を更新できない場合がある。（９−２）に示す管理データ４３０のＨＤＤ３の状態「（異常）」は、ＨＤＤコントローラ３０９が管理データ４３０を更新できた場合に、管理データ４３０内のＨＤＤ３の状態が「異常」となることを表している。
【０１３１】
また、検出された検出結果は、例えば、図１０に示す検出結果テーブル１０００に記憶することにしてもよい。検出結果テーブル１０００は、例えば、メモリ３０７によって実現される。ここで、検出結果テーブル１０００の具体例について説明する。
【０１３２】
図１０は、検出結果テーブル１０００の具体例を示す説明図である。図１０において、検出結果テーブル１０００は、ＨＤＤ番号および検出時刻のフィールドを有し、各フィールドに情報を設定することで、検出結果をレコードとして記憶する。ここで、ＨＤＤ番号は、障害が発生したＨＤＤの識別子である。検出時刻は、障害が発生したＨＤＤが検出された時刻である。
【０１３３】
図１０中（１０−１）は、障害が発生したＨＤＤとして、ＨＤＤ２が検出された場合の検出結果テーブル１０００の更新例である。この場合、検出部５０７が、検出結果テーブル１０００のＨＤＤ番号のフィールドに、ＨＤＤ２のＨＤＤ番号「２」を書き込む。また、検出部５０７が、検出結果テーブル１０００の検出時刻のフィールドに、ＨＤＤ２を検出した検出時刻「２０１０／０８／２３  ０２：１１：５５」を書き込む。
【０１３４】
図１０中（１０−２）は、障害が発生したＨＤＤとして、さらに、ＨＤＤ３が検出された場合の検出結果テーブル１０００の更新例である。この場合、検出部５０７が、検出結果テーブル１０００のＨＤＤ番号のフィールドに、ＨＤＤ３のＨＤＤ番号「３」を書き込む。また、検出部５０７が、検出結果テーブル１０００の検出時刻のフィールドに、ＨＤＤ３を検出した検出時刻「２０１０／０８／２４  １２：０９：２２」を書き込む。
【０１３５】
ここで、ストレージシステム３００は、障害が発生したＨＤＤの台数が２台以上（マルチデッド状態）になると、障害が発生しているＨＤＤのデータを復元できなくなるためシステムダウンする。そこで、判断部５０８により、ストレージシステム３００のシステムダウンの要否を判断する。
【０１３６】
判断部５０８は、検出された検出結果に基づいて、障害が発生したＨＤＤの台数ｘが、所定数Ｘ以上か否かを判断する機能を有する。ここで、所定数Ｘは、障害が発生したＨＤＤの台数がＸ台以上となると、ストレージシステム３００がマルチデッド状態となる値に設定される。具体的には、例えば、所定数Ｘは、パリティドライブの台数Ｙに１を加算した値「Ｘ＝Ｙ＋１」に設定される。
【０１３７】
ストレージシステム３００はＲＡＩＤ３のため、パリティドライブの台数Ｙは「Ｙ＝１」である。このため、所定数Ｘは「Ｘ＝２」となる。また、ＲＡＩＤ５のストレージシステム（例えば、後述するストレージシステム２０００）の場合、パリティドライブの台数Ｙは「Ｙ＝１」である。このため、所定数Ｘは「Ｘ＝２」となる。また、ＲＡＩＤ６のストレージシステムの場合、パリティドライブの台数Ｙは「Ｙ＝２」である。このため、所定数Ｘは「Ｘ＝３」となる。
【０１３８】
具体的には、例えば、まず、判断部５０８が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数ｘ１，ｘ２，ｘ３をそれぞれ特定する。
【０１３９】
図９に示した（９−１）の例では、判断部５０８が、ＨＤＤ１の管理データ４１０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ１＝１」を特定する。また、判断部５０８が、ＨＤＤ２の管理データ４２０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ２＝１」を特定する。また、判断部５０８が、ＨＤＤ３の管理データ４３０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ３＝１」を特定する。
【０１４０】
そして、判断部５０８が、台数ｘ１，ｘ２，ｘ３のうち最大の値を、障害が発生したＨＤＤの台数ｘとして特定する。ここでは、台数ｘ１，ｘ２，ｘ３のすべての値が「１」のため、障害が発生したＨＤＤの台数ｘは「ｘ＝１」となる。このため、判断部５０８が、障害が発生したＨＤＤの台数ｘ（ｘ＝１）が所定数Ｘ（Ｘ＝２）未満と判断する。
【０１４１】
また、図９に示した（９−２）の例では、判断部５０８が、ＨＤＤ１の管理データ４１０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ１＝２」を特定する。また、判断部５０８が、ＨＤＤ２の管理データ４２０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ２＝１」を特定する。また、判断部５０８が、ＨＤＤ３の管理データ４３０を参照して、ＨＤＤ１〜ＨＤＤ３のうち状態が「異常」となっているＨＤＤの台数「ｘ３＝２」を特定する。
【０１４２】
そして、判断部５０８が、台数ｘ１，ｘ２，ｘ３のうち最大の値を、障害が発生したＨＤＤの台数ｘとして特定する。ここでは、管理データ４１０あるいは管理データ４３０に記録されている台数ｘ１，ｘ３の値が「２」で最大のため、障害が発生したＨＤＤの台数ｘは「ｘ＝２」となる。このため、判断部５０８が、障害が発生したＨＤＤの台数ｘ（ｘ＝２）が所定数Ｘ（Ｘ＝２）以上と判断する。
【０１４３】
また、障害が発生したＨＤＤの台数ｘが所定数Ｘ以上となった場合、判断部５０８が、障害が発生したＨＤＤの台数ｘが所定数Ｘ以上となったことをＣＰＵ３０１に通知する。すなわち、ストレージシステム３００がマルチデッド状態となったため、判断部５０８が、ストレージシステム３００をシステムダウンさせるようＣＰＵ３０１に要求する。
【０１４４】
ＣＰＵ３０１は、障害が発生したＨＤＤの台数ｘが所定数Ｘ以上となったことが通知された場合、ストレージシステム３００をシステムダウンさせる。すなわち、ＣＰＵ３０１は、ストレージシステム３００がマルチデッド状態となったため、ストレージシステム３００をシステムダウンさせる。
【０１４５】
また、システムダウンしたストレージシステム３００を復旧する場合、例えば、ストレージシステム３００をシステムダウン直前の非冗長構成に戻す。具体的には、例えば、まず、ＣＰＵ３０１またはユーザの操作入力により、ストレージシステム３００のハードリセット（または、電源のＯＦＦ／ＯＮ）を行う。
【０１４６】
つぎに、プロセッサ３０６により、障害が発生した複数のＨＤＤについて、障害が発生した順序を特定する。障害が発生したＨＤＤの順序を特定する具体的な処理内容については後述する。このあと、プロセッサ３０６により、障害が発生した複数のＨＤＤのうち、最後に障害が発生したＨＤＤ以外のＨＤＤをオフラインにする。すなわち、プロセッサ３０６により、障害が発生した複数のＨＤＤのうち、最後に障害が発生したＨＤＤのみをオンラインにする。
【０１４７】
この際、プロセッサ３０６により、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０内の最後に障害が発生したＨＤＤの状態を更新する。ただし、更新対象となる管理データは、オンラインとなっているＨＤＤの管理データである。図９の（９−２）に示した例では、プロセッサ３０６が、オンラインのＨＤＤ１，ＨＤＤ３の管理データ４１０，４３０のＨＤＤ３の状態を「異常」から「正常」に変更する。
【０１４８】
そして、ＣＰＵ３０１またはユーザの操作入力により、ストレージシステム３００を再起動する。この際、ＣＰＵ３０１が、ストレージシステム３００の起動通知をプロセッサ３０６に出力することにしてもよい。これにより、ストレージシステム３００をシステムダウン直前の非冗長構成に戻すことができる。なお、ここではＣＰＵ３０１またはユーザの操作入力によってストレージシステム３００を再起動することにしたが、プロセッサ３０６がストレージシステム３００の再起動を行うことにしてもよい。
【０１４９】
また、判断部５０８は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する機能を有する。ここで、書込要求に対する書込処理が実行されたＨＤＤは、例えば、上記（Ａ）および（Ｂ）の書込処理の場合、ＨＤＤ１，ＨＤＤ３である。また、上記（Ｃ）の書込処理の場合、書込要求に対する書込処理が実行されたＨＤＤはＨＤＤ３である。
【０１５０】
具体的には、例えば、判断部５０８が、ストレージシステム３００の起動通知をＣＰＵ３０１から受け付けた場合、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断する。また、判断部５０８が、書込要求に対する書込処理が実行されたＨＤＤから起動完了通知を受け付けた場合、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断することにしてもよい。
【０１５１】
書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写されたデータＤｉを複写元のＬＢＡに書き込むよう指示する機能を有する。ここで、データＤｉの複写元のＬＢＡとは、書込要求の要求先のＨＤＤｋのＬＢＡｊである。
【０１５２】
また、書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡに書き込むよう指示する機能を有する。ここで、パリティデータＰｊの複写元のＬＢＡは、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの記憶先のＬＢＡｊである。
【０１５３】
図８に示した例では、書込指示部５０９が、ＨＤＤコントローラ３０９に対して、書込バッファＢ１に複写されたデータＤ１をＨＤＤ１のＬＢＡ１に書き込むよう指示する。この結果、ＨＤＤコントローラ３０９が、書込バッファＢ１に記憶されているデータＤ１を読み出して、ＨＤＤ１のＬＢＡ１に書き込む。この際、ＨＤＤコントローラ３０９は、例えば、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１のうち、アクセス可能な任意の書込バッファＢ１からデータＤ１を読み出す。これにより、データＤ１がＨＤＤ１の複写元のＬＢＡ１に書き戻される。
【０１５４】
また、書込指示部５０９が、ＨＤＤコントローラ３０９に対して、書込バッファＢ２に複写されたパリティデータＰ１をＨＤＤ３のＬＢＡ１に書き込むよう指示する。この結果、ＨＤＤコントローラ３０９が、書込バッファＢ２に記憶されているパリティデータＰ１を読み出して、ＨＤＤ３のＬＢＡ１に書き込む。この際、ＨＤＤコントローラ３０９は、例えば、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２のうち、アクセス可能な任意の書込バッファＢ２からパリティデータＰ１を読み出す。これにより、パリティデータＰ１がＨＤＤ３の複写元のＬＢＡ１に書き戻される。この結果、ＨＤＤ１とＨＤＤ３との間のデータの整合性をとることができる。
【０１５５】
なお、書込指示部５０９は、書込バッファＢに複数のパリティデータが複写されている場合、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写された複数のパリティデータを複写元のＬＢＡにそれぞれ書き込むよう指示する。例えば、ＲＡＩＤ６のストレージシステムの場合、複写指示部５０４が、ＨＤＤコントローラ３０９に対して、書込バッファＢに複写された２種類のパリティデータを複写元のＬＢＡにそれぞれ書き込むよう指示する。
【０１５６】
ここで、ストレージシステム３００をマルチデッド状態から非冗長構成に戻す場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、ＨＤＤ２がオフラインとなっている非冗長構成のストレージシステム３００において、書込要求６００に対する書込処理（上記（Ｂ））が実行された場合を例に挙げて説明する。
【０１５７】
図１１は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その１）である。図１１の（１１−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに成功し、ＨＤＤ３のＬＢＡ１に対する新たなパリティデータＰ１＃の書き込みに失敗している。
【０１５８】
具体的には、ＨＤＤ３のＬＢＡ１に対してパリティデータＰ１＃の一部を書き込めなかったため、ＨＤＤ３のＬＢＡ１の記憶内容がパリティデータＰ１＃とは異なるパリティデータＰｘとなっている。この場合、ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０１５９】
図１１の（１１−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ３が再起動されて、ストレージシステム３００がマルチデッド状態から非冗長構成に復旧されている。ここで、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、本来のパリティデータＰ１＃とは異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０１６０】
図１１の（１１−３）において、書込バッファＢ１に複写されたデータＤ１がＨＤＤ１のＬＢＡ１に書き込まれ、書込バッファＢ２に複写されたパリティデータＰ１がＨＤＤ３のＬＢＡ１に書き込まれる。この結果、ＨＤＤ１、ＨＤＤ３は書込み処理開始前の状態に復帰するので、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保され、オフラインとなっているＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することが可能となる。
【０１６１】
＜書込失敗時に、複写したデータＤｉとパリティデータＰｊを書き戻す＞
上述した説明では、書込要求に対する書込処理が実行されたＨＤＤが再起動されると、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡに書き込むことにしたが、これに限らない。
【０１６２】
ストレージシステム３００の電源のＯＦＦ／ＯＮは、瞬時停電などが原因で発生する場合がある。このため、書込要求に対する書込処理が正常に完了した後、瞬時停電によりストレージシステム３００の電源がＯＦＦ／ＯＮされ、ストレージシステム３００が再起動される場合がある。この場合、書込バッファＢに複写されたデータＤｉとパリティデータＰｊとが再起動後に複写元のＬＢＡに書き込まれると、複写元のＬＢＡの記憶内容が、書込要求に対する書込処理が実行される前の状態に戻ってしまう。
【０１６３】
そこで、書込指示部５０９は、成否判定部５０６によって書込処理が失敗したと判定され、かつ、判断部５０８によってＨＤＤが再起動されたと判断された場合に、書込バッファＢに複写されたデータＤｉを複写元のＬＢＡに書き込むことにしてもよい。同様に、書込指示部５０９は、成否判定部５０６によって書込処理が失敗したと判定され、かつ、判断部５０８によってＨＤＤが再起動されたと判断された場合に、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡに書き込むことにしてもよい。
【０１６４】
具体的には、例えば、まず、書込指示部５０９が、図７に示した書込状態テーブル７００の書込状態フラグが「０」となっているか否かを判断する。ここで、書込状態フラグが「０」の場合には、書込処理が行なわれていない状態にあるため、書込指示部５０９は、判断部５０８によってＨＤＤが再起動されたと判断されても、書込バッファＢに複写されたデータＤｉとパリティデータＰｊの複写元のＬＢＡに対する書き込みを行わない。
【０１６５】
一方、書込状態テーブル７００の書込状態フラグが「１」で、かつ、判断部５０８によってＨＤＤが再起動されたと判断された場合、書込処理中にＨＤＤが再起動され、書込要求に対する書込処理が正常に完了していないことを意味する。そのため書込指示部５０９が、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡに書き込む。これにより、書込要求に対する書込処理が成功した後、瞬時停電等の理由でＨＤＤが再起動された場合であっても、書込バッファＢに複写したデータＤｉとパリティデータＰｊを複写元のＬＢＡに書き戻すことを防ぐことができる。
【０１６６】
＜マルチデッド状態から冗長構成への復旧＞
また、上述した説明では、システムダウンしたストレージシステム３００を復旧する場合、ストレージシステム３００をシステムダウン直前の非冗長構成に戻す場合について説明したが、これに限らない。
【０１６７】
例えば、上記（Ａ）の冗長構成時の書込処理において、ＨＤＤ１に対する書込データＤ１＃の書き込みに失敗し、かつ、ＨＤＤ３に対するパリティデータＰ１＃の書き込みに失敗して、ストレージシステム３００がマルチデッド状態となる場合がある。この場合、システムダウンしたストレージシステム３００を復旧する際に、ストレージシステム３００をマルチデッド状態から冗長構成に戻すことにしてもよい。
【０１６８】
具体的には、例えば、まず、ＣＰＵ３０１またはユーザの操作入力により、システムダウンしたストレージシステム３００のハードリセットを行う。つぎに、ＣＰＵ３０１またはユーザの操作入力により、ストレージシステム３００を再起動する。この際、障害が発生したＨＤＤ１，ＨＤＤ３の両方をオンラインにする。これにより、ストレージシステム３００を冗長構成に戻すことができる。
【０１６９】
このあと、書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込処理の開始時に書込バッファＢに複写されたデータＤｉを複写元のＬＢＡに書き込む。また、書込指示部５０９は、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡに書き込む。
【０１７０】
ここで、ストレージシステム３００をマルチデッド状態から冗長構成に戻す場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、冗長構成のストレージシステム３００において、書込要求６００に対する書込処理（上記（Ａ））が実行された場合を例に挙げて説明する。
【０１７１】
図１２は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その２）である。図１２の（１２−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに失敗し、同時にＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みに失敗している。
【０１７２】
具体的には、ＨＤＤ１のＬＢＡ１に対して書込データＤ１＃の一部を書き込めなかったため、ＨＤＤ１のＬＢＡ１の記憶内容が書込データＤ１＃とは異なるデータＤｘとなっている。また、ＨＤＤ３のＬＢＡ１に対してパリティデータＰ１＃の一部を書き込めなかったため、ＨＤＤ３のＬＢＡ１の記憶内容がパリティデータＰ１＃とは異なるパリティデータＰｘとなっている。この場合、ＨＤＤ１，ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０１７３】
図１２の（１２−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ１，３が再起動されて、ストレージシステム３００がマルチデッド状態から冗長構成に復旧されている。ここで、ＨＤＤ１のＬＢＡ１に記憶されているデータＤｘは、当初ＨＤＤ１に記憶されていたデータＤ１および書込データＤ１＃のいずれとも異なるデータである。また、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、当初ＨＤＤ３に記憶されていたパリティデータＰ１およびパリティデータＰ１＃のいずれとも異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０１７４】
図１２の（１２−３）において、書込処理の開始時に書込バッファＢ１に複写されたデータＤ１がＨＤＤ１のＬＢＡ１に書き込まれ、書込バッファＢ２に複写されたパリティデータＰ１がＨＤＤ３のＬＢＡ１に書き込まれている。この結果、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保される。また、以降ＨＤＤ２がオフラインとなってもＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することが可能となる。
【０１７５】
また、冗長構成時の書込要求に対する書込処理において、要求先のＨＤＤｋに対するデータＤｉまたはパリティドライブに対するパリティデータＰｊの書き込みに失敗して非冗長構成となっても、システムの運用が可能である。このため、書込要求に対する書込処理が実行された結果、ストレージシステム３００が冗長構成から非冗長構成となっても、更新部５０２が、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。
【０１７６】
＜書込要求の要求先のＨＤＤｋがオフライン＞
また、上記（Ｃ）のように、オフラインとなっているＨＤＤ２のＬＢＡ１のデータＤ２を書込データＤ２＃に更新する場合、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１のみの更新が行われる。このため、オフラインのＨＤＤ２に対する書込要求があった場合は、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰ１のみの書込バッファへの複写を行えばよい。
【０１７７】
対象判定部５１０は、検出された検出結果に基づいて、書込要求の要求先のＨＤＤｋに障害が発生しているか否かを判定する機能を有する。具体的には、例えば、対象判定部５１０が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照して、要求先のＨＤＤｋの状態が「異常」となっているか否かを判定する。
【０１７８】
ここで、管理データ４１０，４２０，４３０うち少なくともいずれかの管理データにおいて、要求先のＨＤＤｋの状態が「異常」となっている場合、対象判定部５１０が、ＨＤＤｋに障害が発生していると判定する。一方、すべての管理データ４１０，４２０，４３０で、要求先のＨＤＤｋの状態が「正常」となっている場合、対象判定部５１０が、ＨＤＤｋに障害が発生していないと判定する。
【０１７９】
また、対象判定部５１０は、図１０に示した検出結果テーブル１０００を参照して、要求先のＨＤＤｋに障害が発生しているか否かを判定することにしてもよい。具体的には、例えば、検出結果テーブル１０００の中に、書込要求に含まれるＨＤＤ番号に対応するレコードがあるか否かを判定する。
【０１８０】
ここで、書込要求に含まれるＨＤＤ番号に対応するレコードがある場合、対象判定部５１０が、要求先のＨＤＤｋに障害が発生していると判定する。一方、検出結果テーブル１０００の中に、書込要求に含まれるＨＤＤ番号に対応するレコードがない場合、対象判定部５１０が、要求先のＨＤＤｋに障害が発生していないと判定する。
【０１８１】
複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊを書込バッファＢに複写する。また、複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉの書込バッファＢへの複写は行わない。
【０１８２】
この場合、判断部５０８は、パリティデータＰｊが書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、例えば、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込む。
【０１８３】
＜パリティドライブがオフライン＞
また、パリティドライブがオフラインとなっている場合、書込要求の要求先のＨＤＤｋのＬＢＡｊのデータＤｉのみの更新が行われる。このため、パリティドライブがオフラインとなっている場合は、書込要求の要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉのみの複写を行えばよい。
【０１８４】
対象判定部５１０は、検出された検出結果に基づいて、書込要求の要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの記憶先のＨＤＤに障害が発生しているか否かを判定する機能を有する。具体的には、例えば、対象判定部５１０が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照して、パリティドライブ（ＨＤＤ３）の状態が「異常」となっているか否かを判定する。
【０１８５】
ここで、管理データ４１０，４２０，４３０のうち少なくともいずれかの管理データにおいて、パリティドライブの状態が「異常」となっている場合、対象判定部５１０が、パリティドライブに障害が発生していると判定する。一方、すべての管理データ４１０，４２０，４３０において、パリティドライブの状態が「正常」となっている場合、対象判定部５１０が、パリティドライブに障害が発生していないと判定する。
【０１８６】
また、対象判定部５１０は、図１０に示した検出結果テーブル１０００を参照して、パリティドライブに障害が発生しているか否かを判定することにしてもよい。具体的には、例えば、検出結果テーブル１０００の中に、パリティドライブであるＨＤＤ３のＨＤＤ番号「３」に対応するレコードがあるか否かを判定する。
【０１８７】
ここで、ＨＤＤ３のＨＤＤ番号「３」に対応するレコードがある場合、対象判定部５１０が、パリティドライブに障害が発生していると判定する。一方、検出結果テーブル１０００の中に、ＨＤＤ３のＨＤＤ番号「３」に対応するレコードがない場合、対象判定部５１０が、パリティドライブに障害が発生していないと判定する。
【０１８８】
複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを書込バッファＢに複写する。また、複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを生成元とするパリティデータＰｊの書込バッファＢへの複写は行わない。
【０１８９】
この場合、判断部５０８は、データＤｉが書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、例えば、書込要求に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたデータＤｉを要求先のＨＤＤｋのＬＢＡｊに書き込む。
【０１９０】
＜書込データＤｉ＃の書込バッファＢへの複写＞
また、複写指示部５０４は、さらに、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写することにしてもよい。例えば、書込要求６００を受け付けた場合、複写指示部５０４が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写する。また、複写指示部５０４が、ＨＤＤコントローラ３０９を介して、ＨＤＤ１のＬＢＡ１に記憶されているデータＤ１を生成元とするパリティデータＰ１を各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写する。さらに、複写指示部５０４が、ＨＤＤコントローラ３０９を介して、書込要求６００に含まれる書込データＤ１＃を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３（図８参照）に複写する。
【０１９１】
この場合、判断部５０８は、データＤｉ、パリティデータＰｊおよび書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。例えば、判断部５０８が、データＤ１、パリティデータＰ１および書込データＤ１＃が書込バッファＢ１〜Ｂ３にそれぞれ複写された後、書込要求６００に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。
【０１９２】
そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたデータＤｉを要求先のＬＢＡｊに書き込む。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込む。
【０１９３】
このあと、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込データＤｉ＃を生成元とするパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込む。
【０１９４】
例えば、書込要求６００に対する書込処理が実行されたＨＤＤが再起動されたと判断された場合、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータＤ１を要求先のＨＤＤ１のＬＢＡ１に書き込む。また、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ２に複写されたパリティデータＰ１を複写元のＨＤＤ３のＬＢＡ１に書き込む。
【０１９５】
このあと、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤ１＃を生成元とするパリティデータＰ１＃を算出する。そして、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤ１＃を要求先のＨＤＤ１のＬＢＡ１に書き込む。また、書込指示部５０９が、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰ１＃を、パリティデータＰ１の複写元のＨＤＤ３のＬＢＡ１に書き込む。
【０１９６】
これにより、書込バッファＢに複写したデータＤｉとパリティデータＰｊを書き戻して再起動後のＨＤＤ間のデータの整合性を確保した後、書込バッファＢに複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０１９７】
また、更新部５０２は、上記書込指示部５０９によって指示された各種データの書込処理（以下、「データ書込処理」という）が成功した場合、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。すなわち、例えば、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き戻したことで、ＨＤＤ間のデータの整合性が確保されたため、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更する。
【０１９８】
また、更新部５０２は、書込状態テーブル７００の書込状態フラグが「１」から「０」に変更された場合、書込バッファＢを初期化することにしてもよい。すなわち、書込要求に対する書込処理またはデータ書込処理に成功した場合、更新部５０２が、書込バッファＢ１〜Ｂ３に複写されたデータＤｉ、パリティデータＰｊおよび書込データＤｉ＃を破棄する。
【０１９９】
また、上記書込指示部５０９によって指示されたデータ書込処理に失敗した場合、以降において、データＤｉの読出時に、書込バッファＢに複写されたデータＤｉを読出データとして用いることにしてもよい。また、データ書込処理に失敗した場合、以降において、パリティデータＰｊの読出時に、書込バッファＢに複写されたパリティデータＰｊを読出データとして用いることにしてもよい。また、データ書込処理に失敗した場合、以降において、書込データＤｉ＃の読出時に、書込バッファＢに複写された書込データＤｉ＃を読出データとして用いることにしてもよい。これにより、新たな書込要求を受け付けるまでの間、ストレージシステム３００を正常に運用することができる。
【０２００】
＜データＤｉとパリティデータＰｊの複写が不要なパターン＞
また、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する場合、要求先のＨＤＤｋのＬＢＡｊのデータＤｉと、データＤｉを生成元とするパリティデータＰｊの書込バッファＢへの複写が不要となる場合がある。すなわち、データＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き戻して書込要求を受け付ける直前の状態に戻すことなく、書込要求に対する書込処理を再実行することができる場合がある。
【０２０１】
具体的には、書込要求に対する書込処理の実行時に、オフラインとなっているＨＤＤのデータを復元する必要がない場合は、データＤｉとパリティデータＰｊの書込バッファＢへの複写が不要となる。ここで、データＤｉとパリティデータＰｊの書込バッファＢへの複写が不要となるパターン１〜パターン３について説明する。
【０２０２】
（パターン１）冗長構成時に書込要求を受け付けた場合
ストレージシステム３００が冗長構成の場合、書込バッファＢに複写されたデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き込むことなく、書込バッファＢに複写された書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。そこで、上記判断部５０８により、ストレージシステム３００が冗長構成か否かを判断する。
【０２０３】
ここで、ＲＡＩＤ３，５，６等のストレージシステムは、障害が発生したＨＤＤの台数ｘが、パリティドライブの台数Ｙ未満の場合に冗長構成となる。このため、判断部５０８が、検出された検出結果に基づいて、障害が発生したＨＤＤの台数ｘがパリティドライブの台数Ｙ未満か否かを判断する。ストレージシステム３００のパリティドライブの台数Ｙは「Ｙ＝１」のため、判断部５０８が、障害が発生したＨＤＤの台数ｘが「ｘ＝０」か否かを判断する。
【０２０４】
そして、複写指示部５０４は、障害が発生したＨＤＤの台数ｘがパリティドライブの台数Ｙ未満と判断された場合、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する。また、複写指示部５０４は、障害が発生したＨＤＤの台数ｘがパリティドライブの台数Ｙ未満と判断された場合、データＤｉとパリティデータＰｊの書込バッファＢへの複写は行わない。
【０２０５】
この場合、判断部５０８は、書込要求に含まれる書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込データＤｉ＃を生成元とするパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込む。
【０２０６】
これにより、データＤｉおよびパリティデータＰｊの書込バッファＢに対する複写処理、および書込バッファＢに複写されたデータＤｉおよびパリティデータＰｊの複写元のＬＢＡｊに対するデータ書込処理を削減できる。
【０２０７】
ここで、冗長構成時に書込要求を受け付けた場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、冗長構成のストレージシステム３００において、書込要求６００に対する書込処理（上記（Ａ））が実行された場合を例に挙げて説明する。
【０２０８】
図１３は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その３）である。図１３の（１３−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに失敗し、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みに失敗している。この場合、ＨＤＤ１，ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０２０９】
図１３の（１３−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ１，３が再起動されて、ストレージシステム３００がマルチデッド状態から冗長構成に復旧されている。ここで、ＨＤＤ１のＬＢＡ１に記憶されているデータＤｘは、データＤ１および書込データＤ１＃のいずれとも異なるデータである。また、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、パリティデータＰ１およびパリティデータＰ１＃のいずれとも異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０２１０】
図１３の（１３−３）において、書込バッファＢ３に複写された書込データＤ１＃がＨＤＤ１のＬＢＡ１に書き込まれている。また、書込バッファＢ３に複写された書込データＤ１＃を生成元とするパリティデータＰ１＃（Ｐ１＃＝Ｄ１＃  ｘｏｒ  Ｄ２）がＨＤＤ３のＬＢＡ１に書き込まれている。この結果、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保され、ＨＤＤ２がオフラインとなってもＨＤＤ２のＬＢＡ１に記憶されているデータＤ２を復元することが可能となる。
【０２１１】
（パターン２）要求先のＨＤＤｋがオフライン
要求先のＨＤＤｋがオフラインの場合、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込むことなく、書込バッファＢに複写された書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２１２】
そこで、複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する。また、複写指示部５０４は、要求先のＨＤＤｋに障害が発生していると判定された場合、データＤｉとパリティデータＰｊの書込バッファＢへの複写は行わない。
【０２１３】
この場合、判断部５０８は、書込要求に含まれる書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込データＤｉ＃を生成元とするパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込む。
【０２１４】
これにより、パリティデータＰｊの書込バッファＢに対する複写処理、および書込バッファＢに複写されたパリティデータＰｊの複写元のＬＢＡｊに対するデータ書込処理を削減できる。
【０２１５】
ここで、要求先のＨＤＤｋがオフラインの書込要求を受け付けた場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、ＨＤＤ２がオフラインとなっている非冗長構成時に、ＨＤＤ２のＬＢＡ１のデータＤ２を書込データＤ２＃に更新する書込要求に対する書込処理（上記（Ｃ））が実行された場合を例に挙げて説明する。
【０２１６】
図１４は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その４）である。図１４の（１４−１）において、ＨＤＤ２のＬＢＡ１のデータＤ２をデータＤ２＃に更新する書込要求に対する書込処理が実行された結果、ＨＤＤ３のＬＢＡ１に対するパリティデータＰ１＃の書き込みに失敗している。この場合、ＨＤＤ３が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０２１７】
図１４の（１４−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ３が再起動されて、ストレージシステム３００がマルチデッド状態から非冗長構成に復旧されている。ここで、ＨＤＤ３のＬＢＡ１に記憶されているパリティデータＰｘは、パリティデータＰ１と異なるデータである。したがって、この時点では、ＨＤＤ１，ＨＤＤ３間でデータの不整合が発生している。
【０２１８】
図１４の（１４−３）において、書込バッファＢ３に複写された書込データＤ２＃を生成元とするパリティデータＰ１＃（Ｐ１＃＝Ｄ１  ｘｏｒ  Ｄ２＃）がＨＤＤ３のＬＢＡ１に書き込まれている。この結果、ＨＤＤ１，ＨＤＤ３間でデータの整合性が確保され、以降において、オフラインとなっているＨＤＤ２のＬＢＡ１の書込データＤ２＃を復元することが可能となる。
【０２１９】
（パターン３）パリティドライブがオフライン
パリティドライブがオフラインの場合、書込バッファＢに複写されたデータＤｉを複写元のＬＢＡｊに書き込むことなく、書込バッファＢに複写された書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２２０】
そこで、複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を書込バッファＢに複写する。また、複写指示部５０４は、パリティドライブに障害が発生していると判定された場合、データＤｉとパリティデータＰｊの書込バッファＢへの複写は行わない。
【０２２１】
この場合、判断部５０８は、書込要求に含まれる書込データＤｉ＃が書込バッファＢに複写された後、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する。そして、書込指示部５０９は、ＨＤＤが再起動されたと判断された場合、ＨＤＤコントローラ３０９を介して、書込バッファＢに複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む。これにより、データＤｉの書込バッファＢに対する複写処理、および書込バッファＢに複写されたデータＤｉの複写元のＬＢＡｊに対するデータ書込処理を削減できる。
【０２２２】
ここで、パリティドライブがオフラインのときに書込要求を受け付けた場合のＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例について説明する。ここでは、ＨＤＤ３がオフラインとなっている非冗長構成時に、書込要求６００に対する書込処理が実行された場合を例に挙げて説明する。
【０２２３】
図１５は、ＨＤＤ１〜ＨＤＤ３のＬＢＡ１の記憶内容の変遷例を示す説明図（その５）である。図１５の（１５−１）において、書込要求６００に対する書込処理が実行された結果、ＨＤＤ１のＬＢＡ１に対する書込データＤ１＃の書き込みに失敗している。この場合、ＨＤＤ１が、障害が発生したＨＤＤとして検出されてオフラインとなる。このため、ストレージシステム３００がマルチデッド状態となりシステムダウンする。
【０２２４】
図１５の（１５−２）において、ストレージシステム３００のハードリセットが行われた結果、ＨＤＤ１が再起動されて、ストレージシステム３００がマルチデッド状態から非冗長構成に復旧されている。ここで、ＨＤＤ１のＬＢＡ１に記憶されているデータＤｘは、データＤ１および書込データＤ１＃のいずれとも異なるデータである。
【０２２５】
図１５の（１５−３）において、書込バッファＢ３に複写された書込データＤ１＃がＨＤＤ１のＬＢＡ１に書き込まれている。
【０２２６】
また、上述した説明では、書込バッファＢを、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６にそれぞれ設ける場合を例に挙げて説明したが、不揮発性メモリ３０８に設けることにしてもよい。不揮発性メモリ３０８に書込バッファＢを設けた場合、複写指示部５０４や書込指示部５０９が、ＨＤＤコントローラ３０９を介すことなく、書込バッファＢに直接アクセスできる。また、複写指示部５０４が、データＤｉやパリティデータＰｊ等を書込バッファＢに複写するために、複数のＨＤＤ１〜ＨＤＤ３にアクセスする必要がない。
【０２２７】
このため、不揮発性メモリ３０８に書込バッファＢを設ける場合、各ＨＤＤ１〜ＨＤＤ３に書込バッファＢを設ける場合に比べて、複写指示部５０４によるデータ複写処理および書込指示部５０９によるデータ書込処理の高速化を図ることができる。一方、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４，３１５，３１６に書込バッファＢを設ける場合は、不揮発性メモリ３０８に記憶するデータ量を抑えることができる。
【０２２８】
＜障害が発生したＨＤＤの順序特定＞
ここで、障害が発生した複数のＨＤＤについて、障害が発生した順序を特定する具体的な処理内容の一例について説明する。まず、図９中（９−２）に示した各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を用いて、障害が発生した順序を特定する場合について説明する。
【０２２９】
具体的には、例えば、プロセッサ３０６が、ＨＤＤコントローラ３０９を介して、各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０を参照する。そして、プロセッサ３０６が、管理データ４１０，４２０，４３０の少なくともいずれかの管理データにおいて、状態が「異常」となっているＨＤＤ２，ＨＤＤ３を特定する。
【０２３０】
つぎに、プロセッサ３０６が、ＨＤＤコントローラ３０９を介して、特定されたＨＤＤ２の管理データ４２０のアクセスログを参照して、ＨＤＤ２に最後にアクセスしたアクセス時刻（以下、「アクセス時刻ｔ１」という）を特定する。また、プロセッサ３０６が、ＨＤＤコントローラ３０９を介して、特定されたＨＤＤ３の管理データ４３０のアクセスログを参照して、ＨＤＤ３に最後にアクセスしたアクセス時刻（以下、「アクセス時刻ｔ２」という）を特定する。
【０２３１】
そして、プロセッサ３０６が、特定されたアクセス時刻ｔ１とアクセス時刻ｔ２とを比較して、ＨＤＤ２，ＨＤＤ３について、障害が発生した順序を特定する。具体的には、例えば、プロセッサ３０６が、ＨＤＤ２，ＨＤＤ３について、アクセス時刻が古い順に障害が発生したと特定する。
【０２３２】
ここでは、アクセス時刻ｔ１のほうがアクセス時刻ｔ２に比べて古い場合を想定する。このため、プロセッサ３０６が、ＨＤＤ２に障害が発生した後、ＨＤＤ３に障害が発生したことを特定する。また、管理データ４１０，４２０，４３０のアクセスログから障害が発生した順序を特定する場合を例に挙げて説明したが、各ＨＤＤ１〜ＨＤＤ３の起動時刻から障害が発生した順序を特定することにしてもよい。具体的には、例えば、プロセッサ３０６が、ＨＤＤ２，ＨＤＤ３について、起動時刻が古い順に障害が発生したと特定することにしてもよい。
【０２３３】
つぎに、図１０に示した検出結果テーブル１０００を用いて、障害が発生した順序を特定する場合について説明する。各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０は、ＨＤＤの障害により適切に更新されていない場合がある。このため、プロセッサ３０６は、検出結果テーブル１０００を参照して、障害が発生した複数のＨＤＤについて、障害が発生した順序を特定することにしてもよい。
【０２３４】
図１０に示した（１０−２）の例では、まず、プロセッサ３０６が、検出結果テーブル１０００のＨＤＤ番号を参照して、障害が発生したＨＤＤ２，ＨＤＤ３を特定する。そして、プロセッサ３０６が、検出結果テーブル１０００の検出時刻を参照して、障害が発生した複数のＨＤＤ２，ＨＤＤ３について、障害が発生した順序を特定する。
【０２３５】
具体的には、例えば、プロセッサ３０６が、ＨＤＤ２，ＨＤＤ３について、検出時刻が古い順に障害が発生したと特定する。ここでは、ＨＤＤ２の検出時刻「２０１０／０８／２３  ０２：１１：５５」のほうが、ＨＤＤ３の検出時刻「２０１０／０８／２４  １２：０９：２２」に比べて古い。このため、プロセッサ３０６が、ＨＤＤ２に障害が発生した後、ＨＤＤ３に障害が発生したことを特定する。
【０２３６】
（ストレージ制御装置１０１のストレージ制御処理手順）
つぎに、実施の形態１にかかるストレージ制御装置１０１のストレージ制御処理手順について説明する。
【０２３７】
図１６および図１７は、実施の形態１にかかるストレージ制御装置のデータ複写処理手順の一例を示すフローチャートである。図１６のフローチャートにおいて、まず、受付部５０１により、ＨＤＤｋのＬＢＡｊに対する書込要求を受け付けたか否かを判断する（ステップＳ１６０１）。
【０２３８】
ここで、書込要求を受け付けるのを待って（ステップＳ１６０１：Ｎｏ）、受け付けた場合（ステップＳ１６０１：Ｙｅｓ）、判断部５０８により、障害が発生したＨＤＤの台数ｘが「ｘ＝０」か否かを判断する（ステップＳ１６０２）。
【０２３９】
ここで、「ｘ＝０」の場合（ステップＳ１６０２：Ｙｅｓ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「０」から「１」に変更する（ステップＳ１６０３）。さらに、更新部５０２により、受け付けた書込要求に含まれるＨＤＤ番号「ｋ」とＬＢＡ番号「ｊ」を、書込状態テーブル７００に書き込む（ステップＳ１６０４）。
【０２４０】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれる書込データＤｉ＃を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ１６０５）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行して（ステップＳ１６０６）、図１７に示すステップＳ１７０１に移行する。
【０２４１】
また、ステップＳ１６０２において、障害が発生したＨＤＤの台数ｘが「ｘ≠０」の場合（ステップＳ１６０２：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込状態フラグが「１」か否かを判断する（ステップＳ１６０７）。
【０２４２】
ここで、書込状態フラグが「０」の場合（ステップＳ１６０７：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「０」から「１」に変更する（ステップＳ１６０８）。さらに、更新部５０２により、受け付けた書込要求に含まれるＨＤＤ番号「ｋ」とＬＢＡ番号「ｊ」を、書込状態テーブル７００に書き込む（ステップＳ１６０９）。
【０２４３】
つぎに、対象判定部５１０により、パリティドライブに障害が発生しているか否かを判定する（ステップＳ１６１０）。ここで、パリティドライブに障害が発生している場合（ステップＳ１６１０：Ｙｅｓ）、ステップＳ１６０５に移行する。
【０２４４】
一方、パリティドライブに障害が発生していない場合（ステップＳ１６１０：Ｎｏ）、対象判定部５１０により、書込要求の要求先のＨＤＤｋに障害が発生しているか否かを判定する（ステップＳ１６１１）。ここで、書込要求の要求先のＨＤＤｋに障害が発生している場合（ステップＳ１６１１：Ｙｅｓ）、ステップＳ１６０５に移行する。
【０２４５】
一方、書込要求の要求先のＨＤＤｋに障害が発生していない場合（ステップＳ１６１１：Ｎｏ）、ステップＳ１６１２に移行する。そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求の要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写する（ステップＳ１６１２）。
【０２４６】
また、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータＤｉを生成元とするパリティデータＰｊを、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写する（ステップＳ１６１３）。さらに、複写指示部５０４により、書込要求に含まれる書込データＤｉ＃を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写して（ステップＳ１６１４）、ステップＳ１６０６に移行する。
【０２４７】
また、ステップＳ１６０７において、書込状態フラグが「１」の場合（ステップＳ１６０７：Ｙｅｓ）、ステップＳ１６１５に移行する。そして、検出部５０７により、ＨＤＤコントローラ３０９を介して、オンラインのＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の、書き込みに失敗したＨＤＤの状態を「正常」から「異常」に変更する（ステップＳ１６１５）。書き込みに失敗したＨＤＤは、例えば、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに設定されているＨＤＤ番号から特定される。
【０２４８】
このあと、検出部５０７により、書き込みに失敗したＨＤＤをオフラインにする（ステップＳ１６１６）。そして、判断部５０８により、障害が発生したＨＤＤの台数が２台以上となったことをＣＰＵ３０１に通知することで、ストレージシステム３００がシステムダウンして（ステップＳ１６１７）、本フローチャートによる一連の処理を終了する。
【０２４９】
なお、ステップＳ１６０７において、書込状態フラグが「１」となるのは（ステップＳ１６０７：Ｙｅｓ）、後述する図１８に示すステップＳ１８０４において、データ書込処理に失敗した場合（ステップＳ１８０４：Ｎｏ）である。
【０２５０】
図１７のフローチャートにおいて、まず、成否判定部５０６により、図１６に示したステップＳ１６０６において実行された書込要求に対する書込処理が成功したか否かを判定する（ステップＳ１７０１）。ここで、書込要求に対する書込処理が成功した場合（ステップＳ１７０１：Ｙｅｓ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更して（ステップＳ１７０２）、ステップＳ１７０４に移行する。
【０２５１】
一方、書込要求に対する書込処理が失敗した場合（ステップＳ１７０１：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込失敗ＨＤＤ番号のフィールドに、データの書き込みに失敗したＨＤＤのＨＤＤ番号を書き込む（ステップＳ１７０３）。このあと、検出部５０７により、障害が発生したＨＤＤが検出されたか否かを判断する（ステップＳ１７０４）。
【０２５２】
ここで、障害が発生したＨＤＤが検出されなかった場合（ステップＳ１７０４：Ｎｏ）、本フローチャートによる一連の処理を終了する。一方、障害が発生したＨＤＤが検出された場合（ステップＳ１７０４：Ｙｅｓ）、ステップＳ１７０５に移行する。そして、検出部５０７により、ＨＤＤコントローラ３０９を介して、オンラインのＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の、障害が発生したＨＤＤの状態を「正常」から「異常」に変更する（ステップＳ１７０５）。
【０２５３】
このあと、検出部５０７により、ＨＤＤコントローラ３０９を介して、障害が発生したＨＤＤをオフラインにする（ステップＳ１７０６）。そして、判断部５０８により、障害が発生したＨＤＤの台数ｘが「ｘ≧２」か否かを判断する（ステップＳ１７０７）。ここで、「ｘ＜２」の場合（ステップＳ１７０７：Ｎｏ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更して（ステップＳ１７０８）、本フローチャートによる一連の処理を終了する。
【０２５４】
一方、「ｘ≧２」の場合（ステップＳ１７０７：Ｙｅｓ）、ステップＳ１７０９に移行する。そして、判断部５０８により、障害が発生したＨＤＤの台数が２台以上となったことをＣＰＵ３０１に通知することで、ストレージシステム３００がシステムダウンして（ステップＳ１７０９）、本フローチャートによる一連の処理を終了する。
【０２５５】
これにより、パリティデータＰｊの更新を伴うデータＤｉの更新時に、更新前のデータＤｉ、パリティデータＰｊおよび書込データＤｉ＃を書込バッファＢに退避しておくことができる。また、冗長構成時に書込要求を受け付けた場合は、書込データＤｉ＃のみを書込バッファＢに退避しておくことができる。また、要求先のＨＤＤｋまたはパリティドライブがオフラインの場合は、書込データＤｉ＃のみを書込バッファＢに退避しておくことができる。
【０２５６】
つぎに、実施の形態１にかかるストレージ制御装置１０１のシステム復旧処理手順について説明する。ここでは、システムダウンしたストレージシステム３００をシステムダウン直前の非冗長構成に復旧する場合を例に挙げて説明する。ただし、ストレージシステム３００のハードリセットが行われた後、障害が発生した複数のＨＤＤのうち最後にオフラインとなったＨＤＤをオンラインにして、ストレージシステム３００が再起動された場合を想定する。
【０２５７】
図１８は、実施の形態１にかかるストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。図１８のフローチャートにおいて、まず、判断部５０８により、書込要求に対する書込処理が実行されたＨＤＤが再起動されたか否かを判断する（ステップＳ１８０１）。
【０２５８】
ここで、ＨＤＤが再起動されるのを待って（ステップＳ１８０１：Ｎｏ）、再起動された場合（ステップＳ１８０１：Ｙｅｓ）、書込指示部５０９により、書込状態テーブル７００の書込状態フラグが「１」か否かを判断する（ステップＳ１８０２）。ここで、書込状態フラグが「０」の場合（ステップＳ１８０２：Ｎｏ）、本フローチャートによる一連の処理を終了する。
【０２５９】
一方、書込状態フラグが「１」の場合（ステップＳ１８０２：Ｙｅｓ）、書込指示部５０９により、データ書込処理を実行する（ステップＳ１８０３）。データ書込処理の具体的な処理手順については後述する。このあと、成否判定部５０６により、データ書込処理が成功したか否かを判断する（ステップＳ１８０４）。
【０２６０】
ここで、データ書込処理に成功した場合（ステップＳ１８０４：Ｙｅｓ）、更新部５０２により、書込状態テーブル７００の書込状態フラグを「１」から「０」に変更して（ステップＳ１８０５）、本フローチャートによる一連の処理を終了する。一方、データ書込処理に失敗した場合（ステップＳ１８０４：Ｎｏ）、本フローチャートによる一連の処理を終了する。
【０２６１】
つぎに、ステップＳ１８０３のデータ書込処理の具体的な処理手順の一例について説明する。ステップＳ１８０３のデータ書込処理は、図１６に示したステップＳ１６０６の書込処理を、どのステップを経由して実行したかによって異なる。ここでは一例として、図１６に示した（ステップＳ１６１１：Ｎｏ）を経由した場合のデータ書込処理の具体的な処理手順について説明する。
【０２６２】
図１９は、ステップＳ１８０３のデータ書込処理の具体的な処理手順の一例を示すフローチャートである。図１９のフローチャートにおいて、まず、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータＤｉを要求先のＬＢＡｊに書き込む（ステップＳ１９０１）。
【０２６３】
つぎに、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ２に複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込む（ステップＳ１９０２）。このあと、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤｉ＃を生成元とするパリティデータＰｊ＃を算出する（ステップＳ１９０３）。
【０２６４】
つぎに、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写された書込データＤｉ＃を要求先のＬＢＡｊに書き込む（ステップＳ１９０４）。そして、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、算出されたパリティデータＰｊ＃を、パリティデータＰｊの複写元のＬＢＡｊに書き込んで（ステップＳ１９０５）、図１８に示したステップＳ１８０４に移行する。
【０２６５】
これにより、書込バッファＢに退避したデータＤｉとパリティデータＰｊを退避元に書き戻して再起動後のＨＤＤ間のデータの整合性を確保した後、書込バッファＢに退避した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２６６】
また、ステップＳ１８０４のデータ書込処理に失敗した場合は、新たな書込要求を受け付けるまでの間、書込バッファＢに退避されたデータＤｉ、パリティデータＰｊおよび書込データＤｉ＃を読出データとして用いることができる。また、ステップＳ１８０４のデータ書込処理に失敗した場合、ＨＤＤを再起動しても書込要求に対する書込処理に失敗したことを示すメッセージを、図３に示したディスプレイ３０４に表示して、ユーザに報知することにしてもよい。なお、上述したシステム復旧処理の実行後、障害が発生しているＨＤＤを交換してリビルドを行うことにより、ストレージシステム３００を冗長構成に戻すことにしてもよい。
【０２６７】
以上説明した実施の形態１にかかるストレージ制御装置１０１によれば、書込要求に対する書込処理の実行前に、要求先のＨＤＤｋのＬＢＡｊに記憶されているデータＤｉを書込バッファＢに複写することができる。また、ストレージ制御装置１０１によれば、書込要求に対する書込処理の実行前に、データＤｉを生成元とするパリティデータＰｊを書込バッファＢに複写することができる。これにより、パリティデータＰｊの更新を伴うデータＤｉの更新時に、更新前のデータＤｉとパリティデータＰｊを書込バッファＢに退避しておくことができる。
【０２６８】
また、ストレージ制御装置１０１によれば、書込要求に対する書込処理が実行されたＨＤＤが再起動された場合、書込バッファＢに複写されたデータＤｉを要求先のＨＤＤｋのＬＢＡｊに書き込むことができる。また、ストレージ制御装置１０１によれば、書込要求に対する書込処理が実行されたＨＤＤが再起動された場合、書込バッファＢに複写されたパリティデータＰｊを複写元のＬＢＡｊに書き込むことができる。これにより、サーマル・オフトラック等の障害によりＨＤＤに対する書き込みに失敗しても、ＨＤＤの再起動後に、書込バッファＢに退避したデータＤｉとパリティデータＰｊを退避元のＬＢＡｊに書き戻して、ＨＤＤ間のデータの整合性をとることができる。
【０２６９】
また、ストレージ制御装置１０１によれば、書込要求に対する書込処理に失敗し、かつ、書込処理が実行されたＨＤＤが再起動された場合に、書込バッファＢに複写したデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き込むことができる。これにより、書込要求に対する書込処理が成功した後、瞬時停電等の理由でＨＤＤが再起動されたとしても、書込バッファＢに退避したデータＤｉとパリティデータＰｊを退避元のＬＢＡｊに書き戻すことを防ぐことができる。
【０２７０】
また、ストレージ制御装置１０１によれば、書込要求に対する書込処理の実行前に、書込要求に含まれる書込データＤｉ＃を、書込バッファＢに複写することができる。また、ストレージ制御装置１０１によれば、書込バッファＢに複写したデータＤｉとパリティデータＰｊを複写元のＬＢＡｊに書き戻した後、書込バッファＢに複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。これにより、データＤｉとパリティデータＰｊを退避元に書き戻して再起動後のＨＤＤ間のデータの整合性を確保した後、書込要求に対する書込処理を再実行することができる。
【０２７１】
また、ストレージ制御装置１０１によれば、要求先のＨＤＤｋがオフラインの場合、書込データＤｉ＃を書込バッファＢに複写し、書込失敗によるＨＤＤの再起動後に、複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２７２】
また、ストレージ制御装置１０１によれば、パリティドライブがオフラインの場合、書込データＤｉ＃を書込バッファＢに複写し、書込失敗によるＨＤＤの再起動後に、複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２７３】
また、ストレージ制御装置１０１によれば、冗長構成時に書込要求を受け付けた場合、書込データＤｉ＃を書込バッファＢに複写し、書込失敗によるＨＤＤの再起動後に、複写した書込データＤｉ＃を用いて、書込要求に対する書込処理を再実行することができる。
【０２７４】
これらのことから、実施の形態１にかかるストレージ制御装置１０１によれば、ストレージシステムの復旧時におけるＨＤＤ間のデータの整合性を保障することができる。これにより、書込失敗によるＨＤＤ間のデータの不整合が原因で発生する読出データのデータ化けを防いで、システムが起動しなくなったり、システムが誤動作することを回避することができる。
【０２７５】
なお、上述した説明では、ストレージ制御装置１０１が制御部５０３を備えることとしたが、各ＨＤＤ１〜ＨＤＤ３が制御部５０３を備えることにしてもよい。この場合、各ＨＤＤ１〜ＨＤＤ３の制御部５０３は、例えば、ストレージ制御装置１０１の複写指示部５０４、実行部５０５および書込指示部５０９の指示にしたがって、各ＨＤＤ１〜ＨＤＤ３に対するアクセスを制御する。
【０２７６】
（実施の形態２）
つぎに、実施の形態２にかかるストレージ制御装置１０１について説明する。実施の形態２では、ストレージ制御装置１０１をＲＡＩＤ５のストレージシステム２０００に適用する。ＲＡＩＤ５は、データ群の各データを複数のＨＤＤに分散して記録するとともに、データ群から生成されるパリティデータを複数のＨＤＤに分散して記録する方式である。
【０２７７】
すなわち、ＲＡＩＤ５のストレージシステム２０００では、ＲＡＩＤ３のストレージシステムのようにパリティデータを専用のＨＤＤ（パリティドライブ）に記録するのではなく、複数のＨＤＤにパリティデータを分散して記録する。なお、実施の形態１で説明した箇所と同一箇所については、同一符号を付して図示および説明を省略する。
【０２７８】
（ストレージシステム２０００のハードウェア構成）
図２０は、実施の形態２にかかるストレージシステム２０００のハードウェア構成を示すブロック図である。図２０において、ストレージシステム２０００は、ＣＰＵ３０１と、メインメモリ３０２と、ディスプレイコントローラ３０３と、ディスプレイ３０４と、通信コントローラ３０５と、ストレージ制御装置１０１と、ＨＤＤ１〜ＨＤＤ３と、を備えている。ストレージ制御装置１０１は、プロセッサ３０６と、メモリ３０７と、不揮発性メモリ３０８と、ＨＤＤコントローラ３０９と、バスコントローラ３１０と、を備えている。
【０２７９】
ストレージシステム２０００において、各ＨＤＤ１〜ＨＤＤ３に対するアクセスはストリップ単位で行われる。ここで、ストリップとは、ハードディスクの複数のブロックを束ねた記憶領域である。ブロックとは、ハードディスクを同心円状に区切ったトラックから分割された複数のセクタを束ねた記憶領域である。
【０２８０】
図２０において、ＨＤＤ１のデータ領域３１１は、ストリップＡ、ストリップＣおよびストリップＰ３を含む構成である。また、ＨＤＤ２のデータ領域３１２は、ストリップＢ、ストリップＰ２およびストリップＥを含む構成である。また、ＨＤＤ３のデータ領域３１３は、ストリップＰ１、ストリップＤおよびストリップＦを含む構成である。
【０２８１】
ここで、ＨＤＤ１のストリップＡにはデータａ０が記憶されている。また、ＨＤＤ２のストリップＢにはデータｂ０が記憶されている。そして、ＨＤＤ３のストリップＰ１には、ストリップＡのデータａ０とストリップＢのデータｂ０の排他的論理和をとったパリティデータｐ１が記憶されている。
【０２８２】
ＨＤＤ１のストリップＣにはデータｃ０が記憶されている。また、ＨＤＤ３のストリップＤにはデータｄ０が記憶されている。そして、ＨＤＤ２のストリップＰ２には、ストリップＣのデータｃ０とストリップＤのデータｄ０の排他的論理和をとったパリティデータｐ２が記憶されている。
【０２８３】
ＨＤＤ２のストリップＥにはデータｅ０が記憶されている。また、ＨＤＤ３のストリップＦにはデータｆ０が記憶されている。そして、ＨＤＤ１のストリップＰ３には、ストリップＥのデータｅ０とストリップＦのデータｆ０の排他的論理和をとったパリティデータｐ３が記憶されている。
【０２８４】
（書込状態テーブル２１００の具体例）
つぎに、実施の形態２にかかる書込状態テーブル２１００の具体例について説明する。書込状態テーブル２１００は、書込要求に対する書込処理が正常に完了したか否かを特定するための書込状態情報を記憶する。また、書込状態テーブル２１００は、例えば、図２０に示した不揮発性メモリ３０８により実現される。
【０２８５】
図２１は、書込状態テーブル２１００の具体例を示す説明図である。図２１において、書込状態テーブル２１００は、書込状態フラグおよびストリップ番号のフィールドを有する。各フィールドに情報を設定することで、書込状態情報がレコードとして記憶されている。
【０２８６】
書込状態フラグは、書込要求に対する書込処理が正常に完了したか否かを示すフラグである。書込状態フラグは、初期状態では「０」であり、書込要求を受け付けると「０」から「１」に変更される。また、書込状態フラグは、書込要求に対する書込処理が正常に完了すると「１」から「０」に変更される。ストリップ番号は、書込要求の要求先のストリップの識別子である。
【０２８７】
（ストレージ制御装置１０１のストレージ制御処理手順）
つぎに、実施の形態２にかかるストレージ制御装置１０１のストレージ制御処理手順について説明する。ここでは、ストレージシステム２０００を銀行等のオンラインシステムに適用して、ユーザがＡＴＭ（Ａｕｔｏｍａｔｅｄ  Ｔｅｌｌｅｒ  Ｍａｃｈｉｎｅ）を用いて現金の入出金を行う場合を例に挙げて説明する。
【０２８８】
前提として、ストレージシステム２０００の電源が投入された結果、ストリップＡのデータａ０とストリップＢのデータｂ０が読み込まれてＯＳが正常に起動した場合を想定する。また、初期状態において、各ＨＤＤ１〜ＨＤＤ３の状態は「正常」である。以下、冗長構成時のストレージ制御装置１０１のストレージ制御処理手順について説明する。
【０２８９】
＜冗長構成時のストレージ制御処理手順＞
図２２〜図２４は、冗長構成時のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャートである。図２２のフローチャートにおいて、まず、受付部５０１により、ストリップＢのデータｂ０をデータｂ１に更新するための書込要求を受け付ける（ステップＳ２２０１）。書込要求は、要求先のストリップＢのストリップ番号「Ｂ」と、書込対象となるデータｂ１を含む。この例では、データｂ１は、ＯＳが起動したことを示すイベントログである。
【０２９０】
つぎに、更新部５０２により、図２１に示した書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２２０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｂ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２２０３）。
【０２９１】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｂ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２２０４）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２２０５）。
【０２９２】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｂ１をストリップＢに書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｂ１とストリップＡに記録されているデータａ０との排他的論理和をとったパリティデータｐ１（＃１）をストリップＰ１に書き込む。ここでは、書込要求に対する書込処理に成功した場合を想定する。
【０２９３】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更する（ステップＳ２２０６）。このあと、プロセッサ３０６により、ストリップＡのデータａ０とストリップＢのデータｂ１を読み込んで、運用プログラムを起動して（ステップＳ２２０７）、図２３に示すステップＳ２３０１に移行する。
【０２９４】
図２３のフローチャートにおいて、まず、受付部５０１により、ストリップＣのデータｃ０をデータｃ１に更新するための書込要求を受け付ける（ステップＳ２３０１）。書込要求は、要求先のストリップＣのストリップ番号「Ｃ」と、書込対象となるデータｃ１を含む。この例では、データｃ１は、１００，０００円の入金データである。
【０２９５】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２３０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｃ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２３０３）。
【０２９６】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２３０４）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２３０５）。
【０２９７】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ１をストリップＣに書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ１とストリップＤに記録されているデータｄ０との排他的論理和をとったパリティデータｐ２（＃１）を計算して、ストリップＰ２に書き込む。ここでは、書込要求に対する書込処理に成功した場合を想定する。
【０２９８】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２３０６）、図２４に示すステップＳ２４０１に移行する。この結果、ストリップＣに１００，０００円の入金データが記録される。
【０２９９】
図２４のフローチャートにおいて、まず、受付部５０１により、ストリップＤのデータｄ０をデータｄ１に更新するための書込要求を受け付ける（ステップＳ２４０１）。書込要求は、要求先のストリップＤのストリップ番号「Ｄ」と、書込対象となるデータｄ１を含む。データｄ１は、５，０００円の出金データである。
【０３００】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２４０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｄ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２４０３）。
【０３０１】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２４０４）。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２４０５）。
【０３０２】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ１をストリップＤに書き込む。また、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ１とストリップＣに記録されているデータｃ１との排他的論理和をとったパリティデータｐ２（＃２）を計算して、ストリップＰ２に書き込む。
【０３０３】
ここでは、書込要求に対する書込処理に成功する場合と、書込要求に対する書込処理に失敗する場合の両方を想定する。失敗例として、ストリップＤに対する書込要求に含まれるデータｄ１の書込中に、瞬時停電などによりストレージシステム２０００の電源が切断されて、データｄ１の一部をストリップＤに書き込めなかった場合を想定する。
【０３０４】
この場合、ストリップＤに記憶されているデータは、データｄ０およびデータｄ１のいずれとも異なるデータｄｘである。一方、ストリップＰ２へのパリティデータ書込みが成功した場合、ストリップＰ２に記憶されているパリティデータｐ２（＃２）は、データｄ１を用いて計算されたものである。したがって、この時点では、ストリップＤとストリップＰ２との間でデータの不整合が発生している。また、瞬時停電によりストレージシステム２０００の電源が切断された場合、ＣＰＵ３０１によってストレージシステム２０００の電源が再投入されて、ＨＤＤ１〜ＨＤＤ３が再起動される。
【０３０５】
図２４のフローチャートの説明に戻り、このあと、判断部５０８により、ＨＤＤが再起動されたか否かを判断する（ステップＳ２４０６）。ここで、ＨＤＤが再起動された場合（ステップＳ２４０６：Ｙｅｓ）、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写されたデータｄ１をストリップＤに書き込む（ステップＳ２４０７）。
【０３０６】
さらに、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、パリティデータｐ２（＃２）を計算してストリップＰ２に書き込む（ステップＳ２４０８）。パリティデータｐ２（＃２）は、書込バッファＢ３に複写されたデータｄ１と、ストリップＣに記憶されているデータｃ１とから計算される。そして、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２４０９）、本フローチャートによる一連の処理を終了する。
【０３０７】
一方、ステップＳ２４０６において、ＨＤＤが再起動されなかった場合（ステップＳ２４０６：Ｎｏ）、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２４０９）、本フローチャートによる一連の処理を終了する。
【０３０８】
このように、書込要求に対する書込処理の実行中に、瞬時停電等により電源が切断された場合であっても、電源投入後に、書込バッファＢ３に複写されたデータｄ１を用いて、書込要求に対する書込処理を再実行することができる。書込処理の再実行の結果、ストリップＤに５，０００円の出金データが記録される。このため、以降において、残高照会があった場合、ストリップＣのデータｃ１とストリップＤのデータｄ１から９５，０００円の残高データを参照することができる。
【０３０９】
＜非冗長構成時のストレージ制御処理手順＞
つぎに、非冗長構成時のストレージ制御装置１０１のストレージ制御処理手順について説明する。ここでは、ＨＤＤ１が故障してアクセス不能となった場合を例に挙げて説明する。ここで、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６に記憶されている管理データ４１０，４２０，４３０の更新例について説明する。
【０３１０】
図２５は、管理データ４１０，４２０，４３０の更新例を示す説明図（その２）である。図２５において、ＨＤＤ１に障害が発生した場合の各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の更新例が示されている。図２５中、上段はＨＤＤ１〜ＨＤＤ３が正常の状態であるときの管理データ４１０，４２０，４３０であり、下段はＨＤＤ１に障害が発生した後の管理データ４１０，４２０，４３０である。
【０３１１】
具体的には、管理データ４１０のＨＤＤ１の状態が「正常」から「（異常）」に更新されている。なお、「（異常）」は、ＨＤＤコントローラ３０９が管理データ４１０を更新できた場合に、管理データ４１０内のＨＤＤ１の状態が「異常」となることを表している。また、管理データ４２０のＨＤＤ１の状態が「正常」から「異常」に更新されている。また、管理データ４３０のＨＤＤ１の状態が「正常」から「異常」に更新されている。
【０３１２】
図２６および図２７は、非冗長構成時（ＨＤＤ１異常時）のストレージ制御装置１０１のストレージ制御処理手順の一例を示すフローチャートである。図２６のフローチャートにおいて、まず、受付部５０１により、ストリップＣのデータｃ１をデータｃ２に更新するための書込要求を受け付ける（ステップＳ２６０１）。書込要求は、要求先のストリップＣのストリップ番号「Ｃ」と、書込対象となるデータｃ２を含む。データｃ２は、５００，０００円の入金データである。
【０３１３】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２６０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｃ」を、「１」に変更された書込み状態フラグに対応する書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２６０３）。
【０３１４】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｃ２を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２６０４）。ただし、ＨＤＤ１の書込バッファＢ３にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ３に対するデータｃ２の複写は行われない。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２６０５）。
【０３１５】
具体的には、例えば、実行部５０５が、ＨＤＤコントローラ３０９を介して、ストリップＤからデータｄ１を読み出す。そして、実行部５０５が、データｄ１と書込要求に含まれるデータｃ２との排他的論理和をとったパリティデータｐ２（＃３）を計算して、ストリップＰ２に書き込む。ここでは、書込要求に対する書込処理に成功した場合を想定する。
【０３１６】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２６０６）、図２７に示すステップＳ２７０１に移行する。この結果、ストリップＰ２に５００，０００円の入金データが反映されたパリティデータｐ２（＃３）が書き込まれる。
【０３１７】
図２７のフローチャートにおいて、まず、受付部５０１により、ストリップＤのデータｄ１をデータｄ２に更新するための書込要求を受け付ける（ステップＳ２７０１）。書込要求は、要求先のストリップＤのストリップ番号「Ｄ」と、書込対象となるデータｄ２を含む。データｄ２は、１００，０００円の出金データである。
【０３１８】
つぎに、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「０」から「１」に変更する（ステップＳ２７０２）。さらに、更新部５０２により、受け付けた書込要求に含まれるストリップ番号「Ｄ」を、書込状態テーブル２１００のストリップ番号のフィールドに書き込む（ステップＳ２７０３）。
【０３１９】
そして、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、書込要求の要求先のストリップＤに記憶されているデータｄ１を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ１に複写する（ステップＳ２７０４）。ただし、ＨＤＤ１の書込バッファＢ１にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ１に対するデータｄ１の複写は行われない。
【０３２０】
また、複写指示部５０４により、ＨＤＤコントローラ３０９を介して、ストリップＤのデータｄ１を生成元とするストリップＰ２に記録されているパリティデータｐ２（＃３）を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ２に複写する（ステップＳ２７０５）。ただし、ＨＤＤ１の書込バッファＢ２にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ２に対するパリティデータｐ２（＃３）の複写は行われない。
【０３２１】
さらに、複写指示部５０４により、書込要求に含まれるデータｄ２を、各ＨＤＤ１〜ＨＤＤ３の書込バッファＢ３に複写する（ステップＳ２７０６）。上記同様に、ＨＤＤ１の書込バッファＢ３にアクセス不能な場合は、ＨＤＤ１の書込バッファＢ３に対するデータｄ２の複写は行われない。このあと、実行部５０５により、受け付けた書込要求に対する書込処理を実行する（ステップＳ２７０７）。
【０３２２】
具体的には、例えば、実行部５０５が、ストリップＰ２に記録されているパリティデータｐ２（＃３）とストリップＤに記憶されているデータｄ１との排他的論理和をとって、ストリップＣのデータｃ２を復元する。つぎに、実行部５０５が、ＨＤＤコントローラ３０９を介して、書込要求に含まれるデータｄ２をストリップＤに書き込む。さらに、実行部５０５が、ＨＤＤコントローラ３０９を介して、復元されたデータｃ２と書込要求に含まれるデータｄ２との排他的論理和をとったパリティデータｐ２（＃４）を計算して、ストリップＰ２に書き込む。
【０３２３】
図２７のフローチャートに戻り、つぎに、成否判定部５０６により、書込要求に対する書込処理が成功したか否かを判定する（ステップＳ２７０８）。ここで、書込要求に対する書込処理が成功した場合（ステップＳ２７０８：Ｙｅｓ）、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２７０９）、本フローチャートによる一連の処理を終了する。
【０３２４】
この結果、ストリップＤに１０，０００円の出金データが記録される。このため、以降において、残高照会があった場合は、ストリップＤのデータｄ２とストリップＰ２のパリティデータｐ２（＃３）から４９５，０００円の残高データを復元、参照することができる。
【０３２５】
一方、書込要求に対する書込処理が失敗した場合（ステップＳ２７０８：Ｎｏ）、検出部５０７により、書き込みに失敗したＨＤＤを障害が発生したＨＤＤとして検出する（ステップＳ２７１０）。そして、検出部５０７により、ＨＤＤコントローラ３０９を介して、オンラインのＨＤＤの管理データの障害が発生したＨＤＤの状態を「正常」から「異常」に変更する（ステップＳ２７１１）。
【０３２６】
つぎに、検出部５０７により、ＨＤＤコントローラ３０９を介して、障害が発生したＨＤＤをオフラインにする（ステップＳ２７１２）。そして、判断部５０８により、障害が発生したＨＤＤの台数ｘが「ｘ≧２」となったか否かを判断する。図２７の例では、ＨＤＤの台数ｘが２以上になったと判断されている（ステップＳ２７１３）。最後に、判断部５０８により、障害が発生したＨＤＤの台数が２台以上となったことをＣＰＵ３０１に通知することで、ストレージシステム２０００がシステムダウンする（ステップＳ２７１４）。
【０３２７】
ここで、各ＨＤＤ１〜ＨＤＤ３のシステム領域３１４〜３１６に記憶されている管理データ４１０，４２０，４３０の更新例について説明する。ここでは、図２７に示したステップＳ２７０７において、ＨＤＤ２に障害が発生して、ストリップＰ２に対するパリティデータｐ２（＃４）の書き込みに失敗した場合を例に挙げて説明する。具体的には、ＨＤＤ２のストリップＰ２にパリティデータｐ２（＃４）の一部を書き込めなかったため、ストリップＰ２の記憶内容がパリティデータｐ２（＃４）とは異なるパリティデータｐ２ｘとなっている。この場合、ＨＤＤ２が、障害が発生したＨＤＤとして検出されてオフラインとなる。
【０３２８】
図２８は、管理データ４１０，４２０，４３０の更新例を示す説明図（その３）である。図２８において、ＨＤＤ２に障害が発生した場合の各ＨＤＤ１〜ＨＤＤ３の管理データ４１０，４２０，４３０の更新例が示されている。図２８中、上段はＨＤＤ２に障害が発生する前の管理データ４１０，４２０，４３０であり、下段はＨＤＤ２に障害が発生した後の管理データ４１０，４２０，４３０である。
【０３２９】
具体的には、管理データ４２０のＨＤＤ２の状態が「正常」から「（異常）」に更新されている。なお、「（異常）」は、ＨＤＤコントローラ３０９が管理データ４２０を更新できた場合に、管理データ４２０内のＨＤＤ２の状態が「異常」となることを表している。また、管理データ４３０のＨＤＤ２の状態が「正常」から「異常」に更新されている。一方、既に切り離されているＨＤＤ１では、管理データ４１０のＨＤＤ２の状態は「正常」のままとなっている。
【０３３０】
＜システム復旧処理手順＞
つぎに、ストレージ制御装置１０１のシステム復旧処理手順について説明する。ここでは、システムダウンしたストレージシステム２０００を非冗長構成に復旧する場合を例に挙げて説明する。前提として、ストレージシステム２０００のハードリセットを行った後、最後にオフラインとなったＨＤＤ２をオンラインにして再起動する場合を想定する。この場合、各ＨＤＤ２，ＨＤＤ３の管理データ４２０，４３０のＨＤＤ２の状態が「異常」から「正常」に変更される。なお、ＨＤＤ１の管理データ４１０のＨＤＤ２の状態は「正常」のままである。
【０３３１】
図２９は、ストレージ制御装置１０１のシステム復旧処理手順の一例を示すフローチャートである。図２９のフローチャートにおいて、まず、判断部５０８により、書込要求に対する書込処理が実行されたＨＤＤ、この例ではＨＤＤ２が再起動されたか否かを判断する（ステップＳ２９０１）。
【０３３２】
ここで、ＨＤＤ２が再起動されるのを待って（ステップＳ２９０１：Ｎｏ）、ＨＤＤ２が再起動された場合（ステップＳ２９０１：Ｙｅｓ）、書込指示部５０９により、書込状態テーブル２１００の書込状態フラグが「１」か否かを判断する（ステップＳ２９０２）。ここで、書込状態フラグが「０」の場合（ステップＳ２９０２：Ｎｏ）、本フローチャートによる一連の処理を終了する。
【０３３３】
一方、書込状態フラグが「１」の場合（ステップＳ２９０２：Ｙｅｓ）、書込指示部５０９により、ＨＤＤコントローラ３０９を介して、書込バッファＢ１に複写されたデータｄ１をＨＤＤ３のストリップＤに書き込む（ステップＳ２９０３）。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢ２に複写されたパリティデータｐ２（＃３）を、再起動したＨＤＤ２のストリップＰ２に書き込む（ステップＳ２９０４）。
【０３３４】
このあと、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、書込バッファＢ３に複写されたデータｄ２をストリップＤに書き込む（ステップＳ２９０５）。また、書込指示部５０９は、ＨＤＤコントローラ３０９を介して、データｄ２を生成元とするパリティデータｐ２（＃４）を計算してストリップＰ２に書き込む（ステップＳ２９０６）。
【０３３５】
そして、成否判定部５０６により、ステップＳ２９０３〜ステップＳ２９０６のデータ書込処理が成功したか否かを判断する（ステップＳ２９０７）。ここで、データ書込処理が成功した場合（ステップＳ２９０７：Ｙｅｓ）、更新部５０２により、書込状態テーブル２１００の書込状態フラグを「１」から「０」に変更して（ステップＳ２９０８）、本フローチャートによる一連の処理を終了する。
【０３３６】
この結果、ストリップＤに１０，０００円の出金データが記録される。このため、以降において、残高照会があった場合は、ストリップＤのデータｄ２とストリップＰ２のパリティデータｐ２（＃４）から４９５，０００円の残高データを参照することができる。
【０３３７】
一方、ステップＳ２９０７において、データ書込処理が失敗した場合（ステップＳ２９０７：Ｎｏ）、本フローチャートによる一連の処理を終了する。この場合、書込バッファＢ１〜Ｂ３に複写されたデータｄ１、パリティデータｐ２（＃３）およびデータｄ２を読出データとして用いることができる。例えば、ストリップＣの読出要求を受け付けた場合、書込バッファＢ１に複写されたデータｄ１と書込バッファＢ２に複写されたパリティデータｐ２（＃３）からストリップＣのデータｃ２を復元することができる。
【０３３８】
以上説明した実施の形態２にかかるストレージ制御装置１０１によれば、パリティデータの更新を伴うデータの更新時に、更新前のデータとパリティデータを書込バッファＢ１，Ｂ２に退避しておくことができる。また、ストレージ制御装置１０１によれば、書込失敗によるＨＤＤの再起動後に、書込バッファＢ１，Ｂ２に退避したデータとパリティデータを退避元のストリップに書き戻して、ＨＤＤ間のデータの整合性をとることができる。また、ストレージ制御装置１０１によれば、書込バッファＢ１，Ｂ２に退避したデータとパリティデータを退避元のストリップに書き戻した後、書込バッファＢ３に退避したデータを用いて、書込要求に対する書込処理を再実行することができる。
【０３３９】
なお、本実施の形態で説明したストレージ制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ストレージ制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本ストレージ制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【０３４０】
また、本実施の形態で説明したストレージ制御装置１０１は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）等の特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡ等のＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、例えば、上述したストレージ制御装置１０１の機能をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、ストレージ制御装置１０１を製造することができる。
【０３４１】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０３４２】
（付記１）データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付部と、
前記受付部が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写部と、
前記複写部によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断部と、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込部と、
を備えることを特徴とするストレージ制御装置。
【０３４３】
（付記２）前記書込要求に対する書込処理の処理結果に基づいて、前記書込処理が成功したか否かを判定する成否判定部を備え、
前記書込部は、
前記成否判定部によって前記書込処理が失敗したと判定され、かつ、前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする付記１に記載のストレージ制御装置。
【０３４４】
（付記３）前記複写部は、
さらに、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記書込部は、
前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込み、かつ、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込んだ後、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする付記２に記載のストレージ制御装置。
【０３４５】
（付記４）前記システムの中から、障害が発生したストレージ装置を検出する検出部を備え、
前記複写部は、
前記書込要求を受け付けたストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを生成元とする訂正符号を算出して、前記ストレージ装置の要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置の記憶領域に書き込むことを特徴とする付記３に記載のストレージ制御装置。
【０３４６】
（付記５）前記複写部は、
前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むことを特徴とする付記４に記載のストレージ制御装置。
【０３４７】
（付記６）前記複写部は、
前記検出部によって検出されたストレージ装置の台数が、前記訂正符号を記憶するストレージ装置の台数未満の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を算出して、前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号を記憶する記憶領域に書き込むことを特徴とする付記５に記載のストレージ制御装置。
【０３４８】
（付記７）前記特定の記憶領域は、前記データ群の各データおよび前記データ群から生成される訂正符号の記憶先の記憶領域とは異なる不揮発性の記憶領域であることを特徴とする付記１〜６のいずれか一つに記載のストレージ制御装置。
【０３４９】
（付記８）前記特定の記憶領域は、前記システム内の各ストレージ装置に設けられることを特徴とする付記７に記載のストレージ制御装置。
【０３５０】
（付記９）データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付部と、
前記受付部が前記書込要求を受け付けた場合、前記システム内のストレージ装置にアクセスする制御部に対して、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、特定の記憶領域に複写するよう指示する複写指示部と、
前記複写指示部によって指示された前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断部と、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記制御部に対して、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込むよう指示する書込指示部と、
を備えることを特徴とするストレージ制御装置。
【０３５１】
（付記１０）データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付工程と、
前記受付工程が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写工程と、
前記複写工程によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断工程と、
前記判断工程によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込工程と、
をコンピュータが実行することを特徴とするストレージ制御方法。
【０３５２】
（付記１１）データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付工程と、
前記受付工程によって前記書込要求を受け付けた場合、前記システム内のストレージ装置にアクセスする制御部に対して、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、特定の記憶領域に複写するよう指示する複写指示工程と、
前記複写指示工程によって指示された前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断する判断工程と、
前記判断工程によってストレージ装置が再起動されたと判断された場合、前記制御部に対して、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込むよう指示する書込指示工程と、
をコンピュータが実行することを特徴とするストレージ制御方法。
【符号の説明】
【０３５３】
１００，３００，２０００  ストレージシステム
１０１  ストレージ制御装置
４１０，４２０，４３０  管理データ
５０１  受付部
５０２  更新部
５０３  制御部
５０４  複写指示部
５０５  実行部
５０６  成否判定部
５０７  検出部
５０８  判断部
５０９  書込指示部
５１０  対象判定部
７００，２１００  書込状態テーブル
Ｂ，Ｂ１，Ｂ２，Ｂ３  書込バッファ
Ｓ１〜Ｓ３  ストレージ装置
【手続補正書】
【提出日】平成25年11月18日(2013.11.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付部と、
前記受付部が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写部と、
前記複写部によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が、前記書込処理に失敗して前記システムが非冗長構成からマルチデッド状態となったことに応じて、前記システムをマルチデッド状態から非冗長構成に復旧するために再起動された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込部と、
を備えることを特徴とするストレージ制御装置。
【請求項２】
前記書込要求に対する書込処理の処理結果に基づいて、前記書込処理が成功したか否かを判定する成否判定部と、
前記書込処理が実行されたストレージ装置が、前記システムをマルチデッド状態から非冗長構成に復旧するために再起動されたか否かを判断する判断部と、を備え、
前記書込部は、
前記成否判定部によって前記書込処理が失敗したと判定され、かつ、前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする請求項１に記載のストレージ制御装置。
【請求項３】
前記複写部は、
さらに、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記書込部は、
前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込み、かつ、前記特定の記憶領域に複写された訂正符号を前記複写元のストレージ装置の記憶領域に書き込んだ後、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を前記複写元のストレージ装置の記憶領域に書き込むことを特徴とする請求項２に記載のストレージ制御装置。
【請求項４】
前記システムの中から、障害が発生したストレージ装置を検出する検出部を備え、
前記複写部は、
前記書込要求を受け付けたストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを生成元とする訂正符号を算出して、前記ストレージ装置の要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置の記憶領域に書き込むことを特徴とする請求項３に記載のストレージ制御装置。
【請求項５】
前記複写部は、
前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号の記憶先のストレージ装置が、前記検出部によって検出された障害が発生したストレージ装置の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記ストレージ装置の要求先の記憶領域に書き込むことを特徴とする請求項４に記載のストレージ制御装置。
【請求項６】
前記複写部は、
前記検出部によって検出されたストレージ装置の台数が、前記訂正符号を記憶するストレージ装置の台数未満の場合、前記書込要求に含まれる書込対象データを前記特定の記憶領域に複写し、
前記判断部は、
前記複写部によって前記書込対象データが前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が再起動されたか否かを判断し、
前記書込部は、
前記判断部によってストレージ装置が再起動されたと判断された場合、前記特定の記憶領域に複写された書込対象データを前記要求先の記憶領域に書き込むとともに、当該書込対象データを生成元とする訂正符号を算出して、前記要求先の記憶領域に記憶されているデータを生成元とする訂正符号を記憶する記憶領域に書き込むことを特徴とする請求項５に記載のストレージ制御装置。
【請求項７】
データ群ごとに、前記データ群の各データと前記データ群から生成される訂正符号とを、記憶先のストレージ装置が異なるように記憶するシステム内のストレージ装置に対する書込要求を受け付ける受付工程と、
前記受付工程が前記書込要求を受け付けた場合、前記ストレージ装置の要求先の記憶領域に記憶されているデータと、当該データを生成元とする、前記ストレージ装置に記憶されている訂正符号とを、前記ストレージ装置から特定の記憶領域に複写する複写工程と、
前記複写工程によって前記データと前記訂正符号が前記特定の記憶領域に複写された後、前記書込要求に対する書込処理が実行されたストレージ装置が、前記書込処理に失敗して前記システムが非冗長構成からマルチデッド状態となったことに応じて、前記システムをマルチデッド状態から非冗長構成に復旧するために再起動された場合、前記特定の記憶領域に複写されたデータを前記ストレージ装置の要求先の記憶領域に書き込むとともに、前記特定の記憶領域に複写された訂正符号を当該訂正符号の複写元のストレージ装置の記憶領域に書き込む書込工程と、
をコンピュータが実行することを特徴とするストレージ制御方法。
【国際調査報告】
2012053085.tif 000032
2012053085.tif 000033
2012053085.tif 000034
2012053085.tif 000035