(57)【要約】  不揮発性メモリから読み出し応答がなされない場合であっても、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることを目的とする。データ退避処理時に、退避対象データのパリティデータを生成して、ＣＲＣやＡＩＤを付与した退避対象データおよびパリティデータをフラッシュメモリ１４１または１４２に書き込み、データ復旧処理において、フラッシュメモリ１４１または１４２から所定の時間内にデータ読出処理が完了しない場合に、データ読出処理を中止して付加データを設定し、パリティデータを用いて誤りデータを訂正した退避対象データをキャッシュメモリ１３０に書き込む。
2009107213.tif 000002
【特許請求の範囲】
【請求項１】
異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置であって、
当該のストレージ装置が異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、
前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、
前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、
前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、
前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段と
を備えたことを特徴とするストレージ装置。
【請求項２】
当該のストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避手段と、
当該のストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避手段とをさらに備えることを特徴とする請求項１に記載のストレージ装置。
【請求項３】
当該のストレージ装置が異常終了した場合に、前記退避対象データの先頭アドレスを、前記第一のデータ退避手段によりキャッシュメモリから最初に読み出されるデータの記憶位置である第一の開始アドレスに決定し、所定のサイズであるバウンダリサイズに整数Ｎを乗算した値が、前記退避対象データを２で除算した値よりも大きくなるＮの最小値である第一の基準値を算出して、該第一の基準値に前記バウンダリサイズを乗算した値を、前記第一のデータ退避手段によりキャッシュメモリから読み出されるデータのサイズである第一のデータ退避サイズに決定し、前記バウンダリサイズに整数Ｎを乗算した値が、前記退避対象データのサイズから前記第一のデータ退避サイズを減算した値よりも大きくなるＮの最小値である第二の基準値を算出して、該第二の基準値に前記バウンダリサイズを乗算した値を、前記第二のデータ退避手段によりキャッシュメモリから読み出されるデータのサイズである第二のデータ退避サイズに決定し、前記退避対象データの最終アドレスと前記第一のデータ退避サイズとに基づいて、前記第二のデータ退避手段によりキャッシュメモリから最初に読み出されるデータの記憶位置である第二の開始アドレスを算出する退避データ領域算出手段をさらに備え、
前記第一のデータ退避手段は、前記退避対象データのうち、前記退避データ領域算出手段によって算出された第一の開始アドレスから、前記退避データ領域算出手段によって算出された第一のデータ退避サイズ分のデータを不揮発性メモリへ記憶させ、
前記第二のデータ退避手段は、前記退避対象データのうち、前記退避データ領域算出手段によって算出された第二の開始アドレスから、前記退避データ領域算出手段によって算出された第二のデータ退避サイズ分のデータを不揮発性メモリへ記憶させることを特徴とする請求項２に記載のストレージ装置。
【請求項４】
前記誤りデータ検査手段は、前記ストライプに付与されているＣＲＣ（Cyclic  Redundancy  Check）に基づいて、前記ストライプに誤りデータが存在しているか否かを検査することを特徴とする請求項１〜３のいずれか一つに記載のストレージ装置。
【請求項５】
前記誤りデータ検査手段は、前記ストライプに付与されている前記ストライプを識別するためのストライプ識別番号に基づいて、前記ストライプがすべて存在しているか否かを検査することを特徴とする請求項１〜３のいずれか一つに記載のストレージ装置。
【請求項６】
異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置を制御するストレージ制御装置であって、
前記ストレージ装置が異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、
前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、
前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、
前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、
前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段と
を備えたことを特徴とするストレージ制御装置。
【請求項７】
前記ストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避手段と、
前記ストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避手段とをさらに備えることを特徴とする請求項６に記載のストレージ制御装置。
【請求項８】
前記ストレージ装置が異常終了した場合に、前記退避対象データの先頭アドレスを、前記第一のデータ退避手段によりキャッシュメモリから最初に読み出されるデータの記憶位置である第一の開始アドレスに決定し、所定のサイズであるバウンダリサイズに整数Ｎを乗算した値が、前記退避対象データを２で除算した値よりも大きくなるＮの最小値である第一の基準値を算出して、該第一の基準値に前記バウンダリサイズを乗算した値を、前記第一のデータ退避手段によりキャッシュメモリから読み出されるデータのサイズである第一のデータ退避サイズに決定し、前記バウンダリサイズに整数Ｎを乗算した値が、前記退避対象データのサイズから前記第一のデータ退避サイズを減算した値よりも大きくなるＮの最小値である第二の基準値を算出して、該第二の基準値に前記バウンダリサイズを乗算した値を、前記第二のデータ退避手段によりキャッシュメモリから読み出されるデータのサイズである第二のデータ退避サイズに決定し、前記退避対象データの最終アドレスと前記第一のデータ退避サイズとに基づいて、前記第二のデータ退避手段によりキャッシュメモリから最初に読み出されるデータの記憶位置である第二の開始アドレスを算出する退避データ領域算出手段をさらに備え、
前記第一のデータ退避手段は、前記退避対象データのうち、前記退避データ領域算出手段によって算出された第一の開始アドレスから、前記退避データ領域算出手段によって算出された第一のデータ退避サイズ分のデータを不揮発性メモリへ記憶させ、
前記第二のデータ退避手段は、前記退避対象データのうち、前記退避データ領域算出手段によって算出された第二の開始アドレスから、前記退避データ領域算出手段によって算出された第二のデータ退避サイズ分のデータを不揮発性メモリへ記憶させることを特徴とする請求項７に記載のストレージ制御装置。
【請求項９】
前記誤りデータ検査手段は、前記ストライプに付与されているＣＲＣに基づいて、前記ストライプに誤りデータが存在しているか否かを検査することを特徴とする請求項６〜８のいずれか一つに記載のストレージ制御装置。
【請求項１０】
前記誤りデータ検査手段は、前記ストライプに付与されている前記ストライプを識別するためのストライプ識別番号に基づいて、前記ストライプがすべて存在しているか否かを検査することを特徴とする請求項６〜８のいずれか一つに記載のストレージ制御装置。
【請求項１１】
キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送集積回路であって、
前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、
前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、
前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、
前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、
前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段と
を備えたことを特徴とするデータ転送集積回路。
【請求項１２】
前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避手段と、
前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避手段とをさらに備えることを特徴とする請求項１１に記載のデータ転送集積回路。
【請求項１３】
異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置を制御するストレージ制御方法であって、
前記ストレージ装置が、
異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出工程と、
前記データ読出工程によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与工程と、
前記データ読出工程によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査工程と、
前記誤りデータ検査工程によって誤りデータが検出された場合に、前記データ読出工程によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正工程と、
前記誤りデータ検査工程によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正工程によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込工程と
を含んだことを特徴とするストレージ制御方法。
【請求項１４】
前記ストレージ装置は、
異常終了した場合に、前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避工程と、
異常終了した場合に、前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避工程とをさらに含んだことを特徴とする請求項１３に記載のストレージ制御方法。
【請求項１５】
前記ストレージ装置は、
異常終了した場合に、前記退避対象データの先頭アドレスを、前記第一のデータ退避工程によりキャッシュメモリから最初に読み出されるデータの記憶位置である第一の開始アドレスに決定し、所定のサイズであるバウンダリサイズに整数Ｎを乗算した値が、前記退避対象データを２で除算した値よりも大きくなるＮの最小値である第一の基準値を算出して、該第一の基準値に前記バウンダリサイズを乗算した値を、前記第一のデータ退避工程によりキャッシュメモリから読み出されるデータのサイズである第一のデータ退避サイズに決定し、前記バウンダリサイズに整数Ｎを乗算した値が、前記退避対象データのサイズから前記第一のデータ退避サイズを減算した値よりも大きくなるＮの最小値である第二の基準値を算出して、該第二の基準値に前記バウンダリサイズを乗算した値を、前記第二のデータ退避工程によりキャッシュメモリから読み出されるデータのサイズである第二のデータ退避サイズに決定し、前記退避対象データの最終アドレスと前記第一のデータ退避サイズとに基づいて、前記第二のデータ退避工程によりキャッシュメモリから最初に読み出されるデータの記憶位置である第二の開始アドレスを算出する退避データ領域算出工程をさらに含み、
前記第一のデータ退避工程は、前記退避対象データのうち、前記退避データ領域算出工程によって算出された第一の開始アドレスから、前記退避データ領域算出工程によって算出された第一のデータ退避サイズ分のデータを不揮発性メモリへ記憶させ、
前記第二のデータ退避工程は、前記退避対象データのうち、前記退避データ領域算出工程によって算出された第二の開始アドレスから、前記退避データ領域算出工程によって算出された第二のデータ退避サイズ分のデータを不揮発性メモリへ記憶させることを特徴とする請求項１４に記載のストレージ制御方法。
【請求項１６】
前記誤りデータ検査工程は、前記ストライプに付与されているＣＲＣに基づいて、前記ストライプに誤りデータが存在しているか否かを検査することを特徴とする請求項１３〜１５のいずれか一つに記載のストレージ制御方法。
【請求項１７】
前記誤りデータ検査工程は、前記ストライプに付与されている前記ストライプを識別するためのストライプ識別番号に基づいて、前記ストライプがすべて存在しているか否かを検査することを特徴とする請求項１３〜１５のいずれか一つに記載のストレージ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置、ストレージ制御装置、データ転送集積回路、および、ストレージ制御方法に関する。
【背景技術】
【０００２】
従来、大規模なコンピュータシステムでは、ホストコンピュータと別体に構成された専用のデータ入出力装置を用いてデータを管理している。このデータ入出力装置の中でも、ストレージ装置は、複数のハードディスク装置（記憶媒体）によってＲＡＩＤ（Redundant  Arrays  of  Independent（Inexpensive）  Disks）グループを構成して、取り扱うデータの信頼性を向上させている。【０００３】
ストレージ装置は、一般に、ライトバック方式と呼ばれるライト処理（書込処理）方式を行うことで、アクセス性能を向上させている。具体的には、ストレージ装置は、上位装置であるホストコンピュータからデータのライト命令を受け付けた場合に、キャッシュメモリにデータを記憶した時点で、ライト処理が完了した旨をホストコンピュータへ通知する。その後、所定の条件を満たした時点で、キャッシュメモリに記憶したデータをハードディスク装置へ記憶させる。【０００４】
このようなライトバック方式を採用するストレージ装置には、停電などによって正常な終了操作が行われることなく電源が落とされた場合であっても（以下、正常な終了操作が行われることなく電源が落とされることを「異常終了」という）、揮発性のキャッシュメモリに記憶されているデータが消失しないように構成されているものがある。【０００５】
具体的には、異常終了した場合に、大容量のコンデンサやバッテリー等から電力供給されている間に、キャッシュメモリ上のデータを不揮発性メモリに退避させ、異常終了後に電源投入された場合に不揮発性メモリに退避したデータをキャッシュメモリに復旧させる。これにより、キャッシュメモリに記憶されているデータがハードディスク装置に記憶されていない状態で異常終了した場合であっても、データを消失させないことを実現している。【０００６】
ところで、データを退避させる不揮発性メモリは、一般的に、ＮＡＮＤ型のフラッシュメモリが用いられることが多い。ＮＡＮＤ型のフラッシュメモリは、セル劣化等によって記憶しているデータを破損や消失してしまうことがある。不揮発性メモリに記憶されているデータが破損や消失する状況が発生すると、ストレージ装置は、異常終了後の起動時に、不揮発性メモリから誤ったデータを読み出してしまい、正確にデータを復旧させることができなくなる。【０００７】
そこで、記憶媒体に記憶されているデータのエラーを検出し、エラー検出時にデータ訂正を行う技術（例えば、特許文献１および２を参照）を用いることが考えられる。このような技術を用いれば、異常終了後の起動時に、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることが可能になる。【０００８】
【特許文献１】特表２００４−５０６２５６号公報
【特許文献２】特開２００７−１９３４４９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記特許文献１および２に開示されているような技術を用いても、不揮発性メモリから読み出し応答がなされない場合には、不揮発性メモリに退避させたデータを、正確にキャッシュメモリに復旧させることができないという問題があった。不揮発性メモリの劣化状態によっては、不揮発性メモリから読み出し応答がなされないことがあり、かかる状態では、ハングアップ状態となりデータ訂正処理が実行されないためである。【００１０】
ストレージ装置のような大規模なデータ入出力装置は、重要なコンピュータシステムに用いられることが多く、キャッシュメモリに記憶されているユーザデータやシステムデータを正確に復旧できないことは、大きな問題となる。このようなことから、不揮発性メモリから読み出し応答がなされない場合であっても、不揮発性メモリに退避させたデータを、いかにして正確にキャッシュメモリに復旧させるかが重要な課題となっていた。【００１１】
本発明は、上述した従来技術による課題を解消するためになされたものであり、不揮発性メモリから読み出し応答がなされない場合であっても、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることができるストレージ装置、ストレージ制御装置、データ転送集積回路、および、ストレージ制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するために、本願に開示するストレージ装置は、異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置であって、当該のストレージ装置が異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段とを備えたことを要件とする。【００１３】
なお、本願に開示するストレージ装置の構成要素、表現または構成要素の任意の組合せを、方法、装置、システム、コンピュータプログラム、記録媒体、データ構造などに適用したものも、他の態様として有効である。
【発明の効果】
【００１４】
本願に開示したストレージ装置によれば、不揮発性メモリからデータの読出応答がなされない場合であっても、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることができるという効果を奏する。
【図面の簡単な説明】
【００１５】
【図１】図１は、実施例１に係るストレージ装置の概略構成を示す図である。
【図２−１】図２−１は、フラッシュメモリ１４１の構成およびデータフォーマットを示す図である。
【図２−２】図２−２は、図２−１に示したｐａｇｅの構成およびデータフォーマットを示す図である。
【図３−１】図３−１は、実施例１に係るストレージ装置によるデータ退避処理の概要を説明するための図である。
【図３−２】図３−２は、実施例１に係るストレージ装置によるデータ復旧処理の概要を説明するための図である。
【図３−３】図３−３は、実施例１に係るストレージ装置によるデータ復旧処理の概要を説明するための図である。
【図４】図４は、実施例１に係るストレージ装置が有するＣＭの構成を示す図である。
【図５】図５は、図４に示したデータ転送ＤＭＡの構成を示す図である。
【図６】図６は、図５に示したライトＤＭＡの構成を示す図である。
【図７】図７は、図５に示したリードＤＭＡの構成を示す図である。
【図８】図８は、実施例１に係るストレージ装置によるデータ退避処理の流れを示すシーケンス図である。
【図９】図９は、ライトＤＭＡによるデータ退避処理手順を示すフローチャートである。
【図１０】図１０は、実施例１に係るストレージ装置によるデータ復旧処理の流れを示すシーケンス図である。
【図１１】図１１は、リードＤＭＡによるデータ復旧処理手順を示すフローチャートである。
【図１２−１】図１２−１は、実施例２に係るストレージ装置によるデータ退避処理の概要を説明するための図である。
【図１２−２】図１２−２は、実施例２に係るストレージ装置によるデータ復旧処理の概要を説明するための図である。
【図１３】図１３は、実施例２に係るストレージ装置が有するＣＭの構成を示す図である。
【図１４】図１４は、図１３に示した退避データ領域算出部による退避データ領域算出処理手順を示すフローチャートである。
【符号の説明】
【００１６】
１、２            ストレージ装置
１０              ＣＥ
１１              ＨＤＤ
１２              電力供給部
２０              ＤＥ
１００、２００    ＣＭ
１１０            Ｉ／Ｆ部
１２０、２２０    エクスパンダ
１３０            キャッシュメモリ
１４１、１４２    フラッシュメモリ
１５０            データ転送ＤＭＡ
１６０、２６０    ＲｏＣ
１６１、２６１    退避データ領域算出部
１６２、２６２    退避指示部
１６３            復旧指示部
５１０            ＰＣＩバスＩ／Ｆ
５２１、５２２    メモリＩ／Ｆ
５３０            ディスクリプタ保持レジスタ
５４１、５４２    ライトＤＭＡ
５４１ａ          データ読出部
５４１ｂ          バウンダリ調整部
５４１ｃ          パリティ生成部
５４１ｄ          退避データバッファ
５４１ｅ          パリティバッファ
５４１ｆ          データ書込部
５４１ｇ          ＣＲＣ付与部
５４１ｈ          ＡＩＤ付与部
５５０            リードＤＭＡ
５５０ａ          セレクタ
５５０ｂ          データ読出部
５５０ｃ          タイムアウト検出部
５５０ｄ          エラー検出部
５５０ｅ          復旧データバッファ
５５０ｆ          ＸＯＲ演算部
５５０ｇ          ＣＲＣ検査部
５５０ｈ          ＡＩＤ検査部
５５０ｉ          訂正データバッファ
５５０ｊ          ログ保持レジスタ
５５０ｋ          セレクタ
５５０ｌ          バウンダリ調整部
５５０ｍ          データ書込部
５６１、５６２    イレースＤＭＡ
【発明を実施するための最良の形態】
【００１７】
以下に、本発明にかかるストレージ装置、ストレージ制御装置、データ転送集積回路、および、ストレージ制御方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１８】
まず、実施例１に係るストレージ装置の概略構成について説明する。図１は、実施例１に係るストレージ装置１の概略構成を示す図である。同図に示したストレージ装置１は、高信頼性を確保するために二重化構成が採られており、各構成要素が２系統ずつ（同図中、参照符号に付加したＡ、Ｂによって区別する）備えられている。それぞれの系統の構成要素は互いに同等の機能を有するため、以下では一方の系統についてのみ構成要素の説明をする。【００１９】
同図に示すように、ストレージ装置１は、ストレージ装置１を制御する各部や、ストレージ装置１と上位装置であるホストコンピュータとの間の通信を担う通信モジュールなどを主に搭載するＣＥ（Controller  Enclosure：コントローラ  エンクロージャ）１０と、ハードディスク装置を主に搭載するＤＥ（Device  Enclosure：デバイス  エンクロージャ）２０とに、筐体が分けられている。【００２０】
ＣＥ１０は、図示しないチャネルアダプタ経由でファイバチャネルを介してホストコンピュータと接続され、エクスパンダ１２０Ａおよび１２０Ｂ経由でＤＥ２０と接続されている。ＤＥ２０は、ハードディスク装置（以下、「ＨＤＤ：Hard  Disk  Drive」と略記する）２１を有し、エクスパンダ２２０Ａおよび２２０Ｂを直接、もしくは、ルータ（Router）を経由するなどして、他のＤＥと複数個接続することが可能である。【００２１】
また、ＣＥ１０は、ストレージ装置１を制御するためのＣＭ（Controller  Module：コントローラ  モジュール）１００Ａおよび１００Ｂと、ＣＭ１００Ａおよび１００Ｂに接続される複数のハードディスク装置１１とを有する。【００２２】
ＨＤＤ１１は、ＣＭ１００Ａによってデータが冗長に読み書きされる記憶装置である。なお、ＣＭ１００Ａに接続される記憶装置は、ハードディスク装置に限られず、熱磁気ディスク装置や光磁気ディスク装置、または、半導体不揮発メモリを用いた半導体ディスクのような他の記憶装置であってもよい。【００２３】
ＣＭ１００Ａは、ストレージ装置１を制御するストレージ制御装置であり、インタフェース（以下、「Ｉ／Ｆ」と略記する）部１１０Ａと、エクスパンダ１２０Ａと、キャッシュメモリ１３０Ａと、フラッシュメモリ１４１Ａおよび１４２Ａと、データ転送ＤＭＡ（Direct  Memory  Access）１５０Ａと、ＲＡＩＤ−ｏｎ−Ｃｈｉｐ（以下、「ＲｏＣ」と略記する）１６０Ａとを有する。【００２４】
Ｉ／Ｆ部１１０Ａは、ＬＡＮ（Local  Area  Network）などのネットワークへ接続するためのインタフェースである。エクスパンダ１２０Ａは、ＲｏＣ１６０ＡとＨＤＤ１１との間で送受信されるデータを中継する中継装置である。【００２５】
キャッシュメモリ１３０Ａは、ホストコンピュータとＨＤＤ１１との間で転送が行われるデータを一時的に記憶するメモリである。フラッシュメモリ１４１Ａおよび１４２Ａは、不揮発性メモリであり、例えば、ＮＡＮＤ型のフラッシュメモリである。実施例１に係るストレージ装置１では、フラッシュメモリ１４１Ａおよび１４２Ａに、ＯｎｅＮＡＮＤ（ワンナンド）型のフラッシュメモリを用いることとする。【００２６】
ここで、ＯｎｅＮＡＮＤ型のフラッシュメモリ１４１Ａおよび１４２Ａの構成およびデータフォーマットについて説明する。なお、フラッシュメモリ１４１Ａおよび１４２Ａの構成およびデータフォーマットは同一であるため、ここでは、フラッシュメモリ１４１Ａの構成およびデータフォーマットについてのみ説明する。【００２７】
図２−１は、フラッシュメモリ１４１Ａの構成およびデータフォーマットを示す図である。なお、フラッシュメモリ１４１Ａの記憶容量は、２［ＧＢ（ギガバイト）］であるとする。同図に示すように、フラッシュメモリ１４１Ａは、４つのメモリバンク＃００〜メモリバンク＃０３を有する。メモリバンク＃００〜メモリバンク＃０３は、メモリの集合体であり、それぞれがダイ＃０およびダイ＃１を有する。【００２８】
ダイ＃０およびダイ＃１は、数ミリ角のフラッシュメモリであり、それぞれがＢｌｏｃｋ＃０〜Ｂｌｏｃｋ＃２０４７を有する。また、Ｂｌｏｃｋ＃０〜＃２０４７は、それぞれがｐａｇｅ（ページ）＃０〜ｐａｇｅ＃６３を有する。ｐａｇｅが、フラッシュメモリ１４１への最小アクセス単位となる。【００２９】
ｐａｇｅの構成およびデータフォーマットについて説明する。図２−２は、図２−１に示したｐａｇｅの構成およびデータフォーマットを示す図である。同図に示すように、ｐａｇｅは、メイン領域と、スペア領域とを有する。【００３０】
メイン領域は、ユーザデータが記憶される２［ＫＢ（キロバイト）］の記憶領域であり、４個のセクタ＃０〜セクタ＃３を有する。スペア領域は、主にデータを管理するためのシステムデータ等が記憶される６４［ｂｙｔｅ（バイト）］の記憶領域であり、４個のスペア＃０〜＃３を有する。【００３１】
スペア領域を構成する１つのスペア（例えば、スペア＃０）は、同図に示すように、システム領域と、ＥＣＣ（Error  Correcting  Code：誤り訂正符号）領域と、リザーブ領域と、ユーザ領域とを有する。【００３２】
システム領域は、不良セクタ情報等の各種情報が記憶される記憶領域である。ＥＣＣ領域は、フラッシュメモリ１４１Ａによって生成されるＥＣＣが記憶される領域である。フラッシュメモリ１４１Ａは、このＥＣＣを用いてエラーチェックを行い、エラーを検出した場合に、ＥＣＣチェックエラーが発生した旨を通知する。リザーブ領域は、予備領域である。ユーザ領域は、フラッシュメモリ１４１Ａにデータを記憶させるシステムによってデータ管理上必要となるデータが記憶される記憶領域である。【００３３】
図１の説明に戻って、データ転送ＤＭＡ１５０Ａは、キャッシュメモリ１３０Ａと、フラッシュメモリ１４１Ａおよび１４２Ａとの間におけるデータ送受信をＤＭＡにより行うＤＭＡ回路である。このデータ転送ＤＭＡ１５０Ａは、例えば、ＦＰＧＡ（Field  Programmable  Gate  Array）によって実現される。【００３４】
ＲｏＣ１６０Ａは、ＣＭ１００Ａを全体制御する制御装置であり、ホストコンピュータとのインタフェースを制御したり、キャッシュメモリ１３０Ａの管理を行ったりする。また、ＲｏＣ１６０Ａは、ホストコンピュータからデータのライト命令を受け付けた場合に、かかるデータをキャッシュメモリ１３０Ａに記憶する。そして、ＲｏＣ１６０Ａは、キャッシュメモリ１３０Ａにデータを記憶した時点で、ライト処理が完了した旨をホストコンピュータへ通知する。その後、所定の条件を満たした時点で、キャッシュメモリ１３０Ａに記憶したデータをＨＤＤ１１に書き込みする。【００３５】
また、ＲｏＣ１６０Ａは、ストレージ装置１が異常終了した場合に、データ転送ＤＭＡ１５０Ａに対して、キャッシュメモリ１３０Ａに記憶されているデータをフラッシュメモリ１４１Ａおよび１４２Ａに退避させる処理（以下、「データ退避処理」という）を行うように指示する。また、ＲｏＣ１６０Ａは、異常終了後のストレージ装置１が起動した場合に、データ転送ＤＭＡ１５０Ａに対して、フラッシュメモリ１４１Ａおよび１４２Ａに退避したデータをキャッシュメモリ１３０Ａに復旧させる処理（以下、「データ復旧処理」という）を行うように指示する。【００３６】
次に、図３−１〜図３−３を用いて、実施例１に係るストレージ装置１によるデータ退避処理およびデータ復旧処理の概要について説明する。図３−１は、実施例１に係るストレージ装置１によるデータ退避処理の概要を説明するための図である。なお、以下では、図１中に付加した参照符号のＡおよびＢを付与せずに説明する。すなわち、例えば、図３−１に示したキャッシュメモリ１３０は、図１に示したキャッシュメモリ１３０Ａまたは１３０Ｂに対応する。【００３７】
図３−１に示すように、キャッシュメモリ１３０には、５３［ＫＢ］のデータＤ１が記憶されているものとする。この状態で、ストレージ装置１が異常終了したため、ＲｏＣ１６０が、データ転送ＤＭＡ１５０に対して、データＤ１を退避するように指示したとする。かかる指示を受け付けたデータ転送ＤＭＡ１５０は、キャッシュメモリ１３０からデータＤ１を読み出す。なお、以下では、ストレージ装置１が異常終了した時に、データ転送ＤＭＡ１５０によって退避されるキャッシュメモリ１３０上のデータを「退避対象データ」と呼ぶこととする。【００３８】
そして、データ転送ＤＭＡ１５０は、データＤ１を、２８［ＫＢ］ごとに区切る。具体的には、同図に示すように、データ転送ＤＭＡ１５０は、データＤ１を、２８［ＫＢ］のデータＤ１０と、２５［ＫＢ］のデータＤ２０とに区切る。なお、データ転送ＤＭＡ１５０が退避対象データ（上記例ではデータＤ１）を分割するサイズ（上記例では、２８［ＫＢ］）は、予めシステムで決められており、以下では、このサイズを「バウンダリサイズ」と呼び、バウンダリサイズによって区切られた退避対象データの１つのデータを「バウンダリデータ」と呼ぶこととする。実施例１に係るストレージ装置１では、バウンダリサイズが２８［ＫＢ］に決定されていることとする。【００３９】
そして、データ転送ＤＭＡ１５０は、データＤ１０を、２［ＫＢ］ごとに区切る。具体的には、同図に示すように、データ転送ＤＭＡ１５０は、データＤ１０を、１４個のデータＤ１０１〜Ｄ１１４に区切る。なお、データ転送ＤＭＡ１５０がバウンダリデータ（上記例では、データＤ１０およびＤ２０）を分割するサイズ（上記例では、２［ＫＢ］）は、予めシステムで決められており、実施例１に係るストレージ装置１では、このサイズが、２［ＫＢ］に決定されていることとする。以下では、２［ＫＢ］ごとに区切られたバウンダリデータの１つのデータ（データＤ１０１等）を、「退避対象単位データ」と呼ぶこととし、退避対象単位データを識別するための番号を「退避対象単位データ番号」と呼ぶこととする。本明細書では、退避対象単位データに付した参照符号の数字部分を退避対象単位データ番号とする。例えば、データＤ１０１の退避対象単位データ番号は、「１０１」である。【００４０】
そして、データ転送ＤＭＡ１５０は、退避対象単位データ番号が奇数である７個のデータＤ１０１、Ｄ１０３、・・、Ｄ１１３の排他的論理和（以下、「ＸＯＲ」という）演算を行ってパリティデータＰ１１５を生成する。また、データ転送ＤＭＡ１５０は、退避対象単位データ番号が偶数である７個のデータＤ１０２、Ｄ１０４、・・、Ｄ１１４のＸＯＲ演算を行ってパリティデータＰ１１６を生成する。【００４１】
このパリティデータＰ１１５およびＰ１１６のサイズは、データＤ１０１〜Ｄ１１４のサイズと同様の２［ＫＢ］となる。すなわち、バウンダリサイズ２８［ＫＢ］に区切られたデータＤ１０のサイズと、かかるデータＤ１０から生成されたパリティデータＰ１１５およびＰ１１６のサイズの合計は、３２［ＫＢ］となる。なお、以下では、パリティデータも「退避対象単位データ」と呼ぶこととする。【００４２】
その後、データ転送ＤＭＡ１５０は、データＤ１０１〜Ｄ１１４ごとに、ＣＲＣ（Cyclic  Redundancy  Check）を生成する。同様に、データ転送ＤＭＡ１５０は、パリティデータＰ１１５およびＰ１１６ごとに、ＣＲＣを生成する。そして、データ転送ＤＭＡ１５０は、生成したＣＲＣを、データＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とに付与する。【００４３】
また、データ転送ＤＭＡ１５０は、データＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とを識別するための識別番号（以下、「ＡＩＤ：Area  Identification」という）をデータＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とに付与する。このＡＩＤについては、後に詳述する。【００４４】
そして、データ転送ＤＭＡ１５０は、ＣＲＣおよびＡＩＤが付与されたデータＤ１０１〜Ｄ１１４と、ＣＲＣおよびＡＩＤが付与されたパリティデータＰ１１５およびＰ１１６とをフラッシュメモリ１４１に書き込む。すなわち、データ転送ＤＭＡ１５０は、１６個の退避対象単位データ（１４個のデータＤ１０１〜Ｄ１１４と、２個のパリティデータＰ１１５およびＰ１１６）を、フラッシュメモリ１４１に書き込む。【００４５】
このとき、データ転送ＤＭＡ１５０は、フラッシュメモリ１４１が有する４個のメモリバンク＃００〜メモリバンク＃０３に対して、退避対象単位データを４個ずつ書き込む。また、このとき、データ転送ＤＭＡ１５０は、メモリバンク＃００〜メモリバンク＃０３が有する２個のダイ＃０およびダイ＃１に対して、退避対象単位データを２個ずつ書き込む。また、このとき、データ転送ＤＭＡ１５０は、ダイ＃０およびダイ＃１が有する所定の２個のＢｌｏｃｋに対して、退避対象単位データ番号が奇数である退避対象単位データと、退避対象単位データ番号が偶数である退避対象単位データとを１個ずつ書き込む。【００４６】
以下では、データ転送ＤＭＡ１５０が、１６個の退避対象単位データを書き込むフラッシュメモリ１４１上の領域を「小エリア」と呼ぶこととする。この「小エリア」は、例えば、図２−１に示した小エリアＳＡ１に該当する。【００４７】
ここで、データ転送ＤＭＡ１５０のデータ書込処理について、データＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とを、図２−１に示した小エリアＡＳ１に書き込む場合を例に挙げて説明する。なお、以下では、「メモリバンク＃Ｐのダイ＃ＱのＢｌｏｃｋ＃Ｒが有するｐａｇｅ＃Ｓ」を示す場合に、「メモリバンク＃Ｐ／ダイ＃Ｑ／Ｂｌｏｃｋ＃Ｒ／ｐａｇｅ＃Ｓ」と記載することとする。【００４８】
かかる場合、データ転送ＤＭＡ１５０は、例えば、データＤ１０１を、小エリアＳＡ１内のメモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のメイン領域に書き込む。そして、データ転送ＤＭＡ１５０は、データＤ１０２を、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃３／ｐａｇｅ＃１のメイン領域に書き込み、データＤ１０３を、メモリバンク＃００／ダイ＃１／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のメイン領域に書き込む。このようにして、データ転送ＤＭＡ１５０は、データＤ１０４〜Ｄ１１３を書き込んでいき、データＤ１１４を、メモリバンク＃０３／ダイ＃０／Ｂｌｏｃｋ＃３／ｐａｇｅ＃１に書き込み、パリティデータＰ１１５を、メモリバンク＃０３／ダイ＃１／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１に書き込み、パリティデータＰ１１６を、メモリバンク＃０３／ダイ＃１／Ｂｌｏｃｋ＃３／ｐａｇｅ＃１に書き込む。【００４９】
そして、データ転送ＤＭＡ１５０は、各退避対象単位データに付与したＣＲＣをｐａｇｅのスペア領域内のユーザ領域に書き込む。上記例のように、データＤ１０１を、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のメイン領域に書き込んだ場合、データ転送ＤＭＡ１５０は、データＤ１０１のＣＲＣを、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のスペア＃０のユーザ領域に書き込む。同様に、データ転送ＤＭＡ１５０は、データＤ１０２〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６のＣＲＣについても、ｐａｇｅのユーザ領域に書き込む。【００５０】
また、データ転送ＤＭＡ１５０は、各退避対象単位データに付与したＡＩＤをｐａｇｅのスペア領域内のユーザ領域に書き込む。上記例のように、データＤ１０１のＣＲＣを、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のスペア＃０のユーザ領域に書き込んだ場合、データ転送ＤＭＡ１５０は、データＤ１０１のＡＩＤを、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のスペア＃１のユーザ領域に書き込む。同様に、データ転送ＤＭＡ１５０は、データＤ１０２〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６のＡＩＤについても、ｐａｇｅのユーザ領域に書き込む。【００５１】
このようにして、データ転送ＤＭＡ１５０は、１６個の退避対象単位データを、小エリアに書き込む。以下では、小エリア内の１つのｐａｇｅに記憶されている全てのデータ（退避対象単位データやＣＲＣやＡＩＤ等）を「ストライプ」と呼ぶこととし、小エリア内でストライプを識別するための番号を「ストライプ番号」と呼ぶこととする。本明細書では、退避対象単位データに付した参照符号の数字下２桁部分をストライプ番号とする。例えば、データＤ１０１を記憶するｐａｇｅに記憶されているストライプのストライプ番号は「１」であり、パリティデータＰ１１５を記憶するｐａｇｅに記憶されているストライプのストライプ番号は「１５」である。以下では、ストライプ番号「Ｎ」のストライプを、単に、ストライプＳ「Ｎ」と呼ぶこととする。【００５２】
なお、図３−１に示したフラッシュメモリ１４１内の「Ｄ１０１」や「Ｐ１１５」等を記載した矩形は、ｐａｇｅのメイン領域を示し、かかるメイン領域の後に斜線を付して示した矩形は、ｐａｇｅのスペア領域を示す。すなわち、同図では、例えば、「Ｄ１０１」を記載したメイン領域と、かかるメイン領域の後に示したスペア領域との組合せがストライプＳ１であることを示す。【００５３】
同様にして、データ転送ＤＭＡ１５０は、データＤ２０をフラッシュメモリ１４２に書き込む。具体的には、データ転送ＤＭＡ１５０は、データＤ２０を２［ＫＢ］ごとに区切る。このとき、データ転送ＤＭＡ１５０は、データＤ２０のサイズが２５［ＫＢ］であり、バウンダリサイズの２８［ＫＢ］に満たないので、データＤ２０のサイズが２８［ＫＢ］になるように、３［ＫＢ］の所定の値を加える。以下では、この所定の値を「バウンダリ調整値」と呼ぶこととする。バウンダリデータのサイズがバウンダリサイズに満たない場合に、バウンダリ調整値を加える理由は、パリティデータを生成できるようにするためである。【００５４】
そして、データ転送ＤＭＡ１５０は、バウンダリ調整値を加えたデータＤ２０を２［ＫＢ］ごとに区切る。具体的には、同図に示すように、データ転送ＤＭＡ１５０は、３［ＫＢ］のバウンダリ調整値を加えたデータＤ２０を、１４個のデータＤ２０１〜Ｄ２１４に区切る。【００５５】
その後の処理は、上述したデータＤ１０をフラッシュメモリ１４１に書き込む処理と同様であり、データ転送ＤＭＡ１５０は、パリティデータＰ２１５およびＰ２１６を生成して、データＤ２０１等のＣＲＣを生成して、データＤ２０１〜Ｄ２１４と、パリティデータＰ２１５およびＰ２１６と、ＣＲＣと、ＡＩＤとをフラッシュメモリ１４２に書き込む。【００５６】
このようにして、データ転送ＤＭＡ１５０は、キャッシュメモリ１３０に記憶されているデータＤ１のうち、データＤ１０をフラッシュメモリ１４１に書き込み、データＤ２０をフラッシュメモリ１４２に書き込む。【００５７】
なお、データ転送ＤＭＡ１５０は、複数の小エリアに対して、データを並行して書き込むことが可能である。実施例１に係るストレージ装置１では、データ転送ＤＭＡ１５０が、最大で６４個の小エリアに対して同時にデータを書き込むこととする。以下では、この６４個の小エリアを「エリア」と呼ぶこととする。この「エリア」は、例えば、図２−１に示したエリアＡ１に該当する。上述したＡＩＤは、１個のエリア内に含まれるストライプを識別するための識別番号である。このＡＩＤは、ＲｏＣ１６０によって算出され、データ転送ＤＭＡ１５０は、ＲｏＣ１６０からＡＩＤを受け付ける。【００５８】
次に、実施例１に係るストレージ装置１によるデータ復旧処理の概要について説明する。図３−２および図３−３は、実施例１に係るストレージ装置１によるデータ復旧処理の概要を説明するための図である。図３−２および図３−３に示したフラッシュメモリ１４１には、図３−１に示したデータ転送ＤＭＡ１５０によって退避されたデータが記憶されているものとする。【００５９】
まず、図３−２を用いて、図３−１に示したデータＤ１０をキャッシュメモリ１３０に復旧させる処理について説明する。ここでは、図３−２に示したフラッシュメモリ１４１に記憶されているデータＤ１０３の一部が、フラッシュメモリ１４１のセル劣化等の原因により破損しているものとする。そして、フラッシュメモリ１４１は、データＤ１０３の読出要求を受け付けると、かかる読出要求に対する応答ができなくなるものとする。【００６０】
かかる状態で、ストレージ装置１が異常終了後に起動した場合、データ転送ＤＭＡ１５０は、フラッシュメモリ１４１から、小エリア単位でストライプを読み出す。具体的には、データ転送ＤＭＡ１５０は、フラッシュメモリ１４１から、ストライプＳ１〜Ｓ１６を読み出す。【００６１】
そして、データ転送ＤＭＡ１５０は、ストライプＳ３を読み出している途中で、フラッシュメモリ１４１から読出応答を受け付けなくなる。所定の時間が経過してもストライプＳ３を読み出せない場合、データ転送ＤＭＡ１５０は、ストライプＳ３に対してタイムアウトが発生したことを検出する。【００６２】
そして、データ転送ＤＭＡ１５０は、タイムアウトが発生したストライプＳ３の読出処理を中止して、ストライプＳ３に、読み出しできなかったサイズ分の所定の値（以下、この所定の値を「付加データ」という）を設定する。例えば、１［ＫＢ］分のストライプＳ３を読み出した時点で、フラッシュメモリ１４１から読み出し応答を受け付けなくなった場合、データ転送ＤＭＡ１５０は、読み出し済みの１［ＫＢ］のデータに１［ＫＢ］の付加データを加えた２［ＫＢ］のデータをストライプＳ３とする。その後、データ転送ＤＭＡ１５０は、データの読出処理を再開して、フラッシュメモリ１４１から、ストライプＳ４〜Ｓ１６を読み出す。【００６３】
また、データ転送ＤＭＡ１５０は、ストライプＳ１〜１６を読み出しながら、ＣＲＣ検査、ＡＩＤ検査およびＸＯＲ演算を行う。具体的には、データ転送ＤＭＡ１５０は、読み出したストライプＳ１〜１６内のＣＲＣを用いて、ストライプＳ１〜１６に誤りデータが存在するか否かを検査する。また、データ転送ＤＭＡ１５０は、ストライプＳ１〜１６内のＡＩＤを用いて、ストライプＳ１〜１６がすべて揃っているか否かを検査する。また、データ転送ＤＭＡ１５０は、ストライプ番号が奇数であるストライプＳ１、Ｓ３、・・、Ｓ１５のＸＯＲ演算を行い、訂正データＴ１１を生成するとともに、ストライプ番号が偶数であるストライプＳ２、Ｓ４、・・、Ｓ１６のＸＯＲ演算を行い、訂正データＴ１２を生成する。【００６４】
図３−２に示した例では、データ転送ＤＭＡ１５０は、付加データが設定されているストライプＳ３のＣＲＣ検査において、誤りデータが存在することを検出する。なお、ストライプＳ３に含まれるＡＩＤを読み出す前に、タイムアウトが発生した場合には、ＡＩＤには付加データが設定されているため、データ転送ＤＭＡ１５０は、ストライプＳ３のＡＩＤ検査において、データＤ１０３が欠如していると検出する可能性もある。ここでは、データ転送ＤＭＡ１５０は、ストライプＳ３に対してのみデータ誤りを検出し、ストライプＳ１、Ｓ２、Ｓ４〜Ｓ１６に対しては、ＣＲＣ検査およびＡＩＤ検査においてエラーを検出しなかったものとする。【００６５】
すべてのストライプＳ１〜１６を読み出した後、データ転送ＤＭＡ１５０は、ＣＲＣ検査およびＡＩＤ検査においてエラーが検出されなかったストライプＳ１およびＳ２に含まれるデータＤ１０１およびＤ１０２をキャッシュメモリ１３０に書き込む。そして、データ転送ＤＭＡ１５０は、エラーが検出されたストライプＳ３については、ストライプ番号が奇数であるストライプＳ１、Ｓ５、Ｓ７、・・、Ｓ１５および訂正データＴ１１を用いて、データＤ１０３の誤りデータを訂正して、訂正済みのデータＤ１０３をキャッシュメモリ１３０に書き込む。そして、データ転送ＤＭＡ１５０は、エラーが検出されなかったストライプＳ４〜Ｓ１４に含まれるデータＤ１０４〜Ｄ１１４をキャッシュメモリ１３０に書き込む。なお、ストライプＳ１５およびＳ１６はパリティデータであるため、データ転送ＤＭＡ１５０は、ストライプＳ１５およびＳ１６に含まれるパリティデータＰ１１５およびＰ１１６をキャッシュメモリ１３０に書き込まない。このようにして、データ転送ＤＭＡ１５０は、データＤ１０をキャッシュメモリ１３０に復旧する。【００６６】
続いて、図３−３を用いて、図３−１に示したデータＤ２０をキャッシュメモリ１３０に復旧させる処理について説明する。同図に示すように、データ転送ＤＭＡ１５０は、データＤ１０の復旧処理が終了した後、フラッシュメモリ１４２から、ストライプＳ１〜Ｓ１６を読み出しながら、ＣＲＣ検査、ＡＩＤ検査およびＸＯＲ演算を行い、訂正データＴ２１およびＴ２２を生成する。ここでは、データ転送ＤＭＡ１５０は、フラッシュメモリ１４２からストライプＳ１〜Ｓ１６の読出処理中に、タイムアウトが発生しなかったものとする。また、データ転送ＤＭＡ１５０は、ストライプＳ１〜Ｓ１６のＣＲＣ検査およびＡＩＤ検査においてエラーを検出しなかったものとする。【００６７】
すべてのストライプＳ１〜１６を読み出した後、データ転送ＤＭＡ１５０は、ストライプＳ１〜Ｓ１２に含まれるデータＤ２０１〜Ｄ２１２をキャッシュメモリ１３０に書き込む。そして、データ転送ＤＭＡ１５０は、ストライプＳ１３に含まれるデータＤ２１３から１［ＫＢ］のバウンダリ調整値を除去したデータＤ２１３をキャッシュメモリ１３０に書き込む。なお、ストライプＳ１４に含まれるデータＤ２１４は、すべてバウンダリ調整値であるため、データ転送ＤＭＡ１５０は、データＤ２１４をキャッシュメモリ１３０に書き込まない。【００６８】
以上のように、実施例１に係るストレージ装置１は、データ退避処理時に、退避対象データのパリティデータを生成して、ＣＲＣやＡＩＤを付与した退避対象データおよびパリティデータをフラッシュメモリ１４１または１４２に書き込み、データ復旧処理において、フラッシュメモリ１４１または１４２から所定の時間内にデータ読出処理が完了しない場合に、データ読出処理を中止して付加データを設定し、パリティデータを用いて誤りデータを訂正したデータをキャッシュメモリ１３０に書き込むので、フラッシュメモリ１４１または１４２からデータの読出応答がなされない場合であっても、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。【００６９】
また、実施例１に係るストレージ装置１は、退避対象単位データ番号が奇数である退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である退避対象単位データを用いてパリティデータを生成し、小エリア内の１つのダイには、退避対象単位データ番号が奇数である退避対象単位データと、退避対象単位データ番号が偶数である退避対象単位データとを書き込むように構成したので、１個のダイが故障した場合であっても、かかる故障したダイに記憶されていたデータを訂正することができる。すなわち、１個のダイが故障した場合であっても、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。【００７０】
次に、実施例１に係るストレージ装置１が有するＣＭ１００の構成について説明する。図４は、実施例１に係るストレージ装置１が有するＣＭ１００の構成を示す図である。なお、同図では、データ退避処理およびデータ復旧処理に関連する構成のみを図示している。【００７１】
同図に示すように、ＣＭ１００は、電力供給部１２と接続されており、キャッシュメモリ１３０と、フラッシュメモリ１４１および１４２と、データ転送ＤＭＡ１５０と、ＲｏＣ１６０とを有する。【００７２】
電力供給部１２は、ストレージ装置１が異常終了した場合に、ＣＭ１００に対して電力供給を行う装置であり、例えば、大容量のコンデンサやバッテリー等である。なお、同図では、ＣＭ１００が外部に備えられた電力供給部１２によって電力供給される例を示しているが、ＣＭ１００は、電力供給部１２を有してもよい。【００７３】
キャッシュメモリ１３０は、上述したように、ホストコンピュータとＨＤＤ１１との間で転送が行われるデータを一時的に記憶するメモリである。フラッシュメモリ１４１および１４２は、不揮発性メモリであり、ストレージ装置１の異常終了時にデータ転送ＤＭＡ１５０によって、キャッシュメモリ１３０に記憶されているデータが退避される。【００７４】
データ転送ＤＭＡ１５０は、ＲｏＣ１６０に指示に従って、キャッシュメモリ１３０と、フラッシュメモリ１４１および１４２との間におけるデータ送受信を行うＤＭＡ回路である。具体的には、データ転送ＤＭＡ１５０は、ストレージ装置１が異常終了した場合に、キャッシュメモリ１３０に記憶されているデータを、フラッシュメモリ１４１および１４２に退避させるデータ退避処理を行う。また、データ転送ＤＭＡ１５０は、ストレージ装置１が異常終了後に電源投入された場合に、フラッシュメモリ１４１および１４２に退避したデータをキャッシュメモリ１３０に復旧するデータ復旧処理を行う。なお、データ転送ＤＭＡ１５０の構成、データ転送ＤＭＡ１５０によるデータ退避処理およびデータ復旧処理については、後に詳述する。【００７５】
ＲｏＣ１６０は、ＣＭ１００を全体制御する制御装置であり、退避データ領域算出部１６１と、退避指示部１６２と、復旧指示部１６３とを有する。退避データ領域算出部１６１は、ストレージ装置１が異常終了した場合に、データ転送ＤＭＡ１５０にデータ退避処理を行うように指示する際に必要となる各種情報を算出する処理部である。【００７６】
具体的には、退避データ領域算出部１６１は、退避対象データのサイズや、退避対象データのキャッシュメモリ１３０における記憶位置（アドレス）に基づいて、データ転送ＤＭＡ１５０が退避するデータのサイズや、データ転送ＤＭＡ１５０が退避するデータの記憶位置や、バウンダリ調整値のサイズ等を算出する。【００７７】
退避指示部１６２は、データ転送ＤＭＡ１５０に対して、データ退避処理を行うように指示する処理部である。具体的には、退避指示部１６２は、ストレージ装置１が異常終了した場合に、データ退避処理を行うように指示する命令（以下、「データ退避ディスクリプタ」という）を生成して、データ転送ＤＭＡ１５０に送信する。【００７８】
このデータ退避ディスクリプタには、退避データ領域算出部１６１によって算出された各種情報が含まれる。具体的には、データ退避ディスクリプタには、退避対象データのキャッシュメモリ１３０における先頭の記憶位置（先頭アドレス）や、退避対象データのサイズや、バウンダリ調整値のサイズや、ＡＩＤ等が含まれる。【００７９】
復旧指示部１６３は、データ転送ＤＭＡ１５０に対して、データ復旧処理を行うように指示する処理部である。具体的には、復旧指示部１６３は、ストレージ装置１が異常終了後に電源投入された場合に、データ復旧処理を行うように指示する命令（以下、「データ復旧ディスクリプタ」という）を生成して、データ転送ＤＭＡ１５０に送信する。このデータ復旧ディスクリプタには、除去するバウンダリ調整値のサイズ等が含まれる。【００８０】
また、復旧指示部１６３は、データ転送ＤＭＡ１５０によるデータ復旧処理が完了した場合に、フラッシュメモリ１４１および１４２に記憶されているデータを消去する命令（以下、「イレースディスクリプタ」という）を生成して、データ転送ＤＭＡ１５０に送信する。【００８１】
次に、データ転送ＤＭＡ１５０の構成について説明する。図５は、図４に示したデータ転送ＤＭＡ１５０の構成を示す図である。同図に示すように、データ転送ＤＭＡ１５０は、ＰＣＩ（Peripheral  Component  Interconnect）バスＩ／Ｆ５１０と、メモリＩ／Ｆ５２１および５２２と、ディスクリプタ保持レジスタ５３０と、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０と、イレースＤＭＡ５６１および５６２とを有する。【００８２】
ＰＣＩバスＩ／Ｆ５１０は、データ転送ＤＭＡ１５０とキャッシュメモリ１３０との間のデータ送受信を行うインタフェースである。メモリＩ／Ｆ５２１は、データ転送ＤＭＡ１５０とフラッシュメモリ１４１との間のデータ送受信を行うインタフェースであり、メモリＩ／Ｆ５２２は、データ転送ＤＭＡ１５０とフラッシュメモリ１４２との間のデータ送受信を行うインタフェースである。【００８３】
ディスクリプタ保持レジスタ５３０は、ＲｏＣ１６０から受信した各種ディスクリプタを記憶するレジスタである。具体的には、ディスクリプタ保持レジスタ５３０は、データ退避ディスクリプタや、データ復旧ディスクリプタや、イレースディスクリプタ等を記憶する。【００８４】
ライトＤＭＡ５４１および５４２は、データ退避処理を行うＤＭＡ回路である。具体的には、ライトＤＭＡ５４１は、ディスクリプタ保持レジスタ５３０からデータ退避ディスクリプタを受け取った場合に、ＰＣＩバスＩ／Ｆ５１０を介してキャッシュメモリ１３０に記憶されているデータを取得する。そして、ライトＤＭＡ５４１は、取得したデータを、メモリＩ／Ｆ５２１を介してフラッシュメモリ１４１に書き込む。同様に、ライトＤＭＡ５４２は、ディスクリプタ保持レジスタ５３０からデータ退避ディスクリプタを受け取った場合に、キャッシュメモリ１３０に記憶されているデータを取得し、取得したデータを、フラッシュメモリ１４２に書き込む。【００８５】
ライトＤＭＡ５４１および５４２は、キャッシュメモリ１３０からフラッシュメモリ１４１または１４２にデータを転送する処理を並行して行う。図３−１に示した例において、例えば、ライトＤＭＡ５４１がデータＤ１０をフラッシュメモリ１４１へ書き込む処理を行い、ライトＤＭＡ５４２がデータＤ２０をフラッシュメモリ１４２へ書き込む処理を行う。そして、このライトＤＭＡ５４１および５４２によるデータ退避処理が並行して行われる。【００８６】
このように、ストレージ装置１は、２系統のフラッシュメモリ１４１および１４２と、２系統のライトＤＭＡ５４１および５４２とを有して、ライトＤＭＡ５４１および５４２に対してデータ退避処理を並行して行わせる。これにより、ストレージ装置１は、データ退避処理を効率よく行うことが可能となり、電力供給部１２から電力供給される短い時間内にデータ退避処理を完了させることを実現している。【００８７】
リードＤＭＡ５５０は、データ復旧処理を行うＤＭＡ回路である。具体的には、リードＤＭＡ５５０は、ディスクリプタ保持レジスタ５３０から、データ復旧ディスクリプタを受け取った場合に、フラッシュメモリ１４１に記憶されているデータを取得し、取得したデータを、キャッシュメモリ１３０に記憶させる。同様に、リードＤＭＡ５５０は、データ復旧ディスクリプタを受け取った場合に、フラッシュメモリ１４２に記憶されているデータを取得し、取得したデータを、キャッシュメモリ１３０に記憶させる。【００８８】
実施例１に係るストレージ装置１が、データ退避処理を２系統のライトＤＭＡ５４１および５４２に行わせるのに対して、データ復旧処理を１系統のリードＤＭＡ５５０に行わせる理由について説明する。これは、データ退避処理には、電力供給部１２から電力供給される短い時間内に完了させなければならないという制約があるのに対して、データ復旧処理には、このような制約がないためである。【００８９】
ただし、データ転送ＤＭＡ１５０が有するライトＤＭＡやリードＤＭＡの数は、図５に示した例に限られない。例えば、データ転送ＤＭＡ１５０は、例えば、３個のライトＤＭＡを有してもよいし、１０個のリードＤＭＡを有してもよい。【００９０】
イレースＤＭＡ５６１は、ディスクリプタ保持レジスタ５３０からイレースディスクリプタを受け取った場合に、フラッシュメモリ１４１に記憶されているデータを消去するＤＭＡ回路である。同様に、イレースＤＭＡ５６２は、ディスクリプタ保持レジスタ５３０からイレースディスクリプタを受け取った場合に、フラッシュメモリ１４２に記憶されているデータを消去するＤＭＡ回路である。【００９１】
次に、ライトＤＭＡ５４１および５４２の構成について説明する。図６は、図５に示したライトＤＭＡ５４１および５４２の構成を示す図である。なお、ライトＤＭＡ５４１および５４２の構成は同一であるため、ここでは、ライトＤＭＡ５４１の構成についてのみ説明する。【００９２】
同図に示すように、ライトＤＭＡ５４１は、データ読出部５４１ａと、バウンダリ調整部５４１ｂと、パリティ生成部５４１ｃと、退避データバッファ５４１ｄと、パリティバッファ５４１ｅと、データ書込部５４１ｆとを有する。【００９３】
データ読出部５４１ａは、キャッシュメモリ１３０から所定のサイズのデータを読み出す処理部である。具体的には、データ読出部５４１ａは、データ退避ディスクリプタに含まれている退避対象データの先頭アドレスから、退避対象データのサイズ分のデータを読み出す。【００９４】
バウンダリ調整部５４１ｂは、データ読出部５４１ａによって読み出された退避対象データにバウンダリ調整値を加える処理部である。具体的には、バウンダリ調整部５４１ｂは、退避対象データに、データ退避ディスクリプタに含まれているバウンダリ調整値のサイズ分のバウンダリ調整値を加える。【００９５】
パリティ生成部５４１ｃは、データ読出部５４１ａによって読み出された退避対象データを用いて、パリティデータを生成する処理部である。具体的には、パリティ生成部５４１ｃは、退避対象データを、バウンダリサイズ２８［ＫＢ］ごとのバウンダリデータに区切って、さらに、バウンダリデータを、予めシステムで決められているサイズである２［ＫＢ］ごとに区切る。【００９６】
そして、パリティ生成部５４１ｃは、退避対象単位データ番号が奇数である７個の退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である７個の退避対象単位データを用いてパリティデータを生成する。そして、データ読出部５４１ａによって読み出された退避対象データを、退避データバッファ５４１ｄに記憶させるとともに、生成したパリティデータをパリティバッファ５４１ｅに記憶させる。【００９７】
退避データバッファ５４１ｄは、データを一次記憶する記憶装置であり、上述したように、パリティ生成部５４１ｃによって退避対象データが記憶される。パリティバッファ５４１ｅは、データを一次記憶する記憶装置であり、上述したように、パリティ生成部５４１ｃによってパリティデータが記憶される。【００９８】
データ書込部５４１ｆは、退避データバッファ５４１ｄおよびパリティバッファ５４１ｅから、退避対象単位データおよびパリティデータを読み出してフラッシュメモリ１４１に書き込む処理部であり、ＣＲＣ付与部５４１ｇとＡＩＤ付与部５４１ｈとを有する。【００９９】
ＣＲＣ付与部５４１ｇは、退避データバッファ５４１ｄから読み出した退避対象単位データごとにＣＲＣを生成するとともに、パリティバッファ５４１ｅから読み出したパリティデータごとにＣＲＣを生成する。そして、ＣＲＣ付与部５４１ｇは、生成したＣＲＣを、退避対象単位データおよびパリティデータに付与する。【０１００】
ＡＩＤ付与部５４１ｈは、退避データバッファ５４１ｄから読み出した退避対象単位データに、ＡＩＤを付与するとともに、パリティバッファ５４１ｅから読み出したパリティデータに、ＡＩＤを付与する。なお、ＡＩＤ付与部５４１ｈは、データ退避ディスクリプタからＡＩＤを取得する。【０１０１】
データ書込部５４１ｆは、このようにしてＣＲＣおよびＡＩＤが付与された退避対象単位データおよびパリティデータを、フラッシュメモリ１４１に書き込む。【０１０２】
次に、リードＤＭＡ５５０の構成について説明する。図７は、図５に示したリードＤＭＡ５５０の構成を示す図である。同図に示すように、リードＤＭＡ５５０は、セレクタ５５０ａと、データ読出部５５０ｂと、タイムアウト検出部５５０ｃと、エラー検出部５５０ｄと、復旧データバッファ５５０ｅと、ＸＯＲ演算部５５０ｆと、ＣＲＣ検査部５５０ｇと、ＡＩＤ検査部５５０ｈと、訂正データバッファ５５０ｉと、ログ保持レジスタ５５０ｊと、セレクタ５５０ｋと、バウンダリ調整部５５０ｌと、データ書込部５５０ｍとを有する。【０１０３】
セレクタ５５０ａは、複数の入力信号の中から１つの入力信号のみを選択して出力するセレクタ回路であり、フラッシュメモリ１４１に記憶されているストライプをデータ読出部５５０ｂに出力したり、付加データをデータ読出部５５０ｂに出力したりする。セレクタ５５０ａが、ストライプまたは付加データのいずれを出力するかは、後に説明する。【０１０４】
データ読出部５５０ｂは、セレクタ５５０ａを介して、フラッシュメモリ１４１から、小エリアのストライプを読み出して、読み出したストライプを復旧データバッファ５５０ｅに記憶させる。このとき、データ読出部５５０ｂは、データ読出処理を開始した時刻をタイムアウト検出部５５０ｃに通知する。【０１０５】
タイムアウト検出部５５０ｃは、データ読出部５５０ｂから受け付けたデータ読出処理の開始時刻に基づいて、データ読出部５５０ｂによるデータ読出処理が所定の時間内に完了するか否かを監視する処理部である。【０１０６】
具体的には、タイムアウト検出部５５０ｃは、データ読出部５５０ｂによるデータ読出処理が、データ読出処理の開始時刻から所定の時間を経過しても完了しない場合に、データ読出部５５０ｂが読取処理中のストライプに対してタイムアウトが発生したことを検出する。そして、タイムアウト検出部５５０ｃは、タイムアウトを検出したストライプのストライプ番号を含むタイムアウト検出通知をセレクタ５５０ａに対して行う。【０１０７】
ここで、タイムアウト検出通知を受け付けたセレクタ５５０ａの処理について説明する。タイムアウト検出通知を受け付けたセレクタ５５０ａは、タイムアウト検出通知に含まれるストライプ番号が示すストライプの読出処理を中止して、かかるストライプの読み出しできなかったサイズ分の付加データをデータ読出部５５０ｂに出力する。その後、セレクタ５５０ａは、次のストライプの読出処理を再開する。【０１０８】
エラー検出部５５０ｄは、フラッシュメモリ１４１からＥＣＣチェックエラーが発生した旨の通知を受け付けた場合に、ＥＣＣエラー通知をセレクタ５５０ａに対して行う処理部である。【０１０９】
ここで、ＥＣＣエラー通知を受け付けたセレクタ５５０ａの処理について説明する。ＥＣＣエラー通知を受け付けたセレクタ５５０ａは、読出処理中のストライプの読出処理を中止して、かかるストライプの読み出しできなかったサイズ分の付加データをデータ読出部５５０ｂに出力する。その後、セレクタ５５０ａは、次のストライプの読出処理を再開する。【０１１０】
復旧データバッファ５５０ｅは、データを一次記憶する記憶装置であり、上述したように、データ読出部５５０ｂによって、ストライプまたは付加データが設定されているストライプが記憶される。【０１１１】
ＸＯＲ演算部５５０ｆは、データ読出部５５０ｂによって読み出されたストライプを用いて訂正データを生成する処理部である。具体的には、ＸＯＲ演算部５５０ｆは、ストライプ番号が奇数である７個のストライプを用いて訂正データを生成するとともに、ストライプ番号が偶数である７個のストライプを用いて訂正データを生成する。そして、ＸＯＲ演算部５５０ｆは、生成した訂正データを訂正データバッファ５５０ｉに記憶させる。【０１１２】
ＣＲＣ検査部５５０ｇは、データ読出部５５０ｂによって読み出されたストライプに誤りデータが存在するか否かを検査する処理部である。具体的には、ＣＲＣ検査部５５０ｇは、データ読出部５５０ｂによって読み出されたストライプ内のＣＲＣを用いて、誤りデータが存在するか否かを、ストライプごとに検査する。そして、誤りデータが存在する場合、すなわち、エラーを検出した場合、ＣＲＣ検査部５５０ｇは、エラーを検出したストライプのストライプ番号をログ保持レジスタ５５０ｊに記憶させる。【０１１３】
ＡＩＤ検査部５５０ｈは、データ読出部５５０ｂによって読み出されたストライプがすべて揃っているか否かを検査する処理部である。具体的には、ＡＩＤ検査部５５０ｈは、データ読出部５５０ｂによって読み出されたストライプ内のＡＩＤを用いて、小エリア内のストライプがすべて揃っているか否かを検査する。そして、ストライプがすべて揃っていないことを検出した場合、すなわち、エラーを検出した場合、ＡＩＤ検査部５５０ｈは、欠如しているストライプのストライプ番号をログ保持レジスタ５５０ｊに記憶させる。【０１１４】
訂正データバッファ５５０ｉは、データを一次記憶する記憶装置であり、上述したように、ＸＯＲ演算部５５０ｆによって、訂正データが記憶される。ログ保持レジスタ５５０ｊは、データを一次記憶する記憶装置であり、上述したように、ＣＲＣ検査部５５０ｇまたはＡＩＤ検査部５５０ｈによって、エラーが検出されたストライプのストライプ番号が記憶される。【０１１５】
セレクタ５５０ｋは、セレクタ回路であり、復旧データバッファ５５０ｅと、訂正データバッファ５５０ｉと、ログ保持レジスタ５５０ｊとに記憶されている各種データに基づいて、復旧データバッファ５５０ｅに記憶されているストライプを、データ書込部５５０ｍに出力したり、誤りデータを訂正したストライプをデータ書込部５５０ｍに出力したりする。【０１１６】
具体的には、セレクタ５５０ｋは、ログ保持レジスタ５５０ｊにストライプ番号が記憶されていないストライプについては、復旧データバッファ５５０ｅに記憶されているストライプを、データ書込部５５０ｍに出力する。また、セレクタ５５０ｋは、ログ保持レジスタ５５０ｊにストライプ番号が記憶されているストライプ（以下、「エラー検出ストライプ」という）については、復旧データバッファ５５０ｅおよび訂正データバッファ５５０ｉに記憶されている各種データを用いて、かかるエラー発生ストライプの誤りデータを訂正してデータ書込部５５０ｍに出力する。【０１１７】
バウンダリ調整部５５０ｌは、セレクタ５５０ｋから受け付けた小エリア単位のストライプからバウンダリ調整値を除去する処理部である。具体的には、バウンダリ調整部５５０ｌは、小エリア単位のストライプから、データ復旧ディスクリプタに含まれるバウンダリ調整値のサイズ分のバウンダリ調整値を除去する。【０１１８】
データ書込部５５０ｍは、バウンダリ調整部５５０ｌによってバウンダリ調整値が除去された小エリア単位のストライプに含まれる退避対象単位データをキャッシュメモリ１３０に書き込む処理部である。なお、データ書込部５５０ｍは、パリティデータについてはキャッシュメモリ１３０に書き込まない。【０１１９】
次に、実施例１に係るストレージ装置１によるデータ退避処理について説明する。図８は、実施例１に係るストレージ装置１によるデータ退避処理の流れを示すシーケンス図である。【０１２０】
同図に示すように、ＲｏＣ１６０の退避データ領域算出部１６１は、ストレージ装置１が異常終了したことを検出した場合（ステップＳ１０１）、データ退避ディスクリプタを生成するために必要となる各種情報を算出する。【０１２１】
そして、退避指示部１６２は、退避データ領域算出部１６１によって算出された各種情報に基づいて、ライトＤＭＡ５４１にデータ退避処理を行わせるためのデータ退避ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ１０２）。【０１２２】
例えば、図３−１に示した例のように、キャッシュメモリ１３０にデータＤ１が記憶されている場合、退避指示部１６２は、ライトＤＭＡ５４１にデータ退避処理をさせるためのデータ退避ディスクリプタとして、データＤ１０の先頭アドレスと、データＤ１０のサイズ２８［ＫＢ］と、バウンダリ調整値のサイズ０［ＫＢ］と、ＡＩＤ等を含むデータ退避ディスクリプタを生成する。【０１２３】
同様に、退避指示部１６２は、ライトＤＭＡ５４２にデータ退避処理をさせるためのデータ退避ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ１０３）。【０１２４】
上述例の場合、退避指示部１６２は、ライトＤＭＡ５４２にデータ退避処理をさせるためのデータ退避ディスクリプタとして、データＤ２０の先頭アドレスと、データＤ２０のサイズ２５［ＫＢ］と、バウンダリ調整値のサイズ３［ＫＢ］と、ＡＩＤ等を含むデータ退避ディスクリプタを生成する。【０１２５】
その後、退避指示部１６２は、ライトＤＭＡ５４１を起動させるとともに（ステップＳ１０４）、ライトＤＭＡ５４２を起動させて（ステップＳ１０５）、ライトＤＭＡ５４１およびライトＤＭＡ５４２に対して、データ退避処理を並行して行わせる。【０１２６】
退避指示部１６２によって起動されたライトＤＭＡ５４１は、データ退避処理を行い（ステップＳ１０６）、データ退避処理が完了した場合に、データ退避処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ１０７）。同様に、ライトＤＭＡ５４２は、データ退避処理を行い（ステップＳ１０８）、データ退避処理が完了した場合に、データ退避処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ１０９）。ライトＤＭＡ５４１および５４２によるデータ退避処理は、並行して行われる。【０１２７】
なお、上述したデータ退避処理の流れでは、ストレージ装置１が異常終了した後に、退避指示部１６２がデータ退避ディスクリプタを生成する例を説明したが、退避指示部１６２は、ストレージ装置１が異常終了する前に、データ退避ディスクリプタを生成してもよい。例えば、ストレージ装置１の起動中に、退避対象データのサイズ等を予め取得しておけば、ストレージ装置１の異常終了前にデータ退避ディスクリプタを生成することができる。【０１２８】
次に、ライトＤＭＡ５４１および５４２によるデータ退避処理について説明する。図９は、ライトＤＭＡ５４１および５４２によるデータ退避処理手順を示すフローチャートである。なお、ライトＤＭＡ５４１および５４２によるデータ退避処理手順は同一であるため、ここでは、ライトＤＭＡ５４１によるデータ退避処理手順についてのみ説明する。【０１２９】
同図に示すように、ＲｏＣ１６０によって起動されたライトＤＭＡ５４１は、ディスクリプタ保持レジスタ５３０からデータ退避ディスクリプタを読み出す（ステップＳ２０１）。そして、ライトＤＭＡ５４１のデータ読出部５４１ａは、キャッシュメモリ１３０から、所定のサイズのデータを読み出す（ステップＳ２０２）。このとき、データ読出部５４１ａは、データ退避ディスクリプタに含まれている退避対象データの先頭アドレスから、退避対象データのサイズ分のデータを読み出す。【０１３０】
続いて、バウンダリ調整部５４１ｂは、データ読出部５４１ａによって読み出された退避対象データに、データ退避ディスクリプタに含まれているバウンダリ調整値のサイズ分のバウンダリ調整値を加える（ステップＳ２０３）。【０１３１】
続いて、パリティ生成部５４１ｃは、退避対象データを、バウンダリサイズごとのバウンダリデータに区切って、さらに、バウンダリデータを、予めシステムで決められているサイズである２［ＫＢ］ごとに区切る。そして、パリティ生成部５４１ｃは、退避対象単位データ番号が奇数である７個の退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である７個の退避対象単位データを用いてパリティデータを生成する（ステップＳ２０４）。【０１３２】
続いて、ＣＲＣ付与部５４１ｇは、退避対象単位データごとにＣＲＣを生成するとともに、パリティデータごとにＣＲＣを生成して、生成したＣＲＣを、退避対象単位データおよびパリティデータに付与する（ステップＳ２０５）。続いて、ＡＩＤ付与部５４１ｈは、退避対象単位データおよびパリティデータに、ＡＩＤを付与する（ステップＳ２０６）。そして、データ書込部５４１ｆは、ＣＲＣおよびＡＩＤが付与された退避対象単位データおよびパリティデータを、フラッシュメモリ１４１に書き込む（ステップＳ２０７）。【０１３３】
次に、実施例１に係るストレージ装置１によるデータ復旧処理について説明する。図１０は、実施例１に係るストレージ装置１によるデータ復旧処理の流れを示すシーケンス図である。【０１３４】
同図に示すように、ＲｏＣ１６０の復旧指示部１６３は、異常終了後にストレージ装置１が起動したことを検出した場合（ステップＳ３０１）、リードＤＭＡ５５０に対して、フラッシュメモリ１４１に記憶されているデータをキャッシュメモリ１３０へ復旧する旨のデータ復旧ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ３０２）。その後、復旧指示部１６３は、リードＤＭＡ５５０を起動させる（ステップＳ３０３）。【０１３５】
復旧指示部１６３によって起動されたリードＤＭＡ５５０は、フラッシュメモリ１４１に記憶されているデータをキャッシュメモリ１３０へ復旧させるデータ復旧処理を行う（ステップＳ３０４）。かかるデータ復旧処理が完了した場合に、リードＤＭＡ５５０は、データ復旧処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ３０５）。【０１３６】
続いて、復旧指示部１６３は、リードＤＭＡ５５０に対して、フラッシュメモリ１４２に記憶されているデータをキャッシュメモリ１３０へ復旧する旨のデータ復旧ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ３０６）。その後、復旧指示部１６３は、リードＤＭＡ５５０を起動させる（ステップＳ３０７）。【０１３７】
復旧指示部１６３によって起動されたリードＤＭＡ５５０は、フラッシュメモリ１４２に記憶されているデータをキャッシュメモリ１３０へ復旧させるデータ復旧処理を行う（ステップＳ３０８）。かかるデータ復旧処理が完了した場合に、リードＤＭＡ５５０は、データ復旧処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ３０９）。【０１３８】
続いて、ＲｏＣ１６０は、キャッシュメモリ１３０に復旧されたデータを、ＨＤＤ１１に記憶させるリストア処理（フラッシュバック）を行う（ステップＳ３１０）。これにより、ＨＤＤ１１に書き込みされていないキャッシュメモリ１３０上のデータはなくなる。【０１３９】
続いて、復旧指示部１６３は、イレースディスクリプタを生成して、データ転送ＤＭＡ１５０に記憶させる（ステップＳ３１１）。そして、復旧指示部１６３は、イレースＤＭＡ５６１および５６２を起動させて（ステップＳ３１２）、イレースＤＭＡ５６１および５６２に対して、フラッシュメモリ１４１および１４２に記憶されているデータを消去させる。【０１４０】
復旧指示部１６３によって起動されたイレースＤＭＡ５６１および５６２は、ディスクリプタ保持レジスタ５３０から、イレースディスクリプタを読み出して（ステップＳ３１３）、イレース処理を行う（ステップＳ３１４）。かかるイレース処理が完了した場合に、イレースＤＭＡ５６１および５６２は、イレース処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ３１５）。そして、イレース処理が完了した旨の通知を受け付けたＲｏＣ１６０は、ストレージ装置１を起動させる（ステップＳ３１６）。【０１４１】
次に、リードＤＭＡ５５０によるデータ復旧処理について説明する。図１１は、リードＤＭＡ５５０によるデータ復旧処理手順を示すフローチャートである。同図に示すように、ＲｏＣ１６０によって起動されたリードＤＭＡ５５０は、ディスクリプタ保持レジスタ５３０からデータ復旧ディスクリプタを読み出す（ステップＳ４０１）。【０１４２】
そして、リードＤＭＡ５５０のデータ読出部５５０ｂは、セレクタ５５０ａを介して、フラッシュメモリ１４１から、小エリアのストライプを読み出す（ステップＳ４０２）。このデータ読出部５５０ｂによるデータ読出処理が所定の時間内に完了しない場合（ステップＳ４０３否定）、タイムアウト検出部５５０ｃは、データ読出部５５０ｂによって読取処理されているストライプに対して、タイムアウトが発生したことを検出する。そして、タイムアウト検出部５５０ｃは、タイムアウト検出通知をセレクタ５５０ａに対して行う。【０１４３】
タイムアウト検出通知を受け付けたセレクタ５５０ａは、タイムアウト検出通知に含まれるストライプ番号が示すストライプの読出処理を中止して、かかるストライプの読み出しできなかったサイズ分の付加データをデータ読出部５５０ｂに出力する（ステップＳ４０４）。このようにして、データ読出部５５０ｂは、フラッシュメモリ１４１から小エリアのストライプを読み出す。【０１４４】
続いて、ＸＯＲ演算部５５０ｆは、データ読出部５５０ｂによって読み出されたストライプを用いて訂正データを生成する（ステップＳ４０５）。続いて、ＣＲＣ検査部５５０ｇは、データ読出部５５０ｂによって読み出されたストライプに誤りデータが存在するか否かを検査し、ＡＩＤ検査部５５０ｈは、データ読出部５５０ｂによって読み出されたストライプがすべて揃っているか否かを検査する（ステップＳ４０６）。【０１４５】
ＣＲＣ検査部５５０ｇ、または、ＡＩＤ検査部によってエラーが検出された場合（ステップＳ４０７肯定）、セレクタ５５０ｋは、データ読出部５５０ｂによって読み出されたストライプ、および、ＸＯＲ演算部５５０ｆによって生成された訂正データに基づいて、エラーが検出されたストライプの誤りデータを訂正する（ステップＳ４０８）。【０１４６】
続いて、バウンダリ調整部５５０ｌは、データ読出部５５０ｂによって読み出された小エリアのストライプから、データ復旧ディスクリプタに含まれるバウンダリ調整値のサイズ分のバウンダリ調整値を除去する（ステップＳ４０９）。【０１４７】
そして、データ書込部５５０ｍは、バウンダリ調整部５５０ｌによってバウンダリ調整値が除去された小エリアのストライプに含まれる退避対象単位データを、キャッシュメモリ１３０に書き込む（ステップＳ４１０）。なお、このとき、データ書込部５５０ｍは、パリティデータについてはキャッシュメモリ１３０に書き込まない。【０１４８】
リードＤＭＡ５５０は、フラッシュメモリ１４１に記憶されている全てのデータを読み出していない場合（ステップＳ４１１否定）、フラッシュメモリ１４１から全てのデータを読み出すまで、上述した処理手順（ステップＳ４０１〜Ｓ４１０）を繰り返し行う。【０１４９】
上述してきたように、実施例１に係るストレージ装置１は、データ退避処理時に、退避対象データのパリティデータを生成して、ＣＲＣやＡＩＤを付与した退避対象データおよびパリティデータをフラッシュメモリ１４１または１４２に書き込み、データ復旧処理において、フラッシュメモリ１４１または１４２から所定の時間内にデータ読出処理が完了しない場合に、データ読出処理を中止して付加データを設定し、パリティデータを用いて誤りデータを訂正したデータをキャッシュメモリ１３０に書き込むように構成したので、フラッシュメモリ１４１または１４２からデータの読出応答がなされない場合であっても、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。【０１５０】
なお、上記実施例１では、データ退避処理時に、ライトＤＭＡ５４１および５４２が、７個の退避対象単位データに対して、１個のパリティデータを生成する例を示したが、退避対象単位データの数と、パリティデータの数の比率はこれに限らない。例えば、ライトＤＭＡ５４１および５４２は、２個退避対象単位データに対して、１個のパリティデータを生成してもよいし、１０個退避対象単位データに対して、１個のパリティデータを生成してもよい。【０１５１】
また、上記実施例１では、ライトＤＭＡ５４１および５４２が、退避対象単位データ番号が奇数である退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である退避対象単位データを用いてパリティデータを生成する例を示したが、ライトＤＭＡ５４１および５４２は、退避対象単位データ番号に関わらず、所定の数の退避対象単位データを用いてパリティデータを構成してもよい。
【実施例２】
【０１５２】
ところで、上記実施例１では、データサイズがバウンダリサイズに満たないバウンダリデータに、バウンダリ調整値を加える処理であるバウンダリ処理を行う例を示したが、バウンダリ処理を行わないようにしてもよい。そこで、実施例２では、キャッシュメモリ１３０から読み出したデータをバウンダリサイズごとに区切れない場合であっても、バウンダリ処理を行わない例について説明する。【０１５３】
まず、実施例２に係るストレージ装置２によるデータ退避処理の概要を説明する。なお、実施例２に係るストレージ装置２の概略構成は、図１に示したストレージ装置１の概略構成と同様であるため、その説明を省略する。【０１５４】
図１２−１は、実施例２に係るストレージ装置２によるデータ退避処理の概要を説明するための図である。同図に示すように、キャッシュメモリ１３０には、２１０［ＫＢ］のデータＤ３が記憶されているものとする。この状態で、ストレージ装置２が異常終了した場合、データＤ３は、バウンダリサイズ２８［ＫＢ］ごとにデータＤ３１〜Ｄ３８に区切られる。【０１５５】
ここで、実施例２に係るストレージ装置２のＲｏＣ（ＲｏＣ２６０とする）は、ライトＤＭＡ５４１に対して、キャッシュメモリ１３０に記憶されているデータＤ３のうち、データＤ４（データＤ３１〜Ｄ３４）について、データ退避処理を行うように指示する。【０１５６】
さらに、ＲｏＣ２６０は、ライトＤＭＡ５４２に対して、キャッシュメモリ１３０に記憶されているデータＤ３のうち、データＤ５（データＤ３４−２と、データＤ３５〜Ｄ３８）について、データ退避処理を行うように指示する。【０１５７】
つまり、ＲｏＣ２６０は、ライトＤＭＡ５４１に対して、データＤ３のキャッシュメモリ１３０における先頭の記憶位置である先頭アドレスから４個分のバウンダリデータ（同図に示したデータＤ３１、Ｄ３２、Ｄ３３、Ｄ３４）について、データ退避処理を行うように指示する。また、ＲｏＣ２６０は、ライトＤＭＡ５４２に対して、データＤ３のキャッシュメモリ１３０における最後の記憶位置である最終アドレスから、先頭アドレス方向に４個分のバウンダリデータ（同図に示したデータＤ５４、Ｄ５３、Ｄ５２、Ｄ５１）について、データ退避処理を行うように指示する。【０１５８】
このような指示を受け付けたライトＤＭＡ５４１は、データＤ４を、バウンダリサイズ２８［ＫＢ］ごとにデータＤ３１〜Ｄ３４に区切ることができる。また、ライトＤＭＡ５４２は、データＤ５を、バウンダリサイズ２８［ＫＢ］ごとにデータＤ５１〜Ｄ５４に区切ることができる。すなわち、実施例２に係るストレージ装置２は、バウンダリ処理を行うことなく、データ退避処理を行うことができる。【０１５９】
次に、実施例２に係るストレージ装置２によるデータ復旧処理の概要について説明する。図１２−２は、実施例２に係るストレージ装置２によるデータ復旧処理の概要を説明するための図である。図１２−２に示したフラッシュメモリ１４１および１４２には、図１２−１に示したライトＤＭＡ５４１およびライトＤＭＡ５４２によって退避されたデータが記憶されているものとする。【０１６０】
ストレージ装置２が異常終了後に起動した場合、リードＤＭＡ５５０は、フラッシュメモリ１４１からデータＤ３１を読み出しながら各種検査（ＣＲＣ検査等）を行った後、キャッシュメモリ１３０に書き込む。また、リードＤＭＡ５５０は、同様の処理を、データＤ３２〜Ｄ３４についても行い、キャッシュメモリ１３０にデータＤ４を復旧させる。【０１６１】
その後、リードＤＭＡ５５０は、フラッシュメモリ１４２からデータＤ５１を読み出しながら各種検査（ＣＲＣ検査等）を行った後、キャッシュメモリ１３０に書き込む。このとき、キャッシュメモリ１３０には、フラッシュメモリ１４１から読み出したデータＤ３４−２が書き込み済みであるので、リードＤＭＡ５５０は、データＤ５１を書き込む場合、データＤ３４−２の部分については上書きすることとなる。【０１６２】
そして、リードＤＭＡ５５０は、フラッシュメモリ１４２からデータＤ５２〜Ｄ５４を順に読み出して、キャッシュメモリ１３０にデータＤ５を復旧させる。リードＤＭＡ５５０が、フラッシュメモリ１４１および１４２に記憶されているデータをすべてキャッシュメモリ１３０に書き込むと、キャッシュメモリ１３０にデータＤ３を復旧することができる。【０１６３】
このように、実施例２に係るストレージ装置２は、２系統のライトＤＭＡ５４１および５４２のうち、一方のライトＤＭＡ５４１に対して、退避対象データのキャッシュメモリ１３０における先頭の記憶位置である先頭アドレスから所定の数のバウンダリデータについて、データ退避処理を行わせるとともに、他方のライトＤＭＡ５４２に対して、退避対象データのキャッシュメモリ１３０における最後の記憶位置である最終アドレスから、先頭アドレス方向に所定の数のバウンダリデータについて、データ退避処理を行わせるので、ＤＭＡ５４１および５４２が、フラッシュメモリ１４１または１４２に退避するデータを、バウンダリデータで割り切れることができ、その結果、バウンダリ処理を行うことなく、データ退避処理を行うことができる。【０１６４】
次に、実施例２に係るストレージ装置２が有するＣＭ２００の構成について説明する。図１３は、実施例２に係るストレージ装置２が有するＣＭ２００の構成を示す図である。ここでは、図４に示した構成部位と同様の機能を有する部位には同一符号を付すこととして、その詳細な説明を省略する。【０１６５】
同図に示した退避データ領域算出部２６１は、ストレージ装置２が異常終了した場合に、キャッシュメモリ１３０に記憶されている退避対象データのサイズ等に基づいて、まず、ライトＤＭＡ５４１が退避するデータの開始アドレスＢＡ１およびサイズＤＳ１を算出し、次に、ライトＤＭＡ５４２が退避するデータの開始アドレスＢＡ２およびサイズＤＳ２を算出する。【０１６６】
以下に、図１２−１に示した例を用いつつ、退避データ領域算出部２６１による退避データ領域算出処理について、より具体的に説明する。まず、退避データ領域算出部２６１は、ストレージ装置２が異常終了した場合に、退避対象データのキャッシュメモリ１３０における記憶位置を示す先頭アドレスおよび最終アドレスを取得する。そして、退避データ領域算出部２６１は、取得した先頭アドレスを、ライトＤＭＡ５４１が退避するデータの開始アドレスＢＡ１に決定する。【０１６７】
続いて、退避データ領域算出部２６１は、退避対象データのサイズを２で除算したサイズ「Ｘ］を求める。図１２−１に示した例では、退避対象データのサイズが２１０［ＫＢ］であるので、退避データ領域算出部２６１は、サイズＸとして、２１０［ＫＢ］を２で除算した１０５［ＫＢ］を求める。【０１６８】
続いて、退避データ領域算出部２６１は、式（１）「２８［ＫＢ］  ×  Ｎ  ＞  サイズＸ［ＫＢ］」を満たす整数Ｎの最小値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４１が退避するデータのサイズＤＳ１に決定する。上記例では、サイズＸが１０５［ＫＢ］であり、式（１）を満たすＮの最小値は「４」となるので、退避データ領域算出部２６１は、４に２８［ＫＢ］を乗算した値である１１２［ＫＢ］を、ライトＤＭＡ５４１が退避するデータのサイズＤＳ１に決定する。【０１６９】
続いて、退避データ領域算出部２６１は、退避対象データの先頭アドレスに、ライトＤＭＡ５４１が退避するデータサイズＤＳ１を加算した値「Ｙ」を求める。このＹは、ライトＤＭＡ５４１が退避するデータの最終アドレスに該当する。そして、退避データ領域算出部２６１は、退避対象データの最終アドレスからＹを減算した値「Ｚ」を求める。このＺは、退避対象データのサイズから、ライトＤＭＡ５４１が退避するデータのサイズＤＳ１を減算したサイズに該当する。【０１７０】
すなわち、上記例では、退避対象データのサイズが２１０［ＫＢ］であり、サイズＤＳ１が１１２「ＫＢ」であるので、退避データ領域算出部２６１は、サイズＺとして、２１０［ＫＢ］から１１２［ＫＢ］を減算した９８［ＫＢ］を求める。【０１７１】
続いて、退避データ領域算出部２６１は、式（２）「２８［ＫＢ］×Ｎ  ＞  サイズＺ［ＫＢ］」を満たす整数Ｎの最小値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４２が退避するデータのサイズＤＳ２に決定する。上記例では、サイズＺが９８［ＫＢ］であり、式（２）を満たすＮの最小値は「４」となるので、退避データ領域算出部２６１は、４に２８［ＫＢ］を乗算した値である１１２［ＫＢ］を、ライトＤＭＡ５４２が退避するデータのサイズＤＳ２に決定する。【０１７２】
続いて、退避データ領域算出部２６１は、退避対象データの最終アドレスから、ライトＤＭＡ５４２が退避するデータのサイズＤＳ２を減算した値を、ライトＤＭＡ５４２が退避するデータの先頭アドレスＢＡ２に決定する。【０１７３】
このようにして、退避データ領域算出部２６１は、ライトＤＭＡ５４１が退避するデータの開始アドレスＢＡ１およびサイズＤＳ１と、ライトＤＭＡ５４２が退避するデータの開始アドレスＢＡ２およびサイズＤＳ２を算出する。【０１７４】
図１３に示した退避指示部２６２は、データ退避ディスクリプタを生成して、データ転送ＤＭＡ１５０に送信することで、ライトＤＭＡ５４１および５４２に対して、データ退避処理を行うように指示する。【０１７５】
具体的には、退避指示部２６２は、上述した開始アドレスＢＡ１およびサイズＤＳ１を含むデータ退避ディスクリプタを生成して、かかるデータ退避ディスクリプタに基づいてデータ退避処理を行うようにライトＤＭＡ５４１に対して指示をする。また、退避指示部２６２は、上述した開始アドレスＢＡ２およびサイズＤＳ２を含むデータ退避ディスクリプタを生成して、かかるデータ退避ディスクリプタに基づいてデータ退避処理を行うようにライトＤＭＡ５４２に対して指示をする。なお、退避指示部２６２が生成するデータ退避ディスクリプタには、バウンダリ調整値のサイズを含まない。【０１７６】
次に、図１３に示した退避データ領域算出部２６１による退避データ領域算出処理について説明する。図１４は、図１３に示した退避データ領域算出部２６１による退避データ領域算出処理手順を示すフローチャートである。【０１７７】
図１４に示すように、退避データ領域算出部２６１は、退避対象データのキャッシュメモリ１３０における記憶位置を示す先頭アドレスおよび最終アドレスを取得する（ステップＳ５０１）。【０１７８】
そして、退避データ領域算出部２６１は、取得した先頭アドレスを、ライトＤＭＡ５４１が退避するデータの開始アドレスに決定する（ステップＳ５０２）。続いて、退避データ領域算出部２６１は、退避対象データのサイズを２で除算したサイズＸを求める（ステップＳ５０３）。【０１７９】
続いて、退避データ領域算出部２６１は、式（１）「２８［ＫＢ］  ×  Ｎ  ＞  サイズＸ［ＫＢ］」を満たす整数Ｎの最小値を求める（ステップＳ５０４）。以下では、ここで求めた最小値Ｎを「第一の基準値」と呼ぶこととする。そして、退避データ領域算出部２６１は、第一の基準値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４１が退避するデータのサイズに決定する（ステップＳ５０５）。【０１８０】
続いて、退避データ領域算出部２６１は、退避対象データのサイズから、ライトＤＭＡ５４１が退避するデータのサイズを減算したサイズＺを求める（ステップＳ５０６）。続いて、退避データ領域算出部２６１は、式（２）「２８［ＫＢ］  ×  Ｎ  ＞  サイズＺ［ＫＢ］」を満たす整数Ｎの最小値を求める（ステップＳ５０７）。以下では、ここで求めた最小値Ｎを「第二の基準値」と呼ぶこととする。そして、退避データ領域算出部２６１は、第二の基準値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４２が退避するデータのサイズに決定する（ステップＳ５０８）。【０１８１】
続いて、退避データ領域算出部２６１は、退避対象データの最終アドレスから、ライトＤＭＡ５４２が退避するデータのサイズを減算した値を求め（ステップＳ５０９）、求めた値を、ライトＤＭＡ５４２が退避するデータの先頭アドレスに決定する（ステップＳ５１０）。【０１８２】
上述してきたように、実施例２に係るストレージ装置２は、退避データ領域算出部２６１が、ライトＤＭＡ５４１および５４２が退避するデータの開始アドレスおよびサイズを求めるように構成したので、ＤＭＡ５４１および５４２は、フラッシュメモリ１４１または１４２に退避するデータを、バウンダリデータで割り切れることができ、その結果、フラッシュメモリ１４１または１４２からデータの読出応答がなされない場合であっても、バウンダリ処理を行うことなく、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。【０１８３】
また、実施例２に係るストレージ装置２では、バウンダリ処理を行う必要がないので、退避データ領域算出部２６１がバウンダリ調整値のサイズを算出する必要がなくなる。その結果、退避データ領域算出部２６１にかかる処理負荷を軽減することができ、データ退避処理の高速化を図ることができる。すなわち、異常終了時に、電力供給部１２から電力供給される短い時間内に、大容量のデータについて、データ退避処理を行うことができる。【０１８４】
また、実施例２に係るストレージ装置２では、バウンダリ処理を行う必要がないので、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０から、バウンダリ処理を行うための回路を削除することができ、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０の規模を小さくすることができる。例えば、実施例２に係るストレージ装置２では、図６に示したライトＤＭＡ５４１からバウンダリ調整部５４１ｂを削除することができ、図７に示したリードＤＭＡ５５０からバウンダリ調整部５５０ｌを削除することができる。その結果、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０にかかるコストを軽減することができる。【０１８５】
なお、上記実施例２では、ストレージ装置２が２系統のライトＤＭＡ５４１および５４２を有することを前提として、退避データ領域算出部２６１が、ライトＤＭＡ５４１および５４２が退避するデータの開始アドレスおよびサイズを算出する例を示したが、３系統以上のライトＤＭＡを有するストレージ装置においても、バウンダリ処理を行わないように、退避データ領域算出部２６１が、各ライトＤＭＡが退避するデータの開始アドレスおよびサイズを算出してもよい。例えば、ストレージ装置が４個のライトＤＭＡを有する場合、退避データ領域算出部２６１は、４個目のライトＤＭＡに対して、退避対象データの最終アドレスから、先頭アドレス方向に所定の数のバウンダリデータについて、データ退避処理を行わせるように、４個目のライトＤＭＡが退避するデータの開始アドレスおよびサイズを算出する。【０１８６】
また、上記実施例１および２では、バウンダリサイズを２８［ＫＢ］とし、バウンダリデータを区切るサイズを２［ＫＢ］とし、エリア内のｐａｇｅの数を１０２４個とし、小エリア内のｐａｇｅの数を１６個とする例を示したが、これらの規定値は、上記例に限られない。例えば、バウンダリサイズを５６［ＫＢ］とし、バウンダリデータを区切るサイズを４［ＫＢ］とし、エリア内のｐａｇｅの数を２０４８個とし、小エリア内のｐａｇｅの数を３２個としてもよい。【０１８７】
また、上記実施例１および２では、異常終了時にデータを退避する記憶領域として、ＯｎｅＮＡＮＤ型のフラッシュメモリを用いる例を示したが、異常終了時にデータを退避する記憶領域は、ＯｎｅＮＡＮＤ型のフラッシュメモリ以外の不揮発性メモリであってもよい。【０１８８】
また、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散、統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散、統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵ（Central  Processing  Unit）および当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【図１】
2009107213.tif 000003
【図２−１】
2009107213.tif 000004
【図２−２】
2009107213.tif 000005
【図３−１】
2009107213.tif 000006
【図３−２】
2009107213.tif 000007
【図３−３】
2009107213.tif 000008
【図４】
2009107213.tif 000009
【図５】
2009107213.tif 000010
【図６】
2009107213.tif 000011
【図７】
2009107213.tif 000012
【図８】
2009107213.tif 000013
【図９】
2009107213.tif 000014
【図１０】
2009107213.tif 000015
【図１１】
2009107213.tif 000016
【図１２−１】
2009107213.tif 000017
【図１２−２】
2009107213.tif 000018
【図１３】
2009107213.tif 000019
【図１４】
2009107213.tif 000020
【手続補正書】
【提出日】平成22年6月17日(2010.6.17)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置であって、
当該のストレージ装置が異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、
前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、
前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、
前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、
前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段と
を備えたことを特徴とするストレージ装置。
【請求項２】
当該のストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避手段と、
当該のストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避手段とをさらに備えることを特徴とする請求項１に記載のストレージ装置。
【請求項３】
異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置を制御するストレージ制御装置であって、
前記ストレージ装置が異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、
前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、
前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、
前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、
前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段と
を備えたことを特徴とするストレージ制御装置。
【請求項４】
前記ストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避手段と、
前記ストレージ装置が異常終了した場合に、前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避手段とをさらに備えることを特徴とする請求項３に記載のストレージ制御装置。
【請求項５】
キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送集積回路であって、
前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、
前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、
前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、
前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、
前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段と
を備えたことを特徴とするデータ転送集積回路。
【請求項６】
前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避手段と、
前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避手段とをさらに備えることを特徴とする請求項５に記載のデータ転送集積回路。
【請求項７】
異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置を制御するストレージ制御方法であって、
前記ストレージ装置が、
異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出工程と、
前記データ読出工程によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与工程と、
前記データ読出工程によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査工程と、
前記誤りデータ検査工程によって誤りデータが検出された場合に、前記データ読出工程によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正工程と、
前記誤りデータ検査工程によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正工程によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込工程と
を含んだことを特徴とするストレージ制御方法。
【請求項８】
前記ストレージ装置は、
異常終了した場合に、前記退避対象データのキャッシュメモリにおける先頭の記憶位置を示す先頭アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第一のデータ退避工程と、
異常終了した場合に、前記退避対象データのキャッシュメモリにおける最終の記憶位置を示す最終アドレスから所定のサイズ分のデータを不揮発性メモリへ記憶させる第二のデータ退避工程とをさらに含んだことを特徴とする請求項７に記載のストレージ制御方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置、ストレージ制御装置、データ転送集積回路、および、ストレージ制御方法に関する。
【背景技術】
【０００２】
従来、大規模なコンピュータシステムでは、ホストコンピュータと別体に構成された専用のデータ入出力装置を用いてデータを管理している。このデータ入出力装置の中でも、ストレージ装置は、複数のハードディスク装置（記憶媒体）によってＲＡＩＤ（Redundant  Arrays  of  Independent（Inexpensive）  Disks）グループを構成して、取り扱うデータの信頼性を向上させている。
【０００３】
ストレージ装置は、一般に、ライトバック方式と呼ばれるライト処理（書込処理）方式を行うことで、アクセス性能を向上させている。具体的には、ストレージ装置は、上位装置であるホストコンピュータからデータのライト命令を受け付けた場合に、キャッシュメモリにデータを記憶した時点で、ライト処理が完了した旨をホストコンピュータへ通知する。その後、所定の条件を満たした時点で、キャッシュメモリに記憶したデータをハードディスク装置へ記憶させる。
【０００４】
このようなライトバック方式を採用するストレージ装置には、停電などによって正常な終了操作が行われることなく電源が落とされた場合であっても（以下、正常な終了操作が行われることなく電源が落とされることを「異常終了」という）、揮発性のキャッシュメモリに記憶されているデータが消失しないように構成されているものがある。
【０００５】
具体的には、異常終了した場合に、大容量のコンデンサやバッテリー等から電力供給されている間に、キャッシュメモリ上のデータを不揮発性メモリに退避させ、異常終了後に電源投入された場合に不揮発性メモリに退避したデータをキャッシュメモリに復旧させる。これにより、キャッシュメモリに記憶されているデータがハードディスク装置に記憶されていない状態で異常終了した場合であっても、データを消失させないことを実現している。
【０００６】
ところで、データを退避させる不揮発性メモリは、一般的に、ＮＡＮＤ型のフラッシュメモリが用いられることが多い。ＮＡＮＤ型のフラッシュメモリは、セル劣化等によって記憶しているデータを破損や消失してしまうことがある。不揮発性メモリに記憶されているデータが破損や消失する状況が発生すると、ストレージ装置は、異常終了後の起動時に、不揮発性メモリから誤ったデータを読み出してしまい、正確にデータを復旧させることができなくなる。
【０００７】
そこで、記憶媒体に記憶されているデータのエラーを検出し、エラー検出時にデータ訂正を行う技術（例えば、特許文献１および２を参照）を用いることが考えられる。このような技術を用いれば、異常終了後の起動時に、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることが可能になる。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特表２００４−５０６２５６号公報
【特許文献２】特開２００７−１９３４４９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記特許文献１および２に開示されているような技術を用いても、不揮発性メモリから読み出し応答がなされない場合には、不揮発性メモリに退避させたデータを、正確にキャッシュメモリに復旧させることができないという問題があった。不揮発性メモリの劣化状態によっては、不揮発性メモリから読み出し応答がなされないことがあり、かかる状態では、ハングアップ状態となりデータ訂正処理が実行されないためである。
【００１０】
ストレージ装置のような大規模なデータ入出力装置は、重要なコンピュータシステムに用いられることが多く、キャッシュメモリに記憶されているユーザデータやシステムデータを正確に復旧できないことは、大きな問題となる。このようなことから、不揮発性メモリから読み出し応答がなされない場合であっても、不揮発性メモリに退避させたデータを、いかにして正確にキャッシュメモリに復旧させるかが重要な課題となっていた。
【００１１】
本発明は、上述した従来技術による課題を解消するためになされたものであり、不揮発性メモリから読み出し応答がなされない場合であっても、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることができるストレージ装置、ストレージ制御装置、データ転送集積回路、および、ストレージ制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するために、本願に開示するストレージ装置は、異常終了時に、キャッシュメモリに記憶されているデータである退避対象データ、および、前記退避対象データの誤りデータを訂正するためのパリティデータに、誤りデータを検出するための誤り検出符号を付与した転送対象データを、不揮発性メモリへ記憶させるデータ転送部を有するストレージ装置であって、当該のストレージ装置が異常終了後に電源投入された場合に、前記不揮発性メモリから、前記転送対象データが所定のサイズであるストライプサイズごとに区切られたデータであるストライプを読み出すデータ読出手段と、前記データ読出手段によって前記ストライプが所定の時間内に読み出されない場合に、該ストライプに、該ストライプのサイズがストライプサイズになるまで、付加データを付与する付加データ付与手段と、前記データ読出手段によって読み出されたストライプに付与されている誤り検出符号に基づいて、ストライプに誤りデータが存在しているか否かを検査する誤りデータ検査手段と、前記誤りデータ検査手段によって誤りデータが検出された場合に、前記データ読出手段によって読み出されたストライプを用いて、誤りデータを訂正するデータ訂正手段と、前記誤りデータ検査手段によって誤りデータが検出されなかったストライプに含まれる退避対象データを前記キャッシュメモリに書き込むとともに、前記データ訂正手段によって誤りデータが訂正されたストライプに含まれる退避対象データを前記キャッシュメモリに書き込むデータ書込手段とを備えたことを要件とする。
【００１３】
なお、本願に開示するストレージ装置の構成要素、表現または構成要素の任意の組合せを、方法、装置、システム、コンピュータプログラム、記録媒体、データ構造などに適用したものも、他の態様として有効である。
【発明の効果】
【００１４】
本願に開示したストレージ装置によれば、不揮発性メモリからデータの読出応答がなされない場合であっても、不揮発性メモリに退避させたデータを、キャッシュメモリに復旧させることができるという効果を奏する。
【図面の簡単な説明】
【００１５】
【図１】図１は、実施例１に係るストレージ装置の概略構成を示す図である。
【図２−１】図２−１は、フラッシュメモリ１４１の構成およびデータフォーマットを示す図である。
【図２−２】図２−２は、図２−１に示したｐａｇｅの構成およびデータフォーマットを示す図である。
【図３−１】図３−１は、実施例１に係るストレージ装置によるデータ退避処理の概要を説明するための図である。
【図３−２】図３−２は、実施例１に係るストレージ装置によるデータ復旧処理の概要を説明するための図である。
【図３−３】図３−３は、実施例１に係るストレージ装置によるデータ復旧処理の概要を説明するための図である。
【図４】図４は、実施例１に係るストレージ装置が有するＣＭの構成を示す図である。
【図５】図５は、図４に示したデータ転送ＤＭＡの構成を示す図である。
【図６】図６は、図５に示したライトＤＭＡの構成を示す図である。
【図７】図７は、図５に示したリードＤＭＡの構成を示す図である。
【図８】図８は、実施例１に係るストレージ装置によるデータ退避処理の流れを示すシーケンス図である。
【図９】図９は、ライトＤＭＡによるデータ退避処理手順を示すフローチャートである。
【図１０】図１０は、実施例１に係るストレージ装置によるデータ復旧処理の流れを示すシーケンス図である。
【図１１】図１１は、リードＤＭＡによるデータ復旧処理手順を示すフローチャートである。
【図１２−１】図１２−１は、実施例２に係るストレージ装置によるデータ退避処理の概要を説明するための図である。
【図１２−２】図１２−２は、実施例２に係るストレージ装置によるデータ復旧処理の概要を説明するための図である。
【図１３】図１３は、実施例２に係るストレージ装置が有するＣＭの構成を示す図である。
【図１４】図１４は、図１３に示した退避データ領域算出部による退避データ領域算出処理手順を示すフローチャートである。
【発明を実施するための形態】
【００１６】
以下に、本発明にかかるストレージ装置、ストレージ制御装置、データ転送集積回路、および、ストレージ制御方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１７】
まず、実施例１に係るストレージ装置の概略構成について説明する。図１は、実施例１に係るストレージ装置１の概略構成を示す図である。同図に示したストレージ装置１は、高信頼性を確保するために二重化構成が採られており、各構成要素が２系統ずつ（同図中、参照符号に付加したＡ、Ｂによって区別する）備えられている。それぞれの系統の構成要素は互いに同等の機能を有するため、以下では一方の系統についてのみ構成要素の説明をする。
【００１８】
同図に示すように、ストレージ装置１は、ストレージ装置１を制御する各部や、ストレージ装置１と上位装置であるホストコンピュータとの間の通信を担う通信モジュールなどを主に搭載するＣＥ（Controller  Enclosure：コントローラ  エンクロージャ）１０と、ハードディスク装置を主に搭載するＤＥ（Device  Enclosure：デバイス  エンクロージャ）２０とに、筐体が分けられている。
【００１９】
ＣＥ１０は、図示しないチャネルアダプタ経由でファイバチャネルを介してホストコンピュータと接続され、エクスパンダ１２０Ａおよび１２０Ｂ経由でＤＥ２０と接続されている。ＤＥ２０は、ハードディスク装置（以下、「ＨＤＤ：Hard  Disk  Drive」と略記する）２１を有し、エクスパンダ２２０Ａおよび２２０Ｂを直接、もしくは、ルータ（Router）を経由するなどして、他のＤＥと複数個接続することが可能である。
【００２０】
また、ＣＥ１０は、ストレージ装置１を制御するためのＣＭ（Controller  Module：コントローラ  モジュール）１００Ａおよび１００Ｂと、ＣＭ１００Ａおよび１００Ｂに接続される複数のハードディスク装置１１とを有する。
【００２１】
ＨＤＤ１１は、ＣＭ１００Ａによってデータが冗長に読み書きされる記憶装置である。なお、ＣＭ１００Ａに接続される記憶装置は、ハードディスク装置に限られず、熱磁気ディスク装置や光磁気ディスク装置、または、半導体不揮発メモリを用いた半導体ディスクのような他の記憶装置であってもよい。
【００２２】
ＣＭ１００Ａは、ストレージ装置１を制御するストレージ制御装置であり、インタフェース（以下、「Ｉ／Ｆ」と略記する）部１１０Ａと、エクスパンダ１２０Ａと、キャッシュメモリ１３０Ａと、フラッシュメモリ１４１Ａおよび１４２Ａと、データ転送ＤＭＡ（Direct  Memory  Access）１５０Ａと、ＲＡＩＤ−ｏｎ−Ｃｈｉｐ（以下、「ＲｏＣ」と略記する）１６０Ａとを有する。
【００２３】
Ｉ／Ｆ部１１０Ａは、ＬＡＮ（Local  Area  Network）などのネットワークへ接続するためのインタフェースである。エクスパンダ１２０Ａは、ＲｏＣ１６０ＡとＨＤＤ１１との間で送受信されるデータを中継する中継装置である。
【００２４】
キャッシュメモリ１３０Ａは、ホストコンピュータとＨＤＤ１１との間で転送が行われるデータを一時的に記憶するメモリである。フラッシュメモリ１４１Ａおよび１４２Ａは、不揮発性メモリであり、例えば、ＮＡＮＤ型のフラッシュメモリである。実施例１に係るストレージ装置１では、フラッシュメモリ１４１Ａおよび１４２Ａに、ＯｎｅＮＡＮＤ（ワンナンド）型のフラッシュメモリを用いることとする。
【００２５】
ここで、ＯｎｅＮＡＮＤ型のフラッシュメモリ１４１Ａおよび１４２Ａの構成およびデータフォーマットについて説明する。なお、フラッシュメモリ１４１Ａおよび１４２Ａの構成およびデータフォーマットは同一であるため、ここでは、フラッシュメモリ１４１Ａの構成およびデータフォーマットについてのみ説明する。
【００２６】
図２−１は、フラッシュメモリ１４１Ａの構成およびデータフォーマットを示す図である。なお、フラッシュメモリ１４１Ａの記憶容量は、２［ＧＢ（ギガバイト）］であるとする。同図に示すように、フラッシュメモリ１４１Ａは、４つのメモリバンク＃００〜メモリバンク＃０３を有する。メモリバンク＃００〜メモリバンク＃０３は、メモリの集合体であり、それぞれがダイ＃０およびダイ＃１を有する。
【００２７】
ダイ＃０およびダイ＃１は、数ミリ角のフラッシュメモリであり、それぞれがＢｌｏｃｋ＃０〜Ｂｌｏｃｋ＃２０４７を有する。また、Ｂｌｏｃｋ＃０〜＃２０４７は、それぞれがｐａｇｅ（ページ）＃０〜ｐａｇｅ＃６３を有する。ｐａｇｅが、フラッシュメモリ１４１への最小アクセス単位となる。
【００２８】
ｐａｇｅの構成およびデータフォーマットについて説明する。図２−２は、図２−１に示したｐａｇｅの構成およびデータフォーマットを示す図である。同図に示すように、ｐａｇｅは、メイン領域と、スペア領域とを有する。
【００２９】
メイン領域は、ユーザデータが記憶される２［ＫＢ（キロバイト）］の記憶領域であり、４個のセクタ＃０〜セクタ＃３を有する。スペア領域は、主にデータを管理するためのシステムデータ等が記憶される６４［ｂｙｔｅ（バイト）］の記憶領域であり、４個のスペア＃０〜＃３を有する。
【００３０】
スペア領域を構成する１つのスペア（例えば、スペア＃０）は、同図に示すように、システム領域と、ＥＣＣ（Error  Correcting  Code：誤り訂正符号）領域と、リザーブ領域と、ユーザ領域とを有する。
【００３１】
システム領域は、不良セクタ情報等の各種情報が記憶される記憶領域である。ＥＣＣ領域は、フラッシュメモリ１４１Ａによって生成されるＥＣＣが記憶される領域である。フラッシュメモリ１４１Ａは、このＥＣＣを用いてエラーチェックを行い、エラーを検出した場合に、ＥＣＣチェックエラーが発生した旨を通知する。リザーブ領域は、予備領域である。ユーザ領域は、フラッシュメモリ１４１Ａにデータを記憶させるシステムによってデータ管理上必要となるデータが記憶される記憶領域である。
【００３２】
図１の説明に戻って、データ転送ＤＭＡ１５０Ａは、キャッシュメモリ１３０Ａと、フラッシュメモリ１４１Ａおよび１４２Ａとの間におけるデータ送受信をＤＭＡにより行うＤＭＡ回路である。このデータ転送ＤＭＡ１５０Ａは、例えば、ＦＰＧＡ（Field  Programmable  Gate  Array）によって実現される。
【００３３】
ＲｏＣ１６０Ａは、ＣＭ１００Ａを全体制御する制御装置であり、ホストコンピュータとのインタフェースを制御したり、キャッシュメモリ１３０Ａの管理を行ったりする。また、ＲｏＣ１６０Ａは、ホストコンピュータからデータのライト命令を受け付けた場合に、かかるデータをキャッシュメモリ１３０Ａに記憶する。そして、ＲｏＣ１６０Ａは、キャッシュメモリ１３０Ａにデータを記憶した時点で、ライト処理が完了した旨をホストコンピュータへ通知する。その後、所定の条件を満たした時点で、キャッシュメモリ１３０Ａに記憶したデータをＨＤＤ１１に書き込みする。
【００３４】
また、ＲｏＣ１６０Ａは、ストレージ装置１が異常終了した場合に、データ転送ＤＭＡ１５０Ａに対して、キャッシュメモリ１３０Ａに記憶されているデータをフラッシュメモリ１４１Ａおよび１４２Ａに退避させる処理（以下、「データ退避処理」という）を行うように指示する。また、ＲｏＣ１６０Ａは、異常終了後のストレージ装置１が起動した場合に、データ転送ＤＭＡ１５０Ａに対して、フラッシュメモリ１４１Ａおよび１４２Ａに退避したデータをキャッシュメモリ１３０Ａに復旧させる処理（以下、「データ復旧処理」という）を行うように指示する。
【００３５】
次に、図３−１〜図３−３を用いて、実施例１に係るストレージ装置１によるデータ退避処理およびデータ復旧処理の概要について説明する。図３−１は、実施例１に係るストレージ装置１によるデータ退避処理の概要を説明するための図である。なお、以下では、図１中に付加した参照符号のＡおよびＢを付与せずに説明する。すなわち、例えば、図３−１に示したキャッシュメモリ１３０は、図１に示したキャッシュメモリ１３０Ａまたは１３０Ｂに対応する。
【００３６】
図３−１に示すように、キャッシュメモリ１３０には、５３［ＫＢ］のデータＤ１が記憶されているものとする。この状態で、ストレージ装置１が異常終了したため、ＲｏＣ１６０が、データ転送ＤＭＡ１５０に対して、データＤ１を退避するように指示したとする。かかる指示を受け付けたデータ転送ＤＭＡ１５０は、キャッシュメモリ１３０からデータＤ１を読み出す。なお、以下では、ストレージ装置１が異常終了した時に、データ転送ＤＭＡ１５０によって退避されるキャッシュメモリ１３０上のデータを「退避対象データ」と呼ぶこととする。
【００３７】
そして、データ転送ＤＭＡ１５０は、データＤ１を、２８［ＫＢ］ごとに区切る。具体的には、同図に示すように、データ転送ＤＭＡ１５０は、データＤ１を、２８［ＫＢ］のデータＤ１０と、２５［ＫＢ］のデータＤ２０とに区切る。なお、データ転送ＤＭＡ１５０が退避対象データ（上記例ではデータＤ１）を分割するサイズ（上記例では、２８［ＫＢ］）は、予めシステムで決められており、以下では、このサイズを「バウンダリサイズ」と呼び、バウンダリサイズによって区切られた退避対象データの１つのデータを「バウンダリデータ」と呼ぶこととする。実施例１に係るストレージ装置１では、バウンダリサイズが２８［ＫＢ］に決定されていることとする。
【００３８】
そして、データ転送ＤＭＡ１５０は、データＤ１０を、２［ＫＢ］ごとに区切る。具体的には、同図に示すように、データ転送ＤＭＡ１５０は、データＤ１０を、１４個のデータＤ１０１〜Ｄ１１４に区切る。なお、データ転送ＤＭＡ１５０がバウンダリデータ（上記例では、データＤ１０およびＤ２０）を分割するサイズ（上記例では、２［ＫＢ］）は、予めシステムで決められており、実施例１に係るストレージ装置１では、このサイズが、２［ＫＢ］に決定されていることとする。以下では、２［ＫＢ］ごとに区切られたバウンダリデータの１つのデータ（データＤ１０１等）を、「退避対象単位データ」と呼ぶこととし、退避対象単位データを識別するための番号を「退避対象単位データ番号」と呼ぶこととする。本明細書では、退避対象単位データに付した参照符号の数字部分を退避対象単位データ番号とする。例えば、データＤ１０１の退避対象単位データ番号は、「１０１」である。
【００３９】
そして、データ転送ＤＭＡ１５０は、退避対象単位データ番号が奇数である７個のデータＤ１０１、Ｄ１０３、・・、Ｄ１１３の排他的論理和（以下、「ＸＯＲ」という）演算を行ってパリティデータＰ１１５を生成する。また、データ転送ＤＭＡ１５０は、退避対象単位データ番号が偶数である７個のデータＤ１０２、Ｄ１０４、・・、Ｄ１１４のＸＯＲ演算を行ってパリティデータＰ１１６を生成する。
【００４０】
このパリティデータＰ１１５およびＰ１１６のサイズは、データＤ１０１〜Ｄ１１４のサイズと同様の２［ＫＢ］となる。すなわち、バウンダリサイズ２８［ＫＢ］に区切られたデータＤ１０のサイズと、かかるデータＤ１０から生成されたパリティデータＰ１１５およびＰ１１６のサイズの合計は、３２［ＫＢ］となる。なお、以下では、パリティデータも「退避対象単位データ」と呼ぶこととする。
【００４１】
その後、データ転送ＤＭＡ１５０は、データＤ１０１〜Ｄ１１４ごとに、ＣＲＣ（Cyclic  Redundancy  Check）を生成する。同様に、データ転送ＤＭＡ１５０は、パリティデータＰ１１５およびＰ１１６ごとに、ＣＲＣを生成する。そして、データ転送ＤＭＡ１５０は、生成したＣＲＣを、データＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とに付与する。
【００４２】
また、データ転送ＤＭＡ１５０は、データＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とを識別するための識別番号（以下、「ＡＩＤ：Area  Identification」という）をデータＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とに付与する。このＡＩＤについては、後に詳述する。
【００４３】
そして、データ転送ＤＭＡ１５０は、ＣＲＣおよびＡＩＤが付与されたデータＤ１０１〜Ｄ１１４と、ＣＲＣおよびＡＩＤが付与されたパリティデータＰ１１５およびＰ１１６とをフラッシュメモリ１４１に書き込む。すなわち、データ転送ＤＭＡ１５０は、１６個の退避対象単位データ（１４個のデータＤ１０１〜Ｄ１１４と、２個のパリティデータＰ１１５およびＰ１１６）を、フラッシュメモリ１４１に書き込む。
【００４４】
このとき、データ転送ＤＭＡ１５０は、フラッシュメモリ１４１が有する４個のメモリバンク＃００〜メモリバンク＃０３に対して、退避対象単位データを４個ずつ書き込む。また、このとき、データ転送ＤＭＡ１５０は、メモリバンク＃００〜メモリバンク＃０３が有する２個のダイ＃０およびダイ＃１に対して、退避対象単位データを２個ずつ書き込む。また、このとき、データ転送ＤＭＡ１５０は、ダイ＃０およびダイ＃１が有する所定の２個のＢｌｏｃｋに対して、退避対象単位データ番号が奇数である退避対象単位データと、退避対象単位データ番号が偶数である退避対象単位データとを１個ずつ書き込む。
【００４５】
以下では、データ転送ＤＭＡ１５０が、１６個の退避対象単位データを書き込むフラッシュメモリ１４１上の領域を「小エリア」と呼ぶこととする。この「小エリア」は、例えば、図２−１に示した小エリアＳＡ１に該当する。
【００４６】
ここで、データ転送ＤＭＡ１５０のデータ書込処理について、データＤ１０１〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６とを、図２−１に示した小エリアＡＳ１に書き込む場合を例に挙げて説明する。なお、以下では、「メモリバンク＃Ｐのダイ＃ＱのＢｌｏｃｋ＃Ｒが有するｐａｇｅ＃Ｓ」を示す場合に、「メモリバンク＃Ｐ／ダイ＃Ｑ／Ｂｌｏｃｋ＃Ｒ／ｐａｇｅ＃Ｓ」と記載することとする。
【００４７】
かかる場合、データ転送ＤＭＡ１５０は、例えば、データＤ１０１を、小エリアＳＡ１内のメモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のメイン領域に書き込む。そして、データ転送ＤＭＡ１５０は、データＤ１０２を、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃３／ｐａｇｅ＃１のメイン領域に書き込み、データＤ１０３を、メモリバンク＃００／ダイ＃１／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のメイン領域に書き込む。このようにして、データ転送ＤＭＡ１５０は、データＤ１０４〜Ｄ１１３を書き込んでいき、データＤ１１４を、メモリバンク＃０３／ダイ＃０／Ｂｌｏｃｋ＃３／ｐａｇｅ＃１に書き込み、パリティデータＰ１１５を、メモリバンク＃０３／ダイ＃１／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１に書き込み、パリティデータＰ１１６を、メモリバンク＃０３／ダイ＃１／Ｂｌｏｃｋ＃３／ｐａｇｅ＃１に書き込む。
【００４８】
そして、データ転送ＤＭＡ１５０は、各退避対象単位データに付与したＣＲＣをｐａｇｅのスペア領域内のユーザ領域に書き込む。上記例のように、データＤ１０１を、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のメイン領域に書き込んだ場合、データ転送ＤＭＡ１５０は、データＤ１０１のＣＲＣを、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のスペア＃０のユーザ領域に書き込む。同様に、データ転送ＤＭＡ１５０は、データＤ１０２〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６のＣＲＣについても、ｐａｇｅのユーザ領域に書き込む。
【００４９】
また、データ転送ＤＭＡ１５０は、各退避対象単位データに付与したＡＩＤをｐａｇｅのスペア領域内のユーザ領域に書き込む。上記例のように、データＤ１０１のＣＲＣを、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のスペア＃０のユーザ領域に書き込んだ場合、データ転送ＤＭＡ１５０は、データＤ１０１のＡＩＤを、メモリバンク＃００／ダイ＃０／Ｂｌｏｃｋ＃２／ｐａｇｅ＃１のスペア＃１のユーザ領域に書き込む。同様に、データ転送ＤＭＡ１５０は、データＤ１０２〜Ｄ１１４と、パリティデータＰ１１５およびＰ１１６のＡＩＤについても、ｐａｇｅのユーザ領域に書き込む。
【００５０】
このようにして、データ転送ＤＭＡ１５０は、１６個の退避対象単位データを、小エリアに書き込む。以下では、小エリア内の１つのｐａｇｅに記憶されている全てのデータ（退避対象単位データやＣＲＣやＡＩＤ等）を「ストライプ」と呼ぶこととし、小エリア内でストライプを識別するための番号を「ストライプ番号」と呼ぶこととする。本明細書では、退避対象単位データに付した参照符号の数字下２桁部分をストライプ番号とする。例えば、データＤ１０１を記憶するｐａｇｅに記憶されているストライプのストライプ番号は「１」であり、パリティデータＰ１１５を記憶するｐａｇｅに記憶されているストライプのストライプ番号は「１５」である。以下では、ストライプ番号「Ｎ」のストライプを、単に、ストライプＳ「Ｎ」と呼ぶこととする。
【００５１】
なお、図３−１に示したフラッシュメモリ１４１内の「Ｄ１０１」や「Ｐ１１５」等を記載した矩形は、ｐａｇｅのメイン領域を示し、かかるメイン領域の後に斜線を付して示した矩形は、ｐａｇｅのスペア領域を示す。すなわち、同図では、例えば、「Ｄ１０１」を記載したメイン領域と、かかるメイン領域の後に示したスペア領域との組合せがストライプＳ１であることを示す。
【００５２】
同様にして、データ転送ＤＭＡ１５０は、データＤ２０をフラッシュメモリ１４２に書き込む。具体的には、データ転送ＤＭＡ１５０は、データＤ２０を２［ＫＢ］ごとに区切る。このとき、データ転送ＤＭＡ１５０は、データＤ２０のサイズが２５［ＫＢ］であり、バウンダリサイズの２８［ＫＢ］に満たないので、データＤ２０のサイズが２８［ＫＢ］になるように、３［ＫＢ］の所定の値を加える。以下では、この所定の値を「バウンダリ調整値」と呼ぶこととする。バウンダリデータのサイズがバウンダリサイズに満たない場合に、バウンダリ調整値を加える理由は、パリティデータを生成できるようにするためである。
【００５３】
そして、データ転送ＤＭＡ１５０は、バウンダリ調整値を加えたデータＤ２０を２［ＫＢ］ごとに区切る。具体的には、同図に示すように、データ転送ＤＭＡ１５０は、３［ＫＢ］のバウンダリ調整値を加えたデータＤ２０を、１４個のデータＤ２０１〜Ｄ２１４に区切る。
【００５４】
その後の処理は、上述したデータＤ１０をフラッシュメモリ１４１に書き込む処理と同様であり、データ転送ＤＭＡ１５０は、パリティデータＰ２１５およびＰ２１６を生成して、データＤ２０１等のＣＲＣを生成して、データＤ２０１〜Ｄ２１４と、パリティデータＰ２１５およびＰ２１６と、ＣＲＣと、ＡＩＤとをフラッシュメモリ１４２に書き込む。
【００５５】
このようにして、データ転送ＤＭＡ１５０は、キャッシュメモリ１３０に記憶されているデータＤ１のうち、データＤ１０をフラッシュメモリ１４１に書き込み、データＤ２０をフラッシュメモリ１４２に書き込む。
【００５６】
なお、データ転送ＤＭＡ１５０は、複数の小エリアに対して、データを並行して書き込むことが可能である。実施例１に係るストレージ装置１では、データ転送ＤＭＡ１５０が、最大で６４個の小エリアに対して同時にデータを書き込むこととする。以下では、この６４個の小エリアを「エリア」と呼ぶこととする。この「エリア」は、例えば、図２−１に示したエリアＡ１に該当する。上述したＡＩＤは、１個のエリア内に含まれるストライプを識別するための識別番号である。このＡＩＤは、ＲｏＣ１６０によって算出され、データ転送ＤＭＡ１５０は、ＲｏＣ１６０からＡＩＤを受け付ける。
【００５７】
次に、実施例１に係るストレージ装置１によるデータ復旧処理の概要について説明する。図３−２および図３−３は、実施例１に係るストレージ装置１によるデータ復旧処理の概要を説明するための図である。図３−２および図３−３に示したフラッシュメモリ１４１には、図３−１に示したデータ転送ＤＭＡ１５０によって退避されたデータが記憶されているものとする。
【００５８】
まず、図３−２を用いて、図３−１に示したデータＤ１０をキャッシュメモリ１３０に復旧させる処理について説明する。ここでは、図３−２に示したフラッシュメモリ１４１に記憶されているデータＤ１０３の一部が、フラッシュメモリ１４１のセル劣化等の原因により破損しているものとする。そして、フラッシュメモリ１４１は、データＤ１０３の読出要求を受け付けると、かかる読出要求に対する応答ができなくなるものとする。
【００５９】
かかる状態で、ストレージ装置１が異常終了後に起動した場合、データ転送ＤＭＡ１５０は、フラッシュメモリ１４１から、小エリア単位でストライプを読み出す。具体的には、データ転送ＤＭＡ１５０は、フラッシュメモリ１４１から、ストライプＳ１〜Ｓ１６を読み出す。
【００６０】
そして、データ転送ＤＭＡ１５０は、ストライプＳ３を読み出している途中で、フラッシュメモリ１４１から読出応答を受け付けなくなる。所定の時間が経過してもストライプＳ３を読み出せない場合、データ転送ＤＭＡ１５０は、ストライプＳ３に対してタイムアウトが発生したことを検出する。
【００６１】
そして、データ転送ＤＭＡ１５０は、タイムアウトが発生したストライプＳ３の読出処理を中止して、ストライプＳ３に、読み出しできなかったサイズ分の所定の値（以下、この所定の値を「付加データ」という）を設定する。例えば、１［ＫＢ］分のストライプＳ３を読み出した時点で、フラッシュメモリ１４１から読み出し応答を受け付けなくなった場合、データ転送ＤＭＡ１５０は、読み出し済みの１［ＫＢ］のデータに１［ＫＢ］の付加データを加えた２［ＫＢ］のデータをストライプＳ３とする。その後、データ転送ＤＭＡ１５０は、データの読出処理を再開して、フラッシュメモリ１４１から、ストライプＳ４〜Ｓ１６を読み出す。
【００６２】
また、データ転送ＤＭＡ１５０は、ストライプＳ１〜１６を読み出しながら、ＣＲＣ検査、ＡＩＤ検査およびＸＯＲ演算を行う。具体的には、データ転送ＤＭＡ１５０は、読み出したストライプＳ１〜１６内のＣＲＣを用いて、ストライプＳ１〜１６に誤りデータが存在するか否かを検査する。また、データ転送ＤＭＡ１５０は、ストライプＳ１〜１６内のＡＩＤを用いて、ストライプＳ１〜１６がすべて揃っているか否かを検査する。また、データ転送ＤＭＡ１５０は、ストライプ番号が奇数であるストライプＳ１、Ｓ３、・・、Ｓ１５のＸＯＲ演算を行い、訂正データＴ１１を生成するとともに、ストライプ番号が偶数であるストライプＳ２、Ｓ４、・・、Ｓ１６のＸＯＲ演算を行い、訂正データＴ１２を生成する。
【００６３】
図３−２に示した例では、データ転送ＤＭＡ１５０は、付加データが設定されているストライプＳ３のＣＲＣ検査において、誤りデータが存在することを検出する。なお、ストライプＳ３に含まれるＡＩＤを読み出す前に、タイムアウトが発生した場合には、ＡＩＤには付加データが設定されているため、データ転送ＤＭＡ１５０は、ストライプＳ３のＡＩＤ検査において、データＤ１０３が欠如していると検出する可能性もある。ここでは、データ転送ＤＭＡ１５０は、ストライプＳ３に対してのみデータ誤りを検出し、ストライプＳ１、Ｓ２、Ｓ４〜Ｓ１６に対しては、ＣＲＣ検査およびＡＩＤ検査においてエラーを検出しなかったものとする。
【００６４】
すべてのストライプＳ１〜１６を読み出した後、データ転送ＤＭＡ１５０は、ＣＲＣ検査およびＡＩＤ検査においてエラーが検出されなかったストライプＳ１およびＳ２に含まれるデータＤ１０１およびＤ１０２をキャッシュメモリ１３０に書き込む。そして、データ転送ＤＭＡ１５０は、エラーが検出されたストライプＳ３については、ストライプ番号が奇数であるストライプＳ１、Ｓ５、Ｓ７、・・、Ｓ１５および訂正データＴ１１を用いて、データＤ１０３の誤りデータを訂正して、訂正済みのデータＤ１０３をキャッシュメモリ１３０に書き込む。そして、データ転送ＤＭＡ１５０は、エラーが検出されなかったストライプＳ４〜Ｓ１４に含まれるデータＤ１０４〜Ｄ１１４をキャッシュメモリ１３０に書き込む。なお、ストライプＳ１５およびＳ１６はパリティデータであるため、データ転送ＤＭＡ１５０は、ストライプＳ１５およびＳ１６に含まれるパリティデータＰ１１５およびＰ１１６をキャッシュメモリ１３０に書き込まない。このようにして、データ転送ＤＭＡ１５０は、データＤ１０をキャッシュメモリ１３０に復旧する。
【００６５】
続いて、図３−３を用いて、図３−１に示したデータＤ２０をキャッシュメモリ１３０に復旧させる処理について説明する。同図に示すように、データ転送ＤＭＡ１５０は、データＤ１０の復旧処理が終了した後、フラッシュメモリ１４２から、ストライプＳ１〜Ｓ１６を読み出しながら、ＣＲＣ検査、ＡＩＤ検査およびＸＯＲ演算を行い、訂正データＴ２１およびＴ２２を生成する。ここでは、データ転送ＤＭＡ１５０は、フラッシュメモリ１４２からストライプＳ１〜Ｓ１６の読出処理中に、タイムアウトが発生しなかったものとする。また、データ転送ＤＭＡ１５０は、ストライプＳ１〜Ｓ１６のＣＲＣ検査およびＡＩＤ検査においてエラーを検出しなかったものとする。
【００６６】
すべてのストライプＳ１〜１６を読み出した後、データ転送ＤＭＡ１５０は、ストライプＳ１〜Ｓ１２に含まれるデータＤ２０１〜Ｄ２１２をキャッシュメモリ１３０に書き込む。そして、データ転送ＤＭＡ１５０は、ストライプＳ１３に含まれるデータＤ２１３から１［ＫＢ］のバウンダリ調整値を除去したデータＤ２１３をキャッシュメモリ１３０に書き込む。なお、ストライプＳ１４に含まれるデータＤ２１４は、すべてバウンダリ調整値であるため、データ転送ＤＭＡ１５０は、データＤ２１４をキャッシュメモリ１３０に書き込まない。
【００６７】
以上のように、実施例１に係るストレージ装置１は、データ退避処理時に、退避対象データのパリティデータを生成して、ＣＲＣやＡＩＤを付与した退避対象データおよびパリティデータをフラッシュメモリ１４１または１４２に書き込み、データ復旧処理において、フラッシュメモリ１４１または１４２から所定の時間内にデータ読出処理が完了しない場合に、データ読出処理を中止して付加データを設定し、パリティデータを用いて誤りデータを訂正したデータをキャッシュメモリ１３０に書き込むので、フラッシュメモリ１４１または１４２からデータの読出応答がなされない場合であっても、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。
【００６８】
また、実施例１に係るストレージ装置１は、退避対象単位データ番号が奇数である退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である退避対象単位データを用いてパリティデータを生成し、小エリア内の１つのダイには、退避対象単位データ番号が奇数である退避対象単位データと、退避対象単位データ番号が偶数である退避対象単位データとを書き込むように構成したので、１個のダイが故障した場合であっても、かかる故障したダイに記憶されていたデータを訂正することができる。すなわち、１個のダイが故障した場合であっても、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。
【００６９】
次に、実施例１に係るストレージ装置１が有するＣＭ１００の構成について説明する。図４は、実施例１に係るストレージ装置１が有するＣＭ１００の構成を示す図である。なお、同図では、データ退避処理およびデータ復旧処理に関連する構成のみを図示している。
【００７０】
同図に示すように、ＣＭ１００は、電力供給部１２と接続されており、キャッシュメモリ１３０と、フラッシュメモリ１４１および１４２と、データ転送ＤＭＡ１５０と、ＲｏＣ１６０とを有する。
【００７１】
電力供給部１２は、ストレージ装置１が異常終了した場合に、ＣＭ１００に対して電力供給を行う装置であり、例えば、大容量のコンデンサやバッテリー等である。なお、同図では、ＣＭ１００が外部に備えられた電力供給部１２によって電力供給される例を示しているが、ＣＭ１００は、電力供給部１２を有してもよい。
【００７２】
キャッシュメモリ１３０は、上述したように、ホストコンピュータとＨＤＤ１１との間で転送が行われるデータを一時的に記憶するメモリである。フラッシュメモリ１４１および１４２は、不揮発性メモリであり、ストレージ装置１の異常終了時にデータ転送ＤＭＡ１５０によって、キャッシュメモリ１３０に記憶されているデータが退避される。
【００７３】
データ転送ＤＭＡ１５０は、ＲｏＣ１６０に指示に従って、キャッシュメモリ１３０と、フラッシュメモリ１４１および１４２との間におけるデータ送受信を行うＤＭＡ回路である。具体的には、データ転送ＤＭＡ１５０は、ストレージ装置１が異常終了した場合に、キャッシュメモリ１３０に記憶されているデータを、フラッシュメモリ１４１および１４２に退避させるデータ退避処理を行う。また、データ転送ＤＭＡ１５０は、ストレージ装置１が異常終了後に電源投入された場合に、フラッシュメモリ１４１および１４２に退避したデータをキャッシュメモリ１３０に復旧するデータ復旧処理を行う。なお、データ転送ＤＭＡ１５０の構成、データ転送ＤＭＡ１５０によるデータ退避処理およびデータ復旧処理については、後に詳述する。
【００７４】
ＲｏＣ１６０は、ＣＭ１００を全体制御する制御装置であり、退避データ領域算出部１６１と、退避指示部１６２と、復旧指示部１６３とを有する。退避データ領域算出部１６１は、ストレージ装置１が異常終了した場合に、データ転送ＤＭＡ１５０にデータ退避処理を行うように指示する際に必要となる各種情報を算出する処理部である。
【００７５】
具体的には、退避データ領域算出部１６１は、退避対象データのサイズや、退避対象データのキャッシュメモリ１３０における記憶位置（アドレス）に基づいて、データ転送ＤＭＡ１５０が退避するデータのサイズや、データ転送ＤＭＡ１５０が退避するデータの記憶位置や、バウンダリ調整値のサイズ等を算出する。
【００７６】
退避指示部１６２は、データ転送ＤＭＡ１５０に対して、データ退避処理を行うように指示する処理部である。具体的には、退避指示部１６２は、ストレージ装置１が異常終了した場合に、データ退避処理を行うように指示する命令（以下、「データ退避ディスクリプタ」という）を生成して、データ転送ＤＭＡ１５０に送信する。
【００７７】
このデータ退避ディスクリプタには、退避データ領域算出部１６１によって算出された各種情報が含まれる。具体的には、データ退避ディスクリプタには、退避対象データのキャッシュメモリ１３０における先頭の記憶位置（先頭アドレス）や、退避対象データのサイズや、バウンダリ調整値のサイズや、ＡＩＤ等が含まれる。
【００７８】
復旧指示部１６３は、データ転送ＤＭＡ１５０に対して、データ復旧処理を行うように指示する処理部である。具体的には、復旧指示部１６３は、ストレージ装置１が異常終了後に電源投入された場合に、データ復旧処理を行うように指示する命令（以下、「データ復旧ディスクリプタ」という）を生成して、データ転送ＤＭＡ１５０に送信する。このデータ復旧ディスクリプタには、除去するバウンダリ調整値のサイズ等が含まれる。
【００７９】
また、復旧指示部１６３は、データ転送ＤＭＡ１５０によるデータ復旧処理が完了した場合に、フラッシュメモリ１４１および１４２に記憶されているデータを消去する命令（以下、「イレースディスクリプタ」という）を生成して、データ転送ＤＭＡ１５０に送信する。
【００８０】
次に、データ転送ＤＭＡ１５０の構成について説明する。図５は、図４に示したデータ転送ＤＭＡ１５０の構成を示す図である。同図に示すように、データ転送ＤＭＡ１５０は、ＰＣＩ（Peripheral  Component  Interconnect）バスＩ／Ｆ５１０と、メモリＩ／Ｆ５２１および５２２と、ディスクリプタ保持レジスタ５３０と、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０と、イレースＤＭＡ５６１および５６２とを有する。
【００８１】
ＰＣＩバスＩ／Ｆ５１０は、データ転送ＤＭＡ１５０とキャッシュメモリ１３０との間のデータ送受信を行うインタフェースである。メモリＩ／Ｆ５２１は、データ転送ＤＭＡ１５０とフラッシュメモリ１４１との間のデータ送受信を行うインタフェースであり、メモリＩ／Ｆ５２２は、データ転送ＤＭＡ１５０とフラッシュメモリ１４２との間のデータ送受信を行うインタフェースである。
【００８２】
ディスクリプタ保持レジスタ５３０は、ＲｏＣ１６０から受信した各種ディスクリプタを記憶するレジスタである。具体的には、ディスクリプタ保持レジスタ５３０は、データ退避ディスクリプタや、データ復旧ディスクリプタや、イレースディスクリプタ等を記憶する。
【００８３】
ライトＤＭＡ５４１および５４２は、データ退避処理を行うＤＭＡ回路である。具体的には、ライトＤＭＡ５４１は、ディスクリプタ保持レジスタ５３０からデータ退避ディスクリプタを受け取った場合に、ＰＣＩバスＩ／Ｆ５１０を介してキャッシュメモリ１３０に記憶されているデータを取得する。そして、ライトＤＭＡ５４１は、取得したデータを、メモリＩ／Ｆ５２１を介してフラッシュメモリ１４１に書き込む。同様に、ライトＤＭＡ５４２は、ディスクリプタ保持レジスタ５３０からデータ退避ディスクリプタを受け取った場合に、キャッシュメモリ１３０に記憶されているデータを取得し、取得したデータを、フラッシュメモリ１４２に書き込む。
【００８４】
ライトＤＭＡ５４１および５４２は、キャッシュメモリ１３０からフラッシュメモリ１４１または１４２にデータを転送する処理を並行して行う。図３−１に示した例において、例えば、ライトＤＭＡ５４１がデータＤ１０をフラッシュメモリ１４１へ書き込む処理を行い、ライトＤＭＡ５４２がデータＤ２０をフラッシュメモリ１４２へ書き込む処理を行う。そして、このライトＤＭＡ５４１および５４２によるデータ退避処理が並行して行われる。
【００８５】
このように、ストレージ装置１は、２系統のフラッシュメモリ１４１および１４２と、２系統のライトＤＭＡ５４１および５４２とを有して、ライトＤＭＡ５４１および５４２に対してデータ退避処理を並行して行わせる。これにより、ストレージ装置１は、データ退避処理を効率よく行うことが可能となり、電力供給部１２から電力供給される短い時間内にデータ退避処理を完了させることを実現している。
【００８６】
リードＤＭＡ５５０は、データ復旧処理を行うＤＭＡ回路である。具体的には、リードＤＭＡ５５０は、ディスクリプタ保持レジスタ５３０から、データ復旧ディスクリプタを受け取った場合に、フラッシュメモリ１４１に記憶されているデータを取得し、取得したデータを、キャッシュメモリ１３０に記憶させる。同様に、リードＤＭＡ５５０は、データ復旧ディスクリプタを受け取った場合に、フラッシュメモリ１４２に記憶されているデータを取得し、取得したデータを、キャッシュメモリ１３０に記憶させる。
【００８７】
実施例１に係るストレージ装置１が、データ退避処理を２系統のライトＤＭＡ５４１および５４２に行わせるのに対して、データ復旧処理を１系統のリードＤＭＡ５５０に行わせる理由について説明する。これは、データ退避処理には、電力供給部１２から電力供給される短い時間内に完了させなければならないという制約があるのに対して、データ復旧処理には、このような制約がないためである。
【００８８】
ただし、データ転送ＤＭＡ１５０が有するライトＤＭＡやリードＤＭＡの数は、図５に示した例に限られない。例えば、データ転送ＤＭＡ１５０は、例えば、３個のライトＤＭＡを有してもよいし、１０個のリードＤＭＡを有してもよい。
【００８９】
イレースＤＭＡ５６１は、ディスクリプタ保持レジスタ５３０からイレースディスクリプタを受け取った場合に、フラッシュメモリ１４１に記憶されているデータを消去するＤＭＡ回路である。同様に、イレースＤＭＡ５６２は、ディスクリプタ保持レジスタ５３０からイレースディスクリプタを受け取った場合に、フラッシュメモリ１４２に記憶されているデータを消去するＤＭＡ回路である。
【００９０】
次に、ライトＤＭＡ５４１および５４２の構成について説明する。図６は、図５に示したライトＤＭＡ５４１および５４２の構成を示す図である。なお、ライトＤＭＡ５４１および５４２の構成は同一であるため、ここでは、ライトＤＭＡ５４１の構成についてのみ説明する。
【００９１】
同図に示すように、ライトＤＭＡ５４１は、データ読出部５４１ａと、バウンダリ調整部５４１ｂと、パリティ生成部５４１ｃと、退避データバッファ５４１ｄと、パリティバッファ５４１ｅと、データ書込部５４１ｆとを有する。
【００９２】
データ読出部５４１ａは、キャッシュメモリ１３０から所定のサイズのデータを読み出す処理部である。具体的には、データ読出部５４１ａは、データ退避ディスクリプタに含まれている退避対象データの先頭アドレスから、退避対象データのサイズ分のデータを読み出す。
【００９３】
バウンダリ調整部５４１ｂは、データ読出部５４１ａによって読み出された退避対象データにバウンダリ調整値を加える処理部である。具体的には、バウンダリ調整部５４１ｂは、退避対象データに、データ退避ディスクリプタに含まれているバウンダリ調整値のサイズ分のバウンダリ調整値を加える。
【００９４】
パリティ生成部５４１ｃは、データ読出部５４１ａによって読み出された退避対象データを用いて、パリティデータを生成する処理部である。具体的には、パリティ生成部５４１ｃは、退避対象データを、バウンダリサイズ２８［ＫＢ］ごとのバウンダリデータに区切って、さらに、バウンダリデータを、予めシステムで決められているサイズである２［ＫＢ］ごとに区切る。
【００９５】
そして、パリティ生成部５４１ｃは、退避対象単位データ番号が奇数である７個の退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である７個の退避対象単位データを用いてパリティデータを生成する。そして、データ読出部５４１ａによって読み出された退避対象データを、退避データバッファ５４１ｄに記憶させるとともに、生成したパリティデータをパリティバッファ５４１ｅに記憶させる。
【００９６】
退避データバッファ５４１ｄは、データを一次記憶する記憶装置であり、上述したように、パリティ生成部５４１ｃによって退避対象データが記憶される。パリティバッファ５４１ｅは、データを一次記憶する記憶装置であり、上述したように、パリティ生成部５４１ｃによってパリティデータが記憶される。
【００９７】
データ書込部５４１ｆは、退避データバッファ５４１ｄおよびパリティバッファ５４１ｅから、退避対象単位データおよびパリティデータを読み出してフラッシュメモリ１４１に書き込む処理部であり、ＣＲＣ付与部５４１ｇとＡＩＤ付与部５４１ｈとを有する。
【００９８】
ＣＲＣ付与部５４１ｇは、退避データバッファ５４１ｄから読み出した退避対象単位データごとにＣＲＣを生成するとともに、パリティバッファ５４１ｅから読み出したパリティデータごとにＣＲＣを生成する。そして、ＣＲＣ付与部５４１ｇは、生成したＣＲＣを、退避対象単位データおよびパリティデータに付与する。
【００９９】
ＡＩＤ付与部５４１ｈは、退避データバッファ５４１ｄから読み出した退避対象単位データに、ＡＩＤを付与するとともに、パリティバッファ５４１ｅから読み出したパリティデータに、ＡＩＤを付与する。なお、ＡＩＤ付与部５４１ｈは、データ退避ディスクリプタからＡＩＤを取得する。
【０１００】
データ書込部５４１ｆは、このようにしてＣＲＣおよびＡＩＤが付与された退避対象単位データおよびパリティデータを、フラッシュメモリ１４１に書き込む。
【０１０１】
次に、リードＤＭＡ５５０の構成について説明する。図７は、図５に示したリードＤＭＡ５５０の構成を示す図である。同図に示すように、リードＤＭＡ５５０は、セレクタ５５０ａと、データ読出部５５０ｂと、タイムアウト検出部５５０ｃと、エラー検出部５５０ｄと、復旧データバッファ５５０ｅと、ＸＯＲ演算部５５０ｆと、ＣＲＣ検査部５５０ｇと、ＡＩＤ検査部５５０ｈと、訂正データバッファ５５０ｉと、ログ保持レジスタ５５０ｊと、セレクタ５５０ｋと、バウンダリ調整部５５０ｌと、データ書込部５５０ｍとを有する。
【０１０２】
セレクタ５５０ａは、複数の入力信号の中から１つの入力信号のみを選択して出力するセレクタ回路であり、フラッシュメモリ１４１に記憶されているストライプをデータ読出部５５０ｂに出力したり、付加データをデータ読出部５５０ｂに出力したりする。セレクタ５５０ａが、ストライプまたは付加データのいずれを出力するかは、後に説明する。
【０１０３】
データ読出部５５０ｂは、セレクタ５５０ａを介して、フラッシュメモリ１４１から、小エリアのストライプを読み出して、読み出したストライプを復旧データバッファ５５０ｅに記憶させる。このとき、データ読出部５５０ｂは、データ読出処理を開始した時刻をタイムアウト検出部５５０ｃに通知する。
【０１０４】
タイムアウト検出部５５０ｃは、データ読出部５５０ｂから受け付けたデータ読出処理の開始時刻に基づいて、データ読出部５５０ｂによるデータ読出処理が所定の時間内に完了するか否かを監視する処理部である。
【０１０５】
具体的には、タイムアウト検出部５５０ｃは、データ読出部５５０ｂによるデータ読出処理が、データ読出処理の開始時刻から所定の時間を経過しても完了しない場合に、データ読出部５５０ｂが読取処理中のストライプに対してタイムアウトが発生したことを検出する。そして、タイムアウト検出部５５０ｃは、タイムアウトを検出したストライプのストライプ番号を含むタイムアウト検出通知をセレクタ５５０ａに対して行う。
【０１０６】
ここで、タイムアウト検出通知を受け付けたセレクタ５５０ａの処理について説明する。タイムアウト検出通知を受け付けたセレクタ５５０ａは、タイムアウト検出通知に含まれるストライプ番号が示すストライプの読出処理を中止して、かかるストライプの読み出しできなかったサイズ分の付加データをデータ読出部５５０ｂに出力する。その後、セレクタ５５０ａは、次のストライプの読出処理を再開する。
【０１０７】
エラー検出部５５０ｄは、フラッシュメモリ１４１からＥＣＣチェックエラーが発生した旨の通知を受け付けた場合に、ＥＣＣエラー通知をセレクタ５５０ａに対して行う処理部である。
【０１０８】
ここで、ＥＣＣエラー通知を受け付けたセレクタ５５０ａの処理について説明する。ＥＣＣエラー通知を受け付けたセレクタ５５０ａは、読出処理中のストライプの読出処理を中止して、かかるストライプの読み出しできなかったサイズ分の付加データをデータ読出部５５０ｂに出力する。その後、セレクタ５５０ａは、次のストライプの読出処理を再開する。
【０１０９】
復旧データバッファ５５０ｅは、データを一次記憶する記憶装置であり、上述したように、データ読出部５５０ｂによって、ストライプまたは付加データが設定されているストライプが記憶される。
【０１１０】
ＸＯＲ演算部５５０ｆは、データ読出部５５０ｂによって読み出されたストライプを用いて訂正データを生成する処理部である。具体的には、ＸＯＲ演算部５５０ｆは、ストライプ番号が奇数である７個のストライプを用いて訂正データを生成するとともに、ストライプ番号が偶数である７個のストライプを用いて訂正データを生成する。そして、ＸＯＲ演算部５５０ｆは、生成した訂正データを訂正データバッファ５５０ｉに記憶させる。
【０１１１】
ＣＲＣ検査部５５０ｇは、データ読出部５５０ｂによって読み出されたストライプに誤りデータが存在するか否かを検査する処理部である。具体的には、ＣＲＣ検査部５５０ｇは、データ読出部５５０ｂによって読み出されたストライプ内のＣＲＣを用いて、誤りデータが存在するか否かを、ストライプごとに検査する。そして、誤りデータが存在する場合、すなわち、エラーを検出した場合、ＣＲＣ検査部５５０ｇは、エラーを検出したストライプのストライプ番号をログ保持レジスタ５５０ｊに記憶させる。
【０１１２】
ＡＩＤ検査部５５０ｈは、データ読出部５５０ｂによって読み出されたストライプがすべて揃っているか否かを検査する処理部である。具体的には、ＡＩＤ検査部５５０ｈは、データ読出部５５０ｂによって読み出されたストライプ内のＡＩＤを用いて、小エリア内のストライプがすべて揃っているか否かを検査する。そして、ストライプがすべて揃っていないことを検出した場合、すなわち、エラーを検出した場合、ＡＩＤ検査部５５０ｈは、欠如しているストライプのストライプ番号をログ保持レジスタ５５０ｊに記憶させる。
【０１１３】
訂正データバッファ５５０ｉは、データを一次記憶する記憶装置であり、上述したように、ＸＯＲ演算部５５０ｆによって、訂正データが記憶される。ログ保持レジスタ５５０ｊは、データを一次記憶する記憶装置であり、上述したように、ＣＲＣ検査部５５０ｇまたはＡＩＤ検査部５５０ｈによって、エラーが検出されたストライプのストライプ番号が記憶される。
【０１１４】
セレクタ５５０ｋは、セレクタ回路であり、復旧データバッファ５５０ｅと、訂正データバッファ５５０ｉと、ログ保持レジスタ５５０ｊとに記憶されている各種データに基づいて、復旧データバッファ５５０ｅに記憶されているストライプを、データ書込部５５０ｍに出力したり、誤りデータを訂正したストライプをデータ書込部５５０ｍに出力したりする。
【０１１５】
具体的には、セレクタ５５０ｋは、ログ保持レジスタ５５０ｊにストライプ番号が記憶されていないストライプについては、復旧データバッファ５５０ｅに記憶されているストライプを、データ書込部５５０ｍに出力する。また、セレクタ５５０ｋは、ログ保持レジスタ５５０ｊにストライプ番号が記憶されているストライプ（以下、「エラー検出ストライプ」という）については、復旧データバッファ５５０ｅおよび訂正データバッファ５５０ｉに記憶されている各種データを用いて、かかるエラー発生ストライプの誤りデータを訂正してデータ書込部５５０ｍに出力する。
【０１１６】
バウンダリ調整部５５０ｌは、セレクタ５５０ｋから受け付けた小エリア単位のストライプからバウンダリ調整値を除去する処理部である。具体的には、バウンダリ調整部５５０ｌは、小エリア単位のストライプから、データ復旧ディスクリプタに含まれるバウンダリ調整値のサイズ分のバウンダリ調整値を除去する。
【０１１７】
データ書込部５５０ｍは、バウンダリ調整部５５０ｌによってバウンダリ調整値が除去された小エリア単位のストライプに含まれる退避対象単位データをキャッシュメモリ１３０に書き込む処理部である。なお、データ書込部５５０ｍは、パリティデータについてはキャッシュメモリ１３０に書き込まない。
【０１１８】
次に、実施例１に係るストレージ装置１によるデータ退避処理について説明する。図８は、実施例１に係るストレージ装置１によるデータ退避処理の流れを示すシーケンス図である。
【０１１９】
同図に示すように、ＲｏＣ１６０の退避データ領域算出部１６１は、ストレージ装置１が異常終了したことを検出した場合（ステップＳ１０１）、データ退避ディスクリプタを生成するために必要となる各種情報を算出する。
【０１２０】
そして、退避指示部１６２は、退避データ領域算出部１６１によって算出された各種情報に基づいて、ライトＤＭＡ５４１にデータ退避処理を行わせるためのデータ退避ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ１０２）。
【０１２１】
例えば、図３−１に示した例のように、キャッシュメモリ１３０にデータＤ１が記憶されている場合、退避指示部１６２は、ライトＤＭＡ５４１にデータ退避処理をさせるためのデータ退避ディスクリプタとして、データＤ１０の先頭アドレスと、データＤ１０のサイズ２８［ＫＢ］と、バウンダリ調整値のサイズ０［ＫＢ］と、ＡＩＤ等を含むデータ退避ディスクリプタを生成する。
【０１２２】
同様に、退避指示部１６２は、ライトＤＭＡ５４２にデータ退避処理をさせるためのデータ退避ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ１０３）。
【０１２３】
上述例の場合、退避指示部１６２は、ライトＤＭＡ５４２にデータ退避処理をさせるためのデータ退避ディスクリプタとして、データＤ２０の先頭アドレスと、データＤ２０のサイズ２５［ＫＢ］と、バウンダリ調整値のサイズ３［ＫＢ］と、ＡＩＤ等を含むデータ退避ディスクリプタを生成する。
【０１２４】
その後、退避指示部１６２は、ライトＤＭＡ５４１を起動させるとともに（ステップＳ１０４）、ライトＤＭＡ５４２を起動させて（ステップＳ１０５）、ライトＤＭＡ５４１およびライトＤＭＡ５４２に対して、データ退避処理を並行して行わせる。
【０１２５】
退避指示部１６２によって起動されたライトＤＭＡ５４１は、データ退避処理を行い（ステップＳ１０６）、データ退避処理が完了した場合に、データ退避処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ１０７）。同様に、ライトＤＭＡ５４２は、データ退避処理を行い（ステップＳ１０８）、データ退避処理が完了した場合に、データ退避処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ１０９）。ライトＤＭＡ５４１および５４２によるデータ退避処理は、並行して行われる。
【０１２６】
なお、上述したデータ退避処理の流れでは、ストレージ装置１が異常終了した後に、退避指示部１６２がデータ退避ディスクリプタを生成する例を説明したが、退避指示部１６２は、ストレージ装置１が異常終了する前に、データ退避ディスクリプタを生成してもよい。例えば、ストレージ装置１の起動中に、退避対象データのサイズ等を予め取得しておけば、ストレージ装置１の異常終了前にデータ退避ディスクリプタを生成することができる。
【０１２７】
次に、ライトＤＭＡ５４１および５４２によるデータ退避処理について説明する。図９は、ライトＤＭＡ５４１および５４２によるデータ退避処理手順を示すフローチャートである。なお、ライトＤＭＡ５４１および５４２によるデータ退避処理手順は同一であるため、ここでは、ライトＤＭＡ５４１によるデータ退避処理手順についてのみ説明する。
【０１２８】
同図に示すように、ＲｏＣ１６０によって起動されたライトＤＭＡ５４１は、ディスクリプタ保持レジスタ５３０からデータ退避ディスクリプタを読み出す（ステップＳ２０１）。そして、ライトＤＭＡ５４１のデータ読出部５４１ａは、キャッシュメモリ１３０から、所定のサイズのデータを読み出す（ステップＳ２０２）。このとき、データ読出部５４１ａは、データ退避ディスクリプタに含まれている退避対象データの先頭アドレスから、退避対象データのサイズ分のデータを読み出す。
【０１２９】
続いて、バウンダリ調整部５４１ｂは、データ読出部５４１ａによって読み出された退避対象データに、データ退避ディスクリプタに含まれているバウンダリ調整値のサイズ分のバウンダリ調整値を加える（ステップＳ２０３）。
【０１３０】
続いて、パリティ生成部５４１ｃは、退避対象データを、バウンダリサイズごとのバウンダリデータに区切って、さらに、バウンダリデータを、予めシステムで決められているサイズである２［ＫＢ］ごとに区切る。そして、パリティ生成部５４１ｃは、退避対象単位データ番号が奇数である７個の退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である７個の退避対象単位データを用いてパリティデータを生成する（ステップＳ２０４）。
【０１３１】
続いて、ＣＲＣ付与部５４１ｇは、退避対象単位データごとにＣＲＣを生成するとともに、パリティデータごとにＣＲＣを生成して、生成したＣＲＣを、退避対象単位データおよびパリティデータに付与する（ステップＳ２０５）。続いて、ＡＩＤ付与部５４１ｈは、退避対象単位データおよびパリティデータに、ＡＩＤを付与する（ステップＳ２０６）。そして、データ書込部５４１ｆは、ＣＲＣおよびＡＩＤが付与された退避対象単位データおよびパリティデータを、フラッシュメモリ１４１に書き込む（ステップＳ２０７）。
【０１３２】
次に、実施例１に係るストレージ装置１によるデータ復旧処理について説明する。図１０は、実施例１に係るストレージ装置１によるデータ復旧処理の流れを示すシーケンス図である。
【０１３３】
同図に示すように、ＲｏＣ１６０の復旧指示部１６３は、異常終了後にストレージ装置１が起動したことを検出した場合（ステップＳ３０１）、リードＤＭＡ５５０に対して、フラッシュメモリ１４１に記憶されているデータをキャッシュメモリ１３０へ復旧する旨のデータ復旧ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ３０２）。その後、復旧指示部１６３は、リードＤＭＡ５５０を起動させる（ステップＳ３０３）。
【０１３４】
復旧指示部１６３によって起動されたリードＤＭＡ５５０は、フラッシュメモリ１４１に記憶されているデータをキャッシュメモリ１３０へ復旧させるデータ復旧処理を行う（ステップＳ３０４）。かかるデータ復旧処理が完了した場合に、リードＤＭＡ５５０は、データ復旧処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ３０５）。
【０１３５】
続いて、復旧指示部１６３は、リードＤＭＡ５５０に対して、フラッシュメモリ１４２に記憶されているデータをキャッシュメモリ１３０へ復旧する旨のデータ復旧ディスクリプタを生成して、ディスクリプタ保持レジスタ５３０に記憶させる（ステップＳ３０６）。その後、復旧指示部１６３は、リードＤＭＡ５５０を起動させる（ステップＳ３０７）。
【０１３６】
復旧指示部１６３によって起動されたリードＤＭＡ５５０は、フラッシュメモリ１４２に記憶されているデータをキャッシュメモリ１３０へ復旧させるデータ復旧処理を行う（ステップＳ３０８）。かかるデータ復旧処理が完了した場合に、リードＤＭＡ５５０は、データ復旧処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ３０９）。
【０１３７】
続いて、ＲｏＣ１６０は、キャッシュメモリ１３０に復旧されたデータを、ＨＤＤ１１に記憶させるリストア処理（フラッシュバック）を行う（ステップＳ３１０）。これにより、ＨＤＤ１１に書き込みされていないキャッシュメモリ１３０上のデータはなくなる。
【０１３８】
続いて、復旧指示部１６３は、イレースディスクリプタを生成して、データ転送ＤＭＡ１５０に記憶させる（ステップＳ３１１）。そして、復旧指示部１６３は、イレースＤＭＡ５６１および５６２を起動させて（ステップＳ３１２）、イレースＤＭＡ５６１および５６２に対して、フラッシュメモリ１４１および１４２に記憶されているデータを消去させる。
【０１３９】
復旧指示部１６３によって起動されたイレースＤＭＡ５６１および５６２は、ディスクリプタ保持レジスタ５３０から、イレースディスクリプタを読み出して（ステップＳ３１３）、イレース処理を行う（ステップＳ３１４）。かかるイレース処理が完了した場合に、イレースＤＭＡ５６１および５６２は、イレース処理が完了した旨をＲｏＣ１６０に対して通知する（ステップＳ３１５）。そして、イレース処理が完了した旨の通知を受け付けたＲｏＣ１６０は、ストレージ装置１を起動させる（ステップＳ３１６）。
【０１４０】
次に、リードＤＭＡ５５０によるデータ復旧処理について説明する。図１１は、リードＤＭＡ５５０によるデータ復旧処理手順を示すフローチャートである。同図に示すように、ＲｏＣ１６０によって起動されたリードＤＭＡ５５０は、ディスクリプタ保持レジスタ５３０からデータ復旧ディスクリプタを読み出す（ステップＳ４０１）。
【０１４１】
そして、リードＤＭＡ５５０のデータ読出部５５０ｂは、セレクタ５５０ａを介して、フラッシュメモリ１４１から、小エリアのストライプを読み出す（ステップＳ４０２）。このデータ読出部５５０ｂによるデータ読出処理が所定の時間内に完了しない場合（ステップＳ４０３否定）、タイムアウト検出部５５０ｃは、データ読出部５５０ｂによって読取処理されているストライプに対して、タイムアウトが発生したことを検出する。そして、タイムアウト検出部５５０ｃは、タイムアウト検出通知をセレクタ５５０ａに対して行う。
【０１４２】
タイムアウト検出通知を受け付けたセレクタ５５０ａは、タイムアウト検出通知に含まれるストライプ番号が示すストライプの読出処理を中止して、かかるストライプの読み出しできなかったサイズ分の付加データをデータ読出部５５０ｂに出力する（ステップＳ４０４）。このようにして、データ読出部５５０ｂは、フラッシュメモリ１４１から小エリアのストライプを読み出す。
【０１４３】
続いて、ＸＯＲ演算部５５０ｆは、データ読出部５５０ｂによって読み出されたストライプを用いて訂正データを生成する（ステップＳ４０５）。続いて、ＣＲＣ検査部５５０ｇは、データ読出部５５０ｂによって読み出されたストライプに誤りデータが存在するか否かを検査し、ＡＩＤ検査部５５０ｈは、データ読出部５５０ｂによって読み出されたストライプがすべて揃っているか否かを検査する（ステップＳ４０６）。
【０１４４】
ＣＲＣ検査部５５０ｇ、または、ＡＩＤ検査部によってエラーが検出された場合（ステップＳ４０７肯定）、セレクタ５５０ｋは、データ読出部５５０ｂによって読み出されたストライプ、および、ＸＯＲ演算部５５０ｆによって生成された訂正データに基づいて、エラーが検出されたストライプの誤りデータを訂正する（ステップＳ４０８）。
【０１４５】
続いて、バウンダリ調整部５５０ｌは、データ読出部５５０ｂによって読み出された小エリアのストライプから、データ復旧ディスクリプタに含まれるバウンダリ調整値のサイズ分のバウンダリ調整値を除去する（ステップＳ４０９）。
【０１４６】
そして、データ書込部５５０ｍは、バウンダリ調整部５５０ｌによってバウンダリ調整値が除去された小エリアのストライプに含まれる退避対象単位データを、キャッシュメモリ１３０に書き込む（ステップＳ４１０）。なお、このとき、データ書込部５５０ｍは、パリティデータについてはキャッシュメモリ１３０に書き込まない。
【０１４７】
リードＤＭＡ５５０は、フラッシュメモリ１４１に記憶されている全てのデータを読み出していない場合（ステップＳ４１１否定）、フラッシュメモリ１４１から全てのデータを読み出すまで、上述した処理手順（ステップＳ４０１〜Ｓ４１０）を繰り返し行う。
【０１４８】
上述してきたように、実施例１に係るストレージ装置１は、データ退避処理時に、退避対象データのパリティデータを生成して、ＣＲＣやＡＩＤを付与した退避対象データおよびパリティデータをフラッシュメモリ１４１または１４２に書き込み、データ復旧処理において、フラッシュメモリ１４１または１４２から所定の時間内にデータ読出処理が完了しない場合に、データ読出処理を中止して付加データを設定し、パリティデータを用いて誤りデータを訂正したデータをキャッシュメモリ１３０に書き込むように構成したので、フラッシュメモリ１４１または１４２からデータの読出応答がなされない場合であっても、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。
【０１４９】
なお、上記実施例１では、データ退避処理時に、ライトＤＭＡ５４１および５４２が、７個の退避対象単位データに対して、１個のパリティデータを生成する例を示したが、退避対象単位データの数と、パリティデータの数の比率はこれに限らない。例えば、ライトＤＭＡ５４１および５４２は、２個退避対象単位データに対して、１個のパリティデータを生成してもよいし、１０個退避対象単位データに対して、１個のパリティデータを生成してもよい。
【０１５０】
また、上記実施例１では、ライトＤＭＡ５４１および５４２が、退避対象単位データ番号が奇数である退避対象単位データを用いてパリティデータを生成するとともに、退避対象単位データ番号が偶数である退避対象単位データを用いてパリティデータを生成する例を示したが、ライトＤＭＡ５４１および５４２は、退避対象単位データ番号に関わらず、所定の数の退避対象単位データを用いてパリティデータを構成してもよい。
【実施例２】
【０１５１】
ところで、上記実施例１では、データサイズがバウンダリサイズに満たないバウンダリデータに、バウンダリ調整値を加える処理であるバウンダリ処理を行う例を示したが、バウンダリ処理を行わないようにしてもよい。そこで、実施例２では、キャッシュメモリ１３０から読み出したデータをバウンダリサイズごとに区切れない場合であっても、バウンダリ処理を行わない例について説明する。
【０１５２】
まず、実施例２に係るストレージ装置２によるデータ退避処理の概要を説明する。なお、実施例２に係るストレージ装置２の概略構成は、図１に示したストレージ装置１の概略構成と同様であるため、その説明を省略する。
【０１５３】
図１２−１は、実施例２に係るストレージ装置２によるデータ退避処理の概要を説明するための図である。同図に示すように、キャッシュメモリ１３０には、２１０［ＫＢ］のデータＤ３が記憶されているものとする。この状態で、ストレージ装置２が異常終了した場合、データＤ３は、バウンダリサイズ２８［ＫＢ］ごとにデータＤ３１〜Ｄ３８に区切られる。
【０１５４】
ここで、実施例２に係るストレージ装置２のＲｏＣ（ＲｏＣ２６０とする）は、ライトＤＭＡ５４１に対して、キャッシュメモリ１３０に記憶されているデータＤ３のうち、データＤ４（データＤ３１〜Ｄ３４）について、データ退避処理を行うように指示する。
【０１５５】
さらに、ＲｏＣ２６０は、ライトＤＭＡ５４２に対して、キャッシュメモリ１３０に記憶されているデータＤ３のうち、データＤ５（データＤ３４−２と、データＤ３５〜Ｄ３８）について、データ退避処理を行うように指示する。
【０１５６】
つまり、ＲｏＣ２６０は、ライトＤＭＡ５４１に対して、データＤ３のキャッシュメモリ１３０における先頭の記憶位置である先頭アドレスから４個分のバウンダリデータ（同図に示したデータＤ３１、Ｄ３２、Ｄ３３、Ｄ３４）について、データ退避処理を行うように指示する。また、ＲｏＣ２６０は、ライトＤＭＡ５４２に対して、データＤ３のキャッシュメモリ１３０における最後の記憶位置である最終アドレスから、先頭アドレス方向に４個分のバウンダリデータ（同図に示したデータＤ５４、Ｄ５３、Ｄ５２、Ｄ５１）について、データ退避処理を行うように指示する。
【０１５７】
このような指示を受け付けたライトＤＭＡ５４１は、データＤ４を、バウンダリサイズ２８［ＫＢ］ごとにデータＤ３１〜Ｄ３４に区切ることができる。また、ライトＤＭＡ５４２は、データＤ５を、バウンダリサイズ２８［ＫＢ］ごとにデータＤ５１〜Ｄ５４に区切ることができる。すなわち、実施例２に係るストレージ装置２は、バウンダリ処理を行うことなく、データ退避処理を行うことができる。
【０１５８】
次に、実施例２に係るストレージ装置２によるデータ復旧処理の概要について説明する。図１２−２は、実施例２に係るストレージ装置２によるデータ復旧処理の概要を説明するための図である。図１２−２に示したフラッシュメモリ１４１および１４２には、図１２−１に示したライトＤＭＡ５４１およびライトＤＭＡ５４２によって退避されたデータが記憶されているものとする。
【０１５９】
ストレージ装置２が異常終了後に起動した場合、リードＤＭＡ５５０は、フラッシュメモリ１４１からデータＤ３１を読み出しながら各種検査（ＣＲＣ検査等）を行った後、キャッシュメモリ１３０に書き込む。また、リードＤＭＡ５５０は、同様の処理を、データＤ３２〜Ｄ３４についても行い、キャッシュメモリ１３０にデータＤ４を復旧させる。
【０１６０】
その後、リードＤＭＡ５５０は、フラッシュメモリ１４２からデータＤ５１を読み出しながら各種検査（ＣＲＣ検査等）を行った後、キャッシュメモリ１３０に書き込む。このとき、キャッシュメモリ１３０には、フラッシュメモリ１４１から読み出したデータＤ３４−２が書き込み済みであるので、リードＤＭＡ５５０は、データＤ５１を書き込む場合、データＤ３４−２の部分については上書きすることとなる。
【０１６１】
そして、リードＤＭＡ５５０は、フラッシュメモリ１４２からデータＤ５２〜Ｄ５４を順に読み出して、キャッシュメモリ１３０にデータＤ５を復旧させる。リードＤＭＡ５５０が、フラッシュメモリ１４１および１４２に記憶されているデータをすべてキャッシュメモリ１３０に書き込むと、キャッシュメモリ１３０にデータＤ３を復旧することができる。
【０１６２】
このように、実施例２に係るストレージ装置２は、２系統のライトＤＭＡ５４１および５４２のうち、一方のライトＤＭＡ５４１に対して、退避対象データのキャッシュメモリ１３０における先頭の記憶位置である先頭アドレスから所定の数のバウンダリデータについて、データ退避処理を行わせるとともに、他方のライトＤＭＡ５４２に対して、退避対象データのキャッシュメモリ１３０における最後の記憶位置である最終アドレスから、先頭アドレス方向に所定の数のバウンダリデータについて、データ退避処理を行わせるので、ＤＭＡ５４１および５４２が、フラッシュメモリ１４１または１４２に退避するデータを、バウンダリデータで割り切れることができ、その結果、バウンダリ処理を行うことなく、データ退避処理を行うことができる。
【０１６３】
次に、実施例２に係るストレージ装置２が有するＣＭ２００の構成について説明する。図１３は、実施例２に係るストレージ装置２が有するＣＭ２００の構成を示す図である。ここでは、図４に示した構成部位と同様の機能を有する部位には同一符号を付すこととして、その詳細な説明を省略する。
【０１６４】
同図に示した退避データ領域算出部２６１は、ストレージ装置２が異常終了した場合に、キャッシュメモリ１３０に記憶されている退避対象データのサイズ等に基づいて、まず、ライトＤＭＡ５４１が退避するデータの開始アドレスＢＡ１およびサイズＤＳ１を算出し、次に、ライトＤＭＡ５４２が退避するデータの開始アドレスＢＡ２およびサイズＤＳ２を算出する。
【０１６５】
以下に、図１２−１に示した例を用いつつ、退避データ領域算出部２６１による退避データ領域算出処理について、より具体的に説明する。まず、退避データ領域算出部２６１は、ストレージ装置２が異常終了した場合に、退避対象データのキャッシュメモリ１３０における記憶位置を示す先頭アドレスおよび最終アドレスを取得する。そして、退避データ領域算出部２６１は、取得した先頭アドレスを、ライトＤＭＡ５４１が退避するデータの開始アドレスＢＡ１に決定する。
【０１６６】
続いて、退避データ領域算出部２６１は、退避対象データのサイズを２で除算したサイズ「Ｘ］を求める。図１２−１に示した例では、退避対象データのサイズが２１０［ＫＢ］であるので、退避データ領域算出部２６１は、サイズＸとして、２１０［ＫＢ］を２で除算した１０５［ＫＢ］を求める。
【０１６７】
続いて、退避データ領域算出部２６１は、式（１）「２８［ＫＢ］  ×  Ｎ  ＞  サイズＸ［ＫＢ］」を満たす整数Ｎの最小値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４１が退避するデータのサイズＤＳ１に決定する。上記例では、サイズＸが１０５［ＫＢ］であり、式（１）を満たすＮの最小値は「４」となるので、退避データ領域算出部２６１は、４に２８［ＫＢ］を乗算した値である１１２［ＫＢ］を、ライトＤＭＡ５４１が退避するデータのサイズＤＳ１に決定する。
【０１６８】
続いて、退避データ領域算出部２６１は、退避対象データの先頭アドレスに、ライトＤＭＡ５４１が退避するデータサイズＤＳ１を加算した値「Ｙ」を求める。このＹは、ライトＤＭＡ５４１が退避するデータの最終アドレスに該当する。そして、退避データ領域算出部２６１は、退避対象データの最終アドレスからＹを減算した値「Ｚ」を求める。このＺは、退避対象データのサイズから、ライトＤＭＡ５４１が退避するデータのサイズＤＳ１を減算したサイズに該当する。
【０１６９】
すなわち、上記例では、退避対象データのサイズが２１０［ＫＢ］であり、サイズＤＳ１が１１２「ＫＢ」であるので、退避データ領域算出部２６１は、サイズＺとして、２１０［ＫＢ］から１１２［ＫＢ］を減算した９８［ＫＢ］を求める。
【０１７０】
続いて、退避データ領域算出部２６１は、式（２）「２８［ＫＢ］×Ｎ  ＞  サイズＺ［ＫＢ］」を満たす整数Ｎの最小値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４２が退避するデータのサイズＤＳ２に決定する。上記例では、サイズＺが９８［ＫＢ］であり、式（２）を満たすＮの最小値は「４」となるので、退避データ領域算出部２６１は、４に２８［ＫＢ］を乗算した値である１１２［ＫＢ］を、ライトＤＭＡ５４２が退避するデータのサイズＤＳ２に決定する。
【０１７１】
続いて、退避データ領域算出部２６１は、退避対象データの最終アドレスから、ライトＤＭＡ５４２が退避するデータのサイズＤＳ２を減算した値を、ライトＤＭＡ５４２が退避するデータの先頭アドレスＢＡ２に決定する。
【０１７２】
このようにして、退避データ領域算出部２６１は、ライトＤＭＡ５４１が退避するデータの開始アドレスＢＡ１およびサイズＤＳ１と、ライトＤＭＡ５４２が退避するデータの開始アドレスＢＡ２およびサイズＤＳ２を算出する。
【０１７３】
図１３に示した退避指示部２６２は、データ退避ディスクリプタを生成して、データ転送ＤＭＡ１５０に送信することで、ライトＤＭＡ５４１および５４２に対して、データ退避処理を行うように指示する。
【０１７４】
具体的には、退避指示部２６２は、上述した開始アドレスＢＡ１およびサイズＤＳ１を含むデータ退避ディスクリプタを生成して、かかるデータ退避ディスクリプタに基づいてデータ退避処理を行うようにライトＤＭＡ５４１に対して指示をする。また、退避指示部２６２は、上述した開始アドレスＢＡ２およびサイズＤＳ２を含むデータ退避ディスクリプタを生成して、かかるデータ退避ディスクリプタに基づいてデータ退避処理を行うようにライトＤＭＡ５４２に対して指示をする。なお、退避指示部２６２が生成するデータ退避ディスクリプタには、バウンダリ調整値のサイズを含まない。
【０１７５】
次に、図１３に示した退避データ領域算出部２６１による退避データ領域算出処理について説明する。図１４は、図１３に示した退避データ領域算出部２６１による退避データ領域算出処理手順を示すフローチャートである。
【０１７６】
図１４に示すように、退避データ領域算出部２６１は、退避対象データのキャッシュメモリ１３０における記憶位置を示す先頭アドレスおよび最終アドレスを取得する（ステップＳ５０１）。
【０１７７】
そして、退避データ領域算出部２６１は、取得した先頭アドレスを、ライトＤＭＡ５４１が退避するデータの開始アドレスに決定する（ステップＳ５０２）。続いて、退避データ領域算出部２６１は、退避対象データのサイズを２で除算したサイズＸを求める（ステップＳ５０３）。
【０１７８】
続いて、退避データ領域算出部２６１は、式（１）「２８［ＫＢ］  ×  Ｎ  ＞  サイズＸ［ＫＢ］」を満たす整数Ｎの最小値を求める（ステップＳ５０４）。以下では、ここで求めた最小値Ｎを「第一の基準値」と呼ぶこととする。そして、退避データ領域算出部２６１は、第一の基準値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４１が退避するデータのサイズに決定する（ステップＳ５０５）。
【０１７９】
続いて、退避データ領域算出部２６１は、退避対象データのサイズから、ライトＤＭＡ５４１が退避するデータのサイズを減算したサイズＺを求める（ステップＳ５０６）。続いて、退避データ領域算出部２６１は、式（２）「２８［ＫＢ］  ×  Ｎ  ＞  サイズＺ［ＫＢ］」を満たす整数Ｎの最小値を求める（ステップＳ５０７）。以下では、ここで求めた最小値Ｎを「第二の基準値」と呼ぶこととする。そして、退避データ領域算出部２６１は、第二の基準値に２８［ＫＢ］を乗算した値を、ライトＤＭＡ５４２が退避するデータのサイズに決定する（ステップＳ５０８）。
【０１８０】
続いて、退避データ領域算出部２６１は、退避対象データの最終アドレスから、ライトＤＭＡ５４２が退避するデータのサイズを減算した値を求め（ステップＳ５０９）、求めた値を、ライトＤＭＡ５４２が退避するデータの先頭アドレスに決定する（ステップＳ５１０）。
【０１８１】
上述してきたように、実施例２に係るストレージ装置２は、退避データ領域算出部２６１が、ライトＤＭＡ５４１および５４２が退避するデータの開始アドレスおよびサイズを求めるように構成したので、ＤＭＡ５４１および５４２は、フラッシュメモリ１４１または１４２に退避するデータを、バウンダリデータで割り切れることができ、その結果、フラッシュメモリ１４１または１４２からデータの読出応答がなされない場合であっても、バウンダリ処理を行うことなく、フラッシュメモリ１４１または１４２に退避させたデータを、キャッシュメモリ１３０に復旧させることができる。
【０１８２】
また、実施例２に係るストレージ装置２では、バウンダリ処理を行う必要がないので、退避データ領域算出部２６１がバウンダリ調整値のサイズを算出する必要がなくなる。その結果、退避データ領域算出部２６１にかかる処理負荷を軽減することができ、データ退避処理の高速化を図ることができる。すなわち、異常終了時に、電力供給部１２から電力供給される短い時間内に、大容量のデータについて、データ退避処理を行うことができる。
【０１８３】
また、実施例２に係るストレージ装置２では、バウンダリ処理を行う必要がないので、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０から、バウンダリ処理を行うための回路を削除することができ、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０の規模を小さくすることができる。例えば、実施例２に係るストレージ装置２では、図６に示したライトＤＭＡ５４１からバウンダリ調整部５４１ｂを削除することができ、図７に示したリードＤＭＡ５５０からバウンダリ調整部５５０ｌを削除することができる。その結果、ライトＤＭＡ５４１および５４２と、リードＤＭＡ５５０にかかるコストを軽減することができる。
【０１８４】
なお、上記実施例２では、ストレージ装置２が２系統のライトＤＭＡ５４１および５４２を有することを前提として、退避データ領域算出部２６１が、ライトＤＭＡ５４１および５４２が退避するデータの開始アドレスおよびサイズを算出する例を示したが、３系統以上のライトＤＭＡを有するストレージ装置においても、バウンダリ処理を行わないように、退避データ領域算出部２６１が、各ライトＤＭＡが退避するデータの開始アドレスおよびサイズを算出してもよい。例えば、ストレージ装置が４個のライトＤＭＡを有する場合、退避データ領域算出部２６１は、４個目のライトＤＭＡに対して、退避対象データの最終アドレスから、先頭アドレス方向に所定の数のバウンダリデータについて、データ退避処理を行わせるように、４個目のライトＤＭＡが退避するデータの開始アドレスおよびサイズを算出する。
【０１８５】
また、上記実施例１および２では、バウンダリサイズを２８［ＫＢ］とし、バウンダリデータを区切るサイズを２［ＫＢ］とし、エリア内のｐａｇｅの数を１０２４個とし、小エリア内のｐａｇｅの数を１６個とする例を示したが、これらの規定値は、上記例に限られない。例えば、バウンダリサイズを５６［ＫＢ］とし、バウンダリデータを区切るサイズを４［ＫＢ］とし、エリア内のｐａｇｅの数を２０４８個とし、小エリア内のｐａｇｅの数を３２個としてもよい。
【０１８６】
また、上記実施例１および２では、異常終了時にデータを退避する記憶領域として、ＯｎｅＮＡＮＤ型のフラッシュメモリを用いる例を示したが、異常終了時にデータを退避する記憶領域は、ＯｎｅＮＡＮＤ型のフラッシュメモリ以外の不揮発性メモリであってもよい。
【０１８７】
また、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散、統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散、統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵ（Central  Processing  Unit）および当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【符号の説明】
【０１８８】
１、２            ストレージ装置
１０              ＣＥ
１１              ＨＤＤ
１２              電力供給部
２０              ＤＥ
１００、２００    ＣＭ
１１０            Ｉ／Ｆ部
１２０、２２０    エクスパンダ
１３０            キャッシュメモリ
１４１、１４２    フラッシュメモリ
１５０            データ転送ＤＭＡ
１６０、２６０    ＲｏＣ
１６１、２６１    退避データ領域算出部
１６２、２６２    退避指示部
１６３            復旧指示部
５１０            ＰＣＩバスＩ／Ｆ
５２１、５２２    メモリＩ／Ｆ
５３０            ディスクリプタ保持レジスタ
５４１、５４２    ライトＤＭＡ
５４１ａ          データ読出部
５４１ｂ          バウンダリ調整部
５４１ｃ          パリティ生成部
５４１ｄ          退避データバッファ
５４１ｅ          パリティバッファ
５４１ｆ          データ書込部
５４１ｇ          ＣＲＣ付与部
５４１ｈ          ＡＩＤ付与部
５５０            リードＤＭＡ
５５０ａ          セレクタ
５５０ｂ          データ読出部
５５０ｃ          タイムアウト検出部
５５０ｄ          エラー検出部
５５０ｅ          復旧データバッファ
５５０ｆ          ＸＯＲ演算部
５５０ｇ          ＣＲＣ検査部
５５０ｈ          ＡＩＤ検査部
５５０ｉ          訂正データバッファ
５５０ｊ          ログ保持レジスタ
５５０ｋ          セレクタ
５５０ｌ          バウンダリ調整部
５５０ｍ          データ書込部
５６１、５６２    イレースＤＭＡ
【国際調査報告】
2009107213.tif 000021
2009107213.tif 000022