(57)【特許請求の範囲】
【請求項１】
複数の記憶デバイスと、
前記複数の記憶デバイス及びホスト計算機に接続され、前記ホスト計算機に仮想ボリュームを提供するストレージコントローラと、
を備え、
前記複数の記憶デバイスの夫々は、複数の不揮発性半導体メモリと、前記複数の不揮発性半導体メモリに部分的に発生する障害を管理し、前記複数の不揮発性半導体メモリの一部に関連付けられた論理アドレス空間を前記ストレージコントローラに提供するデバイスコントローラと、を含み、
前記ストレージコントローラは、前記複数の記憶デバイスの夫々の論理アドレス空間を記憶し、前記複数の記憶デバイスの中の２以上の記憶デバイスである第１記憶デバイスグループを使用して第１ＲＡＩＤグループを構成し、前記第１ＲＡＩＤグループの中の論理記憶領域を複数のページに分割し、前記ホスト計算機から前記仮想ボリュームへのライト要求に基づいて前記第１ＲＡＩＤグループの中の前記複数のページの１つを前記仮想ボリュームに割り当て、
前記第１記憶デバイスグループの中の一つの記憶デバイスである第１記憶デバイスのデバイスコントローラは、前記複数の不揮発性半導体メモリ内の部分的な障害を検出した場合、前記検出された障害を示す第１障害情報を前記ストレージコントローラへ送信し、
前記ストレージコントローラは、前記第１障害情報を受信した場合、前記第１障害情報に基づいて、前記第１記憶デバイスの論理アドレス空間の中から削減される論理アドレス範囲である第１削減領域を決定し、前記第１ＲＡＩＤグループの中で前記第１削減領域に対応する第１論理記憶領域を特定し、前記仮想ボリュームの中から前記第１論理記憶領域を割り当てられている特定仮想記憶領域を特定し、前記複数の記憶デバイスの一部が割り当てられている複数の論理記憶領域の中から、前記仮想ボリュームに割り当てられていない第２論理記憶領域を選択し、前記第１論理記憶領域に格納されているデータを前記第１論理記憶領域から前記第２論理記憶領域へ移動させ、前記第２論理記憶領域を前記特定仮想記憶領域に割り当て、前記第１記憶デバイスグループの中の夫々の記憶デバイスの論理アドレス空間から前記第１削減領域に対応する論理アドレス範囲を削減する、
ストレージ装置。
【請求項２】
前記ストレージコントローラは、前記第１障害情報を受信した場合、前記第１障害情報に基づいて、前記第１記憶デバイスに格納されているデータのうち、前記検出された障害により失われたデータである障害データを特定し、前記第１記憶デバイスグループの中の前記第１記憶デバイス以外の記憶デバイスに格納されているデータに基づいて、前記障害データを回復し、前記回復された障害データを前記第１記憶デバイスへ書き込み、前記書き込みの後、前記第１論理記憶領域に格納されているデータを前記第１論理記憶領域から前記第２論理記憶領域へ移動させる、
請求項１に記載のストレージ装置。
【請求項３】
前記ストレージコントローラは、前記複数の記憶デバイスの夫々の論理アドレス空間の中でＲＡＩＤグループに使用されていない論理アドレス範囲である交替領域を示す交替領域情報を記憶し、前記交替領域のサイズが前記第１削減領域のサイズ以上であり且つ前記交替領域が前記複数の記憶デバイスの中で前記第１記憶デバイスグループ以外の記憶デバイスから提供されていることを条件とし、前記条件を満たす前記交替領域が前記交替領域情報に示されているか否かを判定し、前記条件を満たす前記交替領域が前記交替領域情報に示されていると判定した場合、前記第１削減領域の代わりに前記交替領域を使用する、
請求項２に記載のストレージ装置。
【請求項４】
前記第１記憶デバイスのデバイスコントローラは、前記第１記憶デバイスのうち、前記検出された障害が発生した部分を閉塞する、
請求項３に記載のストレージ装置。
【請求項５】
前記デバイスコントローラは、前記複数の不揮発性半導体メモリから前記ストレージコントローラへ提供する論理アドレス空間のサイズであるユーザ容量を記憶し、前記記憶されたユーザ容量を前記ストレージコントローラへ送信し、
前記ストレージコントローラは、前記送信されたユーザ容量を受信し、前記受信されたユーザ容量を記憶する、
請求項４に記載のストレージ装置。
【請求項６】
前記ストレージコントローラは、前記第１障害情報を受信した場合、前記第１記憶デバイスのユーザ容量から前記第１削減領域のサイズを削減する指示を前記第１記憶デバイスへ送信し、
前記第１記憶デバイスのデバイスコントローラは、前記指示に応じて、前記第１記憶デバイスのユーザ容量から前記第１削減領域のサイズを削減する、
請求項５に記載のストレージ装置。
【請求項７】
前記ストレージコントローラは、前記第１記憶デバイスグループの中の記憶デバイスのユーザ容量の最小値である最小使用可能容量を検出し、前記第１記憶デバイスグループ内の各記憶デバイスの最小使用可能容量分を用いて前記第１ＲＡＩＤグループを作成する、
請求項６に記載のストレージ装置。
【請求項８】
前記ストレージコントローラは、前記複数の記憶デバイスのうち、前記第１記憶デバイスグループと異なる２以上の記憶デバイスである第２記憶デバイスグループを使用して第２ＲＡＩＤグループを作成し、
前記ストレージコントローラは、前記第２記憶デバイスグループの中の第２記憶デバイスから、前記第２記憶デバイス内の障害を示す第２障害情報を受信した場合、前記第２障害情報に基づいて、前記第２記憶デバイスの論理アドレス空間の中から削減される論理アドレス範囲である第２削減領域を決定し、前記第２記憶デバイスグループの中の前記第２記憶デバイス以外の記憶デバイスの論理アドレス空間の中で前記第２削減領域に対応する論理アドレス範囲である関連領域を特定し、前記関連領域を前記交替領域として前記交替領域情報へ登録する、
請求項３に記載のストレージ装置。
【請求項９】
前記複数の記憶デバイスは、ＲＡＩＤグループに使用されていない記憶デバイスである代替記憶デバイスを含み、
前記ストレージコントローラは、前記代替記憶デバイス内の論理アドレス範囲を、前記交替領域として前記交替領域情報へ登録する、
請求項３に記載のストレージ装置。
【請求項１０】
ホスト計算機に仮想ボリュームを提供するストレージコントローラが、複数の記憶デバイスの夫々の中の複数の不揮発性半導体メモリの一部に関連付けられ且つ前記ストレージコントローラへ提供される論理アドレス空間を記憶し、前記複数の記憶デバイスの中の２以上の記憶デバイスである第１記憶デバイスグループを使用して第１ＲＡＩＤグループを構成し、前記第１ＲＡＩＤグループの中の論理記憶領域を複数のページに分割し、前記ホスト計算機から前記仮想ボリュームへのライト要求に基づいて前記第１ＲＡＩＤグループの中の前記複数のページの１つを前記仮想ボリュームに割り当て、
前記第１記憶デバイスグループの中の一つの記憶デバイスである第１記憶デバイスのデバイスコントローラが、前記複数の不揮発性半導体メモリ内の部分的な障害を検出した場合、前記検出された障害を示す第１障害情報を前記ストレージコントローラへ送信し、
前記ストレージコントローラが、前記第１障害情報を受信した場合、前記第１障害情報に基づいて、前記第１記憶デバイスの論理アドレス空間の中から削減される論理アドレス範囲である第１削減領域を決定し、前記第１ＲＡＩＤグループの中で前記第１削減領域に対応する第１論理記憶領域を特定し、前記仮想ボリュームの中から前記第１論理記憶領域を割り当てられている特定仮想記憶領域を特定し、前記複数の記憶デバイスの一部が割り当てられている複数の論理記憶領域の中から、前記仮想ボリュームに割り当てられていない第２論理記憶領域を選択し、前記第１論理記憶領域に格納されているデータを前記第１論理記憶領域から前記第２論理記憶領域へ移動させ、前記第２論理記憶領域を前記特定仮想記憶領域に割り当て、前記第１記憶デバイスグループの中の夫々の記憶デバイスの論理アドレス空間から前記第１削減領域に対応する論理アドレス範囲を削減する、
ことを備えるストレージ装置制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、不揮発性半導体メモリを有するストレージ装置に関する。
【背景技術】
【０００２】
近年、企業で扱われるデータ量の増大に伴い、ストレージ装置は多数の記憶デバイスを備え、記憶デバイスの容量も年々増大している。記憶デバイスとして、一般にＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）が搭載されているが、近年、ＨＤＤに代わって、記憶媒体として不揮発性半導体メモリ（例えば、フラッシュメモリ）を有する記憶デバイス（例えばＳＳＤ：Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）が注目されている。ＳＳＤは、ＨＤＤに比べて高価であるがＩ／Ｏ処理が非常に高速である。【０００３】
フラッシュメモリでは、物理的な記憶領域は、ブロックと呼ばれる単位で管理されており、データの消去はこのブロック単位で行われる。ブロックを消去可能な回数には上限があり、消去回数が増加すると、フラッシュメモリにデータが書き込めなくなる場合や、フラッシュメモリに書き込まれたデータのエラー発生率が増大する場合がある。つまり、フラッシュメモリには寿命があり、多数のフラッシュメモリを有するＳＳＤにも寿命がある。また、フラッシュメモリでは、一般にダイやチップなどの単位で品質にばらつきが生じる。品質が悪いダイは、所定の消去回数未満でも障害により使用できなくなる。複数のダイにこのような障害が発生すると、ユーザデータを格納する記憶領域を確保できなくなり、記憶デバイスを閉塞せざるを得なくなる。このように、所定の期間よりも早期にＳＳＤが使用不能になると、交換の頻度が増加し、ＳＳＤの購入や保守のためのコストが発生する可能性がある。【０００４】
例えば、特許文献１には、ＳＳＤ内のブロックに障害が発生した場合のデータ復旧技術が開示されている。複数のＳＳＤを有するストレージ装置において、或るＳＳＤ内のブロックの障害が検出されると、障害ブロックを含むＳＳＤの全データを別のＳＳＤにリビルドする技術が知られている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許第８０４１９９１号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１の技術では、記憶デバイス内の不揮発性半導体メモリの一部に障害が発生した場合、他に品質が良く使用可能な部分（メモリのダイやチップ）が多数存在していても、その記憶デバイスは閉塞されるため、その記憶デバイスを交換する必要があった。記憶デバイスが大容量化すると、部分的に障害が発生しても依然として使用可能な容量も大きいことになる。このため、一部の障害に対して記憶デバイス全体を閉塞すると、無駄が多い。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明の一態様であるストレージ装置は、複数の記憶デバイスと、前記複数の記憶デバイス及びホスト計算機に接続され、前記ホスト計算機に仮想ボリュームを提供するストレージコントローラと、を備える。前記複数の記憶デバイスの夫々は、複数の不揮発性半導体メモリと、前記複数の不揮発性半導体メモリに部分的に発生する障害を管理し、前記複数の不揮発性半導体メモリに関連付けられた論理記憶領域を前記ストレージコントローラに提供するデバイスコントローラと、を含む。前記ストレージコントローラは、前記複数の記憶デバイスの夫々に対して、前記論理記憶領域のうち前記ストレージコントローラにより使用可能な容量である使用可能容量を記憶し、前記複数の記憶デバイスの中の第１記憶デバイスグループを使用して第１ＲＡＩＤグループを構成し、前記第１ＲＡＩＤグループの中の論理記憶領域を複数のページに分割し、前記ホスト計算機から前記仮想ボリュームへのライト要求に基づいて前記第１ＲＡＩＤグループの中の前記複数のページの１つを前記仮想ボリュームに割り当てる。前記デバイスコントローラは、前記複数の不揮発性半導体メモリ内の部分的な障害を検出し、前記検出された障害を示す障害情報を前記ストレージコントローラへ送信する。前記ストレージコントローラは、前記第１記憶デバイスグループの中の第１記憶デバイスから、前記第１記憶デバイス内の障害を示す第１障害情報を受信した場合、前記第１障害情報に基づいて前記第１記憶デバイスの使用可能容量を削減する。
【発明の効果】
【０００８】
本発明の一態様によれば、記憶デバイス内の不揮発性半導体メモリの一部に障害が発生した場合に、格納可能なデータ容量を削減することでその記憶デバイス全体の閉塞を防ぎ、記憶デバイスを継続して使用することができる。
【図面の簡単な説明】
【０００９】
【図１】本発明の実施例１の計算機システムの構成を示す。
【図２】ＦＭＰＫ３００の構成を示す。
【図３】ストレージシステム１００におけるＲＧ（ＲＡＩＤ  Ｇｒｏｕｐ）及びＬＵ（Ｌｏｇｉｃａｌ  Ｕｎｉｔ）の構成を示す。
【図４】ストレージシステム１００におけるＬＵ及びＶＶＯＬ（Ｖｉｒｔｕａｌ  Ｖｏｌｕｍｅ：仮想ボリューム）の構成を示す。
【図５】ストレージコントローラ４００のメモリ４２０に格納される情報を示す。
【図６】ＲＧ管理テーブル６２０を示す。
【図７】ＬＵ管理テーブル６３０を示す。
【図８】仮想ページマッピング管理テーブル６５０を示す。
【図９】実ページ状態管理テーブル６６０を示す。
【図１０】ＰＤＥＶ管理テーブル６４０を示す。
【図１１】ＦＭＰＫ３００の論理ページ及び物理ページの構成を示す。
【図１２】ＦＭ−ＣＴＬ５００のメモリ５２０に格納される情報を示す。
【図１３】ページマッピング管理テーブル７２０を示す。
【図１４】ＦＭＰＫ状態管理テーブル７３０を示す。
【図１５】障害アドレスリスト７５０を示す。
【図１６】現在ユーザ容量取得処理を示す。
【図１７】ＲＧ作成処理を示す。
【図１８】ＦＭ−ＣＴＬ５００によるヘルスチェック処理を示す。
【図１９】ＦＭ−ＣＴＬ５００による全ページチェック処理を示す。
【図２０】定期監視処理を示す。
【図２１】データ回復処理を示す。
【図２２】容量縮退処理を示す。
【図２３】データ移動処理を示す。
【図２４】実ページ張替え処理を示す。
【図２５】実ページ張替え処理を模式的に示す。
【図２６】ＦＭＰＫ容量変更処理を示す。
【図２７】容量縮退処理を模式的に示す。
【図２８】実施例２のストレージコントローラ４００のメモリ４２０に格納される情報を示す。
【図２９】実施例２のＰＤＥＶ管理テーブル６４０ｂを示す。
【図３０】ＰＤＥＶ交替領域管理テーブル６７０を示す。
【図３１】実施例２の定期監視処理を示す。
【図３２】交替領域判定処理を示す。
【図３３】実施例２の交替領域の登録及び割り当てを模式的に示す。
【図３４】実施例３の交替領域の割り当てを模式的に示す。
【図３５】実施例４のＲＡＩＤ構成の変更を模式的に示す。
【発明を実施するための形態】
【００１０】
実施形態の概要を説明する。本実施形態では、記憶デバイス内の不揮発性半導体メモリにダイ等の単位で障害が発生した場合に、記憶デバイス全体を閉塞せずにダイ単位で閉塞し、ユーザデータを格納する容量を削減して記憶デバイスを継続して使用する。ストレージコントローラは記憶デバイスに格納可能なユーザデータの容量の変化を認識する必要があるため、記憶デバイスは容量の変化をストレージコントローラに通知する。そして、ストレージコントローラは、障害箇所のデータの復旧や削減した容量分のデータを他の記憶デバイスに移動させる等の処理を行う。本実施形態の詳細は以下に説明する。
【実施例１】
【００１１】
以下、本実施例の計算機システムの構成について説明する。【００１２】
図１は、本発明の実施例１の計算機システムの構成を示す。【００１３】
この計算機システムは、ストレージシステム（ストレージ装置）１００と、複数のホスト計算機２００とを有する。複数のホスト計算機２００の夫々は、ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）２１０を介して、ストレージシステム１００に接続されている。計算機システムは、一つ以上のホスト計算機２００を有していても良い。【００１４】
ストレージシステム１００は、二つのストレージコントローラ（ＤＫＣ：Ｄｉｓｋ  Ｃｏｎｔｒｏｌｌｅｒ）４００と、複数のＦＭＰＫ（Ｆｌａｓｈ  Ｍｅｍｏｒｙ  Ｐａｃｋａｇｅ）３００とを有する。ストレージコントローラ４００は例えば、複数の記憶デバイスをＲＡＩＤグループとして制御するコントローラである。二つのストレージコントローラ４００は、冗長化されており、通常時には一方のストレージコントローラ４００がストレージシステム１００を制御し、そのストレージコントローラ４００の障害発生時に他方のストレージコントローラ４００がストレージシステム１００の制御を継続させる。ＦＭＰＫ３００に加えて、ＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  Ｓｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ）−ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、ＳＡＴＡ（Ｓｅｒｉａｌ  Ａｄｖａｎｃｅｄ  Ｔｅｃｈｎｏｌｏｇｙ  Ａｔｔａｃｈｍｅｎｔ）−ＨＤＤ等、他の記憶デバイスが用いられても良い。以後の説明及び図面において、このような記憶デバイスをＰＤＥＶ（Ｐｈｙｓｉｃａｌ  Ｄｅｖｉｃｅ）と呼ぶことがある。【００１５】
ストレージコントローラ４００は、ホスト計算機２００に仮想ボリュームを提供する。ストレージコントローラ４００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４１０と、メモリ４２０と、ホストＩ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４３０と、ディスクＩ／Ｆ４４０とを有する。ストレージコントローラ４００内の各部は、バスを介して互いに接続されている。メモリ４２０は、ストレージシステム１００を制御するためのプログラムを格納する。また、メモリ４２０は、記憶デバイスから読み出されたデータや記憶デバイスに書き込まれるデータを一時的に格納するキャッシュメモリとしての領域を有する。ＣＰＵ４１０は、メモリ４２０に格納されたプログラムに従ってストレージシステム１００を制御する。ホストＩ／Ｆ４３０は、ＳＡＮ２１０に接続され、ホスト計算機２００とのデータの送受信を行う。ディスクＩ／Ｆ４４０は、ＦＭＰＫ３００に接続され、ＦＭＰＫ３００とのデータの送受信を行う。【００１６】
図２は、ＦＭＰＫ３００の構成を示す。【００１７】
ＦＭＰＫ３００は、ＦＭ−ＣＴＬ（Ｆｌａｓｈ  Ｍｅｍｏｒｙ  Ｃｏｎｔｒｏｌｌｅｒ、デバイスコントローラ）５００と、複数のメモリモジュール３１０とを有する。ＦＭ−ＣＴＬ５００は、ＣＰＵ５１０と、メモリ５２０と、上位Ｉ／Ｆ５３０と、複数のＦＭ  Ｉ／Ｆ５４０とを有する。ＦＭ−ＣＴＬ５００内の各部は、バスを介して互いに接続されている。メモリ５２０は、ＦＭＰＫ３００を制御するためのプログラムを格納する。また、メモリ５２０は、ＦＭチップから読み出されたデータやＦＭチップに書き込まれるデータを格納する。ＣＰＵ５１０は、メモリ５２０に格納されたプログラムに従ってＦＭＰＫ３００を制御する。【００１８】
一つのＦＭ  Ｉ／Ｆ５４０には、一つのメモリモジュール３１０が接続されている。ＦＭ  Ｉ／Ｆ５４０は、複数のＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）コントローラ５４１を有する。メモリモジュール３１０は、複数のスイッチ（ＳＷ）５６０と、複数のＦＭチップ５７０とを有する。一つのＤＭＡコントローラ５４１には、一つのスイッチ５６０が接続されている。一つのスイッチ５６０には、複数のＦＭチップ５７０が接続されている。ＦＭチップ５７０は、複数のダイ（Ｄｉｅ）５７１を有する。ダイ５７１は、複数のブロックを有する。ＤＭＡコントローラ５４１は、ＦＭチップ５７０との通信を制御する。以後の説明及び図面において、ＦＭチップ５７０を単にチップと呼ぶことがあり、ＤＭＡコントローラ５４１を単にＤＭＡと呼ぶことがある。【００１９】
チップにおいては、ページ、ブロック、ダイ、プレーン等の単位で障害が発生する可能性がある。障害の発生率は、フラッシュメモリの品質によって異なりうる。また、ＤＭＡが故障すれば、ＤＭＡ単位でチップにアクセスすることができなくなる。ページ、ブロック、プレーン、ダイ、チップ、ＤＭＡに障害が発生した場合、物理記憶領域の容量から障害部位毎に所定の容量が削減される。本実施例では、各ページの容量、各ブロックの容量、各ダイの容量、各チップの容量、各ＤＭＡに接続されるチップ数は等しいものとする。ただし、それぞれの容量が異なっていてもよい。【００２０】
ＦＭ−ＣＴＬ５００は、ＦＭＰＫ３００内の論理アドレス空間をストレージコントローラ４００に提供する。論理アドレス空間には、ＦＭＰＫ３００内の物理記憶領域が対応付けられる。ＦＭＰＫ３００の外部に提供される論理記憶空間に対応する物理記憶領域をユーザ領域とよぶ。論理アドレス空間は、ＦＭＰＫ３００内部で所定のサイズの論理ページに区切って管理される。ＦＭ−ＣＴＬ５００は、ストレージコントローラ４００から論理アドレスを指定したリード／ライト要求を受信すると、論理アドレスから物理ページを特定し、データのリード／ライトを実行する。また、ＦＭ−ＣＴＬ５００は、ＦＭＰＫ３００に部分的に発生する障害を管理する。【００２１】
フラッシュメモリの物理記憶領域は、複数のブロックを含み、各ブロックは複数のページを含む。ブロックはデータの消去の単位であり、ページはデータの書き込み及び読み出しの単位である。つまり、ＦＭ−ＣＴＬ５００は、ブロック単位でデータを消去し、ページ単位でデータの書き込み及び読み出しを制御する。【００２２】
また、フラッシュメモリは、データの上書きができないという特性がある。このため、ＦＭ−ＣＴＬ５００は、あるページに格納されているデータを更新するデータ（更新データ）を受信すると、更新データをデータが格納されていない空きページへ書き込む。そして、論理ページと更新前のページの対応関係を、その論理ページと更新後のページの対応関係に変更する。このため、ストレージコントローラ４００はアクセス先の論理アドレスを変更する必要はない。【００２３】
そして、ＦＭ−ＣＴＬ５００は、更新前のデータを無効データ、更新後のデータを有効データとして管理する。無効データが消去されると、無効データが格納されていたページは空きページとなり、データを書き込むことが可能になる。ただし、消去はブロック単位で行われる。ブロック内に有効データと無効データが混在している場合、ＦＭ−ＣＴＬ５００は有効データを他の空きページにコピーして、そのブロック内のデータの消去を行う。この有効データのコピーとブロックの消去処理を、リクラメーションと呼ぶ。【００２４】
このように、フラッシュメモリでは、空きページが存在しない場合、ブロック単位でデータの消去を行わなければ新たにデータを書き込むことができない。また、消去処理が実行されると、消去処理が終わるまでデータを書き込むことができないため書き込み性能が低下し、消去処理そのもののオーバーヘッドによる性能低下も発生する。そこで、フラッシュメモリを記憶媒体とする記憶デバイスでは、更新データを書き込む領域（更新領域）が設けられる。更新領域の容量が大きいほど、リクラメーションの頻度が小さくなり、性能が維持される。ただし、更新領域の容量が大きいと、ユーザデータを格納する領域（ユーザ領域）の容量は小さくなる。つまり、ユーザ領域の容量と更新領域の容量の比率によって、ストレージコントローラ４００がＦＭＰＫ３００に格納可能なデータ容量と性能の関係が決まることになる。【００２５】
以下の説明及び図面において、ユーザ領域の容量をユーザ容量と呼び、更新領域の容量を更新容量と呼び、ユーザ容量と更新容量の合計を物理容量と呼ぶことがある。本実施例において、障害の発生に伴いユーザ容量及び更新容量は変化する。本実施例では、ユーザ容量と更新容量の比率を一定に保って、容量を変化させる。これにより、容量を削減した場合であっても、性能を維持することができる。【００２６】
なお、ユーザ領域と更新領域は物理的に区別されている必要はない。例えば、あるブロックがユーザ領域として使用された後に消去された場合、次は更新領域として使用されてもよい。【００２７】
図３は、ストレージシステム１００におけるＲＧ（ＲＡＩＤ  Ｇｒｏｕｐ）及びＬＵ（Ｌｏｇｉｃａｌ  Ｕｎｉｔ）の構成を示す。【００２８】
ストレージコントローラ４００は、複数のＰＤＥＶを用いてＲＧを構築する。この図の例において、ストレージコントローラ４００は、ＰＤＥＶ＃０〜＃１５の中から、ＰＤＥＶ＃０〜＃３を用いて、ＲＧ＃０を構築し、ＰＤＥＶ＃８〜＃１５を用いて、ＲＧ＃１を構築する。各ＲＧは、複数のストライプを有する。各ストライプは、複数のＰＤＥＶに跨り、複数のデータと複数のデータから生成されるパリティを含む。例えばＲＡＩＤ５の場合、複数のＰＤＥＶにおけるデータとパリティの配置はストライプ毎に異なる。３Ｄ＋１ＰのＲＡＩＤ５の構成であれば、１つのストライプには３つのデータと３つのデータから生成されるパリティとが含まれる。ストレージコントローラ４００が、パリティの生成を行う。更にストレージコントローラ４００は、ＲＧ内の記憶領域をＬＵに割り当てる。この図の例において、ストレージコントローラ４００は、ＲＧ＃０をＬＵ＃０、＃１に割り当て、ＲＧ＃１をＬＵ＃２に割り当てる。【００２９】
図４は、ストレージシステム１００におけるＬＵ及びＶＶＯＬ（Ｖｉｒｔｕａｌ  Ｖｏｌｕｍｅ：仮想ボリューム）の構成を示す。【００３０】
ストレージコントローラ４００は、ＬＵを所定のサイズの論理記憶領域である実ページに分割して管理する。ストレージコントローラ４００は、実ページをプールに登録して管理する。ストレージコントローラ４００は、ホスト計算機２００に対してＶＶＯＬを提供する。ストレージコントローラ４００は、ＶＶＯＬ内の仮想的なアドレス空間を所定のサイズの仮想記憶領域である仮想ページに分割して管理する。ストレージコントローラ４００は、Ｔｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ機能により、ホスト計算機２００からの書き込み要求に応じて、書き込み要求で指定されたＶＶＯＬ内のアドレスの範囲が含まれる仮想ページへ、プールから実ページを割り当てる。ストレージコントローラ４００は、実ページの仮想ページへの割り当てを解除すると、その実ページをプールへ戻す。この図の例において、ストレージコントローラ４００は、ＬＵ＃０〜＃２内の実ページをプール＃０、＃１に登録する。更にストレージコントローラ４００は、プール＃０、＃１内の実ページをＶＶＯＬ＃０、＃１内の仮想ページに割り当てる。【００３１】
図５は、ストレージコントローラ４００のメモリ４２０に格納される情報を示す。【００３２】
メモリ４２０は、ストレージ制御プログラム６１０と、ＲＧ管理テーブル６２０と、ＬＵ管理テーブル６３０と、ＰＤＥＶ管理テーブル６４０と、仮想ページマッピング管理テーブル６５０と、実ページ状態管理テーブル６６０とを格納する。【００３３】
ストレージ制御プログラム６１０は、ストレージシステム１００の制御をＣＰＵ４１０に実行させるためのプログラムである。【００３４】
図６は、ＲＧ管理テーブル６２０を示す。【００３５】
ＲＧ管理テーブル６２０は、ＲＧ毎のエントリを有する。或るＲＧのエントリは、当該ＲＧを示すＲＧ番号（ＲＧ＃）６２１と、当該ＲＧに属するＰＤＥＶを示すＰＤＥＶ番号（ＰＤＥＶ＃）６２２と、当該ＲＧのＲＡＩＤレベル６２３と、当該ＲＧに属するＰＤＥＶの種別であるＰＤＥＶ種別６２４と、当該ＲＧに属するＰＤＥＶのユーザ容量の最小値であるＰＤＥＶ最小容量６２５とを有する。【００３６】
図７は、ＬＵ管理テーブル６３０を示す。【００３７】
ＬＵ管理テーブル６３０は、ＬＵ毎のエントリを有する。或るＬＵのエントリは、当該ＬＵを示すＬＵ番号（ＬＵ＃）６３１と、当該ＬＵに割り当てられているＲＧを示すＲＧ番号（ＲＧ＃）６３２と、当該ＬＵのストライプサイズ６３３と、当該ＲＧ内の論理アドレス空間で当該ＬＵの開始アドレスであるＬＵ開始アドレス６３４と、当該ＬＵのサイズであるＬＵサイズ６３５とを有する。【００３８】
図８は、仮想ページマッピング管理テーブル６５０を示す。【００３９】
仮想ページマッピング管理テーブル６５０は、仮想ページ毎のエントリを有する。或る仮想ページのエントリは、当該仮想ページが属するＶＶＯＬを示すＶＶＯＬ番号（ＶＶＯＬ＃）６５１と、当該仮想ページを示す仮想ページＩＤ６５２と、当該仮想ページに割り当てられている実ページを示す実ページＩＤ６５３とを有する。当該仮想ページに実ページが割り当てられていない場合、実ページＩＤ６５３は「未割り当て」であることを示す。仮想ページＩＤ６５２は、ストレージシステム１００内でユニークな識別子である。実ページＩＤ６５３は、ストレージシステム１００内でユニークな識別子である。【００４０】
図９は、実ページ状態管理テーブル６６０を示す。【００４１】
実ページ状態管理テーブル６６０は、実ページ毎のエントリを有する。或る実ページのエントリは、当該実ページが属するプールを示すプール番号（ＰＯＯＬ＃）６６１と、当該実ページを示す実ページＩＤ６６２と、当該実ページの状態６６３とを有する。状態６６３は、仮想ページに割り当てられている（使用中）か否かを示す。【００４２】
図１０は、ＰＤＥＶ管理テーブル６４０を示す。【００４３】
ＰＤＥＶ管理テーブル６４０は、ＰＤＥＶ毎のエントリを有する。或るＰＤＥＶのエントリは、当該ＰＤＥＶを示すＰＤＥＶ番号（ＰＤＥＶ＃）６４１と、当該ＰＤＥＶの現在のユーザ容量である現在ユーザ容量６４２と、当該ＰＤＥＶの初期のユーザ容量である初期ユーザ容量６４３と、当該ＰＤＥＶの論理アドレス空間（ＦＭＰＫ論理アドレス空間）におけるユーザ領域の開始アドレス６４４と、当該ＰＤＥＶの論理アドレス空間におけるユーザ領域の終端アドレス６４５とを有する。ＦＭＰＫ論理アドレス空間は例えば、ＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）で表される。【００４４】
図１１は、ＦＭＰＫ３００の論理ページ及び物理ページの構成を示す。【００４５】
ＦＭ−ＣＴＬ５００は、論理アドレス空間９１１を、ストレージコントローラ４００に提供し、論理アドレス空間９１１を所定のサイズ（例えば８ｋＢ）の論理ページ９１２に分割して管理する。ＦＭ−ＣＴＬ５００は、ブロックを、所定のページサイズの物理ページ９１３に分割して管理する。ＦＭ−ＣＴＬ５００は、物理ページ９１３を論理ページ９１２に割り当てる。ブロック９１４は、所定数の物理ページ９１３を有する。ＦＭ−ＣＴＬ５００は、ＦＭチップ５７０に対するデータの読み書きを物理ページ９１３単位で行い、ＦＭチップ５７０に対する消去をブロック９１４単位で行う。【００４６】
図１２は、ＦＭ−ＣＴＬ５００のメモリ５２０に格納される情報を示す。【００４７】
メモリ５２０は、ＦＭＰＫ制御プログラム７１０と、ページマッピング管理テーブル７２０と、ＦＭＰＫ状態管理テーブル７３０と、ユーザ容量比率７４１と、物理容量７４２と、現在ユーザ容量７４３と、初期ユーザ容量７４４と、ユーザ容量下限７４５と、障害アドレスリスト７５０を格納する。ユーザ容量比率７４１と、物理容量７４２と、初期ユーザ容量７４４と、ユーザ容量下限７４５とは予め定められ、メモリ５２０に格納される。現在ユーザ容量７４３は、動作開始時には初期ユーザ容量７４４と等しいが、ＦＭＰＫ３００内の物理記憶領域に障害が発生すると減少する。ユーザ容量比率７４１は、障害の無い物理記憶領域（ユーザ領域及び更新領域）の全容量に対する現在ユーザ容量７４３の比率である。本実施例において、ユーザ容量比率７４１は、一定である。【００４８】
図１３は、ページマッピング管理テーブル７２０を示す。【００４９】
ページマッピング管理テーブル７２０は、論理ページ毎のエントリを有する。或る論理ページのエントリは、当該論理ページを示す論理ページ番号７２１と、当該論理ページに割り当てられている物理ページを示す物理ページ番号７２２とを有する。当該論理ページに物理ページが割り当てられていない場合、物理ページ番号７２２は、未割当を示す。【００５０】
図１４は、ＦＭＰＫ状態管理テーブル７３０を示す。【００５１】
ＦＭＰＫ状態管理テーブル７３０は、ＤＭＡ毎のＤＭＡ管理テーブル８１０を有する。【００５２】
或るＤＭＡのＤＭＡ管理テーブル８１０は、当該ＤＭＡを示すＤＭＡ番号（ＤＭＡ＃）８１１と、当該ＤＭＡのＳｔａｔｕｓ８１２と、当該ＤＭＡに属する全てのチップの内の不良チップ数８１３と、当該ＤＭＡに属する総チップ数８１４と、当該ＤＭＡに属するチップ毎のチップ管理テーブル８２０とを有する。Ｓｔａｔｕｓ８１２は、当該ＤＭＡが使用可能であればＧｏｏｄを示し、そうでなければＢａｄを示す。【００５３】
或るチップのチップ管理テーブル８２０は、当該チップを示すチップ番号（Ｃｈｉｐ＃）８２１と、当該チップのＳｔａｔｕｓ８２２と、当該チップ内の全てのダイの内の不良ダイ数８２３と、当該チップ内の総ダイ数８２４と、当該チップ内のダイ毎のダイ管理テーブル８３０とを有する。Ｓｔａｔｕｓ８２２は、当該チップが使用可能であればＧｏｏｄを示し、そうでなければＢａｄを示す。【００５４】
或るダイのダイ管理テーブル８３０は、当該ダイを示すダイ番号（Ｄｉｅ＃）８３１と、当該ダイのＳｔａｔｕｓ８３２と、当該ダイ内の全てのブロックの内の不良ブロック数８３３と、当該ダイ内で論理ページに割り当て済みのブロックの数である割当ブロック数８３４と、当該ダイ内の総ブロック数８３５と、当該ダイ内のブロック毎のブロック管理テーブル８４０とを有する。Ｓｔａｔｕｓ８３２は、当該ダイが使用可能であればＧｏｏｄを示し、そうでなければＢａｄを示す。【００５５】
或るブロックのブロック管理テーブル８４０は、当該ブロックを示すブロック番号（Ｂｌｏｃｋ＃）８４１と、当該ブロックのＳｔａｔｕｓ８４２と、当該ブロック内の総ページ数８４３と、当該ブロック内の全てのページの内のデータを格納している（使用中）ページの数であるＩｎ−ｕｓｅ８４４と、使用中ページの内の有効ページの数であるＶａｌｉｄ８４５と、使用中ページの内の無効ページの数であるＩｎｖａｌｉｄ８４６とを有する。Ｓｔａｔｕｓ８４２は、当該ブロックが使用可能で且つデータを格納していれば「割り当て済（Ａｌｏｃａｔｅｄ）」を示し、当該ブロックが使用可能で且つデータを格納していなければ「未割り当て」を示す。更にＳｔａｔｕｓ８４２は、当該ブロックに障害がある場合に「故障」を示し、当該ブロックの書き換え回数が閾値を超過した場合に「寿命」を示す。【００５６】
本実施例では、ＤＭＡ、チップ、ダイ、ブロック単位の障害を例として説明するが、プレーンなど、他の物理的な単位での障害の発生を管理してもよい。【００５７】
図１５は、障害アドレスリスト７５０を示す。【００５８】
障害アドレスリスト７５０は、ＦＭＰＫ３００において、障害が発生した物理記憶領域に対応するＦＭＰＫ論理アドレス空間内の論理アドレス領域（論理アドレス範囲）である障害領域毎のエントリを有する。或るエントリは、当該障害領域の開始ＬＢＡである障害アドレス７５１と、当該障害領域の長さであるレングス７５２とを有する。【００５９】
物理記憶領域に障害が発生すると、その物理記憶領域に格納されたデータが消失する。ＦＭ−ＣＴＬ５００は、消失したデータを復元することができない。このため、ＦＭ−ＣＴＬ５００は、障害が発生した物理記憶領域に対応する論理アドレス領域を特定し、ストレージコントローラ４００に通知することで、ストレージコントローラ４００はデータを復元することができる。ストレージコントローラ４００は、物理記憶領域の障害を認識できないため、ＦＭ−ＣＴＬ５００から論理アドレス領域を取得できない場合は、ＦＭＰＫ３００内の全データを復元する必要がある。ＦＭＰＫ３００の容量が大きいほど、データの復元処理には時間がかかり、その間は冗長性が低下した状態となる。しかし、本実施例のようにＦＭ−ＣＴＬ５００がストレージコントローラ４００に特定の論理アドレス領域を通知することで、適切な範囲のデータを復元することができるため、短時間でデータの復元処理を完了することができ、冗長性が低下する時間を短縮することでストレージシステムの信頼性が向上する。【００６０】
以下、ストレージシステム１００の動作について説明する。【００６１】
図１６は、現在ユーザ容量取得処理を示す。【００６２】
ストレージコントローラ４００は、対象ＦＭＰＫの現在ユーザ容量を取得する現在ユーザ容量取得処理を実行する。ストレージコントローラ４００は、ＦＭＰＫ３００をストレージシステム１００へインストールする場合に、そのＦＭＰＫ３００を対象ＦＭＰＫとして現在ユーザ容量を取得する。ストレージコントローラ４００は、定期的に現在ユーザ容量更新処理を行ってもよい。【００６３】
ストレージコントローラ４００は、対象ＦＭＰＫへ容量問い合わせコマンドを送信することにより、対象ＦＭＰＫから現在ユーザ容量を受信し（Ｓ４１１０）、受信された現在ユーザ容量によりＰＤＥＶ管理テーブル６４０において対象ＦＭＰＫの現在ユーザ容量６４２を更新し（Ｓ４１２０）、この処理を終了する。【００６４】
ＦＭ−ＣＴＬ５００は、ストレージコントローラ４００から容量問い合わせコマンドを受信すると（Ｓ４２１０）、メモリ５２０内の現在ユーザ容量７４３をストレージコントローラ４００へ送信し（Ｓ４２２０）、この処理を終了する。以上が現在ユーザ容量取得処理である。【００６５】
現在ユーザ容量取得処理によれば、ストレージコントローラ４００は、ＦＭＰＫ３００の現在ユーザ容量を取得することができる。【００６６】
図１７は、ＲＧ作成処理を示す。【００６７】
ストレージコントローラ４００は、複数のＦＭＰＫ３００を用いて新たなＲＧを作成する場合に、複数のＦＭＰＫ３００の夫々についてＲＧに用いる容量を決定し、ＲＧを作成するＲＧ作成処理を実行する。【００６８】
ストレージコントローラ４００は、ＰＤＥＶ管理テーブル６４０から、ＲＧに属するＦＭＰＫ３００の現在ユーザ容量６４２の最小値を検出して、当該ＲＧのＰＤＥＶ最小容量とする（Ｓ４３１０）。その後、ストレージコントローラ４００は、当該ＲＧに属する全てのＦＭＰＫ３００の夫々の内でＰＤＥＶ最小容量分の論理アドレス領域を用いて当該ＲＧを作成し、そのＰＤＥＶ最小容量を、ＲＧ管理テーブル６２０内の当該ＲＧのＰＤＥＶ最小容量６２５へ入力し（Ｓ４３２０）、この処理を終了する。以上がＲＧ作成処理である。ストレージコントローラ４００は、ＲＧに属する複数のＰＤＥＶに対して、データをストライピングして格納する。ストライピングしてデータを格納するためには、ＲＧ内の各ＰＤＥＶに同じサイズの空き容量が必要となる。つまり、あるＰＤＥＶに空き容量がなければ、ＲＧ内の他のＰＤＥＶに空き容量があってもデータを格納することはできない。よって、あるＰＤＥＶのユーザ容量が削減されると、ＲＧ内の他のＰＤＥＶに空き容量があっても、ＲＧとしてはデータを格納できない。このため、ストレージコントローラ４００は、ＰＤＥＶ最小容量にあわせて、ＲＧを作成する。【００６９】
ＲＧ作成処理によれば、ＲＧに属するＦＭＰＫ３００の現在ユーザ容量に合わせて、適切な容量のＲＧを作成することができる。【００７０】
図１８は、ＦＭ−ＣＴＬ５００によるヘルスチェック処理を示す。【００７１】
ＦＭ−ＣＴＬ５００は、定期的にバックグラウンドで、ＦＭＰＫ３００の状態を検出するヘルスチェック処理を実行する。【００７２】
ＦＭ−ＣＴＬ５００は、ＦＭＰＫ３００において、全てのＤＭＡのＳｔａｔｕｓ８１２と、全てのチップのＳｔａｔｕｓ８２２と、全てのダイのＳｔａｔｕｓ８３２とを検出する全ページチェック処理を実行する（Ｓ１１１０）。ＦＭ−ＣＴＬ５００は、全ページチェック処理により、障害のあるＤＭＡ、チップ、ダイの検出を行う。ＦＭ−ＣＴＬ５００は、全ページチェック処理の結果を、ＦＭＰＫ状態管理テーブル７３０に保存する。全ページチェック処理については後述する。【００７３】
その後、ＦＭ−ＣＴＬ５００は、ＦＭＰＫ状態管理テーブル７３０に基づいて、Ｓｔａｔｕｓ８１２がＢａｄであるＤＭＡ（Ｂａｄ  ＤＭＡ）があるか否かを判定する（Ｓ１１２０）。Ｂａｄ  ＤＭＡがあると判定された場合（Ｓ１１２０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、Ｂａｄ  ＤＭＡを閉塞し（Ｓ１１５０）、この処理を終了する。そうでない場合（Ｓ１１２０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、Ｓｔａｔｕｓ８２２がＢａｄであるチップ（Ｂａｄ  Ｃｈｉｐ）があるか否かを判定する（Ｓ１１３０）。Ｂａｄ  Ｃｈｉｐがあると判定された場合（Ｓ１１３０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、Ｂａｄ  Ｃｈｉｐを閉塞し（Ｓ１１６０）、この処理を終了する。そうでない場合（Ｓ１１３０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、Ｓｔａｔｕｓ８３２がＢａｄであるダイ（Ｂａｄ  Ｄｉｅ）があるか否かを判定する（Ｓ１１４０）。Ｂａｄ  Ｄｉｅがあると判定された場合（Ｓ１１４０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、Ｂａｄ  Ｄｉｅを閉塞し（Ｓ１１７０）、この処理を終了する。そうでない場合（Ｓ１１４０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、この処理を終了する。以上がヘルスチェック処理である。【００７４】
ＦＭ−ＣＴＬ５００は、ヘルスチェック処理の結果に基づき、障害が発生した物理記憶領域に含まれる物理ページに有効データが格納されているか、無効データが格納されているかを判断する。有効データが格納された物理ページに障害が発生した場合は、そのデータを回復する必要があるためである。有効データが格納されている物理ページの番号は、ページマッピング管理テーブル７２０に記録されているため、ページマッピング管理テーブル７２０を用いて、有効データが格納されている物理ページ番号に対応する論理ページ番号を特定することができる。そして、論理ページ番号からＦＭＰＫ論理アドレス空間上の論理アドレス領域を特定し、障害アドレスリスト７５０としてメモリ５２０内に保存する。ＦＭ−ＣＴＬ５００は、障害が発生した物理記憶領域に対応する論理アドレス領域を障害アドレスリスト７５０に保存し、それをストレージコントローラ４００に通知して、ストレージコントローラ４００から回復したデータを受け取ることができる。障害が発生した物理ページに無効データが格納されていた場合、そのデータを回復する必要はないため、障害アドレスリスト７５０には保存しない。また、閉塞した物理記憶領域の容量を物理容量７４２から減算し、メモリ５２０に保存する。【００７５】
なお、ＦＭ−ＣＴＬ５００は、物理ページ番号のリストをメモリ５２０に保存し、物理ページ毎に有効データが格納されているか、無効データが格納されているかを管理してもよい。さらに、ＦＭ−ＣＴＬ５００は、このリストに、物理ページ番号に対応付けられている論理ページ番号を保存してもよい。ＦＭ−ＣＴＬ５００は、物理ページの障害を検出した場合、このリストを用いて有効データが格納されている物理ページに対応する論理ページを特定することができる。【００７６】
ヘルスチェック処理によれば、障害が発生した部分だけを閉塞することにより、他の部分へのアクセスを許すことができる。【００７７】
図１９は、ＦＭ−ＣＴＬ５００による全ページチェック処理を示す。【００７８】
前述のＳ１１１０において、ＦＭ−ＣＴＬ５００は全ページチェック処理を実行する。ＦＭ−ＣＴＬ５００は、この全ページチェック処理の結果をＦＭＰＫ状態管理テーブル７３０に保存する。つまり、ＤＭＡやチップ等の単位毎に、障害の有無を保存する。【００７９】
ＦＭ−ＣＴＬ５００は、ＦＭＰＫ３００内の全てのＤＭＡの中から未選択の一つのＤＭＡを選択する（Ｓ１５１０）。ＦＭ−ＣＴＬ５００は、選択されたＤＭＡに属する全てのチップの中から未選択の一つのチップを選択する（Ｓ１５２０）。ＦＭ−ＣＴＬ５００は、選択されたチップ内の全てのダイの中から未選択の一つのダイを選択する（Ｓ１５３０）。【００８０】
その後、ＦＭ−ＣＴＬ５００は、選択されたダイ内の全ての割り当て済ブロックの中の全ての割り当て済ページのＲｅａｄを実行する（Ｓ１６１０）。その後、ＦＭ−ＣＴＬ５００は、そのＲｅａｄの結果、アンコレクタブルエラーが発生したブロックをＢａｄ  Ｂｌｏｃｋと認識する（Ｓ１６２０）。なお、Ｂａｄ  Ｂｌｏｃｋの条件に、他の条件が用いられても良い。その後、ＦＭ−ＣＴＬ５００は、選択されたダイ内の全ての割り当て済ブロックがＢａｄ  Ｂｌｏｃｋである場合に、そのダイをＢａｄ  Ｄｉｅと判定する（Ｓ１６３０）。なお、Ｂａｄ  Ｄｉｅの条件に、他の条件が用いられても良い。例えば、ＦＭ−ＣＴＬ５００は、選択されたダイ内の割り当て済ブロックの内、所定の数以上のブロックがＢａｄ  Ｂｌｏｃｋである場合にそのダイをＢａｄ  Ｄｉｅと判定しても良い。【００８１】
その後、ＦＭ−ＣＴＬ５００は、選択されたチップ内の全てのダイの選択が終了したか否かを判定する（Ｓ１６４０）。全てのダイの選択が終了していないと判定された場合（Ｓ１６４０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、処理をＳ１５３０へ移行させる。【００８２】
全てのダイの選択が終了したと判定された場合（Ｓ１６４０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、選択されたチップ内の全てのダイがＢａｄ  Ｄｉｅである場合に、そのチップをＢａｄ  Ｃｈｉｐと判定する（Ｓ１６５０）。なお、Ｂａｄ  Ｃｈｉｐの条件に、他の条件が用いられても良い。例えば、ＦＭ−ＣＴＬ５００は、選択されたチップ内のダイの内、所定の数以上のダイがＢａｄ  Ｄｉｅである場合にそのチップをＢａｄ  Ｃｈｉｐと判定しても良い。【００８３】
その後、ＦＭ−ＣＴＬ５００は、選択されたＤＭＡに属する全てのチップの選択が終了したか否かを判定する（Ｓ１６６０）。全てのチップの選択が終了していないと判定された場合（Ｓ１６６０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、処理をＳ１５２０へ移行させる。【００８４】
全てのチップの選択が終了したと判定された場合（Ｓ１６６０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、選択されたＤＭＡに属する全てのチップがＢａｄ  Ｃｈｉｐである場合に、そのチップをＢａｄ  ＤＭＡと判定する（Ｓ１６７０）。なお、Ｂａｄ  ＤＭＡの条件に、他の条件が用いられても良い。例えば、ＦＭ−ＣＴＬ５００は、選択されたＤＭＡに属するチップの内、所定の数以上のチップがＢａｄ  Ｃｈｉｐである場合にそのＤＭＡをＢａｄ  ＤＭＡと判定しても良い。【００８５】
その後、ＦＭ−ＣＴＬ５００は、ＦＭＰＫ３００内の全てのＤＭＡの選択が終了したか否かを判定する（Ｓ１６８０）。全てのＤＭＡの選択が終了していない場合（Ｓ１６８０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、処理をＳ１５１０へ移行させる。【００８６】
全てのＤＭＡの選択が終了したと判定された場合（Ｓ１６８０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、この処理を終了する。以上が全ページチェック処理である。【００８７】
全ページチェック処理によれば、ＦＭ−ＣＴＬ５００は、ＦＭＰＫ３００内の障害のある部分を検出することができる。【００８８】
図２０は、定期監視処理を示す。【００８９】
ストレージコントローラ４００は、定期的に、ＦＭＰＫ３００の一つを対象ＦＭＰＫとして選択し、対象ＰＤＥＶの状態を取得する定期監視処理を実行する。ストレージコントローラ４００は、定期的に、全ＰＤＥＶのそれぞれに対して、定期監視処理を実行する。【００９０】
ストレージコントローラ４００は、ＰＤＥＶ監視コマンドを対象ＦＭＰＫへ発行する（Ｓ２１１０）。ＰＤＥＶ監視コマンドを受信したＦＭ−ＣＴＬ５００は、ＰＤＥＶ監視コマンドの応答として障害アドレスリスト７５０をストレージコントローラ４００へ送信する。その後、ストレージコントローラ４００は、対象ＦＭＰＫから障害アドレスリスト７５０を受信する（Ｓ２１２０）。その後、ストレージコントローラ４００は、障害アドレスリスト７５０に基づいて障害を検出したか否かを判定する（Ｓ２１３０）。障害を検出していないと判定された場合（Ｓ２１３０：Ｎｏ）、ストレージコントローラ４００は、この処理を終了する。障害を検出したと判定された場合（Ｓ２１３０：Ｙｅｓ）、ストレージコントローラ４００は、対象ＦＭＰＫを障害ＦＭＰＫと認識し、障害ＦＭＰＫで失われたデータを回復するデータ回復処理を実行し（Ｓ２１４０）、障害ＦＭＰＫが属するＲＧを障害ＲＧと認識し、障害ＲＧに属するＦＭＰＫ３００のユーザ容量を削減する容量縮退処理を実行し（Ｓ２１５０）、この処理を終了する。データ回復処理及び容量縮退処理については後述する。以上が定期監視処理である。【００９１】
なお、ＦＭ−ＣＴＬ５００は、障害が発生している場合、Ｒｅａｄコマンド及びＷｒｉｔｅコマンドの応答としてＵＡ（Ｕｎｉｔ  Ａｔｔｅｎｔｉｏｎ）をストレージコントローラ４００へ送信することにより、障害が発生していることをストレージコントローラ４００に知らせても良い。この場合、ストレージコントローラ４００は、ＰＤＥＶ監視コマンドにより障害アドレスリスト７５０を取得しても良い。また、ストレージコントローラ４００とＦＭ−ＣＴＬ５００に予め定められたルールに従って、ＦＭ−ＣＴＬ５００が障害部位をストレージコントローラ４００へ通知しても良い。例えば、ＦＭ−ＣＴＬ５００は、予め定められたサイズである報告サイズ（例えば２５６ｋＢ）の論理アドレス領域毎に障害を検出し、障害が検出された論理アドレス領域の開始アドレスだけをストレージコントローラ４００へ送信する。開始アドレスを受信したストレージコントローラ４００は、開始アドレスにより特定される報告サイズの論理アドレス領域のデータを回復する。【００９２】
図２１は、データ回復処理を示す。【００９３】
前述のＳ２１４０において、ストレージコントローラ４００はデータ回復処理を実行する。【００９４】
ストレージコントローラ４００は、障害ＦＭＰＫから取得された障害アドレスリスト７５０の先頭から順に、一つのエントリを選択し、選択されたエントリから障害領域を認識する（Ｓ２５１０）。その後、ストレージコントローラ４００は、ＲＧ管理テーブル６２０に基づいて、障害ＲＧに属する障害ＦＭＰＫ以外のＦＭＰＫ３００を特定し、ＬＵ管理テーブル６３０に基づいて、障害領域に対応するストライプを特定し、特定されたストライプの特定されたＦＭＰＫ３００のデータ又はパリティを読み出しＲＡＩＤ計算を実行することにより、障害領域で失われたデータ（障害データ）を再生成し、再生成されたデータを障害ＦＭＰＫへ書き込む（Ｓ２５２０）。その後、ストレージコントローラ４００は、取得された障害アドレスリスト７５０の全てのエントリの選択が終了したか否かを判定する（Ｓ２５３０）。全てのエントリの選択が終了したと判定された場合（Ｓ２５３０：Ｙｅｓ）、ストレージコントローラ４００は、処理を終了する。そうでない場合、ストレージコントローラ４００は、処理をＳ２５１０へ移行させる。以上がデータ回復処理である。【００９５】
データ回復処理によれば、障害ＦＭＰＫの中の障害が発生した部分に格納されていたデータを回復させることができる。ＦＭ−ＣＴＬ５００は、障害の発生した論理アドレス領域を特定してストレージコントローラ４００に通知することで、ストレージコントローラ４００は特定されたアドレス範囲に関するデータの回復を行うことができる。これにより、アドレス範囲が特定されない場合は、障害ＦＭＰＫ内の全論理アドレス領域のデータを回復する必要があるため、本データ回復処理ではデータ回復の時間を短縮できる。【００９６】
図２２は、容量縮退処理を示す。【００９７】
前述のＳ２１５０において、ストレージコントローラ４００は容量縮退処理を実行する。【００９８】
ストレージコントローラ４００は、障害ＲＧで削減される論理アドレス領域内のデータを移動させるデータ移動処理を実行し（Ｓ２６２０）、障害ＲＧに属するＦＭＰＫ３００の容量を変更するＦＭＰＫ容量変更処理を実行し（Ｓ２６３０）、この処理を終了する。データ移動処理及びＦＭＰＫ容量変更処理については後述する。以上が容量縮退処理である。【００９９】
図２３は、データ移動処理を示す。【０１００】
前述のＳ２６２０において、ストレージコントローラ４００はデータ移動処理を実行する。【０１０１】
ストレージコントローラ４００は、障害ＦＭＰＫから削減される論理アドレス領域である削減領域を決定する（Ｓ２７１０）。ここでストレージコントローラ４００は、削減領域のサイズである削減サイズと、削減領域の開始アドレスとを決定する。削減領域は、例えば、ＰＤＥＶ管理テーブル６４０における各ＦＭＰＫ３００の終端アドレス６４５から前の削減サイズ分のアドレス範囲である。つまり、容量を削減するとは、ストレージコントローラ４００が使用可能なＦＭＰＫ３００の論理アドレス領域を制限することである。例えば、ストレージコントローラ４００は、正常領域容量の問い合わせを障害ＦＭＰＫへ送信する。正常領域容量の問い合わせを受信したＦＭ−ＣＴＬ５００は、現在の不良部分を除いた物理記憶領域の容量（物理容量７４２）に、ユーザ容量比率を乗じた値を正常領域容量として算出し、正常領域容量をストレージコントローラ４００へ送信する。不良部分は例えば、Ｂａｄ  Ｂｌｏｃｋである。なお、本実施例におけるＦＭＰＫ３００は、ヘルスチェック処理により、ダイ内の全ての割り当て済みブロックがＢａｄ  Ｂｌｏｃｋである場合にそのダイを閉塞するため、ダイ内の割り当て済みブロックの一部がＢａｄ  Ｂｌｏｃｋであってもそのダイを閉塞しない。従って、ＦＭＰＫ３００において、全てのＢａｄ  Ｂｌｏｃｋの容量は、閉塞された部分の容量と異なる場合がある。そこで、不良部分は閉塞された部分であっても良い。正常領域容量を受信したストレージコントローラ４００は、障害ＦＭＰＫの現在ユーザ容量から正常領域容量を減じた値を削減サイズとして算出する。【０１０２】
その後、ストレージコントローラ４００は、ＲＧ管理テーブル６２０とＬＵ管理テーブル６３０とＰＤＥＶ管理テーブル６４０とに基づいて、障害ＦＭＰＫを含むＲＧ内で削減領域に対応するストライプの論理アドレス領域であるＲＧ削減範囲を特定し、ＲＧ削減範囲内の全ての実ページの一覧を生成する（Ｓ２７２０）。ＲＧ削減範囲のサイズは、ＲＧ管理テーブル６２０における障害ＲＧのＲＡＩＤレベル６２３によって異なる。例えば、障害ＲＧのＲＡＩＤレベル６２３が０、５、又は６である場合、ＲＧ削減範囲のサイズは、削減サイズにデータディスク数（障害ＲＧに属する全ディスク数からパリティディスク数を除いた値）を乗じた値になる。また、障害ＲＧのＲＡＩＤレベル６２３が１である場合、ＲＧ削減範囲のサイズは、削減サイズになる。【０１０３】
ストレージコントローラ４００は、ＲＧの記憶領域を実ページ単位で管理しているため、実ページ単位でＲＧのサイズを削減する。ここで、ストレージコントローラ４００は、単にＦＭＰＫ３００から通知された障害領域のサイズを削減サイズとするのではなく、実ページの情報に基づいて削減サイズを決定する。障害領域のサイズが実ページ単位で端数を含んでいれば、ストレージコントローラ４００は、障害領域のサイズを実ページの整数倍に切り上げた削減サイズを算出する。ストレージコントローラ４００は、実ページの情報を管理しているが、ＦＭＰＫ３００は、実ページの情報を管理していない。従って、ストレージコントローラ４００は、後述するＦＭＰＫ容量変更処理により、削減サイズをＦＭＰＫ３００へ通知する必要がある。【０１０４】
その後、ストレージコントローラ４００は、ＲＧ削減範囲内の実ページの一覧から先頭の実ページを選択する（Ｓ２７３０）。その後、ストレージコントローラ４００は、実ページ状態管理テーブル６６０に基づいて、当該実ページが使用中である（仮想ページに割り当てられている）か否かを判定する（Ｓ２７４０）。使用中でないと判定された場合（Ｓ２７４０：Ｎｏ）、ストレージコントローラ４００は、処理をＳ２７６０へ移行させる。実ページが仮想ページに割り当てられていなければ、データをコピーする必要がないためである。使用中であると判定された場合（Ｓ２７４０：Ｙｅｓ）、ストレージコントローラ４００は、Ｔｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ機能により、当該実ページを張替え元実ページとして別の実ページに張り替える実ページ張替え処理を実行する（Ｓ２７５０）。実ページ張替え処理については後述する。その後、ストレージコントローラ４００は、実ページの一覧の全ての実ページの選択を終了したか否かを判定する（Ｓ２７６０）。ＲＧ削減範囲内の全ての実ページの選択を終了していない場合（Ｓ２７６０：Ｎｏ）、ストレージコントローラ４００は、実ページの一覧から次の実ページを選択し（Ｓ２７７０）、処理をＳ２７４０へ移行させる。ＲＧ削減範囲内の全ての実ページの選択を終了した場合（Ｓ２７６０：Ｙｅｓ）、ストレージコントローラ４００は、この処理を終了する。以上がデータ移動処理である。【０１０５】
図２４は、実ページ張替え処理を示す。【０１０６】
前述のＳ２７５０において、ストレージコントローラ４００は、実ページ張替え処理を実行する。【０１０７】
ストレージコントローラ４００は、選択された実ページを張替え元実ページとして決定する（Ｓ２８１０）。その後、ストレージコントローラ４００は、実ページ状態管理テーブル６６０に基づいて、未使用の実ページを含むプールから張替え先実ページを選択する（Ｓ２８２０）。ここでストレージコントローラ４００は、プール内の実ページの中で障害ＲＧ以外の実ページを選択しても良い。その後、ストレージコントローラ４００は、張替え元実ページのデータを張替え先実ページへコピーする（Ｓ２８３０）。【０１０８】
その後、ストレージコントローラ４００は、張替え元実ページを割り当てられていた仮想ページに、張替え先実ページを割り当てる（Ｓ２８４０）。ここでストレージコントローラ４００は、仮想ページマッピング管理テーブル６５０において、張替え元実ページＩＤを張替え先実ページＩＤに変更し、実ページ状態管理テーブル６６０において、張替え元実ページの状態６６３を未使用に変更し、張替え先実ページの状態６６３を使用中に変更する。【０１０９】
その後、ストレージコントローラ４００は、張替え元実ページに割り当てられている対象ＦＭＰＫの論理ページが未使用であることを通知するＰＤＥＶ領域解放コマンドを対象ＦＭＰＫへ発行し（Ｓ２８５０）、この処理を終了する。言い換えれば、このＰＤＥＶ領域解放コマンドは、対象ＦＭＰＫが当該論理ページのデータを破棄しても良いことを通知する。以上が実ページ張替え処理である。【０１１０】
図２５は、実ページ張替え処理を模式的に示す。【０１１１】
この図の実ページ張替え処理において、実ページ＃１００が張替え元実ページとして選択されており、張替え元実ページは、仮想ページ＃００２に割り当てられている。その後、プール＃０から実ページ＃００１が張替え先実ページとして選択され、張替え先実ページが仮想ページ＃００２に割り当てられる。【０１１２】
実ページ張替え処理によれば、障害ＲＧ内で削減される実ページを割り当てられている仮想ページへ、プールから実ページを割り当てることができる。これにより、障害ＲＧ内で削減される全ての実ページを未使用の状態に変更することができ、障害ＲＧの容量を削減することができる。【０１１３】
データ移動処理によれば、現在ユーザ容量と、障害ＦＭＰＫにおける障害が発生した物理記憶領域の容量とに基づいて、削減領域を決定することができる。また、障害ＦＭＰＫの削減領域に対応する実ページに格納されているデータを移動させると共に、その実ページを割り当てられていた仮想ページに、移動先の実ページを割り当てる。これにより、ホスト計算機２００からその仮想ページに含まれるアドレスへのアクセスを維持することができる。【０１１４】
図２６は、ＦＭＰＫ容量変更処理を示す。【０１１５】
前述のＳ２６３０において、ストレージコントローラ４００は、障害ＲＧに属する全てのＦＭＰＫ３００の夫々を対象ＦＭＰＫとしてＦＭＰＫ容量変更処理を実行する。【０１１６】
ストレージコントローラ４００は、削減サイズを指定する容量変更コマンドを、対象ＦＭＰＫへ送信し（Ｓ２９１０）、その応答を受信する（Ｓ２９２０）。その後、ストレージコントローラ４００は、ＰＤＥＶ管理テーブル６４０において対象ＦＭＰＫのエントリを更新する（Ｓ２９３０）。ここでストレージコントローラ４００は、対象ＦＭＰＫの現在ユーザ容量６４２において、格納されている値から削減サイズを減じた値へ変更する。更にストレージコントローラ４００は、終端アドレス６４５において、格納されている値から削減サイズを減じた値へ変更する。【０１１７】
その後、ストレージコントローラ４００は、ＲＧ管理テーブル６２０及びＬＵ管理テーブル６３０を更新し（Ｓ２９４０）、この処理を終了する。ここでストレージコントローラ４００は、更新した現在ユーザ容量６４２に基づいて、ＲＧ管理テーブル６２０のＰＤＥＶ最小容量６２５と、ＬＵ管理テーブル６３０のＬＵサイズ６３５とを更新する。これにより、ページ張替え処理でプールに戻された張替え元実ページは、プールから削除される。【０１１８】
ＦＭ−ＣＴＬ５００は、ストレージコントローラ４００から容量変更コマンドを受信すると（Ｓ３０１０）、メモリ５２０内の現在ユーザ容量７４３から、容量変更コマンドに指定された削減サイズを減じた値を削減後ユーザ容量として算出し、削減後ユーザ容量が、メモリ５２０内のユーザ容量下限７４５より大きいか否かを判定する（Ｓ３０２０）。削減後ユーザ容量がユーザ容量下限７４５より大きいと判定された場合（Ｓ３０２０：Ｙｅｓ）、ＦＭ−ＣＴＬ５００は、現在ユーザ容量７４３の値を削減後ユーザ容量に変更し、容量変更コマンドに対して成功を示す応答をストレージコントローラ４００へ送信し（Ｓ３０３０）、この処理を終了する。そうでない場合（Ｓ３０２０：Ｎｏ）、ＦＭ−ＣＴＬ５００は、容量変更コマンドに対して失敗を示す応答をストレージコントローラ４００へ送信し（Ｓ３０３０）、この処理を終了する。ストレージコントローラ４００は、ＦＭＰＫ３００から失敗を示す応答を受信した場合、そのＦＭＰＫ３００の全体を閉塞する。つまり、ＦＭＰＫ容量変更処理によりＦＭＰＫ３００のユーザ容量がユーザ容量下限７４５以下になった場合、そのＦＭＰＫ３００は閉塞する。以上がＦＭＰＫ容量変更処理である。【０１１９】
一般に、ホスト計算機２００は、アクセス先のボリュームの容量を変更する場合、業務を停止して、ボリュームを再認識する必要がある。本実施例では、ＦＭＰＫの容量が削減された場合は、プールの容量を減少させる。より具体的には、プールに含まれる実ページの数を減少させる。仮想ボリュームにはプールから記憶領域が割当てられるが、仮想ボリュームの容量が変更されることはない。これにより、ホスト計算機２００は、ＦＭＰＫ内部の部分的な障害による容量削減を認識する必要がなく、仮想ボリュームへのアクセスを継続することができる。【０１２０】
以後の説明及び図面において、障害ＲＧに属する障害ＦＭＰＫ以外のＦＭＰＫ３００を関連ＦＭＰＫと呼ぶことがあり、障害ＲＧにおいて障害ＦＭＰＫの削減領域のストライプに対応する関連ＦＭＰＫの論理アドレス領域を関連領域と呼ぶことがある。ＦＭＰＫ容量変更処理によれば、障害ＦＭＰＫの削減領域を削減するだけでなく、関連ＦＭＰＫの関連領域を削減することができる。【０１２１】
ＦＭＰＫ容量変更処理によれば、ストレージコントローラ４００により削減された現在ユーザ領域を、ＦＭＰＫ３００に反映することができる。【０１２２】
図２７は、容量縮退処理を模式的に示す。【０１２３】
この図は、容量縮退処理前の障害ＲＧにおける実ページの配置と、容量縮退処理後のＲＧにおける実ページの配置とを示す。容量縮退処理により、障害ＲＧに属するＦＭＰＫ３００において、削減されたユーザ容量より後のアドレス範囲の実ページのデータは別の実ページに移動する。これにより、障害ＲＧに属する全てのＦＭＰＫ３００において、先頭から現在ユーザ容量までのアドレス範囲が障害ＲＧに割り当てられる。また、障害ＲＧに属する全てのＦＭＰＫ３００において、現在ユーザ容量より後のアドレス範囲は、障害ＲＧに用いられない未使用領域（Ｆｒｅｅ  Ａｒｅａ）となる。【０１２４】
容量縮退処理によれば、ストレージコントローラ４００は、障害ＦＭＰＫの削減領域に対応する実ページのデータを移動し、その実ページを割り当てられている仮想ページへ、プール内の実ページを割り当てることにより、障害ＦＭＰＫの現在ユーザ容量を削減することができる。また、削減領域及び関連領域を削減することにより、障害ＲＧに属するＦＭＰＫ３００の現在ユーザ容量を合わせ、障害ＲＧの容量を削減することができる。また、ＦＭ−ＣＴＬ５００は、ストレージコントローラ４００からの指示に従って、現在ユーザ容量を削減することができる。【０１２５】
本実施例によれば、ストレージコントローラ４００は、ＦＭＰＫ３００に障害が発生した場合に、障害部分に応じてＦＭＰＫ３００の容量を削減することにより、そのＦＭＰＫ３００全体の閉塞を防ぎ、そのＦＭＰＫ３００の使用を継続することができる。また、ＦＭＰＫ３００内のＤＭＡ、チップ、ダイ又はプレーンの単位で、障害が発生した部分を閉塞することができる。また、ストレージコントローラ４００は、ＲＧに属する複数のＦＭＰＫ３００の一つに障害が発生した場合に、そのＲＧの容量を削減することにより、そのＲＧの使用を継続することができる。
【実施例２】
【０１２６】
実施例１において、障害ＦＭＰＫのユーザ容量を削減する場合、障害ＦＭＰＫと同じＲＧに属する他のＦＭＰＫ３００についても、障害ＦＭＰＫと同様にユーザ容量を削減するため、障害のない論理アドレス領域であってもＲＧとしては使用不可能になる。本実施例では、このような障害が発生していないＦＭＰＫ３００の記憶領域を有効活用する。本実施例におけるストレージシステム１００は、或るＲＧにおいて容量縮退処理により削減された関連領域をプールに登録し、他のＲＧの障害の発生時の削減領域に割り当てる。本実施例においては、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略する。【０１２７】
図２８は、実施例２のストレージコントローラ４００のメモリ４２０に格納される情報を示す。【０１２８】
実施例１のメモリ４２０と比較すると、実施例２のメモリ４２０は更に、ＰＤＥＶ管理テーブル６４０の代わりにＰＤＥＶ管理テーブル６４０ｂを格納し、新たにＰＤＥＶ交替領域管理テーブル６７０を格納する。【０１２９】
図２９は、実施例２のＰＤＥＶ管理テーブル６４０ｂを示す。【０１３０】
実施例１のＰＤＥＶ管理テーブル６４０と比較すると、実施例２のＰＤＥＶ管理テーブル６４０ｂにおけるＰＤＥＶのエントリは更に、当該ＰＤＥＶが交替領域を有するか否かを示す交替領域フラグ（交替領域有無）６４６を有する。本実施例における交替領域は、容量縮退処理により削減された関連領域である。言い換えれば、交替領域は、容量縮退処理により生成された未使用領域の中で、障害がない領域である。【０１３１】
図３０は、ＰＤＥＶ交替領域管理テーブル６７０を示す。【０１３２】
ＰＤＥＶ交替領域管理テーブル６７０は、交替領域毎のエントリを有する。或る交替領域のエントリは、当該交替領域を示す交替領域ＩＤ６７１と、当該交替領域の状態６７２と、当該交替領域を有するＰＤＥＶを示すＰＤＥＶ番号（ＰＤＥＶ＃）６７３と、当該交替領域が属するＲＧ内の論理アドレス空間における当該交替領域の開始アドレス６７４と、当該交替領域の終端アドレス６７５と、当該交替領域が交替先である場合の交替元の交替領域を示す交替元交替領域ＩＤ６７６と、当該交替領域が交替元である場合の交替先の交替領域を示す交替先交替領域ＩＤ６７７とを有する。状態６７２は、交替元、交替先、未使用の何れか一つを示す。ストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０に登録された未使用の交替領域の集合を、ＰＤＥＶ交替領域プールとして管理する。【０１３３】
図３１は、実施例２の定期監視処理を示す。【０１３４】
実施例２の定期監視処理におけるＳ２１１０、Ｓ２１２０、Ｓ２１３０、Ｓ２１４０は、実施例１の定期監視処理と同様である。Ｓ２１４０の後、ストレージコントローラ４００は、障害ＦＭＰＫの削減領域と置き換え可能な交替領域である使用可能交替領域を検出する交替領域判定処理を実行し（Ｓ２２１０）、使用可能交替領域が有るか否かを判定する（Ｓ２２２０）。交替領域判定処理については後述する。【０１３５】
使用可能交替領域が無いと判定された場合（Ｓ２２２０：Ｎｏ）、ストレージコントローラ４００は、Ｓ２１５０と同様の容量縮退処理を実行する（Ｓ２２５０）。その後、ストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０において、容量縮退処理により削減された関連領域のエントリを追加することにより、その関連領域を交替領域としてＰＤＥＶ交替領域プールへ登録し（Ｓ２２６０）、この処理を終了する。ここでストレージコントローラ４００は、追加されたエントリの状態６７２へ「未使用」を入力する。【０１３６】
使用可能交替領域が有ると判定された場合（Ｓ２２１０：Ｙｅｓ）、ストレージコントローラ４００は、障害ＲＧにおいて障害ＦＭＰＫの削減領域に使用可能交替領域を割り当て（Ｓ２２８０）、この処理を終了する。ここでストレージコントローラ４００は、障害ＲＧにおいて障害ＦＭＰＫの削減領域を使用可能交替領域に置き換えることにより、障害ＲＧの容量を削減せずに障害ＲＧの使用を継続する。以上が実施例２の定期監視処理である。【０１３７】
図３２は、交替領域判定処理を示す。【０１３８】
前述のＳ２２８０において、ストレージコントローラ４００は交替領域判定処理を実行する。【０１３９】
ストレージコントローラ４００は、実施例１のＳ２７１０と同様にして、障害ＦＭＰＫの削減領域を決定する（Ｓ３１１０）。その後、ストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０の先頭エントリの交替領域を対象交替領域として選択する（Ｓ３１２０）。その後、ストレージコントローラ４００は、対象交替領域の状態６７２に基づいて、対象交替領域が未使用であるか否かを判定する（Ｓ３１３０）。対象交替領域が未使用でないと判定された場合（Ｓ３１３０：Ｎｏ）、ストレージコントローラ４００は、処理をＳ３１７０へ移行させる。【０１４０】
対象交替領域が未使用であると判定された場合（Ｓ３１３０：Ｙｅｓ）、ストレージコントローラ４００は、対象交替領域のサイズが障害ＦＭＰＫの削減領域のサイズ（削減サイズ）以上であるか否かを判定する（Ｓ３１４０）。対象交替領域のサイズが削減サイズ以上でないと判定された場合（Ｓ３１４０：Ｎｏ）、ストレージコントローラ４００は、処理をＳ３１７０へ移行させる。【０１４１】
対象交替領域のサイズが削減サイズ以上であると判定された場合（Ｓ３１４０：Ｙｅｓ）、ストレージコントローラ４００は、削減領域を対象交替領域で置き換えた場合に、対象交替領域が冗長化されるか否かを判定する（Ｓ３１５０）。ここでストレージコントローラ４００は、障害ＲＧにおいて削減領域のストライプに対応する記憶領域を有する他のＦＭＰＫ３００を認識し、認識された全てのＦＭＰＫ３００が、対象交替領域を有するＦＭＰＫ３００と異なる場合に、対象交替領域が冗長化されると判定する。つまり、ストレージコントローラ４００は、障害ＲＧの交替領域を、交替領域が属している障害ＲＧとは異なるＲＧに使用する。同じ障害ＲＧ内の交替領域とすると冗長性が低下し、ＦＭＰＫの障害時にデータ復旧が不可能となるためである。対象交替領域が冗長化されないと判定された場合（Ｓ３１５０：Ｎｏ）、ストレージコントローラ４００は、処理をＳ３１７０へ移行させる。【０１４２】
対象交替領域が冗長化されると判定された場合（Ｓ３１５０：Ｙｅｓ）、ストレージコントローラ４００は、対象交替領域が削減領域の交替先として使用可能であると判定し、対象交替領域を使用可能交替領域とする（Ｓ３１６０）。ここでストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０において、障害ＦＭＰＫの削減領域のエントリを追加し、状態６７２へ「交替元」を入力し、交替先交替領域ＩＤ６７７へ使用可能交替領域のＩＤを入力する。更にストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０において、使用可能交替領域の状態６７２の値を「交替先」に変更し、交替元交替領域ＩＤ６７６へ障害ＦＭＰＫの削減領域のＩＤを入力する。【０１４３】
その後、ストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０内の全てのエントリの交替領域の選択を終了したか否かを判定する（Ｓ３１７０）。全てのエントリの選択を終了していないと判定された場合（Ｓ３１７０：Ｎｏ）、ストレージコントローラ４００は、ＰＤＥＶ交替領域管理テーブル６７０における次のエントリの交替領域を対象交替領域として選択し（Ｓ３１８０）、処理をＳ３１２０へ移行させる。全てのエントリの選択を終了したと判定された場合（Ｓ３１７０：Ｙｅｓ）、ストレージコントローラ４００は、この処理を終了する。以上が交替領域判定処理である。上記処理により、冗長性を低下させることなく、関連領域を交替領域として利用することが可能となる。【０１４４】
図３３は、実施例２の交替領域の登録及び割り当てを模式的に示す。【０１４５】
この図の例において、ストレージコントローラ４００は、ＦＭＰＫ３００であるＰＤＥＶ＃０、＃１、＃２、＃３を用いてＲＧ＃０を構築し、ＦＭＰＫ３００であるＰＤＥＶ＃４、＃５、＃６、＃７を用いてＲＧ＃１を構築する。【０１４６】
ＰＤＥＶ＃３の内部で物理記憶領域に部分的な障害が発生すると、ストレージコントローラ４００は、ＦＭＰＫ論理アドレス空間内の領域である論理アドレス領域＃０００３を削減領域とし、ＰＤＥＶ＃３のユーザ容量を削減領域のサイズだけ削減する。論理アドレス領域は、幾つかの論理ページを含む。これに伴い、ストレージコントローラ４００は、ＰＤＥＶ＃３と同じＲＧ＃０に属するＰＤＥＶ＃０、＃１、＃２について、論理アドレス領域＃０００３のストライプに対応する論理アドレス領域＃００００、＃０００１、＃０００２を削減領域とし、ＰＤＥＶ＃０、＃１、＃２のユーザ容量を削減領域のサイズだけ削減し、ＲＧ＃０の容量を削減する。更にストレージコントローラ４００は、論理アドレス領域＃００００、＃０００１、＃０００２を、交替領域としてＰＤＥＶ交替領域プールへ登録する。【０１４７】
その後、ＰＤＥＶ＃６の論理アドレス領域＃１００２に障害が発生すると、ストレージコントローラ４００は、ＰＤＥＶ交替領域プールから交替領域＃００００を選択し、論理アドレス領域＃１００２の代わりに交替領域＃００００を用いる。これにより、ＲＧ＃１の容量を削減することなく、ＲＧ＃１の使用を継続することができる。つまり、ストレージコントローラ４００は、論理アドレス領域＃１０００、＃１００１、＃００００、＃１００３に基づいて１つ以上の実ページを作成することができる。論理アドレス領域＃００００は物理的にはＲＧ＃１とは異なるＲＧに属するが、論理的な記憶領域である実ページへの対応付けを行うことで、論理アドレス領域＃００００を利用することができる。【０１４８】
本実施例によれば、ストレージコントローラ４００は、障害ＲＧの容量を削減した場合、障害ＲＧ内の障害ＦＭＰＫ以外の削減領域を交替領域として登録することができる。その後、ストレージコントローラ４００は、他のＲＧ内で障害が発生した場合にその障害が発生したＦＭＰＫ内の論理アドレス領域の代わりに交替領域を用いることができ、そのＲＧの容量を維持することができる。また、冗長化される交替領域を選択することにより、障害ＲＧの冗長性を維持することができる。
【実施例３】
【０１４９】
本実施例におけるストレージシステム１００は、予め用意された未使用領域をプールに登録し、障害ＦＭＰＫの削減領域に割り当てる。本実施例においては、実施例２との相違点を主に説明し、実施例２との共通点については説明を省略する。【０１５０】
実施例３のストレージシステム１００において、ストレージコントローラ４００は、複数のＦＭＰＫ３００の他に、少なくとも一つのスペアＰＤＥＶを有する。ストレージコントローラ４００は、スペアＰＤＥＶ内の論理アドレス領域を交替領域とし、ＰＤＥＶ交替領域管理テーブル６７０にその交替領域のエントリを作成することにより、その交替領域をＰＤＥＶ交替領域プールに登録する。【０１５１】
実施例３の定期監視処理は、実施例２の定期監視処理と同様である。なお、Ｓ２２６０において、ストレージコントローラ４００は、容量縮退処理により生成された障害ＦＭＰＫ以外の削減領域を登録しなくても良い。この場合、ＰＤＥＶ交替領域プールには、スペアＰＤＥＶ内の交替領域だけが登録される。【０１５２】
図３４は、実施例３の交替領域の割り当てを模式的に示す。【０１５３】
この図の例において、ストレージコントローラ４００は、ＦＭＰＫ３００であるＰＤＥＶ＃０、＃１、＃２、＃３を用いてＲＧ＃０を構築し、ＦＭＰＫ３００であるＰＤＥＶ＃４、＃５、＃６、＃７を用いてＲＧ＃１を構築する。更にストレージコントローラ４００は、ＦＭＰＫ３００であるＰＤＥＶ＃１００をスペアＰＤＥＶとし、スペアＰＤＥＶ内の交替領域をＰＤＥＶ交替領域プールへ登録する。【０１５４】
ＰＤＥＶ＃３の論理アドレス領域＃０００３に障害が発生すると、ストレージコントローラ４００は、ＰＤＥＶ交替領域プールから交替領域＃９１００を選択し、論理アドレス領域＃０００３の代わりに交替領域＃９１００を用いる。これにより、ＲＧ＃０の容量を削減することなく、ＲＧ＃０の使用を継続することができる。【０１５５】
同様に、ＰＤＥＶ＃６の論理アドレス領域＃１００２に障害が発生すると、ストレージコントローラ４００は、交替領域割当処理により、ＰＤＥＶ交替領域プールから交替領域＃９２００を選択し、論理アドレス領域＃１００２の代わりに交替領域＃９２００を用いる。これにより、ＲＧ＃１の容量を削減することなく、ＲＧ＃０の使用を継続することができる。【０１５６】
本実施例によれば、ストレージコントローラ４００は、ＦＭＰＫ３００に障害が発生した場合、削減領域の代わりに、予め用意された交替領域を用いることにより、そのＲＧの容量を維持することができる。
【実施例４】
【０１５７】
実施例１において、障害ＦＭＰＫのユーザ容量を削減する場合、障害ＦＭＰＫと同じＲＧに属する他のＦＭＰＫ３００についても、障害ＦＭＰＫと同様にユーザ容量を削減するため、障害が発生していないＦＭＰＫ３００の記憶領域であってもＲＧとしては使用不可能になる。本実施例では、このような障害が発生していないＦＭＰＫ３００の記憶領域を有効活用する。本実施例におけるストレージシステム１００は、或るＲＧにおいて容量縮退処理により削減された関連領域については、ＲＡＩＤ構成を変更して利用する。本実施例においては、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略する。【０１５８】
図３５は、実施例４におけるＲＡＩＤ構成の変更を模式的に示す。【０１５９】
この図の例において、ストレージコントローラ４００は、ＦＭＰＫ３００であるＰＤＥＶ＃０、＃１、＃２、＃３を用いてＲＧ＃０を構築する。障害発生前は、ＲＧ＃０は、３Ｄ＋１ＰのＲＡＩＤ構成であるとする。ここで、ＰＤＥＶ＃０の物理記憶領域の一部に障害が発生した場合、ストレージコントローラ４００は、障害が発生したＰＤＥＶ＃０の使用可能なユーザ容量を削減し、障害が発生していないＰＤＥＶ＃１、＃２、＃３の使用可能なユーザ容量は変更しない。【０１６０】
ストレージコントローラ４００は、容量を削減されていない領域を継続して３Ｄ＋１ＰのＲＧ＃０として制御する。そして、ストレージコントローラ４００は、関連領域をＲＡＩＤ構成を変更して、２Ｄ＋１ＰのＲＧ＃１として制御する。ストレージコントローラ４００は、ＲＧ＃１の記憶領域を実ページに分割して管理し、ホスト計算機２００から仮想ボリュームへのライト要求に応じて実ページを割り当てる。３Ｄ＋１Ｐの領域から２Ｄ＋１Ｐの領域へデータが移動される場合は、ストレージコントローラ４００は２Ｄ＋１Ｐにあわせてパリティを生成し直す。【０１６１】
３Ｄ＋１Ｐから２Ｄ＋１Ｐへ変更する例を示したが、他のＲＡＩＤ構成が採用されてもよい。例えば、ＰＤＥＶ＃１とＰＤＥＶ＃２の関連領域をＲＡＩＤ１（ミラーリング）として制御し、ＰＤＥＶ＃３の関連領域をスペア領域としてＰＤＥＶ交換領域プールに登録してもよい。また、例えば、１４Ｄ＋２ＰのＲＡＩＤグループに含まれるＰＤＥＶのうちの２台に障害が発生した場合、関連領域を３つの３Ｄ＋１ＰのＲＡＩＤグループとして制御し、残りの２つのＰＤＥＶの関連領域をスペア領域としてもよい。【０１６２】
本実施例によれば、ストレージコントローラ４００は、ＦＭＰＫ３００に障害が発生した場合、関連領域についてＲＡＩＤ構成を変更することで継続して使用できるため、関連領域の容量を無駄なく使うことができる。【０１６３】
用語について説明する。使用可能容量は、現在ユーザ容量等に対応する。論理記憶領域内のページは、実ページ等に対応する。仮想記憶領域は、仮想ページ等に対応する。障害情報は、障害アドレスリスト等に対応する。第１記憶デバイス及び第２記憶デバイスは、障害ＦＭＰＫ等に対応する。交替領域情報は、ＰＤＥＶ交替領域管理テーブル６７０等に対応する。指示は、容量変更コマンド等に対応する。最小使用可能容量は、ＰＤＥＶ最小容量等に対応する。論理アドレス範囲は、論理アドレス領域等に対応する。【０１６４】
なお、以上の説明では「ａａａテーブル」、「ａａａリスト」、「ａａａＤＢ」、「ａａａキュー」等の表現にて本発明の情報を説明するが、これら情報はテーブル、リスト、ＤＢ、キュー等のデータ構造以外で表現されていてもよい。そのため、データ構造に依存しないことを示すために「ａａａテーブル」、「ａａａリスト」、「ａａａＤＢ」、「ａａａキュー」等について「ａａａ情報」と呼ぶことがある。【０１６５】
さらに、各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「名前」、「ＩＤ」という表現を用いるが、これらについてはお互いに置換が可能である。【０１６６】
以上の説明では「プログラム」を主語として説明を行う場合があるが、プログラムはプロセッサによって実行されることで定められた処理をメモリ及び通信ポートを用いながら行うため、プロセッサを主語とした説明としてもよい。また、プログラムを主語として開示された処理は管理計算機や情報処理装置が行う処理としてもよい。また、プログラムの一部または全ては専用ハードウェアによって実現されてもよい。【０１６７】
また、各種プログラムはプログラム配布サーバや、計算機が読み取り可能な記憶メディアによって各計算機にインストールされてもよい。【０１６８】
以上の実施例における不揮発性半導体メモリは、ＦＭ（Ｆｌａｓｈ  Ｍｅｍｏｒｙ）である。以上の実施例におけるＦＭは、ブロック単位で消去が行われ、ページ単位でリード及びライトが行われる種類のＦＭ、典型的にはＮＡＮＤ型のフラッシュメモリである。しかし、ＦＭは、ＮＡＮＤ型に代えて他種のフラッシュメモリ（例えばＮＯＲ型）でも良い。また、ＦＭに代えて、他種の不揮発性半導体メモリ、例えば、磁気抵抗メモリであるＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）や、抵抗変化型メモリであるＲｅＲＡＭ（Ｒｅｓｉｓｔａｎｃｅ  ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）、強誘電体メモリであるＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）等の半導体メモリや、相変化メモリが使用されても良い。
【符号の説明】
【０１６９】
１００：ストレージシステム、  ２００：ホスト計算機、  ３００：ＦＭＰＫ、  ３１０：メモリモジュール、  ４００：ストレージコントローラ、  ４１０：ＣＰＵ、  ４２０：メモリ、  ５００：ＦＭ−ＣＴＬ、  ５１０：ＣＰＵ、  ５２０：メモリ、  ５４１：ＤＭＡコントローラ、  ５７０：ＦＭチップ、  ５７１：ダイ、  ５７２：ブロック
【図１】
0006055544.tif 000002
【図２】
0006055544.tif 000003
【図３】
0006055544.tif 000004
【図４】
0006055544.tif 000005
【図５】
0006055544.tif 000006
【図６】
0006055544.tif 000007
【図７】
0006055544.tif 000008
【図８】
0006055544.tif 000009
【図９】
0006055544.tif 000010
【図１０】
0006055544.tif 000011
【図１１】
0006055544.tif 000012
【図１２】
0006055544.tif 000013
【図１３】
0006055544.tif 000014
【図１４】
0006055544.tif 000015
【図１５】
0006055544.tif 000016
【図１６】
0006055544.tif 000017
【図１７】
0006055544.tif 000018
【図１８】
0006055544.tif 000019
【図１９】
0006055544.tif 000020
【図２０】
0006055544.tif 000021
【図２１】
0006055544.tif 000022
【図２２】
0006055544.tif 000023
【図２３】
0006055544.tif 000024
【図２４】
0006055544.tif 000025
【図２５】
0006055544.tif 000026
【図２６】
0006055544.tif 000027
【図２７】
0006055544.tif 000028
【図２８】
0006055544.tif 000029
【図２９】
0006055544.tif 000030
【図３０】
0006055544.tif 000031
【図３１】
0006055544.tif 000032
【図３２】
0006055544.tif 000033
【図３３】
0006055544.tif 000034
【図３４】
0006055544.tif 000035
【図３５】
0006055544.tif 000036