(57)【要約】【課題】一つのデータ単位における読み出せなくなった二以上のデータ要素をリストアすることと、消費記憶容量を節約することとの両方を可能にする。【解決手段】複数のデータ単位を基にそれぞれ生成した複数の第一の冗長コードを基に、一つのコード（圧縮冗長コード）を生成し、その圧縮冗長コードを不揮発性の記憶領域に書込む。その圧縮冗長コードを利用して、一部障害記憶装置が有する読出し不可能なサブ記憶領域に記憶されている、多重障害データを構成するデータ要素又は多重障害データに対応する第一の冗長コードをリストアし、リストアされたデータ要素又は第一の冗長コードと、多重障害データを構成する他のデータ要素又は多重障害データに対応する第一の冗長コードとを基に、完全障害記憶装置が有するサブ記憶領域に記憶されている、多重障害データを構成するデータ要素をリストアする。【選択図】図１１
2009098996.tif 000002
【特許請求の範囲】
【請求項１】
複数の記憶装置で構成されたストレージグループと、
ライト対象のデータを所定サイズのデータであるデータ単位に分割して前記ストレージグループに書込む書込み制御部と、
前記ストレージグループに記憶されているデータ単位を構成するデータ要素をリストアするリストア制御部と
を備え、
前記ストレージグループの記憶領域であるグループ記憶領域が、複数のサブ記憶領域列で構成されており、
各サブ記憶領域列は、前記複数の記憶装置に跨り、前記複数の記憶装置に対応する複数のサブ記憶領域で構成され、
前記データ単位のサイズは、一つのサブ記憶領域列のサイズよりも小さく、
前記書込み制御部が、
（Ｗ１）データ単位を構成する複数のデータ要素を、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
（Ｗ２）複数のデータ単位を基にそれぞれ生成した複数の第一の冗長コードを基に、前記複数の第一の冗長コードのトータルサイズよりも小さいサイズの一つのコードである圧縮冗長コードを生成し、
（Ｗ３）前記生成された圧縮冗長コードを、不揮発性の記憶領域に書込み、
前記ストレージグループに、読出し不可能な第一及び第二のデータ要素を含んだデータ単位である多重障害データが存在する場合、前記リストア制御部が、
（Ｒ１）前記圧縮冗長コードを前記不揮発性の記憶領域から読出し、前記圧縮冗長コードを利用して、前記多重障害データを構成する前記第一のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアし、
（Ｒ２）前記リストアされたデータ要素又は第一の冗長コードと、前記多重障害データを構成する他のデータ要素又は前記多重障害データに対応する第一の冗長コードとを基に、前記多重障害データを構成する前記第二のデータ要素をリストアする、
ストレージシステム。
【請求項２】
前記書込み制御部が、
前記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第一の冗長コードを生成し、前記複数のデータ要素及び第一の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
前記（Ｗ２）として、各記憶装置について、ストレージシステムを構成する複数のサブ記憶領域に書き込まれる二以上のデータ要素及び二以上の第一の冗長コードを基に、前記圧縮冗長コードを生成し、
前記リストア制御部が、
前記（Ｒ１）として、前記第一のデータ要素を記憶したサブ記憶領域に対応した第一の記憶装置に対応した前記圧縮冗長コードを読出し、前記第一の記憶装置を構成する前記複数のサブ記憶領域のうちの所定範囲の読出し可能なサブ記憶領域から、データ要素及び第一の冗長コードを読出し、読み出された圧縮冗長コード、データ要素及び第一の冗長コードを基に、前記多重障害データを構成する前記第一のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアし、
前記（Ｒ２）として、前記リストアされたデータ要素又は第一の冗長コードと、前記多重障害データを構成する他のデータ要素又は前記多重障害データに対応する第一の冗長コードとを基に、前記多重障害データを構成する前記第二のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアする、
請求項１記載のストレージシステム。
【請求項３】
各記憶装置に対応した各圧縮冗長コードを記憶するキャッシュメモリを更に備え、
前記書込み制御部が、前記（Ｗ１）を行う都度に、前記（Ｗ２）において、前記キャッシュメモリに記憶されている各圧縮冗長コードを更新し、圧縮冗長コードが複数回更新された後に、前記（Ｗ３）において、前記キャッシュメモリに記憶されている更新後の圧縮冗長コードを、前記不揮発性の記憶領域に書込む、
請求項２記載のストレージシステム。
【請求項４】
前記書込み制御部が、
前記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第二の冗長コードを生成し、前記複数のデータ要素及び第二の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
前記（Ｗ２）として、前記ストレージグループに書き込まれた複数のデータ単位毎に、複数のデータ単位にそれぞれ対応した複数の第一の冗長コードを生成しそれら複数の第一の冗長コードを基に前記圧縮冗長コードを生成し、
前記（Ｗ３）として、前記ストレージグループに書き込まれた複数のデータ単位毎に対応した各圧縮冗長コードを、前記不揮発性の記憶領域に書込み、
前記リストア制御部が、
（Ｒ３）前記多重障害データではないデータ単位である一重障害データを構成するデータ要素を、前記一重障害データを構成する他のデータ要素及び前記一重障害データに対応する第二の冗長コードを基にリストアし、
前記（Ｒ１）として、前記リストアされたデータ要素を有する前記一重障害データを基に第一の冗長コードを生成し、前記一重障害データが一つのメンバである複数のデータ単位に対応した前記圧縮冗長コードを読出し、前記一重障害データに対応した第一の冗長コードと、前記読み出した圧縮冗長コードとを基に、前記多重障害データに対応する第一の冗長コードをリストアし、
前記（Ｒ２）として、前記多重障害データを構成する前記第一及び第二のデータ要素を、前記多重障害データに対応した前記リストアされた第一の冗長コードと、前記多重障害データに対応する第二の冗長コードと、前記多重障害データを構成する他のデータ要素とに基づいてリストアする、
請求項１乃至３のうちのいずれか１項に記載のストレージシステム。
【請求項５】
一つの前記圧縮冗長コードに対応した複数のデータ単位について、データ単位が記憶される複数のサブ記憶領域である第一のサブ記憶領域群と、次のデータ単位が記憶される複数のサブ記憶領域である第二のサブ記憶領域群との間には、少なくとも一つの別の圧縮冗長コードに対応した複数のデータ単位におけるデータ単位が記憶される少なくとも一つの別のサブ記憶領域群がある、
請求項４記載のストレージシステム。
【請求項６】
前記第一のサブ記憶領域群と前記第二のサブ記憶領域群との間に存在する別のサブ記憶領域群の数は、前記ストレージグループを構成する各記憶装置が有する記憶メディアに基づく数である、
請求項５記載のストレージシステム。
【請求項７】
前記圧縮冗長コードは、前記圧縮冗長コードに対応する各データ単位に対応する各第二の冗長コードが記憶される記憶装置とは異なる記憶装置の特定のサブ記憶領域に書き込まれる、
請求項４乃至６のうちのいずれか１項に記載のストレージシステム。
【請求項８】
一つのサブ記憶領域列が、一つのデータ単位と一つの第二の冗長コードとのトータルサイズよりも大きなサイズである、
請求項７記載のストレージシステム。
【請求項９】
複数の記憶装置で構成されたストレージグループを制御するコントローラであって、
ライト対象のデータを所定サイズのデータであるデータ単位に分割して前記ストレージグループに書込む書込み制御部と、
前記ストレージグループに記憶されているデータ単位を構成するデータ要素をリストアするリストア制御部と
を備え、
前記ストレージグループの記憶領域であるグループ記憶領域が、複数のサブ記憶領域列で構成されており、
各サブ記憶領域列は、前記複数の記憶装置に跨り、前記複数の記憶装置に対応する複数のサブ記憶領域で構成され、
前記データ単位のサイズは、一つのサブ記憶領域列のサイズよりも小さく、
前記書込み制御部が、
（Ｗ１）データ単位を構成する複数のデータ要素を、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
（Ｗ２）複数のデータ単位を基にそれぞれ生成した複数の第一の冗長コードを基に、前記複数の第一の冗長コードのトータルサイズよりも小さいサイズの一つのコードである圧縮冗長コードを生成し、
（Ｗ３）前記生成された圧縮冗長コードを、不揮発性の記憶領域に書込み、
前記ストレージグループに、読出し不可能な第一及び第二のデータ要素を含んだデータ単位である多重障害データが存在する場合、前記リストア制御部が、
（Ｒ１）前記圧縮冗長コードを読出し、前記圧縮冗長コードを利用して、前記多重障害データを構成する前記第一のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアし、
（Ｒ２）前記リストアされたデータ要素又は第一の冗長コードと、前記多重障害データを構成する他のデータ要素又は前記多重障害データに対応する第一の冗長コードとを基に、前記多重障害データを構成する前記第二のデータ要素をリストアする、
コントローラ。
【請求項１０】
前記書込み制御部が、
前記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第一の冗長コードを生成し、前記複数のデータ要素及び第一の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
前記（Ｗ２）として、各記憶装置について、ストレージシステムを構成する複数のサブ記憶領域に書き込まれる二以上のデータ要素及び二以上の第一の冗長コードを基に、前記圧縮冗長コードを生成し、
前記リストア制御部が、
前記（Ｒ１）として、前記第一のデータ要素を記憶したサブ記憶領域に対応した第一の記憶装置に対応した前記圧縮冗長コードを読出し、前記第一の記憶装置を構成する前記複数のサブ記憶領域のうちの所定範囲の読出し可能なサブ記憶領域から、データ要素及び第一の冗長コードを読出し、読み出された圧縮冗長コード、データ要素及び第一の冗長コードを基に、前記多重障害データを構成する前記第一のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアし、
前記（Ｒ２）として、前記リストアされたデータ要素又は第一の冗長コードと、前記多重障害データを構成する他のデータ要素又は前記多重障害データに対応する第一の冗長コードとを基に、前記多重障害データを構成する前記第二のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアする、
請求項９記載のコントローラ。
【請求項１１】
前記書込み制御部が、
前記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第二の冗長コードを生成し、前記複数のデータ要素及び第二の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
前記（Ｗ２）として、前記ストレージグループに書き込まれた複数のデータ単位毎に、複数のデータ単位にそれぞれ対応した複数の第一の冗長コードを生成しそれら複数の第一の冗長コードを基に前記圧縮冗長コードを生成し、
前記（Ｗ３）として、前記ストレージグループに書き込まれた複数のデータ単位毎に対応した各圧縮冗長コードを、前記不揮発性の記憶領域に書込み、
前記リストア制御部が、
（Ｒ３）前記多重障害データではないデータ単位である一重障害データを構成するデータ要素を、前記一重障害データを構成する他のデータ要素及び前記一重障害データに対応する第二の冗長コードを基にリストアし、
前記（Ｒ１）として、前記リストアされたデータ要素を有する前記一重障害データを基に第一の冗長コードを生成し、前記一重障害データが一つのメンバである複数のデータ単位に対応した前記圧縮冗長コードを読出し、前記一重障害データに対応した第一の冗長コードと、前記読み出した圧縮冗長コードとを基に、前記多重障害データに対応する第一の冗長コードをリストアし、
前記（Ｒ２）として、前記多重障害データを構成する前記第一及び第二のデータ要素を、前記多重障害データに対応した前記リストアされた第一の冗長コードと、前記多重障害データに対応する第二の冗長コードと、前記多重障害データを構成する他のデータ要素とに基づいてリストアする、
請求項９又は１０記載のコントローラ。
【請求項１２】
複数の記憶装置で構成されたストレージグループに対する入出力を制御する方法であって、前記ストレージグループの記憶領域であるグループ記憶領域が、複数のサブ記憶領域列で構成されており、各サブ記憶領域列は、前記複数の記憶装置に跨り、前記複数の記憶装置に対応する複数のサブ記憶領域で構成されており、
（Ｗ１）一つのサブ記憶領域列のサイズよりも小さいデータ単位を構成する複数のデータ要素を、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
（Ｗ２）複数のデータ単位を基にそれぞれ生成した複数の第一の冗長コードを基に、前記複数の第一の冗長コードのトータルサイズよりも小さいサイズの一つのコードである圧縮冗長コードを生成し、
（Ｗ３）前記生成された圧縮冗長コードを、不揮発性の記憶領域に書込み、
前記ストレージグループに、読出し不可能な第一及び第二のデータ要素を含んだデータ単位である多重障害データが存在する場合、
（Ｒ１）前記圧縮冗長コードを読出し、前記圧縮冗長コードを利用して、前記多重障害データを構成する前記第一のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアし、
（Ｒ２）前記リストアされたデータ要素又は第一の冗長コードと、前記多重障害データを構成する他のデータ要素又は前記多重障害データに対応する第一の冗長コードとを基に、前記多重障害データを構成する前記第二のデータ要素をリストアする、
方法。
【請求項１３】
前記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第一の冗長コードを生成し、前記複数のデータ要素及び第一の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
前記（Ｗ２）として、各記憶装置について、ストレージシステムを構成する複数のサブ記憶領域に書き込まれる二以上のデータ要素及び二以上の第一の冗長コードを基に、前記圧縮冗長コードを生成し、
前記（Ｒ１）として、前記第一のデータ要素を記憶したサブ記憶領域に対応した第一の記憶装置を構成する前記複数のサブ記憶領域のうちの所定範囲の読出し可能なサブ記憶領域から、データ要素及び第一の冗長コードを読出し、読み出された圧縮冗長コード、データ要素及び第一の冗長コードを基に、前記多重障害データを構成する前記第一のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアし、
前記（Ｒ２）として、前記リストアされたデータ要素又は第一の冗長コードと、前記多重障害データを構成する他のデータ要素又は前記多重障害データに対応する第一の冗長コードとを基に、前記多重障害データを構成する前記第二のデータ要素又は前記多重障害データに対応する第一の冗長コードをリストアする、
請求項１２記載の方法。
【請求項１４】
前記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第二の冗長コードを生成し、前記複数のデータ要素及び第二の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
前記（Ｗ２）として、前記ストレージグループに書き込まれた複数のデータ単位毎に、複数のデータ単位にそれぞれ対応した複数の第一の冗長コードを生成しそれら複数の第一の冗長コードを基に前記圧縮冗長コードを生成し、
前記（Ｗ３）として、前記ストレージグループに書き込まれた複数のデータ単位毎に対応した各圧縮冗長コードを、前記不揮発性の記憶領域に書込み、
（Ｒ３）前記多重障害データではないデータ単位である一重障害データを構成するデータ要素を、前記一重障害データを構成する他のデータ要素及び前記一重障害データに対応する第二の冗長コードを基にリストアし、
前記（Ｒ１）として、前記リストアされたデータ要素を有する前記一重障害データを基に第一の冗長コードを生成し、前記一重障害データが一つのメンバである複数のデータ単位に対応した前記圧縮冗長コードを読出し、前記一重障害データに対応した第一の冗長コードと、前記読み出した圧縮冗長コードとを基に、前記多重障害データに対応する第一の冗長コードをリストアし、
前記（Ｒ２）として、前記多重障害データを構成する前記第一及び第二のデータ要素を、前記多重障害データに対応した前記リストアされた第一の冗長コードと、前記多重障害データに対応する第二の冗長コードと、前記多重障害データを構成する他のデータ要素とに基づいてリストアする、
請求項１２又は１３記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステムに関し、特に、データ要素のリストアに関する。
【背景技術】
【０００２】
一般に、ＲＡＩＤ（Redundant Arrays of Independent （or Inexpensive） Disks）と呼ばれる技術が採用されているストレージシステムには、複数の記憶装置で構成されたＲＡＩＤグループが備えられている。ＲＡＩＤグループの記憶領域は、複数のサブ記憶領域列で構成されている。各サブ記憶領域列は、ＲＡＩＤグループを構成する複数の記憶装置に跨っており、複数の記憶装置に対応した複数のサブ記憶領域で構成されている。以下、一つのサブ記憶領域を、「ストライプ」と呼び、複数のストライプで構成された一列を、「ストライプ列」と呼ぶ。連続したストライプ列によって、ＲＡＩＤグループの記憶領域が構成されている。
【０００３】
ＲＡＩＤには、いくつかのレベル（以下、「ＲＡＩＤレベル）という）があることが知られている。
【０００４】
例えば、ＲＡＩＤ５がある。ＲＡＩＤ５では、データが、ＲＡＩＤ５に対応したＲＡＩＤグループを構成する複数の記憶装置（例えば、ハードディスクドライブ（ＨＤＤ））に分散して書き込まれる。具体的には、例えば、ＲＡＩＤ５に対応したホストコンピュータから指定されたライト対象のデータは、所定サイズのデータ（以下、便宜上「データ単位」と言う）に分割されて、各データ単位が、複数のデータ要素に分割され、複数のデータ要素が、複数のストライプに書き込まれる。また、ＲＡＩＤ５では、記憶装置に障害が発生したことによりその記憶装置から読み出せなくなったデータ要素をリストアするために、一つのデータ単位につき、“パリティ”と呼ばれる冗長な情報（以下、「冗長コード」）が生成され、その冗長コードも、ストライプに書き込まれる。具体的には、例えば、ＲＡＩＤグループを構成する記憶装置の数が４である場合は、そのうちの３つの記憶装置に対応する３つのストライプに、データ単位を構成する３つのデータ要素が書き込まれ、残りの一つの記憶装置に対応するストライプに、冗長コードが書き込まれる。もし、ＲＡＩＤグループを構成する４つの記憶装置のうちの一つの記憶装置に障害が発生した場合、読み出せなくなったデータ要素は、その読み出せなくなったデータ要素を含んだデータ単位を構成する残りの二つのデータ要素と、そのデータ単位に対応した冗長コードとを用いてリストアされる。
【０００５】
ＲＡＩＤ５の問題点としては、いわゆる二重障害に耐えられない点である。具体的には、ＲＡＩＤグループを構成する複数の記憶装置のうちの二つの記憶装置に障害が発生した等の理由により、データ単位を構成する複数のデータ要素のうちの二つのデータ要素を読み出すことができない場合は、それら二つのデータ要素をリストアすることはできない。なぜなら、データ単位ごとに生成される冗長コードの数は、１であるからである。
【０００６】
このような二重障害に耐えられるＲＡＩＤレベルとして、ＲＡＩＤ６がある。ＲＡＩＤ６では、一つのストライプ列ごとに二つの（２種類の）冗長コードが生成される（非特許文献１）。
【０００７】
【非特許文献１】Intelligent RAID6 Theory Overview and Implementation ((http://www.intel.com/design/storage/papers/308122.htm,http://www.intel.com/design/storage/intelligent_raid.htm)
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、ＲＡＩＤ６には、二重障害に耐えられるというメリットがある一方で、一つのデータ単位につきＲＡＩＤ５よりも多くの記憶容量が必要になってしまうというデメリットがある。なぜなら、一つのデータ単位につきＲＡＩＤ５よりも多くの冗長コードが書き込まれるためである。
【０００９】
そこで、本発明の目的は、一つのデータ単位における読み出せなくなった二以上のデータ要素をリストアすることと、消費記憶容量を節約することとの両方を可能にすることにある。
【課題を解決するための手段】
【００１０】
複数のデータ単位を基にそれぞれ生成した複数の第一の冗長コードを基に、それら複数の第一の冗長コードのトータルサイズよりも小さいサイズの一つのコードである圧縮冗長コードを生成し、その圧縮冗長コードを不揮発性の記憶領域に書込む。その圧縮冗長コードを利用して、多重障害データを構成する第一のデータ要素又は多重障害データに対応する第一の冗長コードをリストアし、リストアされた第一のデータ要素又は第一の冗長コードと、多重障害データを構成する他のデータ要素又は多重障害データに対応する第一の冗長コードとを基に、多重障害データを構成する第二のデータ要素をリストアする。
【発明を実施するための最良の形態】
【００１１】
実施形態１では、ストレージシステムが、複数の記憶装置で構成されたストレージグループと、ライト対象のデータを所定サイズのデータであるデータ単位に分割してストレージグループに書込む書込み制御部と、ストレージグループに記憶されているデータ単位を構成するデータ要素をリストアするリストア制御部とを備える。書込み制御部とリストア制御部は、例えば、ストレージシステムのコントローラに備えられる。ストレージグループの記憶領域であるグループ記憶領域が、複数のサブ記憶領域列（例えばストライプ列）で構成されている。各サブ記憶領域列は、複数の記憶装置に跨り、複数の記憶装置に対応する複数のサブ記憶領域（例えばストライプで構成されている。一つのサブ記憶領域列におけるサブ記憶領域と、記憶装置とが、例えば１対１で対応している。データ単位のサイズは、一つのサブ記憶領域列のサイズよりも小さい。
【００１２】
書込み制御部が、
（Ｗ１）データ単位を構成する複数のデータ要素を、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
（Ｗ２）複数のデータ単位を基にそれぞれ生成した複数の第一の冗長コードを基に、前記複数の第一の冗長コードのトータルサイズよりも小さいサイズの一つのコードである圧縮冗長コードを生成し、
（Ｗ３）前記生成された圧縮冗長コードを、不揮発性の記憶領域（例えば、不揮発性のメモリ、或いは、複数のサブ記憶領域列のうちのデータ要素が書き込まれるサブ記憶領域列以外の特定のサブ記憶領域列を構成する特定のサブ記憶領域）に書込む。
【００１３】
どのサブ記憶領域からもデータ要素を読み出すことのできない一つの記憶装置である完全障害記憶装置と、データ要素を読み出せるサブ記憶領域と読み出せないサブ記憶領域の両方を有する別の一つの記憶装置である一部障害記憶装置とが一つのストレージグループに存在するが故に、そのストレージグループに、読出し不可能な少なくとも二つのデータ要素を含んだデータ単位である多重障害データが存在する場合、リストア制御部が、
（Ｒ１）圧縮冗長コードを不揮発性の記憶領域（例えば上記特定のサブ記憶領域）から読出し、前記圧縮冗長コードを利用して、一部障害記憶装置が有する読出し不可能なサブ記憶領域に記憶されている、多重障害データを構成するデータ要素又は多重障害データに対応する第一の冗長コードをリストアし、
（Ｒ２）リストアされたデータ要素又は第一の冗長コードと、多重障害データを構成する他のデータ要素又は多重障害データに対応する第一の冗長コードとを基に、完全障害記憶装置が有するサブ記憶領域に記憶されている、多重障害データを構成するデータ要素をリストアする。
【００１４】
上述した記憶装置は、例えば、ハードディスクドライブ、フラッシュメモリドライブなど種々の記憶メディアのドライブとすることができる。
【００１５】
実施形態２では、実施形態１において、書込み制御部が、
上記（Ｗ１）として、前記データ単位を構成する複数のデータ要素を基に第一の冗長コードを生成し、前記複数のデータ要素及び第一の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
上記（Ｗ２）として、各記憶装置について、ストレージシステムを構成する複数のサブ記憶領域に書き込まれる二以上のデータ要素及び二以上の第一の冗長コードを基に、前記圧縮冗長コードを生成する。上記（Ｗ３）として、書込み制御部は、各記憶装置が有する各特定のサブ記憶領域に、各圧縮冗長コードを書込んでもよい。
【００１６】
この実施形態２では、リストア制御部が、
上記（Ｒ１）として、一部障害記憶装置に対応する圧縮冗長コードを読出し（例えば、一部障害記憶装置の特定のサブ記憶領域から圧縮冗長コードを読出し）、一部障害記憶装置を構成する複数のサブ記憶領域のうちの所定範囲の読出し可能なサブ記憶領域から、データ要素及び第一の冗長コードを読出し、読み出された圧縮冗長コード、データ要素及び第一の冗長コードを基に、読出し不可能なサブ記憶領域に記憶されている、多重障害データを構成するデータ要素又は多重障害データに対応する第一の冗長コードをリストアし、
上記（Ｒ２）として、リストアされたデータ要素又は第一の冗長コードと、多重障害データを構成する他のデータ要素又は多重障害データに対応する第一の冗長コードとを基に、完全障害記憶装置が有するサブ記憶領域に記憶されている、多重障害データを構成するデータ要素又は多重障害データに対応する第一の冗長コードをリストアする。
【００１７】
実施形態３では、ストレージシステムが、各記憶装置に対応した各圧縮冗長コードを記憶するキャッシュメモリを更に備える。書込み制御部が、上記（Ｗ１）を行う都度に、上記（Ｗ２）において、キャッシュメモリに記憶されている各圧縮冗長コードを更新し、圧縮冗長コードが複数回更新された後に、上記（Ｗ３）において、キャッシュメモリに記憶されている更新後の圧縮冗長コードを、不揮発性の記憶領域（例えば、更新後の圧縮冗長コードに対応した記憶装置が有する特定のサブ記憶領域）に書込む。
【００１８】
実施形態４では、実施形態１乃至３のうちのいずれかにおいて、書込み制御部が、
上記（Ｗ１）として、データ単位を構成する複数のデータ要素を基に第二の冗長コードを生成し、複数のデータ要素及び第二の冗長コードを、異なる記憶装置に対応した異なるサブ記憶領域にそれぞれ書込み、
上記（Ｗ２）として、ストレージグループに書き込まれた複数のデータ単位毎に、複数のデータ単位にそれぞれ対応した複数の第一の冗長コードを生成しそれら複数の第一の冗長コードを基に圧縮冗長コードを生成し、
上記（Ｗ３）として、ストレージグループに書き込まれた複数のデータ単位毎に対応した各圧縮冗長コードを、不揮発性の記憶領域（例えば各特定のサブ記憶領域）に書込む。
【００１９】
この実施形態４では、リストア制御部が、
（Ｒ３）完全障害記憶装置が有するサブ記憶領域に記憶されている、多重障害データではないデータ単位である一重障害データを構成するデータ要素を、一重障害データを構成する他のデータ要素及び一重障害データに対応する第二の冗長コードを基にリストアし、
上記（Ｒ１）として、リストアされたデータ要素を有する一重障害データを基に第一の冗長コードを生成し、一重障害データが一つのメンバである複数のデータ単位に対応した圧縮冗長コードを読出し、一重障害データに対応した第一の冗長コードと、読み出した圧縮冗長コードとを基に、一部障害記憶装置が有する読出し不可能なサブ記憶領域に記憶されているデータ要素を含んだ多重障害データに対応する第一の冗長コードをリストアし、
上記（Ｒ２）として、完全障害記憶装置が有するサブ記憶領域と一部障害記憶装置が有する読出し不可能なサブ記憶領域にそれぞれ記憶されている、多重障害データを構成するデータ要素を、多重障害データに対応した上記リストアされた第一の冗長コードと、多重障害データに対応する第二の冗長コードと、多重障害データを構成する他のデータ要素とに基づいてリストアする。
【００２０】
実施形態５では、実施形態４において、一つの圧縮冗長コードに対応した複数のデータ単位について、データ単位が記憶される複数のサブ記憶領域である第一のサブ記憶領域群と次のデータ単位が記憶される複数のサブ記憶領域である第二のサブ記憶領域群との間には、少なくとも一つの別の圧縮冗長コードに対応した複数のデータ単位におけるデータ単位が記憶される少なくとも一つの別のサブ記憶領域群がある。
【００２１】
実施形態６では、実施形態５において、第一のサブ記憶領域群と第二のサブ記憶領域群との間に存在する別のサブ記憶領域群の数は、ストレージグループを構成する各記憶装置が有する記憶メディアに基づく数である。
【００２２】
実施形態７では、実施形態４乃至６のうちのいずれかにおいて、圧縮冗長コードは、圧縮冗長コードに対応する各データ単位に対応する各第二の冗長コードが記憶される記憶装置とは異なる記憶装置の特定のサブ記憶領域に書き込まれる。
【００２３】
実施形態８では、実施形態７において、一つのサブ記憶領域列が、一つのデータ単位と一つの第二の冗長コードとのトータルサイズよりも大きなサイズである。
【００２４】
上述した実施形態１乃至８のうちの任意の二以上の実施形態を組み合わせることが可能である。上述した書込み制御部及びリストア制御部のうちの少なくとも一つは、ハードウェア（例えば回路）、コンピュータプログラム又はそれらの組み合わせ（例えば一部をコンピュータプログラムにより実現し残りをハードウェアで実現すること）により構築することができる。コンピュータプログラムは、所定のプロセッサに読み込まれて実行される。また、コンピュータプログラムがプロセッサに読み込まれて行われる情報処理の際、適宜に、メモリ等のハードウェア資源上に存在する記憶域が使用されてもよい。また、コンピュータプログラムは、ＣＤ−ＲＯＭ等の記録媒体から計算機にインストールされてもよいし、通信ネットワークを介して計算機にダウンロードされてもよい。
【００２５】
以下、図面を参照しながら本発明の一実施形態について詳細に説明する。なお、以下の説明では、冗長コードを生成するために必要となる所定サイズの各データを「データ単位」と言い、データ単位の構成要素であり一ストライプに記憶されるデータを「データ要素」と言う。また、以下の説明では、ストレージグループを「ＲＡＩＤグループ」と呼び、ＲＡＩＤグループを構成する各記憶装置が、ＨＤＤ（ハードディスクドライブ）であるとする。
【００２６】
図１は、本発明の一実施形態に係るストレージシステム１の物理的な構成を示す図である。
【００２７】
一以上のホスト計算機（以下、ホスト）４とストレージシステム１とが、ＦＣ（Fibre Channel）スイッチ５を介して接続される。同図では、ホスト４とストレージシステム１とが、一つのＦＣスイッチ５を介して接続されているが、複数のＦＣスイッチ５を介して接続されてもよい。尚、一以上のＦＣスイッチ５により、ＳＡＮ（Storage Area Network）が構築される。ＦＣスイッチ５とホスト４間、及び、ＦＣスイッチ５とストレージシステム１のホストアダプタ１１間は、それぞれファイバチャネルケーブルにより接続される。ホスト４は、ＦＣチャネル５を経由して、ストレージシステム１に対してデータのＩ／Ｏ要求（例えば、リード要求やライト要求）を送信することができる。
【００２８】
ストレージシステム１は、例えば、アレイ状に配列された多数のＨＤＤ１６を備えるＲＡＩＤシステムとすることができる。ストレージシステム１は、そのコントローラとして、例えば、ＣHＡ（チャネルアダプタ）１１と、ＤＫＡ（ディスクアダプタ）１３と、キャッシュ／制御メモリ１４と、内部スイッチ１５とを備える。ストレージシステム１のコントローラによって、ＨＤＤ１６へのアクセスが制御される。尚、例えば、ＣＨＡ１１やＤＫＡ１３や内部スイッチ１５の機能がＦＣスイッチ５に搭載され、ＦＣスイッチ５と複数のＨＤＤ１６の組み合わせによりストレージシステム１が実現されてもよい。
【００２９】
ＣＨＡ１１は、外部の装置（例えば、ホスト或いは他のストレージシステム）と通信可能に接続される一又は複数のＩ／Ｆ（例えば、通信ポート或いは通信ポートを備えた通信制御回路）１１３を有し、外部の装置との間のデータ通信を行うものである。ＣＨＡ１２は、ＣＰＵ１１１やメモリ１１２等を備えたマイクロコンピュータシステム（例えば、回路基盤）として構成されている。ＣＨＡ１１は、例えば、ホスト４からのライト要求があった場合、ライト対象のデータをキャッシュ／制御メモリ１４のキャッシュ領域に書込む。また、ＣＨＡ１１は、ホスト４からのリード要求があった場合、ＤＫＡ１３がＨＤＤ１６から読み出してキャッシュ／制御メモリ１４のキャッシュ領域に書き込んだリード対象のデータをホスト４に送信する。
【００３０】
ＤＫＡ１３は、各ＨＤＤ１６と通信可能に接続される一又は複数のドライブＩ／Ｆ（例えば、通信ポート或いは通信ポートを備えた通信制御回路）１３３を有し、ＨＤＤ１６との間のデータ通信を行うものである。ＤＫＡ１３は、ＣＰＵ１３１やメモリ１３２等を備えたマイクロコンピュータシステム（例えば、回路基盤）として構成されている。ＤＫＡ１３は、例えば、ＣＨＡ１１からキャッシュ／制御メモリ１４のキャッシュ領域に書かれたライト対象のデータをＨＤＤ１６に書込んだり、ＨＤＤ１６から読み出したリード対象のデータをキャッシュ領域に書込んだりする。
【００３１】
また、ＤＫＡ１３は、ＨＤＤに障害が発生した際にその障害により読み出せなくなったデータ要素をリストアするための冗長コード（以下、パリティ）を生成するパリティ生成部１３４を備える。本実施形態では、パリティ生成部１３４は、パリティを生成するためのハードウェア回路であるが、コンピュータプログラムに組み込まれた機能であっても良い。パリティ生成部１３４は、例えば、データ単位を構成する複数のデータ要素の排他的論理和をとることによって（或いは、データ単位を構成する複数のデータ要素に所定の係数を掛けた後でそれぞれのデータの排他的論理和をとることによって）、パリティを生成する。また、パリティ生成部１３４は、複数のパリティを基づく一つのパリティ（以下、「圧縮パリティ」と呼ぶ）を生成する。本実施形態では、第一と第二のデータ保護方式があるが、どのデータ保護方式であるかによって、圧縮パリティの生成の仕方も異なる。第一のデータ保護方式では、ＨＤＤごとに、一つの圧縮パリティが生成される。具体的には、ＨＤＤごとに、ＨＤＤを構成する複数のストライプに記憶されている複数のデータ要素及び複数の第一のパリティ（以下、Ｐパリティ）を基に、一つの圧縮パリティが生成される。第二のデータ保護方式では、複数のデータ単位に対応した複数のＰパリティを基に一つの圧縮パリティが生成される。つまり、第一の実施形態では、圧縮パリティは、二以上のＰパリティのみならずデータ単位を構成するデータ要素にも基づいて生成され、第二の実施形態では、複数のＰパリティのみに基づいて生成される。
【００３２】
キャッシュ／制御メモリ１４は、例えば、揮発性又は不揮発性のメモリである。キャッシュ／制御メモリ１４は、キャッシュ領域と制御領域とを有したメモリである。キャッシュ／制御メモリ１４は、キャッシュ領域を有したメモリと制御領域を有したメモリとの二つのメモリから構成されてもよい。キャッシュ領域には、外部の装置（ホスト４等）から受信したデータや、ＨＤＤ１６から読み出されたデータが一時的に格納される。制御領域には、ストレージシステム１の制御に関する情報（以下、制御情報）が格納される。制御情報としては、例えば、後述する各種テーブルがある。
【００３３】
内部スイッチ１５は、例えばクロスバスイッチであり、ＣＨＡ１１、ＤＫＡ１３、キャッシュ／制御メモリ１４を相互に接続させる装置である。内部スイッチ１５に代えて、バスなどの他種の接続部が採用されてもよい。
【００３４】
内部スイッチ１５には、例えば管理端末６が接続される。管理端末６は、ストレージシステム１を管理するための計算機である。管理端末６は、例えば、キャッシュ／制御メモリ１４の制御領域に、後述する各種テーブルを格納することができる。尚、管理端末６が行う機能は、ホスト４に搭載されてもよい。即ち、ホスト４から、後述する各種テーブルを格納してもよい。
【００３５】
以上が、本実施形態に係るストレージシステムの物理的な構成例の説明である。尚、上記の説明は一例であり、このストレージシステムの構成に限定する必要は無い。例えば、コントローラは、もっと簡易な構成、例えば、一つの回路基盤にＣＰＵとメモリを備えた構成（ＣＨＡ１１とＤＫＡ１３の機能が一つの回路基板によって実現される構成）とされてもよい。
【００３６】
図２は、本実施形態に係るストレージシステム１の論理的な構成例を示す図である。
【００３７】
ＣＨＡ１１には、ＣＰＵ１１１に実行されるコンピュータプログラムとして、例えば、コマンド処理部９０１が、例えば、メモリ１１２に記憶される。ＤＫＡ１３には、ＣＰＵ１３１に実行されるコンピュータプログラムとして、例えば、ディスクＩ／Ｏ処理部９０２と、論理物理変換部９０３とが、例えば、メモリ１３２に記憶される。以下、コンピュータプログラムを主語として記述している説明文は、実際にはそのコンピュータプログラムを実行するＣＰＵによって処理が行われることを意味するものとして記述する。
【００３８】
コマンド処理部９０１は、ホスト４から受信したＩ／Ｏ要求を処理する。例えば、Ｉ／Ｏ要求がライト要求の場合、コマンド処理部９０１は、ライト要求に伴うライト対象のデータをキャッシュ領域に書き込む。
【００３９】
論理物理変換部９０３は、論理アドレスを物理アドレスに変換する。論理アドレスとは、例えば、ＬＤＥＶの識別子やそのＬＤＥＶにおけるＬＢＡ（論理ブロックアドレス）である。物理アドレスとは、ＨＤＤ１６内で各ディスクブロックの位置を特定するために用いられるＬＢＡ、あるいは、「シリンダ番号、トラック番号及びセクタ番号の組（ＣＣ、ＨＤＤ、ＳＳ）」などである。
【００４０】
ディスクＩ／Ｏ処理部９０２は、ＨＤＤ１６に対するデータの入出力を制御する。具体的には、例えば、ディスクＩ／Ｏ処理部９０２は、キャッシュ領域に記憶されているライト対象のデータを、複数のデータ単位に分割し、各データ単位をＲＡＩＤグループに書き込む。その際、ディスクＩ／Ｏ処理部９０２は、論理物理変換部９０３を利用して、アクセス先の論理アドレスを物理アドレスに変換し、物理アドレスを指定したＩ／Ｏ要求をＨＤＤ１６に送信する。それにより、その物理アドレスに対応した記憶領域にデータ要素やパリティを書き込んだり、その物理アドレスに対応した記憶領域からデータ要素をやパリティを読み出したりすることができる。
【００４１】
図３は、複数のＨＤＤ１６と論理ボリュームとの関係性の一例を示す図である。
【００４２】
複数（例えば４台）のＨＤＤ１６−１、１６−２、１６−３及び１６−４により一つのＲＡＩＤグループが構成される。例えば、ＲＡＩＤレベルがＲＡＩＤ５である場合は、同図のように、データ単位を構成する３つのデータ要素が３つのＨＤＤ１６に格納され、それら３つのデータを基に生成されたＰパリティが、他の一つのＨＤＤ１６に格納される。
【００４３】
このＲＡＩＤグループにより提供される記憶領域（４つのＨＤＤ１６の記憶領域の集合）を、本実施形態では、Virtual Deviceを略して「ＶＤＥＶ」と呼ぶ。このＶＤＥＶを区切ることにより得られた各ＶＤＥＶ部分が、本実施形態で言う論理ボリュームである。論理ボリュームは、ホスト４から指定され、ストレージシステム１内部でも識別される。そこで、以下、ホスト４から指定される論理ボリュームを、「ＬＵ」（Logical Unit）と称し、ストレージシステム１内部で識別される論理ボリュームを、「ＬＤＥＶ」（Logical Device）と呼ぶ場合がある。この図の例では、一つのＶＤＥＶから３つのＬＤＥＶが形成されているが、ＬＤＥＶの数は、それより多くても少なくてもよい（例えば、一つのＶＤＥＶに一つのＬＤＥＶでもよい）。
【００４４】
ＶＤＥＶは、複数のストライプ列で構成されている。各ストライプ列は、４台のＨＤＤ１６−１、１６−２、１６−３及び１６−４に対応した４つのストライプで構成されている。ＨＤＤ１６の記憶領域は、複数の所定サイズのサブ記憶領域（つまりストライプ）に区分けられている。ストライプを一つの単位として、データ要素やパリティの書込みが行われる。
【００４５】
以下、図４〜図８を参照して、キャッシュ／制御メモリ１４に格納される制御情報に含まれる種々のテーブルを説明する。
【００４６】
図４は、ＲＡＩＤ構成テーブル４００の構成例を示す図である。
【００４７】
ＲＡＩＤ構成テーブル４００は、各ＶＤＥＶのＲＡＩＤ構成を管理するためのテーブルである。具体的には、例えば、このテーブル４００には、ＶＤＥＶの識別番号が書かれるカラム４０１と、ＨＤＤの識別番号が書かれるカラム４０２と、ＲＡＩＤレベルが書かれるカラム４０３と、ストライプサイズ（ストライプの記憶容量）が書かれるカラム４０４とがある。即ち、このテーブル４００には、ＶＤＥＶ毎に、ＶＤＥＶの識別番号と、該ＶＤＥＶを構成する複数のＨＤＤの識別番号と、該ＶＤＥＶのＲＡＩＤレベルと、ストライプサイズとが書かれる。
【００４８】
図５は、ＶＤＥＶ構成テーブル５００の構成例を示す図である。
【００４９】
ＶＤＥＶ構成テーブル５００は、ＶＤＥＶの構成を管理するためのテーブルである。具体的には、例えば、このテーブル５００には、ＶＤＥＶの識別番号が書かれるカラム５０１と、ＬＤＥＶの識別番号が書かれるカラム５０２と、ＬＤＥＶのＶＤＥＶにおける論理アドレス範囲の先頭アドレスが書かれるカラム５０３と、ＬＤＥＶのＶＤＥＶにおける論理アドレス範囲の終端アドレスが書かれるカラム５０４とがある。即ち、このテーブル５００には、どのＶＤＥＶのどの論理アドレス範囲にどんな識別番号のＬＤＥＶが存在するかが書かれる。
【００５０】
図６は、ＬＵ構成テーブル６００の構成例を示す図である。
【００５１】
ＬＵ構成テーブル６００は、各ＬＵの構成を管理するためのテーブルである。具体的には、例えば、このテーブル６００には、ＬＤＥＶの識別番号が書かれるカラム６０１と、ＷＷＮ（World Wide Name）が書かれるカラム６０２と、ＬＵＮ（Logical Unit Number）が書かれるカラム６０３と、ＬＤＥＶの記憶容量が書かれるカラム６０４とがある。即ち、このテーブル６００には、各ＬＵ毎に、ＬＤＥＶの識別番号と、該ＬＤＥＶに対応付けられたＷＷＮ及びＬＵＮと、そのＬＤＥＶの記憶容量とが書かれる。
【００５２】
この実施形態では、前述したように、ホスト４から指定される論理ボリュームを「ＬＵ」と言うが、具体的には、例えば、Fibre ChannelプロトコルでのWWN及びＬＵＮが対応付けられた論理ボリュームをＬＵと言う。尚、例えば、メインフレームでは、ＷＷＮ及びＬＵＮのカラム６０２及び６０３は設けられなくてもよい。
【００５３】
図７は、ＨＤＤ障害チェックテーブル７００の構成例を示す図である。
【００５４】
ＨＤＤ障害チェックテーブル７００は、障害の発生したＨＤＤ１６をチェックするためのテーブルである。具体的には、例えば、このテーブル７００には、ＨＤＤの識別番号が書かれるカラム７０１と、障害が発生しているか否かを識別するためのフラグが書かれるカラム７０２とがある。即ち、このテーブル７００には、どのＨＤＤ１６に障害が発生しているかが書かれる。
【００５５】
図８は、ストライプ障害チェックテーブル８００の構成例を示す図である。
【００５６】
ストライプ障害チェックテーブル８００は、障害の発生したＨＤＤ１６に含まれるストライプのうち、データ要素を読み出すことができないストライプ（説明の便宜上、「障害ストライプ」と表記する）をチェックするためのテーブルである。このテーブル８００は、ＲＡＩＤグループを構成する全てのＨＤＤ１６の各々について作成される。具体的には、例えば、このテーブル８００には、ストライプの識別番号が書かれるカラム８０１と、障害が発生しているか否かを識別するためのフラグが書かれるカラム８０２とがある。即ち、このテーブル８００には、どのストライプが障害ストライプであるかが書かれる。尚、同図では、ＨＤＤ１６ごとにそのＨＤＤ１６に含まれるストライプを一意に特定するために付与された識別番号が、カラム８０１に書かれているが、図３において付された識別番号のように、ＲＡＩＤ内に含まれるストライプを一意に特定するために付与された識別番号が、カラム８０１に書かれてもよい。
【００５７】
以上が、各種テーブルについての説明である。本実施形態に係るストレージシステム１は、ＲＡＩＤ５やＲＡＩＤ６と同様に、ＲＡＩＤグループを構成する複数のＨＤＤ１６に分散してデータを書込むストライピングを採用するが、パリティの生成や書き込みについては、ＲＡＩＤ５やＲＡＩＤ６とは異なる方法を採用する。以下では、データ要素及びパリティの配置やその配置に基づいて行われるリストアを「データ保護方式」と呼ぶ。本実施形態に係るストレージシステム１は、二種類のデータ保護方式を採用することができる。それら二種類のデータ保護方式のいずれにおいても、二重障害の生じたデータ単位をリストアすることが可能である。具体的には、どのストライプからもデータ要素を読み出すことのできないＨＤＤ（以下、完全障害ＨＤＤ）と、データ要素を読み出せるストライプと読み出せないストライプの両方を有するＨＤＤ（以下、一部障害ＨＤＤ）とが一つのＲＡＩＤグループに存在するが故に、読出し不可能な二つのデータ要素を含んだデータ単位である二重障害データが存在する場合、それら二つのデータ要素をリストアすることが可能である。そして、それら二種類のデータ保護方式では、複数のデータ単位に対応した複数のパリティを基にそのトータルサイズよりも小さいサイズの圧縮パリティを生成して格納することで、一つのデータ単位について必ず二つのパリティが生成されるＲＡＩＤ６に比べて、消費記憶容量が少なくて済む。以下、それら二種類のデータ保護方式について具体的に説明する。尚、ＨＤＤ１６へのデータ及びパリティの書込みは、ＤＫＡ１３のＣＰＵ１３１によって実行されるディスクＩ／Ｏ処理部９０２が行う。また、第一及び第二のデータ保護方式のいずれでも、圧縮パリティが格納されるストライプを、便宜上「特定ストライプ」と言う。一方、データ要素やパリティの書込み先となるストライプを「通常ストライプ」と言う。データ要素或いはパリティの読み出しが不可能になった通常ストライプが、前述した「障害ストライプ」である。
【００５８】
図９は、第一のデータ保護方式での書込みの説明図である。
【００５９】
まず、第一のデータ保護方式において、データ要素及びパリティが、ＨＤＤ１５にどのように配置されるかについて説明する。
【００６０】
第一のデータ保護方式では、ＨＤＤ１６ごとに、ＨＤＤ１６に含まれる全てのストライプのデータ要素及びＰパリティから生成された圧縮パリティが書き込まれる。その圧縮パリティは、ＨＤＤ１６に対応する全ての通常ストライプに格納されるデータ要素及びＰパリティの排他的論理和を算出することによって（或いは、それらのデータ要素及びＰパリティに所定の係数を掛けた後でそれらの排他的論理和を算出することによって）、生成される。圧縮パリティが書き込まれるストライプ（つまり特定ストライプ）の位置は、例えば、同図のように、それぞれのＨＤＤ１６の最後尾とすることができる。別の言い方をすれば、ＶＤＥＶの最後尾のストライプ列が、４個の特定ストライプで構成された特定ストライプ列である。尚、特定ストライプは、ＨＤＤ１６の最後尾以外のストライプであっても良い。
【００６１】
本実施形態では、４つのＨＤＤ１６−１乃至１６−４にそれぞれ対応した４つの圧縮パリティが、キャッシュ／制御メモリ１４のキャッシュ領域に常駐し、適時に、キャッシュ領域から特定ストライプに書き込まれる。例えば、ライト要求を受けた際のデータの書込みにより圧縮パリティが更新された場合、その更新された圧縮パリティは、その更新されたときに、ＨＤＤ１６とキャッシュ領域との両方に書き込まれてもよいし、ＨＤＤ１６には書き込まれずにキャッシュ領域にだけ書き込まれてもよい。後者の場合は、その後の所定のタイミングで、キャッシュ領域に書き込まれている４つの圧縮パリティのうちの少なくとも一つ（例えば、全て、或いは、更新された圧縮パリティのみ）が、ＨＤＤ１６における特定ストライプにコピーされる。このようにすることで、ライト要求を受けた際のデータの書込みを行う度に、ＨＤＤ１６上の圧縮パリティが書き込まれているストライプへのアクセスが行われなくなるので、書込みに要する時間が短縮される。ＨＤＤ１６−１を例に採り説明すると、ＨＤＤ１６−１における通常ストライプに書き込まれるデータ要素及びＰパリティ（データ要素“０”、
“３”及び“６”とＰパリティ“Ｐ３”など）を基に、ＨＤＤ１６−１に対応する圧縮パリティ“ＲＰ０”が生成され、それが、キャッシュ領域とＨＤＤ１６−１に書き込まれる。他のＨＤＤ１６−２〜１６−４における圧縮パリティ“ＲＰ１”〜“ＲＰ３”の生成及び書き込みについても、ＨＤＤ１６−１における圧縮パリティ“ＲＰ０”の場合と同様である。
【００６２】
第一のデータ保護方式は、圧縮パリティが書き込まれる点を除いては、ＲＡＩＤ５におけるデータ保護方式と実質的に同じである。従って、同図のように、ＲＡＩＤグループを構成するＨＤＤ１６の総数が４つである場合は、そのうちの３つのＨＤＤ１６に、データ単位を構成する３つのデータ要素（例えば、データ要素“０”、“１”及び“２”）が書き込まれ、残りの一つのＨＤＤに、そのデータ単位に基づく一つのＰパリティ（例えば、Ｐパリティ“Ｐ０”）が書き込まれる。つまり、ＲＡＩＤグループを構成するＨＤＤ１６の個数をＮ（Ｎは３以上の整数）とすると、（Ｎ−１）個のＨＤＤ１６それぞれに１個の、即ち（Ｎ−１）個のＨＤＤ１６に対して合計（Ｎ−１）個のデータ要素が書き込まれ、残りの１個のＨＤＤ１６に、それら（Ｎ−１）個のデータ要素を基に生成された一つのＰパリティが書き込まれる。Ｐパリティは、４つのＨＤＤ１６−１〜１６−４に分散して書き込まれる。言い換えれば、Ｐパリティの書込み先となるＨＤＤ１６は、データ単位毎にシフトする。
【００６３】
次に、第一のデータ保護方式に従う、データ単位及びＰパリティの更新について説明する。なお、以下の説明では、更新前のデータ要素を、「旧データ要素」と言い、更新後のデータ要素を、「新データ要素」と言う（Ｐパリティ及び圧縮パリティについても同様）。
【００６４】
例えば、１番目のデータ単位を構成する３つのデータ要素のうちデータ要素“１”が更新されるとする。この場合、Ｐパリティ“Ｐ０”及び圧縮パリティ“ＲＰ１”を更新する必要がある。なぜなら、Ｐパリティ“Ｐ０”も圧縮パリティ“ＲＰ１”も、旧データ要素“１”を基に生成されたパリティであって、データ要素“１”が更新されれば、Ｐパリティ“Ｐ０”及び圧縮パリティ“ＲＰ１”の値が変わるためである。
【００６５】
そこで、ディスクＩ／Ｏ処理部９０２は、まず、Ｐパリティ“Ｐ０”の生成に必要となる旧データ要素“１”及び旧Ｐパリティ“Ｐ０”を、ＨＤＤ１６−２及び１６−４から読み出す。そして、ディスクＩ／Ｏ処理部９０２は、新データ要素“１”と、旧データ要素“１”及び旧Ｐパリティ“Ｐ０”とを基に、新Ｐパリティ“Ｐ０”を生成することができる（或いは、更新されないデータ要素“０”及び“２”と、新データ要素“１”とから、新Ｐパリティ“Ｐ０”を生成してもよい）。また、ディスクＩ／Ｏ処理部９０２は、新Ｐパリティ“Ｐ０”の生成と同じような方法で、新圧縮パリティ“ＲＰ１”の生成も行う。即ち、ディスクＩ／Ｏ処理部９０２は、ＨＤＤ１６−２に対応した旧圧縮パリティ“ＲＰ１”と、旧データ要素“１”、新データ要素“１”とを基に、新圧縮パリティ“ＲＰ１”を生成することができる（或いはディスクＩ／Ｏ処理部９０２は、ＨＤＤ１６−２から、旧データ要素“１”以外のデータ要素とＰパリティを読出し、読み出したデータ要素及びＰパリティと、新データ要素“１”とを基に、新圧縮パリティ“ＲＰ１”を生成しても良い）。その後、ディスクＩ／Ｏ処理部９０２は、新データ要素“１”を、旧データ要素“１”が記憶されている通常ストライプに書き込み、新Ｐパリティ“Ｐ０”を、旧Ｐパリティ“Ｐ０”が記憶されている通常ストライプに書き込む。また、ディスクＩ／Ｏ処理部９０２は、新圧縮パリティ“ＲＰ１”を、キャッシュ領域に書込み、所定のタイミングで、キャッシュ領域上の新圧縮パリティ“ＲＰ１”を、旧圧縮パリティ“ＲＰ１”が記憶されている特定ストライプに書き込む。
【００６６】
図１０は、第一のデータ保護方式でのリストアの説明図である。なお、以下の説明では、読出し不可能なデータ要素が一つだけであるデータ単位であって、二重障害データ（前述した通り、読出し不可能なデータ要素を二つ含んだデータ単位）ではないデータ単位のことを、「一重障害データ」と言う。
【００６７】
同図では、ＨＤＤ１６−１が、完全障害ＨＤＤであり、ＨＤＤ１６−２が、一部障害ＨＤＤである。その一部障害ＨＤＤ１６−２では、データ要素“１３”を記憶した通常ストライプが障害ストライプである。
【００６８】
一重障害データを構成するデータ要素のリストアの手順は、通常のＲＡＩＤ５と同様である。すなわち、完全障害ＨＤＤ１６−１の障害ストライプに記憶されている、一重障害データを構成するデータ要素は、その一重障害データを構成する他の全てのデータ要素と、その一重障害データに対応したＰパリティとを用いて（言い換えれば、その障害ストライプを含んだストライプ列における他の全てのストライプにあるデータ要素及びＰパリティを用いて）、リストアされる。
【００６９】
一方、二重障害データを構成する読み出し不可能な二つのデータ要素は、通常のＲＡＩＤ５と同様の手順でリストアすることはできない。二重障害データに対応するパリティは一つだけだからである。本例の場合では、データ要素“１２”と“１３”の両方を、残りのデータ要素“１４”とＰパリティ“Ｐ４”とからだけでは、リストアすることはできない。
【００７０】
そこで、これら二つのデータ要素のリストアは、圧縮パリティを利用して、次のようにして行われる。
【００７１】
まず、一部障害ＨＤＤ１６−２における障害ストライプに記憶されているデータ要素“１３”がリストアされる。具体的には、一部障害ＨＤＤ１６−２における、障害ストライプ以外の全ての通常ストライプに記憶されているデータ要素及びＰパリティと、その一部障害ＨＤＤ１６−２に対応した圧縮パリティ“ＲＰ１”（キャッシュ領域又は特定ストライプに記憶されている圧縮パリティ“ＲＰ１”）との排他的論理和により、データ要素“１３”がリストアされる（同図の（ａ））。
【００７２】
次に、そのデータ要素“１３”と、そのデータ要素“１３”を含んだデータ単位における他のデータ要素“１４”及びそのデータ単位に対応したＰパリティ“Ｐ４”を基に、完全障害ＨＤＤ１６−１の障害ストライプに記憶されている、データ要素“１２”がリストアされる。これにより、二重障害データにおけるデータ要素“１２”及び“１３”の両方がリストアされたことになる。
【００７３】
最後に、完全障害ＨＤＤ１６−１の特定ストライプに記憶される、圧縮パリティがリストアされる。具体的には、完全障害ＨＤＤ１６−１の障害ストライプに記憶されている、二重障害データにおけるリストアされたデータ要素“１２”や、ＲＡＩＤ５と同様にリストアされた他のデータ要素やＰパリティを基に、圧縮パリティ“ＲＰ１”がリストアされる。
【００７４】
以上が、第一のデータ保護方式についての説明である。
【００７５】
なお、上記の処理において、一部障害ＨＤＤの障害ストライプに、データ要素ではなくＰパリティが記憶されている場合には、その一部障害ＨＤＤに対応した圧縮パリティや、その一部障害ＨＤＤの障害ストライプ以外の通常ストライプに記憶されているデータ要素及びＰパリティを基に、その障害ストライプに記憶されているＰパリティがリストアされる。そして、そのリストアされたＰパリティを用いて、通常のＲＡＩＤ５と同様の方法で、完全障害ＨＤＤの障害ストライプに記憶されているデータ要素がリストアされる。
【００７６】
また、上記の説明によれば、第一のデータ保護方式では、完全障害ＨＤＤ以外の全てのＨＤＤが、一部障害ＨＤＤであっても良い。但し、一部障害ＨＤＤに記憶されているデータ要素をリストアするためには、一部障害ＨＤＤに存在する障害ストライプは一つだけである必要がある。
【００７７】
また、第一のデータ保護方式では、一つのデータ単位及びそれに対応するＰパリティのトータルサイズと、一つのストライプ列のサイズとが同一である。具体的には、一つのデータ単位及びそれに対応するＰパリティは、一つのストライプ列に収まり、複数のストライプ列に跨ることは無い。しかし、それに限らず、例えば、後述する第二のデータ保護方式の例と同様に、一つのデータ単位及びそれに対応するＰパリティのトータルサイズは、一つのストライプ列のサイズより小さくても良い。
【００７８】
図１１は、第二のデータ保護方式での書込みの説明図である。
【００７９】
第二のデータ保護方式では、第一のデータ保護方式と異なり、一つのデータ単位について、ＲＡＩＤ６と同様に、ＰパリティのみならずＱパリティ（第二の冗長コード）も生成される。しかし、データ単位毎にＲＡＩＤグループに書き込まれるのは、Ｑパリティのみであって、Ｐパリティは、データ単位毎には書き込まれない。Ｐパリティに関して言えば、複数のデータ単位に対応した複数のＰパリティが一つの圧縮パリティに圧縮されてＲＡＩＤグループに書き込まれる。これにより、二重障害データにおける二つのデータ要素のリストアを可能にしつつ、ＲＡＩＤグループの消費記憶容量の節約も可能にする。
【００８０】
第二のデータ保護方式では、ＲＡＩＤグループを構成するＨＤＤ１６の個数をＮとすると、（Ｎ−２）個のストライプにデータが書き込まれ、残り２個のＨＤＤ１６のうちのどちらか１個に含まれるストライプに、Ｑパリティが書き込まれる。つまり、第二のデータ保護方式では、データ単位とＱパリティとのトータルデータサイズよりも、一ストライプ列のサイズの方が、ストライプ一つ分大きいことになる。
【００８１】
第二のデータ保護方式では、前述したように、特定ストライプに書き込まれる圧縮パリティは、複数のデータ単位に対応する複数のＰパリティを一つに圧縮したコード、具体的には、それら複数のＰパリティの排他的論理和をとることによって生成される。本実施形態では、例えば、３つのデータ単位に対応する３つのＰパリティを基に一つの圧縮コードが生成される。具体的には、例えば、第一のデータ単位に対応した第一のＰパリティ（データ要素“０”及び“１”の排他的論理和）と、第二のデータ単位に対応した第二のＰパリティ（データ要素“４８”及び“４９”の排他的論理和）と、第三のデータ単位に対応した第三のＰパリティ（データ要素“９６”及び“９７”の排他的論理和）との排他的論理和を算出することにより、圧縮パリティ“ＣＰ０”が生成される。
【００８２】
第二のデータ保護形式では、一つのＨＤＤ１６に、複数の特定ストライプが存在する。このため、ＨＤＥＶには、複数の特定ストライプ列が存在することになる。複数の特定ストライプ列は、ＨＤＥＶに分散していても良いが、図示のように、ＨＤＥＶの末尾側に、連続した特定ストライプ列として存在しても良い。
【００８３】
本実施形態における第二のデータ保護方式では、以下の第一及び第二の規則が遵守される。
【００８４】
第一の規則は、圧縮パリティを、それの基になった複数のＰパリティに対応する複数のデータ単位及びそれら複数のデータ単位に対応する複数のＱパリティが記憶されるＨＤＤと異なるＨＤＤ１６のストライプに書き込むことである。ＨＤＤ１６の障害の発生により、圧縮パリティと、それに対応する各データ単位におけるデータ要素又は各データ単位に対応するＱパリティとが、同時に読み出せなくなることを避けるためである。例えば、圧縮パリティ“ＣＰ０”について説明すると、圧縮パリティ“ＣＰ０”に対応したデータ単位を構成する二つのデータ要素がＨＤＤ１６−１及び１６−２に書き込まれ、そのデータ単位に対応するＱパリティがＨＤＤ１６−３に書き込まれるため、圧縮パリティ“ＣＰ０”は、ＨＤＤ１６−４に書き込まれる。別の言い方をすれば、ＨＤＤ１６−４に書き込まれる圧縮パリティの基にすべき複数のＰパリティに対応する複数のデータ単位は、ＨＤＤ１６−１及び１６−２に書き込まれるデータ単位とすべきである。なぜなら、そのデータ単位に対応するＱパリティの書込み先はＨＤＤ１６−３であり、重複しないＨＤＤはＨＤＤ１６−４のみだからである。
【００８５】
第二の規則は、圧縮パリティに対応するｍ番目のデータ単位及びそれのＱパリティと、その圧縮パリティに対応するｍ＋１番目のデータ単位及びそれのＱパリティ（つまり次のデータ単位及びそれのＱパリティ）との間に、所定数の通常ストライプが存在することである。別の言い方をすれば、第二の規則は、圧縮パリティに対応するｍ番目のデータ単位及びそれのＱパリティが存在する一つ又は二つの通常ストライプ列と、ｍ＋１番目のデータ単位及びそれのＱパリティが存在する一つ又は二つの通常ストライプ列との間に、所定数の通常ストライプ列が存在することである。従って、例えば、圧縮パリティ“ＣＰ０”について言えば、圧縮パリティ“ＣＰ０”に対応するデータ単位は、ＨＤＤ１６−１及び１６−２にわたって記憶されるデータ単位であれば何でも良いわけではなく、ＨＤＤ１６−１及び１６−２にわたって記憶されるデータ単位であって、所定数の通常ストライプ列を隔てたデータ単位同士である必要がある。なぜなら、詳細は後述するが、圧縮パリティに対応する複数のデータ単位において二重障害データが一つだけであれば、その二重障害データを構成する読出し不可能な二つのデータ要素をリストアすることができるが、それら複数のデータ単位に二重障害データが二つ以上あると、リストアが不可能となってしまうためである。
【００８６】
第二のデータ保護方式によれば、一つの圧縮パリティに対応するデータ単位の数が多ければ多いほど、ＲＡＩＤグループに書き込まれる圧縮パリティの数を減らすことができる。しかし、そうすると、データ単位間の間隔が短くなる。すなわち、データ単位及びそれに対応するＱパリティと、次のデータ単位及びＱパリティとの間に存在するストライプの数が少なくなる（言い換えれば、それらのデータ単位が存在するストライプ列同士の間に存在するストライプ列数が少なくなる）。データ単位間の間隔が狭いと、完全障害ＨＤＤが一つ存在し更に別のＨＤＤ１６で障害が生じたことにより一つの部分障害ＨＤＤが生じた場合に、圧縮パリティに対応する複数のデータ単位のうちの二以上のデータ単位が同時に二重障害データとなってしまうおそれがある。これを避ける方法としては、圧縮パリティに対応するデータ単位の数を少なくし、且つ、圧縮パリティに対応するデータ単位とデータ単位との間隔を十分に長くする方法が考えられる。しかし、そうすると、ＲＡＩＤグループに書き込まれる圧縮パリティの数が多くなる。この観点から、本実施形態では、圧縮パリティに対応するデータ単位とデータ単位との間隔を、各ＨＤＤ１６のハードディスクの構造（例えば、記録密度）を基に適切な長さに設定されている。このため、例えば、ＲＡＩＤグループを構成する複数のＨＤＤのハードディスクの構造は同じである。
【００８７】
図１２は、第二のデータ保護方式での書込みをより詳細に説明するための図である。
【００８８】
同図の例では、８つのＨＤＤ１６−１〜１６−８からＲＡＩＤグループが構成されている。上述したように、それぞれのＨＤＤ１６の記憶領域は、複数のストライプに区分けされている。番号が付与されている一つの領域が、一つのストライプである。本例では、図３や図９乃至図１１の場合と異なり、各ストライプに記録されている番号は、データ要素或いはパリティの識別番号ではなく、データ単位を識別する識別番号である。但し、Ｑパリティには、その識別番号の前に「Ｑ」の文字が付与されているため、どのデータ単位に対応するＱパリティであるかがわかるようになっている。
【００８９】
圧縮パリティ“ＣＰ０”に対応するデータ単位及びＱパリティと次のデータ単位及びＱパリティとの間には、ｉ個の他のデータ単位が存在する。ｉは、上述した第二の規則に基づく１以上の整数である。なお、ｉの選定基準については後述する。圧縮パリティ“ＣＰ０”は、データ単位“０”、“ｉ”、“２ｉ”、“３ｉ”、…（その他このＲＡＩＤグループに含まれる全てのストライプ列のうち、その識別番号がｉの倍数となるもの）に対応している。具体的には、データ単位“０”のＰパリティをＰパリティ“Ｐ０”、データ単位“ｉ”のＰパリティをＰパリティ“Ｐｉ”、データ単位“２ｉ”のＰパリティをＰパリティ“Ｐ２ｉ”とする。また、圧縮パリティ“ＣＰ０”に対応する、データ単位“３ｉ”以降の全てのデータ単位に対応する全てのＰパリティの排他的論理和を算出した値を、“Ｐｘ”とする。そうすると、圧縮パリティ“ＣＰ０”は、Ｐ０とＰｉとＰ２ｉとＰｘとの排他的論理和となる。圧縮パリティ“ＣＰ０”は、第一の規則に従い、それの基になったデータ単位及びＱパリティのいずれも書き込まれないＨＤＤ１６−８に書き込まれる。
【００９０】
他の圧縮パリティについても、圧縮パリティ“ＣＰ０”と実質的に同様に生成され書き込まれる。例えば、圧縮パリティ“ＣＰ６”は、データ単位“６”に対応したＰパリティ“Ｐ６”と、データ単位“ｉ＋６”に対応したＰパリティ“Ｐｉ＋６”と、データ単位“２ｉ＋６”に対応したＰパリティ“Ｐ２ｉ＋６”と、データ単位“３ｉ＋６”以降のデータ単位に対応したＰパリティの排他的論理和である値“Ｐｙ”との排他的論理和である。この圧縮パリティ“ＣＰ６”は、第一の規則に従い、それの基になったデータ単位及びＱパリティのいずれも書き込まれないＨＤＤ１６−２に書き込まれる。
【００９１】
図１３は、第二のデータ保護方式でのリストアの説明図である。
【００９２】
第二のデータ保護方式でも、第一のデータ保護方式と同様、二重障害データにおける読出し不可能な二つのデータ要素をリストアすることができるが、その際、リストア可能な、一部障害ＨＤＤに関する条件が異なる。すなわち、第一のデータ保護方式では、完全障害ＨＤＤ以外のどのＨＤＤも一部障害ＨＤＤであっても良いが、各一部障害ＨＤＤに存在しても良い障害ストライプは一つである。それに対し、第二のデータ保護方式では、一つのＲＡＩＤグループに存在しても良い一部障害ＨＤＤは一つだけであるが、その一部障害ＨＤＤに存在しても良い障害ストライプは、一つに限らない。但し、一つの圧縮パリティに対応する複数のデータ単位に存在しても良い二重障害データは一つだけである。
【００９３】
同図では、ＨＤＤ１６−１が完全障害ＨＤＤであり、ＨＤＤ１６−２が、一部障害ＨＤＤである。ＨＤＤ１６−２には、圧縮パリティ“ＣＰ０”に対応した複数のデータ単位のうち、データ単位“０”のみが二重障害データとなり、他のデータ単位（“ｉ”、“２ｉ”、“３ｉ”・・・）一重障害データとならない範囲で、障害ストライプが存在する。
【００９４】
圧縮パリティ“ＣＰｘ”（ｘは整数）に対応するデータ単位と次のデータ単位との間隔を示す値“ｉ”について、その選定例を説明する。図２３はＨＤＤ１６内の記憶媒体（磁気円盤）上におけるデータ（セクタ）の配置例と、記憶媒体上に部分障害が発生した場合の障害範囲とを示した図である。１，２，３，…の番号が割り振られている領域は、「セクタ」と呼ばれる固定長（一般的なハードディスクでは５１２バイト）の領域である。ＨＤＤ１６内の記憶媒体上には、セクタが同心円状に複数個配置される。同心円の１周分のセクタの集合を「トラック」と呼ぶ。また図２３において、点線の楕円で示している領域は、記憶媒体上の部分障害の発生箇所の例である。一般に、記憶媒体上の部分障害が発生する場合、障害の発生したセクタの配置される１つのトラックを観測すると、障害の範囲は、トラック内の１セクタ分に収まる。ただし、この障害の範囲は、複数のトラック（一般的に１０トラック程度）に跨ることが多い。そのため、圧縮パリティ“ＣＰｘ”に対応するデータ単位と次のデータ単位との間隔を設定する際に、この部分障害の特性を考慮する。
【００９５】
図１２と図２３とに基づいて更に説明する。図１２において、１つのストライプのサイズが４ＫＢ（キロバイト）とすると、ＨＤＤ１６−１の１ストライプ、例えばストライプ０は、図２３に示した記憶媒体上の８セクタ分の大きさ、即ち、セクタ１からセクタ８に対応する。図２３に示したセクタ配置例では、１トラック上に１６セクタ、即ち８ＫＢのセクタが配置されるため、１トラック上に、２ストライプが配置される。即ち、図１２のストライプ０及び１が、最初のトラック（最外周のトラック）に、そして、ストライプ２及び３が、次の周のトラックに、それぞれ配置されることになる。圧縮パリティ“ＣＰ０”の生成には、ストライプ０とストライプ“ｉ”及びストライプ“２ｉ”が使用される。圧縮パリティに基づいて、データリストアをする場合、圧縮パリティを生成するために使用するストライプのうち、１つのストライプが障害の場合には、リストアが可能だが、そうでない場合には、リストアは不可能になる。図２３に示した記憶媒体上の部分障害の範囲が、ほとんどの場合、１０トラック以内に収まるとすると、本文における例、即ち１トラック上に２ストライプが配置される例の場合には、ストライプ０とストライプ“ｉ”（あるいはストライプ“ｉ”とストライプ“２ｉ”なども同様）の間隔を、５トラックよりも多く離して配置する。これにより、部分障害が発生したときに、ストライプ０とストライプ“ｉ”とが同時にアクセス不可（読めなくなる）になることを回避することができる（正確には、同時にアクセスできなくなる確率を低くすることが出来る）。そのため、この場合には、ｉを、５以上に設定すると良い。
【００９６】
第二のデータ保護方式でのリストアの手順の概要は、以下の通りである。
【００９７】
まず、完全障害ＨＤＤ１６−１の障害ストライプに記憶されている、各一重障害データにおける各データ要素が、各一重障害データに対応するＱパリティを用いてＲＡＩＤ５と同様の手法でリストアされる（同図（ａ））。なお、データ要素の代わりにＱパリティが記憶されている場合には、一重障害データとすらなっていない通常のデータ単位を基にＱパリティがリストアされる。
【００９８】
次に、各圧縮パリティについて、圧縮パリティに対応する複数のデータ単位における二重障害データに対応するＰパリティがリストアされる（同図（ｂ））。具体的には、例えば、圧縮パリティ“ＣＰ０”と、それの基になった、二重障害データ“０”に対応するＰパリティ“Ｐ０”以外のパリティ“Ｐｉ”、“Ｐ２ｉ”及び“Ｐｘ”を基に、二重障害データ“０”に対応するＰパリティ“Ｐ０”がリストアされる。
【００９９】
その後、ＲＡＩＤ６と同様の手法により、二重障害データにおける二つのデータ要素がリストアされる（同図（ｃ））。具体的には、リストアされたＰパリティ“Ｐ０”と、二重障害データ“０”に対応するＱパリティとを基に、二重障害データ“０”における読出し不可能な二つのデータ要素（完全障害ＨＤＤ１６−１と一部障害ＨＤＤ１６−２とに記憶されているデータ要素）がリストアされる。
【０１００】
最後に、完全障害ＨＤＤ１６−１の各特定ストライプに記憶されている各圧縮パリティがリストアされる（同図（ｄ））。具体的には、例えば、同図（ａ）乃至（ｃ）により、全ての二重障害データが通常のデータ単位にリストアされたので、リストアされた通常のデータ単位を基にＰパリティを生成し、生成したＰパリティと、そのデータ単位が対応する圧縮パリティに対応する他のデータ単位に対応するＰパリティとを基に、完全障害ＨＤＤ１６−１に記憶されている圧縮パリティ“ＣＰ７”、“ＣＰ１５”などがリストアされる。
【０１０１】
以上が、第一及び第二のデータ保護形式についての説明である。なお、いずれのデータ保護方式においても、完全障害ＨＤＤや一部障害ＨＤＤについて、一重障害データや二重障害データにおける読出し不可能なデータ要素は、所定の記憶資源、例えばスペアのＨＤＤにリストアされる。
【０１０２】
以下、本実施形態で行われる種々の処理の流れを説明する。
【０１０３】
図１４は、ストレージシステム１がホスト４からＩ／Ｏ要求を受信した場合にコマンド処理部９０１が行う処理のフローチャートである。
【０１０４】
ホスト４は、ＬＵにアクセスする際、ＬＵに付与されているＷＷＮとＬＵＮ、そして、リード乃至ライト対象のアドレス（ＬＢＡ：Logical Block Address）を指定したＩ／Ｏ要求を、ストレージシステム１に対して発行する。コマンド処理部９０１は、そのＩ／Ｏ要求を受けたことに応答して、ＬＵ構成テーブル６００を参照し、ＬＵＮとＷＷＮに対応するＬＤＥＶの識別番号（ＬＤＥＶ番号）を割り出す（Ｓ１０１）。続いて、コマンド処理部９０１は、ホスト４からのＩ／Ｏ要求がライト要求であるか否かを判定する（Ｓ１０２）。ライト要求の場合には（Ｓ１０２：ＹＥＳ）、本処理はＳ１０３に移行し、そうでない場合（リード要求）には（Ｓ１０２：ＮＯ）、本処理はＳ１０５へと移行する。
【０１０５】
Ｓ１０３では、コマンド処理部９０１は、キャッシュ／制御メモリ１４のキャッシュ領域の未使用領域にライトデータ（Ｉ／Ｏ要求に従うライト対象のデータ）を格納し、Ｓ１０４で、ホスト４に対して、当該ライト処理が完了したことを通知する。Ｓ１０４の処理は、これよりも後、例えばＳ１０５の後に行ってもよい。Ｓ１０４の時点ではＨＤＤ１６へのデータ書き込みは完了していないが、キャッシュ領域にライトデータが格納された時点で、ホスト４に対して処理完了を通知することで、ライト処理の応答時間を高速化することが出来る。
【０１０６】
Ｓ１０５では、コマンド処理部９０１は、ＲＡＩＤ構成テーブル４００及びＶＤＥＶ構成テーブル５００を参照し、Ｓ１０１で割り出したＬＤＥＶ番号の付与されたＬＤＥＶを含むＶＤＥＶのＲＡＩＤレベルを判定する。
【０１０７】
ＲＡＩＤレベルの値が「０ｘ０ｂ」の場合は（Ｓ１０５：ＹＥＳ）、コマンド処理部９０１は、第一のデータ保護方式に基づいて、Ｓ１０１で割り出したＬＤＥＶ番号の付与されたＬＤＥＶに対するリード乃至ライト処理を実施する（Ｓ１０６）。この処理については、図１５で詳述する。
【０１０８】
一方、ＲＡＩＤレベルの値が「０ｘ０ａ」である場合は（Ｓ１０５：ＮＯ）、コマンド処理部９０１は、第二のデータ保護方式に基づいて、Ｓ１０１で割り出したＬＤＥＶ番号の付与されたＬＤＥＶに対するリード乃至ライト処理を実施する（Ｓ１０７）。この処理については、図１８、１９で詳述する。
【０１０９】
Ｓ１０８で、コマンド処理部９０１は、受信したＩ／Ｏ要求がリード要求であるかを判定する。当該要求がリード要求である場合（Ｓ１０８：ＹＥＳ）、前述のＳ１０６又はＳ１０７の処理によって、ＨＤＤ１６からのリード対象のデータがキャッシュ領域に格納されているので、コマンド処理部９０１は、キャッシュ領域上のリード対象のデータをホスト４に対して返送する（Ｓ１０９）。Ｓ１０８で、当該要求がリード要求ではないと判断された場合には（Ｓ１０８：ＮＯ）、本処理は終了する。
【０１１０】
図１５は、第一のデータ保護方式に基づいたＩ／Ｏ処理のフローチャートである。
【０１１１】
図１５の説明では、Ｉ／Ｏ要求の対象とされたＬＤＥＶを「対象ＬＤＥＶ」と言い、対象ＬＤＥＶを含むＶＤＥＶに属する各ＨＤＤを「対象ＨＤＤ」と言い、ホスト４からのＩ／Ｏ要求で指定されているＬＢＡで特定されるボリューム領域が対応付けられるＨＤＤ上のアドレスを「対象物理アドレス」と呼ぶ。
【０１１２】
Ｓ２０１では、ホスト４からのＩ／Ｏ要求で指定されているＬＢＡが対象物理アドレスに変換される。具体的には、例えば、コマンド処理部９０１が、ＤＫＡ１３に、ホスト４からのＩ／Ｏ要求で指定されているＬＢＡを含んだＩ／Ｏ要求を出し、ＤＫＡ１３内のディスクＩ／Ｏ処理部９０２が、そのＩ／Ｏ要求を受ける。そのＩ／Ｏ要求は、キャッシュ／制御メモリ１４の制御領域に書かれてもよいし、内部スイッチ１５を介してＤＫＡ１３に送信されてもよい。Ｉ／Ｏ要求を受けるＤＫＡ１３は、各対象ＨＤＤ１６に接続されたＤＫＡ１３である。当該ＤＫＡ１３のディスクＩ／Ｏ処理部９０２が、受けたＩ／Ｏ要求中のＬＢＡを対象物理アドレスに変換する。
【０１１３】
Ｓ２０２では、ディスクＩ／Ｏ処理部９０２が、受けたＩ／Ｏ要求が、ライト要求であるかリード要求であるかを判断する。ライト要求である場合には（Ｓ２０２：ＹＥＳ）、本処理はＳ２０３に移行し、リード要求である場合には（Ｓ２０２：ＮＯ）、本処理はＳ２０８に移行する。尚、このＳ２０２の処理は、Ｓ２０１の処理が終了する前に完了されてもよい。
【０１１４】
Ｓ２０３では、ディスクＩ／Ｏ処理部９０２が、キャッシュ領域上に置かれたライト対象のデータの書込みに関係するストライプ（例えば、ライト対象のデータから分割される各データ単位、各データ単位に関連するＰパリティ、或いは、更新される圧縮パリティが書き込まれるストライプ）を、他からアクセスできないようにロックする。ストレージシステム１においては、ホスト４から同時に複数のアクセス要求を扱うため、ライト対象のデータの書込みに関係するストライプへの更新が同時に複数発生する可能性がある。もしPパリティの生成処理途中（Ｓ２０３からＳ２０７の間）で他のアクセス処理により、Ｐパリティの生成に必要なストライプの更新が発生すると、Ｐパリティの内容が矛盾のあるものになるため、それを抑止するためにロック処理を行う。
【０１１５】
Ｓ２０４では、ディスクＩ／Ｏ処理部９０２が、データ単位における新データ要素と、新データ要素に対応する旧データ要素と、新Ｐパリティとから、新Ｐパリティを生成し、その生成した新Ｐパリティをキャッシュ領域に書き込む。尚、この処理が行われる前に、旧データ要素と旧Ｐパリティとがキャッシュ領域に格納されていない場合には、ＨＤＤ１６から読み出される。
【０１１６】
Ｓ２０５では、ディスクＩ／Ｏ処理部９０２が、新データ要素と、旧データ要素と、旧圧縮パリティとから、新圧縮パリティを生成し、その生成した新圧縮パリティをキャッシュ領域に書き込む。尚、この処理が行われる前に、旧圧縮パリティがキャッシュ領域に格納されていない場合、ＨＤＤ１６から読み出される。
【０１１７】
Ｓ２０６では、ディスクＩ／Ｏ処理部９０２が、対象物理アドレスを指定した、新データ要素及び新Ｐパリティのライト要求を、各対象ＨＤＤ１６に送信することにより、新データ要素及び新Ｐパリティを書込む。
【０１１８】
Ｓ２０７では、ディスクＩ／Ｏ処理部９０２が、対象物理アドレスを指定した、新圧縮パリティのライト要求を、各対象ＨＤＤ１６に送信することにより、新圧縮パリティを書き込み、Ｓ２０３でロックしたストライプについてロックの解除を行う。尚、ディスクＩ／Ｏ処理部９０２は、このＳ２０７の処理を行わずに、例えば、所定のタイミングで、キャッシュ領域に書き込まれている更新後の全ての圧縮パリティを同時に、ＨＤＤ１６に書き込むようにしてもよい。
【０１１９】
Ｓ２０８では、ディスクＩ／Ｏ処理部９０２が、各対象ＨＤＤ１６からリード対象のデータを読み出し、その読み出したリード対象のデータをキャッシュ領域に格納する。
【０１２０】
図１６は、第一のデータ保護方式でのリストアの処理のフローチャートである。
【０１２１】
リストアの処理は、ディスクＩ／Ｏ処理部９０２が行う。図１６の説明では、ＲＡＩＤグループに一つの完全障害ＨＤＤがあるとする。図１６の処理において、ディスクＩ／Ｏ処理部９０２は、完全障害ＨＤＤにある全ストライプのデータ要素、Ｐパリティ及び圧縮パリティをリストアする。また、そのリストアの際に、他の一つのＨＤＤのストライプからデータ要素又はＰパリティの読み出しに失敗した場合には（つまり、完全障害ＨＤＤ以外に少なくとも一つの障害ストライプがある場合には）、図１７の処理に移行して、その完全障害ＨＤＤ１６以外のＨＤＤ１６に含まれるデータ要素又はＰパリティのリストアが行われる。
【０１２２】
ディスクＩ／Ｏ処理部９０２は、ＨＤＤの先頭から何番目のストライプ列であるかを表すカウント値（以下、「カウント値Ａ」と記載）と、本リストア処理の最中に適宜に更新される圧縮パリティ（以下、「仮圧縮パリティＲＤ」と記載）を、キャッシュ／制御メモリ１４に記録する。
【０１２３】
Ｓ３０１では、ディスクＩ／Ｏ処理部９０２が、カウント値A及び仮圧縮パリティＲＤの初期値としてそれぞれ０をセットする。
【０１２４】
Ｓ３０２では、ディスクＩ／Ｏ処理部９０２が、カウント値Ａから特定されるストライプ列（先頭からＡ番目のストライプ）における、完全障害ＨＤＤの障害ストライプ（以下、完全障害ストライプ）以外の全てのストライプから、データ要素及びＰパリティ（Ｐパリティは含まない場合もある）を読み出す。即ち、完全障害ＨＤＤ以外のＨＤＤ１６について、先頭からＡ番目のストライプを読み出す。
【０１２５】
Ｓ３０３では、ディスクＩ／Ｏ処理部９０２が、Ｓ３０２における読み出しが成功したかどうかを判断する。その読み出しが成功した場合は（Ｓ３０３：ＹＥＳ）、本処理はＳ３０６に移行し、その読み出しに失敗した場合は（Ｓ３０３：ＮＯ）、本処理はＳ３０４に移行する。
【０１２６】
Ｓ３０４では、ディスクＩ／Ｏ処理部９０２が、Ｓ３０２の処理にて読み出しに失敗したデータ要素及び／又はＰパリティのリストアを行う。この処理は、後に図１７を参照して詳述する。
【０１２７】
Ｓ３０５では、ディスクＩ／Ｏ処理部９０２が、Ｓ３０４におけるリストアが成功したか否かを判断する。リストアが成功した場合は（Ｓ３０４：ＹＥＳ）、本処理はＳ３０６に移行し、リストアに失敗した場合は（Ｓ３０４：ＮＯ）、本処理は終了する。
【０１２８】
Ｓ３０６では、ディスクＩ／Ｏ処理部９０２が、Ｓ３０３にて読み出した或いはＳ３０４にてリストアされたデータ要素及びＰパリティから、それらの排他的論理和を算出することによって、カウント値Aに対応する完全障害ストライプのデータ要素又はＰパリティを生成し、生成されたデータ要素又はＰパリティ（以下、「リストア要素ＮＤ」と記載）をキャッシュ領域に書き込む。
【０１２９】
Ｓ３０７では、ディスクＩ／Ｏ処理部９０２が、キャッシュ領域に記憶されている仮圧縮パリティＲＤとリストア要素ＮＤとの排他的論理和を算出し、算出された値を、仮圧縮ＲＤとする。つまり、仮圧縮パリティＲＤが、リストアされたそのリストア要素ＮＤに基づく最新の仮圧縮パリティＲＤに更新される。
【０１３０】
Ｓ３０８では、ディスクＩ／Ｏ処理部９０２が、リストア要素ＮＤを、スペアＨＤＤにおける、完全障害ＨＤＤ１６における対象ストライプの位置と同じ位置にあるストライプに書き込む。なお、スペアＨＤＤとは、ストレージシステム１に搭載されており、このリストア処理が正常に終了した後、完全障害ＨＤＤ１６と交替で稼働が開始されるＨＤＤ、言い換えれば、完全障害ＨＤＤに代わってＲＡＩＤグループのメンバとなるＨＤＤである。
【０１３１】
Ｓ３０９では、ディスクＩ／Ｏ処理部９０２が、カウント値Ａに１を加える。
【０１３２】
Ｓ３１０では、ディスクＩ／Ｏ処理部９０２が、Ｓ３０９による更新後のカウント値Ａが、通常ストライプ列の数と同じか否かを判断する。カウント値Ａが通常ストライプ列数となっている場合は（Ｓ３１０：ＹＥＳ）、本処理はＳ３１１に移行し、カウント値Ａがストライプ列数未満である場合は（Ｓ３１０：ＮＯ）、本処理はＳ３０２に移行する。カウント値Ａが通常ストライプ列数ということは、完全障害ＨＤＤにおける全ての通常ストライプのリストアが済んでいるということを意味する。Ｓ３１１に移行するということは、仮圧縮パリティＲＤは、完全障害ＨＤＤにおける全ての通常ストライプに対応したデータ要素及びＰパリティに基づく完成した圧縮パリティである。
【０１３３】
Ｓ３１１では、ディスクＩ／Ｏ処理部９０２が、仮圧縮パリティＲＤ（つまり完成した圧縮パリティ）を、スペアのＨＤＤ１６における、完全障害ＨＤＤ１６における特定ストライプと同じ位置にあるストライプに書き込む。
【０１３４】
以上の一連の流れにより、スペアＨＤＤに、完全障害ＨＤＤに記憶されていた全てのデータ要素、Ｐパリティ及び圧縮パリティがリストアされる。
【０１３５】
図１７は、図１６におけるＳ３０４に相当する処理のフローチャートである。
【０１３６】
図１６におけるＳ３０４では、本処理が実施される。本処理において、ディスクＩ／Ｏ処理部９０２は、図１６におけるＳ３０３にて読み出しに失敗したデータ要素又はＰパリティのリストアを行う。本処理は、図１６におけるＳ３０３にて読み出しに失敗したデータ要素又はＰパリティを記憶している障害ストライプを有するＨＤＤ１６、つまり一部障害ＨＤＤについて行われる。図１７では、その障害ストライプに記憶されているデータ要素又はPパリティがリストア対象であるため、以下、その障害ストライプを、「一部障害ストライプ」という。
【０１３７】
まず、ディスクＩ／Ｏ処理部９０２は、ＨＤＤの先頭から何番目のストライプ列であるかを表すカウント値（以下、「カウント値Ｂ」と記載）と、一部障害ストライプに記憶されているデータ要素又はPパリティを算出するまでの途中の一時的な値（以下、「仮リストア要素ＮＤＢ」と記載）とを、キャッシュ領域に書き込む。
【０１３８】
Ｓ４０１では、ディスクＩ／Ｏ処理部９０２が、カウント値Ｂ及び仮リストア要素ＮＤBの初期値としてそれぞれ０をセットする。
【０１３９】
Ｓ４０２では、ディスクＩ／Ｏ処理部９０２が、カウント値Ｂがカウント値Ａと同じかどうかを判断する。カウント値Ｂとカウント値Aが同じである場合は（Ｓ４０２：ＹＥＳ）、本処理はＳ４０６に移行し、カウント値Ｂとカウント値Ａとが異なる場合は（Ｓ４０２：ＮＯ）、本処理はＳ４０３に移行する。
【０１４０】
Ｓ４０３では、ディスクＩ／Ｏ処理部９０２が、カウント値Ｂから特定されるストライプからデータ要素又はPパリティを読み出す。
【０１４１】
Ｓ４０４では、ディスクＩ／Ｏ処理部９０２が、Ｓ４０３における読み出しが成功したかどうかを判断する。その読み出しが成功した場合は（Ｓ４０４：ＹＥＳ）、本処理はＳ４０５に移行し、その読み出しに失敗した場合は（Ｓ４０４：ＮＯ）、本処理はエラー終了となる。そうすると、図１６のＳ３０５でＮＯとなって、リストア処理がエラー終了となる。つまり、一部障害ＨＤＤに障害ストライプが二つ存在すると、第一のデータ保護方式についてリストア処理はエラー終了となる。
【０１４２】
Ｓ４０５では、ディスクＩ／Ｏ処理部９０２が、Ｓ４０３にて読み出したデータ要素又はＰパリティと、既にキャッシュ領域に記憶されている仮リストア要素ＮＤＢとの排他的論理和を算出し、算出された値を、仮リストア要素ＮＤＢとする。つまり、仮リストア要素ＮＤＢが、最新の値に更新される。
【０１４３】
Ｓ４０６では、ディスクＩ／Ｏ処理部９０２が、カウント値Ｂに１を加える。
【０１４４】
Ｓ４０７では、ディスクＩ／Ｏ処理部９０２が、カウント値Ｂと通常ストライプ列数とが同じか否かを判断する。同じであれば（Ｓ４０７：ＹＥＳ）、本処理はＳ４０８に移行し、違っていれば（Ｓ４０７：ＮＯ）、本処理はＳ４０２に移行する。同じであるということは、一部障害ＨＤＤにおける一つの障害ストライプ以外の全ての通常ストライプに記憶されているデータ要素及びＰパリティを基に生成された仮リストア要素ＮＤＢは、その障害ストライプに記憶されているデータ要素又はＰパリティとなっている。言い換えれば、障害ストライプに記憶されているデータ要素又はＰパリティが、キャッシュ領域にリストアされていることになる。
【０１４５】
Ｓ４０８では、ディスクＩ／Ｏ処理部９０２が、仮リストア要素ＮＤＢ、つまり、キャッシュ領域にリストアされている、障害ストライプに記憶されているデータ要素又はＰパリティを、一部障害ＨＤＤ１６内の交換セクタに書き込む。交換セクタとは、ＨＤＤに設けられている予備的なストライプである。以後は、障害ストライプの代わりに、その予備的なストライプを、当該ＨＤＤにおけるＡ番目のストライプとすることができる。
【０１４６】
図１８は、第二のデータ保護方式に基づいたＩ／Ｏ処理のフローチャートである。
【０１４７】
図１５の説明と同様に、図１８，１９の説明では、Ｉ／Ｏ要求の対象とされたＬＤＥＶを「対象ＬＤＥＶ」と言い、対象ＬＤＥＶを含むＶＤＥＶに属する各ＨＤＤを「対象ＨＤＤ」と言い、ホスト４からのＩ／Ｏ要求で指定されているＬＢＡで特定されるボリューム領域が対応付けられるＨＤＤ上のアドレスを「対象物理アドレス」と呼ぶ。
【０１４８】
Ｓ５０１の処理は、図１５におけるＳ２０１と同じ処理である。即ち、Ｓ５０１では、ホスト４からのＩ／Ｏ要求で指定されているＬＢＡが対象物理アドレスに変換される。
【０１４９】
Ｓ５０２では、図１５におけるＳ２０２の処理と同様に、ディスクＩ／Ｏ処理部９０２が、受けたＩ／Ｏ要求が、ライト要求であるかリード要求であるかを判断する。ライト要求である場合には（Ｓ５０２：ＹＥＳ）、本処理はＳ５０３に移行し、リード要求である場合には（Ｓ５０２：ＮＯ）、本処理はＳ５０９に移行する。
【０１５０】
Ｓ５０３では、ディスクＩ／Ｏ処理部９０２が、キャッシュ領域上に置かれたライト対象のデータの書込みに関係するストライプ（例えば、ライト対象のデータが分割されたデータ単位、それに対応するＱパリティ等の書込み先のストライプ）を、他からアクセスできないようにロックする。
【０１５１】
Ｓ５０４では、ディスクＩ／Ｏ処理部９０２が、ライト対象データのサイズが、データ単位のサイズ以上であるか否かを判定する。ライト対象データのサイズがデータ単位のサイズよりも小さい場合は（Ｓ５０４：ＮＯ）、本処理はＳ５０５に移行し、ライト対象データのサイズがデータ単位のサイズ以上である場合は（Ｓ５０４：ＹＥＳ）、本処理はＳ５０８に移行する。
【０１５２】
Ｓ５０５では、ディスクＩ／Ｏ処理部９０２が、データ単位における新データ要素と、その新データ要素に対応する旧データ要素と、旧Ｑパリティとから、新Ｑパリティを生成し、その生成した新Ｑパリティをキャッシュ領域に書き込む。尚、この処理が行われる前に、旧データ要素と旧Ｑパリティとがキャッシュ領域に格納されていない場合、ＨＤＤ１６から読み出される。
【０１５３】
Ｓ５０６では、ディスクＩ／Ｏ処理部９０２が、新データ要素と、旧データ要素と、旧圧縮パリティとから、新圧縮パリティを生成し、その生成した新圧縮パリティをキャッシュ領域に書き込む。尚、この処理が行われる前に、旧圧縮パリティがキャッシュ領域に格納されていない場合、ＨＤＤ１６から読み出される。
【０１５４】
Ｓ５０７では、ディスクＩ／Ｏ処理部９０２が、対象物理アドレスを指定した、新データ要素、新Ｑパリティ及び新圧縮パリティのライト要求を、各対象ＨＤＤ１６に送信することにより、新データ要素、新Ｑパリティ及び新圧縮パリティを書込む。
【０１５５】
Ｓ５０８では、ディスクＩ／Ｏ処理部９０２が、ライト対象のデータがデータ単位以上の場合のライト処理を行う。この処理については、後に図１９を参照して詳述する。
【０１５６】
Ｓ５０９では、図１５におけるＳ２０８の処理と同様に、ディスクＩ／Ｏ処理部９０２が、各対象ＨＤＤ１６からリード対象のデータを読み出し、その読み出したリード対象のデータをキャッシュ領域に格納する。
【０１５７】
図１９は、図１８におけるＳ５０８に相当する処理のフローチャートである。
【０１５８】
図１８におけるＳ５０８では、本処理が実施される。
【０１５９】
Ｓ６０１では、ディスクＩ／Ｏ処理部９０２が、キャッシュ領域上に置かれたライト対象のデータに対応した各データ単位を用いて、新Ｑパリティを生成し、その生成した新Ｑパリティをキャッシュ領域に書き込む。尚、データ単位の構成によっては（例えば、一つのデータ要素しか更新されないといった場合には）、図１８におけるＳ５０５の処理と同様の処理によって、新Ｑパリティが生成されてもよい。
【０１６０】
Ｓ６０２では、ディスクＩ／Ｏ処理部９０２が、キャッシュ領域に記憶されているデータ単位の数が、所定数（一つの圧縮パリティに対応するデータ単位数）以上か否かを判定する。所定数以上のデータ単位がキャッシュ領域上に置かれている場合は（Ｓ６０２：ＹＥＳ）、本処理はＳ６０３に移行し、所定数以上のデータ単位がキャッシュ領域上に置かれていない場合は（Ｓ６０２：ＮＯ）、本処理はＳ６０５に移行する。
【０１６１】
Ｓ６０３では、ディスクＩ／Ｏ処理部９０２が、キャッシュ領域に記憶されている複数のデータ単位に対応した複数のＰパリティを生成し、生成した複数のＰパリティを一つに圧縮した新圧縮パリティを生成し、キャッシュ領域に書き込む。なお、もし、データ単位の数が、一つの圧縮パリティに対応するデータ単位の数で割り切れない場合（余りが生じる場合）、余りの分のデータ単位については、Ｓ６０５、Ｓ６０６で示された処理によって新圧縮パリティを生成する。あるいは今後新たに書き込まれるデータ単位或いは既存のデータ単位等を利用して、新圧縮パリティが生成されても良い。
【０１６２】
Ｓ６０５では、ディスクＩ／Ｏ処理部９０２が、旧データ要素と、旧圧縮パリティとをＨＤＤ１６から読み出す。
【０１６３】
Ｓ６０６では、図１８におけるＳ５０６の処理と同様に、ディスクＩ／Ｏ処理部９０２が、新データ要素と、旧データ要素と、旧圧縮パリティとから、それらの排他的論理和をとることによって、新圧縮パリティを生成し、その生成した新圧縮パリティをキャッシュ領域に書き込む。
【０１６４】
Ｓ６０７では、図１８におけるＳ５０７の処理と同様に、ディスクＩ／Ｏ処理部９０２が、対象物理アドレスを指定した、新データ要素、新Ｑパリティ及び新圧縮パリティのライト要求を、各対象ＨＤＤ１６に送信することにより、新データ要素、新Ｑパリティ及び新圧縮パリティを書込む。
【０１６５】
図２０は、第二のデータ保護方式でのリストアの処理のフローチャートである。
【０１６６】
図２０の説明では、図１６の場合と同様に、ＲＡＩＤグループに一つの完全障害ＨＤＤがあるとする。図２０の処理において、ディスクＩ／Ｏ処理部９０２は、完全障害ＨＤＤにある全ストライプのデータ要素、Ｑパリティ及び圧縮パリティをリストアする。
【０１６７】
ディスクＩ／Ｏ処理部９０２は、ＨＤＤの先頭から何番目のストライプ列であるかを表すカウント値（以下、「カウント値Ａ」と記載）を、キャッシュ／制御メモリ１４に記録する。
【０１６８】
Ｓ７０１では、ディスクＩ／Ｏ処理部９０２が、カウント値Aを０にセットする。
【０１６９】
Ｓ７０２では、ディスクＩ／Ｏ処理部９０２は、カウント値Ａから特定されるストライプ列における、完全障害ＨＤＤの障害ストライプ（以下、完全障害ストライプ）が、圧縮パリティが書き込まれる特定ストライプであるか否かを判定する。カウント値Ａに対応した完全障害ストライプが、特定ストライプである場合は（Ｓ７０２：ＹＥＳ）、本処理はＳ７０７に移行する。カウント値Ａに対応した完全障害ストライプが、特定ストライプでない場合は（Ｓ７０２：ＮＯ）、本処理はＳ７０３に移行する。
【０１７０】
Ｓ７０３では、ディスクＩ／Ｏ処理部９０２が、カウント値Ａから特定されるストライプ列における完全障害ストライプ以外の全てのストライプから、データ要素及びＱパリティ（Ｑパリティは含まない場合もある）を読み出す。
【０１７１】
Ｓ７０４では、ディスクＩ／Ｏ処理部９０２が、Ｓ７０３における読み出しが成功したかどうかを判断する。その読み出しが成功した場合は（Ｓ７０４：ＹＥＳ）、本処理はＳ７０５に移行し、その読み出しに失敗した場合は（Ｓ７０４：ＮＯ）、本処理はＳ７０７に移行する。
【０１７２】
Ｓ７０５では、ディスクＩ／Ｏ処理部９０２が、Ｓ７０３にて読み出したデータ要素及びＱパリティを用いて、完全障害ストライプのデータ要素又はＱパリティを生成し、そのデータ要素又はＱパリティを、スペアのＨＤＤ１６における、完全障害ＨＤＤ１６における、カウント値Ａに対応した完全障害ストライプの位置と同じ位置にあるストライプに書き込む。
【０１７３】
Ｓ７０６では、ディスクＩ／Ｏ処理部９０２が、カウント値Ａに１を加える。
【０１７４】
Ｓ７０７では、ディスクＩ／Ｏ処理部９０２が、Ｓ７０２：ＹＥＳの場合は、カウント値Ａに対応した完全障害ストライプ（特定ストライプ）について、Ｓ７０４：ＮＯの場合は、Ｓ７０３にて読み出しに失敗したデータ要素又はＱパリティが記憶されているストライプ（以下、便宜上「一部障害ストライプ」という）について、ストライプ障害チェックテーブル８００における、それらのストライプに対応するカラム８０２のフラグをＯＮにする。
【０１７５】
Ｓ７０８では、ディスクＩ／Ｏ処理部９０２が、カウント値Ａが、ＨＤＤ内のストライプ列数と等しくなっているか否かを判断する。カウント値Ａがストライプ列数となっている場合は（Ｓ７０８：ＹＥＳ）、本処理はＳ７０９に移行し、カウント値Ａがストライプ列数となっていない場合は（Ｓ７０８：ＮＯ）、本処理はＳ７０２に移行する。
【０１７６】
Ｓ７０９では、ディスクＩ／Ｏ処理部９０２が、未だリストアされていないデータ要素及びＱパリティ、すなわち、Ｓ７０７にてストライプ障害チェックテーブル８００に障害が発生したものとしてフラグがＯＮにされたストライプに記憶されているデータ要素及びＱパリティ（言い換えれば、一部障害ＨＤＤにおけるデータ要素及びＱパリティ）をリストアする。この処理については、後に図２１を参照して詳述する。
【０１７７】
Ｓ７１０では、ディスクＩ／Ｏ処理部９０２が、Ｓ７０９にてリストアの対象としたデータ要素及びＱパリティのリストアが、成功したが否かを判断する。リストアが成功した場合は（Ｓ７１０：ＹＥＳ）、本処理はＳ７１１に移行し、リストアに失敗した場合は（Ｓ７１０：ＮＯ）、本処理は終了する。
【０１７８】
Ｓ７１１では、ディスクＩ／Ｏ処理部９０２が、完全障害ＨＤＤ１６に含まれる全ての圧縮パリティをリストアする。
【０１７９】
図２１は、図２０におけるＳ７０９に相当する処理のフローチャートである。
【０１８０】
図２０におけるＳ７０９では、本処理が実施される。
【０１８１】
Ｓ８０１では、ディスクＩ／Ｏ処理部９０２が、ストライプ障害チェックテーブル８００のカラム８０２のフラグがＯＮであるストライプの中から、一つのストライプを選択する。この選択されたストライプが、図２１における対象ストライプとなる。
【０１８２】
Ｓ８０２では、ディスクＩ／Ｏ処理部９０２が、対象ストライプが、圧縮パリティが書き込まれるストライプであるか否かを判定する。対象ストライプが、圧縮パリティが書き込まれるストライプである場合は（Ｓ８０２：ＹＥＳ）、本処理はＳ８１１に移行し、対象ストライプが、圧縮パリティが書き込まれるストライプでない場合は（Ｓ８０２：ＮＯ）、本処理はＳ８０３に移行する。
【０１８３】
Ｓ８０３では、ディスクＩ／Ｏ処理部９０２が、対象ストライプが属するデータ単位及びそれに対応するＱストライプを、二つの障害ストライプ以外のストライプから読み出す。このため、読み出しに成功したとしても、Ｑパリティは含まない場合もある。なお、「対象ストライプが属するデータ単位」とは、対象ストライプに記憶されているデータ要素を含んだデータ単位、又は、対象ストライプに記憶されているＱパリティに対応したデータ単位である。また、「二つの障害ストライプ」とは、完全障害ストライプと、それと同じデータ単位に属する一部障害ストライプであり、いずれか一方の障害ストライプが対象ストライプである。
【０１８４】
Ｓ８０４では、ディスクＩ／Ｏ処理部９０２が、Ｓ８０３における読み出しが成功したかどうかを判断する。その読み出しが成功した場合は（Ｓ８０４：ＹＥＳ）、本処理はＳ８０５に移行し、その読み出しに失敗した場合は（Ｓ８０４：ＮＯ）、本処理は終了する。
【０１８５】
Ｓ８０５では、ディスクＩ／Ｏ処理部９０２が、対象ストライプが属するデータ単位に対応するＰパリティを生成するために必要な全てのデータ（即ち、そのデータ単位が対応する圧縮パリティ、及び、その圧縮パリティに対応する他の全てのデータ単位）を読み出す。
【０１８６】
Ｓ８０６では、ディスクＩ／Ｏ処理部９０２が、Ｓ８０５における読み出しが成功したかどうかを判断する。その読み出しが成功した場合は（Ｓ８０６：ＹＥＳ）、本処理はＳ８０７に移行し、その読み出しに失敗した場合は（Ｓ８０６：ＮＯ）、本処理は終了する。
【０１８７】
Ｓ８０７では、ディスクＩ／Ｏ処理部９０２が、Ｓ８０５にて読み出したデータ単位及び圧縮パリティから、それらの排他的論理和をとることによって、対象ストライプが属するデータ単位に対応したＰパリティを生成する。
【０１８８】
Ｓ８０８では、ディスクＩ／Ｏ処理部９０２が、Ｓ８０３にて読み出したデータ要素及びＱパリティと、Ｓ８０７にて生成したＰパリティとから、ＲＡＩＤ６と同様の手法で、二つの障害ストライプにおける二つのデータ要素をリストアする。
【０１８９】
Ｓ８０９では、ディスクＩ／Ｏ処理部９０２が、Ｓ８０８にてリストアされたデータ要素又はＱパリティを、スペアのＨＤＤ１６上の、完全障害ＨＤＤ１６における完全障害ストライプの位置と同じ位置にあるストライプと、別のスペアＨＤＤ１６上の、一部障害ＨＤＤ１６における一部障害ストライプの位置と同じ位置にあるストライプとに、それぞれ書き込む。なお、Ｓ８０８にてリストアされたデータ要素又はＱパリティが一部障害ＨＤＤ１６にあったものである場合、リストアされたデータ要素またはＱパリティの書込み先は、スペアＨＤＤに代えて、一部障害ＨＤＤの交替セクタであっても良い。
【０１９０】
Ｓ８１０では、ディスクＩ／Ｏ処理部９０２が、ストライプ障害チェックテーブル８００における、対象ストライプを含んだ２つの障害ストライプに対応する、カラム８０２の２つのフラグをＯＦＦにセットする。
【０１９１】
Ｓ８１１では、ディスクＩ／Ｏ処理部９０２が、ストライプ障害チェックテーブル８００のカラム８０２のフラグがＯＮであるストライプ（圧縮パリティが書き込まれないもの）が、あるかないかを判断する。そのようなストライプがある場合は（Ｓ８１１：ＹＥＳ）、本処理はＳ８０１に移行し、そのようなストライプがない場合は（Ｓ８１１：ＮＯ）、本処理は終了する。
【０１９２】
図２２は、図２０におけるＳ７１１に相当する処理のフローチャートである。
【０１９３】
図２０におけるＳ７１１では、本処理が実施される。
【０１９４】
Ｓ９０１では、図２１におけるＳ８０１の処理と同様に、ディスクＩ／Ｏ処理部９０２が、ストライプ障害チェックテーブル８００のカラム８０２のフラグがＯＮであるストライプの中から、一つのストライプを選択する。この選択されたストライプ（図２２における対象ストライプ）は、圧縮パリティが書き込まれるストライプである。
【０１９５】
Ｓ９０２では、ディスクＩ／Ｏ処理部９０２が、対象ストライプに記憶されている圧縮パリティをリストアするために必要な全てのデータ単位を、ＨＤＤ１６から読み出し、それらのデータ単位に対応した複数のＰパリティを基に、圧縮パリティをリストアする。
【０１９６】
Ｓ９０３では、ディスクＩ／Ｏ処理部９０２が、Ｓ９０２にてリストアした圧縮パリティを、スペアのＨＤＤ１６上の、完全障害ＨＤＤ１６における対象ストライプの位置と同じ位置にあるストライプに書き込む。なお、リストアした圧縮パリティが一部障害ＨＤＤに書き込まれていたものである場合には、書込み先はスペアＨＤＤに代えて、一部障害ＨＤＤの交替セクタであっても良い。
【０１９７】
Ｓ９０４では、ディスクＩ／Ｏ処理部９０２が、ストライプ障害チェックテーブル８００における、対象ストライプに対応する、カラム８０２のフラグをＯＦＦにセットする。
【０１９８】
Ｓ９０５では、ディスクＩ／Ｏ処理部９０２が、ストライプ障害チェックテーブル８００のカラム８０２のフラグがＯＮであるストライプが、あるかないかを判断する。そのようなストライプがある場合は（Ｓ９０５：ＹＥＳ）、本処理はＳ９０１に移行し、そのようなストライプがない場合は（Ｓ９０５：ＮＯ）、本処理は終了する。
【０１９９】
上述した本発明の実施形態は、本発明の説明のための例示であり、本発明の範囲をその実施形態にのみ限定する趣旨ではない。本発明は、その要旨を逸脱することなく、その他の様々な態様でも実施することができる。例えば、上記の例では、一ストライプ列を構成するストライプがＨＤＤと１対１に対応しているが、一ストライプ列を構成する各二以上のストライプが一つのＨＤＤに対応しても良い。また、第二のデータ保護方式では、Ｑパリティに代えて、Ｐパリティが、データ単位毎に記録され、複数のＰパリティに代えて、複数のＱパリティが、一つの圧縮パリティに圧縮されてＲＡＩＤグループに書き込まれても良い。
【図面の簡単な説明】
【０２００】
【図１】本発明の一実施形態に係るストレージシステムの物理的な構成を示す図である。
【図２】本実施形態に係るストレージシステム１の論理的な構成例を示す図である。
【図３】ＲＡＩＤグループを構成する複数のＨＤＤと論理ボリュームとの関係性の一例を示す図である。
【図４】ＲＡＩＤ構成テーブルの構成例を示す図である。
【図５】ＶＤＥＶ構成テーブルの構成例を示す図である。
【図６】ＬＵ構成テーブルの構成例を示す図である。
【図７】ＨＤＤ障害チェックテーブルの構成例を示す図である。
【図８】ストライプ障害チェックテーブルの構成例を示す図である。
【図９】第一のデータ保護方式での書込みの説明図である。
【図１０】第一のデータ保護方式でのリストアの説明図である。
【図１１】第二のデータ保護方式での書込みの説明図である。
【図１２】第二のデータ保護方式での書込みのより詳細な説明図である。
【図１３】第二のデータ保護方式でのリストアの説明図である。
【図１４】ストレージシステムがホストからＩ／Ｏ要求を受信した場合にコマンド処理部が行う処理のフローチャートである。
【図１５】第一のデータ保護方式に基づいたＩ／Ｏ処理のフローチャートである。
【図１６】第一のデータ保護方式でのリストアの処理のフローチャートである。
【図１７】図１６におけるＳ３０４に相当する処理のフローチャートである。
【図１８】第二のデータ保護方式に基づいたＩ／Ｏ処理のフローチャートである。
【図１９】図１８におけるＳ５０８に相当する処理のフローチャートである。
【図２０】第二のデータ保護方式でのリストアの処理のフローチャートである。
【図２１】図２０におけるＳ７０９に相当する処理のフローチャートである。
【図２２】図２０におけるＳ７１１に相当する処理のフローチャートである。
【図２３】ＨＤＤ内の記憶媒体上のセクタ配置例の説明図である。
【符号の説明】
【０２０１】
１…ストレージシステム、４…ホストコンピュータ、５…ＦＣスイッチ、６…管理端末、１１…ＣＨＡ、１３…ＤＫＡ、１４…キャッシュ／制御メモリ、１５…内部スイッチ、１６…ＨＤＤ、９０１…コマンド処理部、９０２…ディスクＩ／Ｏ処理部、９０３…論理物理変換部
【図１】
2009098996.tif 000003
【図２】
2009098996.tif 000004
【図３】
2009098996.tif 000005
【図４】
2009098996.tif 000006
【図５】
2009098996.tif 000007
【図６】
2009098996.tif 000008
【図７】
2009098996.tif 000009
【図８】
2009098996.tif 000010
【図９】
2009098996.tif 000011
【図１０】
2009098996.tif 000012
【図１１】
2009098996.tif 000013
【図１２】
2009098996.tif 000014
【図１３】
2009098996.tif 000015
【図１４】
2009098996.tif 000016
【図１５】
2009098996.tif 000017
【図１６】
2009098996.tif 000018
【図１７】
2009098996.tif 000019
【図１８】
2009098996.tif 000020
【図１９】
2009098996.tif 000021
【図２０】
2009098996.tif 000022
【図２１】
2009098996.tif 000023
【図２２】
2009098996.tif 000024
【図２３】
2009098996.tif 000025