(57)【要約】【課題】  重複するデータがあっても、そのデータへの参照数を減らすことのできるストレージを提供することにある。【解決手段】  サーバ及び物理記憶デバイスと接続され、メモリと、プロセッサとを備えたストレージコントローラにおいて、前記メモリは、ＶＯＬ管理テーブル、アドレス変換テーブル、及び世代管理テーブルを格納し、前記ＶＯＬ管理テーブルには第１の提供ボリュームと第１の追記ボリュームが登録され、前記アドレス変換テーブルには前記第１の提供ボリュームの第１のアドレスの参照先が前記第１の追記ボリュームの第２のアドレスと登録され、前記プロセッサは、前記第１の提供ボリュームの複製の要求を受信し、前記第１の提供ボリュームの子世代として、前記第２の提供ボリュームと前記第３の提供ボリュームを前記世代管理テーブルに登録し、前記第１の提供ボリュームへの要求を、前記第３の提供ボリュームへの要求として処理する。【選択図】  図３３
2020047036.tif 000002
【特許請求の範囲】
【請求項１】
ストレージコントローラであって、
サーバと接続するための第１のインターフェースと、
物理記憶デバイスと接続するための第２のインターフェースと、
複数のプログラムと複数のテーブルが格納されたメモリと、
前記メモリに格納された複数のプログラムの中の第１のプログラムを実行し、前記第１のインターフェースで受信した要求に応じて、前記第２のインターフェースを制御するプロセッサと
を備え、
前記メモリは、
複数のテーブルの一部としてＶＯＬ管理テーブル、アドレス変換テーブル、及び世代管理テーブルが格納され、
前記ＶＯＬ管理テーブルには第１の提供ボリュームと第１の追記ボリュームが登録され、
前記アドレス変換テーブルには前記第１の提供ボリュームの第１のアドレスの参照先が前記第１の追記ボリュームの第２のアドレスと登録され、
前記世代管理テーブルには前記第１の提供ボリュームの子世代が無いと登録され、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第２のプログラムを実行することにより、
前記第１の提供ボリュームの複製の要求を前記第１のインターフェースで受信し、
第２の提供ボリュームと第２の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
第３の提供ボリュームと第３の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
前記第１の提供ボリュームの子世代として、前記第２の提供ボリュームと前記第３の提供ボリュームを前記世代管理テーブルに登録し、
前記第２の提供ボリュームと前記第３の提供ボリュームそれぞれの親世代として、前記第１の提供ボリュームを前記世代管理テーブルに登録し、
前記第１のインターフェースで受信した前記第１の提供ボリュームへの要求を、前記第３の提供ボリュームへの要求として処理すること
を特徴とするストレージコントローラ。
【請求項２】
請求項１に記載のストレージコントローラであって、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第３のプログラムを実行することにより、
前記第１のインターフェースで受信した前記第１の提供ボリュームへのライト要求を、前記第３の提供ボリュームへのライト要求とし、前記第３の追記ボリュームへライトするように制御し、
前記第１のインターフェースで受信した前記第２の提供ボリュームへのライト要求に対して、前記第２の追記ボリュームへライトするように制御すること
を特徴とするストレージコントローラ。
【請求項３】
請求項１に記載のストレージコントローラであって、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第４のプログラムを実行することにより、
前記第１のインターフェースで受信した前記第１の提供ボリュームへのリード要求を、前記第３の提供ボリュームへのリード要求とし、前記世代管理テーブルに登録された前記第３の提供ボリュームの親世代の前記第１の提供ボリュームを特定し、親世代の前記第１の提供ボリュームへのリード要求とし、
前記第１のインターフェースで受信した前記第２の提供ボリュームへのリード要求に対して、前記世代管理テーブルに登録された前記第２の提供ボリュームの親世代の前記第１の提供ボリュームを特定し、親世代の前記第１の提供ボリュームへのリード要求とすること
を特徴とするストレージコントローラ。
【請求項４】
請求項３に記載のストレージコントローラであって、
前記プロセッサは、前記第４のプログラムを実行することにより、
親世代の前記第１の提供ボリュームの前記第１のアドレスの参照先として前記アドレス変換テーブルに登録された前記第１の追記ボリュームの第２のアドレスからリードするように制御すること
を特徴とするストレージコントローラ。
【請求項５】
請求項１に記載のストレージコントローラであって、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第２のプログラムを実行することにより、
前記第２の提供ボリュームの複製の要求を前記第１のインターフェースで受信し、
第４の提供ボリュームと第４の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
第５の提供ボリュームと第５の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
前記第２の提供ボリュームの子世代として、前記第４の提供ボリュームと前記第５の提供ボリュームを前記世代管理テーブルに登録し、
前記第４の提供ボリュームと前記第５の提供ボリュームそれぞれの親世代として、前記第２の提供ボリュームを前記世代管理テーブルに登録し、
前記第１のインターフェースで受信した前記第２の提供ボリュームへの要求を、前記第５の提供ボリュームへの要求として処理すること
を特徴とするストレージコントローラ。
【請求項６】
請求項２に記載のストレージコントローラであって、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第５のプログラムを実行することにより、
前記第１のインターフェースで受信した前記第１の提供ボリュームへの削除要求を、前記第３の提供ボリュームへの削除要求とし、前記第３の追記ボリュームを削除するように制御し、前記第１の提供ボリュームの子世代として前記世代管理テーブルに登録された前記第３の提供ボリュームを削除し、
前記第１のインターフェースで受信した前記第２の提供ボリュームへの削除要求に対して、前記第２の追記ボリュームを削除するように制御し、前記第１の提供ボリュームの子世代として前記世代管理テーブルに登録された前記第２の提供ボリュームを削除すること
を特徴とするストレージコントローラ。
【請求項７】
請求項４に記載のストレージコントローラであって、
前記アドレス変換テーブルには前記第１の提供ボリュームの前記第１のアドレスの参照先が前記第１の追記ボリュームの前記第２のアドレスと登録され、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第６のプログラムを実行することにより、
前記第２のアドレスのデータを、ガベージコレクションのために第３のアドレスにコピーし、前記アドレス変換テーブルに登録された前記第２のアドレスを前記第３のアドレスに変更し、
前記プロセッサは、前記第６のプログラムの実行後に、前記第４のプログラムを実行することにより、
前記第１のインターフェースで受信した前記第１の提供ボリューム又は前記第２の提供ボリュームの前記第１のアドレスへのリード要求に対して、
親世代の前記第１の提供ボリュームの前記第１のアドレスの参照先として前記アドレス変換テーブルに登録された前記第１の追記ボリュームの前記第３のアドレスからリードするように制御すること
を特徴とするストレージコントローラ。
【請求項８】
請求項２に記載のストレージコントローラであって、
前記プロセッサは、前記第３のプログラムを実行することにより、
前記第３の追記ボリューム及び前記第２の追記ボリュームへライトするように制御し、
前記プロセッサは、前記第３のプログラムを実行後に、前記メモリに格納された複数のプログラムの中の第７のプログラムを実行することにより、
前記世代管理テーブルに登録された前記第１の提供ボリュームの子世代の情報を参照し、前記アドレス変換テーブルに登録された前記第１の提供ボリュームの前記第１のアドレスの参照先の前記第１の追記ボリュームの前記第２のアドレスを削除し、
前記アドレス変換テーブルに前記第１の追記ボリュームの前記第２のアドレスが無くなった場合、
前記第１の提供ボリューム及び前記第１の追記ボリュームを削除する
を特徴とするストレージコントローラ。
【請求項９】
ストレージコントローラであって、
サーバと接続するための第１のインターフェースと、
物理記憶デバイスと接続するための第２のインターフェースと、
複数のプログラムと複数のテーブルが格納されたメモリと、
前記メモリに格納された複数のプログラムの中の第１のプログラムを実行し、前記第１のインターフェースで受信した要求に応じて、前記第２のインターフェースを制御するプロセッサと
を備え、
前記メモリは、
複数のテーブルの一部としてＶＯＬ管理テーブル、アドレス変換テーブル、及び世代管理テーブルが格納され、
前記ＶＯＬ管理テーブルには第１の提供ボリュームと第１の追記ボリュームが登録され、
前記アドレス変換テーブルには前記第１の提供ボリュームの第１のアドレスの参照先が前記第１の追記ボリュームの第２のアドレスと登録され、
前記世代管理テーブルには前記第１の提供ボリュームの子世代が無いと登録され、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第８のプログラムを実行することにより、
前記第１の提供ボリュームの複製の要求を前記第１のインターフェースで受信し、
第３の提供ボリュームと第３の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
前記第１の提供ボリュームの子世代として、前記第３の提供ボリュームを前記世代管理テーブルに登録し、
前記第３の提供ボリュームそれぞれの親世代として、前記第１の提供ボリュームを前記世代管理テーブルに登録し、
前記第１のインターフェースで受信した前記第１の提供ボリュームへの要求を、前記第３の提供ボリュームへの要求として処理すること
を特徴とするストレージコントローラ。
【請求項１０】
請求項９に記載のストレージコントローラであって、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第９のプログラムを実行することにより、
第２の提供ボリュームへの要求を前記第１のインターフェースで受信し、
前記第１の提供ボリュームを前記第２の提供ボリュームにアタッチし、
前記第１のインターフェースで受信した前記第２の提供ボリュームへの要求を、前記第１の提供ボリュームへの要求として処理すること
を特徴とするストレージコントローラ。
【請求項１１】
請求項９に記載のストレージコントローラであって、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第１０のプログラムを実行することにより、
前記第１の追記ボリュームにライトされたデータを前記第３の追記ボリュームにコピーし、
前記第３の提供ボリュームの前記第１のアドレスの参照先として前記第３の追記ボリュームの前記第２のアドレスを前記アドレス変換テーブルに登録し、
前記アドレス変換テーブルに前記第１の追記ボリュームの前記第２のアドレスが無くなった場合、
前記第１の提供ボリューム及び前記第１の追記ボリュームを削除すること
を特徴とするストレージコントローラ。
【請求項１２】
コンピュータによるストレージ制御方法であって、
前記コンピュータは、
サーバと接続するための第１のインターフェースと、
物理記憶デバイスと接続するための第２のインターフェースと、
複数のプログラムと複数のテーブルが格納されたメモリと、
前記メモリに格納された複数のプログラムの中の第１のプログラムを実行し、前記第１のインターフェースで受信した要求に応じて、前記第２のインターフェースを制御するプロセッサと
を備え、
前記メモリは、
複数のテーブルの一部としてＶＯＬ管理テーブル、アドレス変換テーブル、及び世代管理テーブルが格納され、
前記ＶＯＬ管理テーブルには第１の提供ボリュームと第１の追記ボリュームが登録され、
前記アドレス変換テーブルには前記第１の提供ボリュームの第１のアドレスの参照先が前記第１の追記ボリュームの第２のアドレスと登録され、
前記世代管理テーブルには前記第１の提供ボリュームの子世代が無いと登録され、
前記プロセッサは、前記メモリに格納された複数のプログラムの中の第２のプログラムを実行することにより、
前記第１の提供ボリュームの複製の要求を前記第１のインターフェースで受信し、
第２の提供ボリュームと第２の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
第３の提供ボリュームと第３の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、
前記第１の提供ボリュームの子世代として、前記第２の提供ボリュームと前記第３の提供ボリュームを前記世代管理テーブルに登録し、
前記第２の提供ボリュームと前記第３の提供ボリュームそれぞれの親世代として、前記第１の提供ボリュームを前記世代管理テーブルに登録し、
前記第１のインターフェースで受信した前記第１の提供ボリュームへの要求を、前記第３の提供ボリュームへの要求として処理すること
を特徴とするストレージ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージコントローラ及びストレージ制御方法に関する。
【背景技術】
【０００２】
計算機システムの一例として、ストレージシステムがある。一般に、ストレージシステムにおいて、論理記憶領域の複数のレイヤがある。以下、複数のレイヤのうちの第１レイヤの論理記憶領域を「第１論理記憶領域」と呼び、複数のレイヤのうちの第２レイヤの論理記憶領域を「第２論理記憶領域」と呼ぶことにする。
【０００３】
第２レイヤは第１レイヤよりも上位のレイヤである。第１論理記憶領域は、複数の部分領域で構成されている。第２論理記憶領域は、例えば、Thin Provisioningに従う仮想ボリューム（仮想的な論理ボリューム）であり、その場合、第１論理記憶領域は、仮想ボリュームに割り当てられ得る複数のページ（部分領域の一例）で構成されたプールである。
【０００４】
データ量削減機能の１つとして、重複排除機能がある。重複排除機能は、一般に、複数の論理アドレス（２以上の第２論理記憶領域における異なる複数のライト先）にそれぞれ対応した複数のデータセット（の内容）の重複を検出した場合、複数の論理アドレスの参照先を、複数のデータセットのうちのいずれかのデータセット（重複データセット）が格納される部分領域とし、残りのデータセットを削除する機能である。
【０００５】
特許文献１には、重複排除機能とガベージコレクション機能を有するストレージシステムが記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】米国特許第８５２７５４４号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に記載されたストレージシステムによれば、重複排除機能によりデータ量削減が可能となる。しかしながら、複数の論理アドレスの参照先を重複データセットとしているので、例えばガベージコレクションのために重複データセットを移動するには、複数の論理アドレスの参照先もそれぞれ更新しなければならなくなり、処理量が増加するものの、特許文献１には、これに対する技術の記載は見当たらない。
【０００８】
そこで、本発明の目的は、重複するデータがあっても、そのデータへの参照数を減らすことのできるストレージを提供することにある。
【課題を解決するための手段】
【０００９】
本発明に係る代表的なストレージは、ストレージコントローラであって、サーバと接続するための第１のインターフェースと、物理記憶デバイスと接続するための第２のインターフェースと、複数のプログラムと複数のテーブルが格納されたメモリと、前記メモリに格納された複数のプログラムの中の第１のプログラムを実行し、前記第１のインターフェースで受信した要求に応じて、前記第２のインターフェースを制御するプロセッサとを備え、前記メモリは、複数のテーブルの一部としてＶＯＬ管理テーブル、アドレス変換テーブル、及び世代管理テーブルが格納され、前記ＶＯＬ管理テーブルには第１の提供ボリュームと第１の追記ボリュームが登録され、前記アドレス変換テーブルには前記第１の提供ボリュームの第１のアドレスの参照先が前記第１の追記ボリュームの第２のアドレスと登録され、前記世代管理テーブルには前記第１の提供ボリュームの子世代が無いと登録され、前記プロセッサは、前記メモリに格納された複数のプログラムの中の第２のプログラムを実行することにより、前記第１の提供ボリュームの複製の要求を前記第１のインターフェースで受信し、第２の提供ボリュームと第２の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、第３の提供ボリュームと第３の追記ボリュームを前記ＶＯＬ管理テーブルに登録し、前記第１の提供ボリュームの子世代として、前記第２の提供ボリュームと前記第３の提供ボリュームを前記世代管理テーブルに登録し、前記第２の提供ボリュームと前記第３の提供ボリュームそれぞれの親世代として、前記第１の提供ボリュームを前記世代管理テーブルに登録し、前記第１のインターフェースで受信した前記第１の提供ボリュームへの要求を、前記第３の提供ボリュームへの要求として処理することを特徴とする。
【発明の効果】
【００１０】
本発明によれば、重複するデータがあっても、そのデータへの参照数を減らすことのできるストレージを提供することが可能になる。
【図面の簡単な説明】
【００１１】
【図１】本発明の一実施形態の例を示す図である。
【図２】重複排除の一比較例を示す図である。
【図３】ストレージシステムを含むシステムの構成例を示す図である。
【図４】メモリの構成と、メモリ内のプログラム及び管理情報との例を示す図である。
【図５】ストレージシステム内の記憶階層の例を示す図である。
【図６】ページへの追記の例に示す図である。
【図７】重複排除処理の例を示す図である。
【図８】ＶＯＬ管理テーブルの例を示す図である。
【図９】アドレス変換テーブルの例を示す図である。
【図１０】有効領域管理テーブルの例を示す図である。
【図１１】ページ変換テーブルの例を示す図である。
【図１２】ページ割当管理テーブルの例を示す図である。
【図１３】サブブロック管理テーブルの例を示す図である。
【図１４】追記先検索テーブルの例を示す図である。
【図１５】重複チェックテーブルの例を示す図である。
【図１６】ハッシュ管理テーブルの例を示す図である。
【図１７】重複管理テーブルの例を示す図である。
【図１８】共通領域割当管理テーブルの例を示す図である。
【図１９】共通領域チェックテーブルの例を示す図である。
【図２０】フロントエンドライト処理の流れの例を示す図である。
【図２１】データ量削減処理の流れの例を示す図である。
【図２２】重複排除処理の流れの例を示す図である。
【図２３】重複判定処理の流れの例を示す図である。
【図２４】追記処理の流れの例を示す図である。
【図２５】リード処理の流れの例を示す図である。
【図２６】提供ボリューム削除処理の流れの例を示す図である。
【図２７】ガベージコレクション処理の流れの例を示す図である。
【図２８】共通領域解放処理の流れの例を示す図である。
【図２９】提供ボリュームの複製の例を示す図である。
【図３０】複製後の複製元と複製先の提供ボリュームへのライトの例を示す図である。
【図３１】重複単独の一比較例を示す図である。
【図３２】共通領域による重複排除の一比較例を示す図である。
【図３３】ボリューム複製処理の例に示す図である。
【図３４】世代管理テーブルの例を示す図である。
【図３５】実データ位置管理ビットマップの例を示す図である。
【図３６】ボリューム複製処理（複製先無）の流れの例を示す図である。
【図３７】ボリューム複製処理（複製先有）の流れの例を示す図である。
【図３８】重複単独領域解放処理の流れの例を示す図である。
【発明を実施するための形態】
【００１２】
以下の説明において、「インターフェース部」は、１以上のインターフェースでよい。この１以上のインターフェースは、１以上の同種の通信インターフェースデバイス（例えば１以上のＮＩＣ（Network Interface Card））であってもよいし、２以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１３】
また、以下の説明において、「メモリ部」は、１以上のメモリであり、典型的には主記憶デバイスでよい。メモリ部における少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。
【００１４】
また、以下の説明において、「ＰＤＥＶ部」は、１以上のＰＤＥＶであり、典型的には補助記憶デバイスでよい。「ＰＤＥＶ」は、物理的な記憶デバイス（Physical storage DEVice）を意味し、典型的には、不揮発性の記憶デバイス、例えばＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive）である。
【００１５】
また、以下の説明において、「記憶部」は、メモリ部とＰＤＥＶ部の少なくとも一部とのうちの少なくとも１つ（典型的には少なくともメモリ部）である。
【００１６】
また、以下の説明において、「プロセッサ部」は、１以上のプロセッサである。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Central Processing Unit）のようなマイクロプロセッサであるが、ＧＰＵ（Graphics Processing Unit）のような他種のプロセッサでもよい。少なくとも１つのプロセッサは、シングルコアでもよいしマルチコアでもよい。
【００１７】
また、少なくとも１つのプロセッサは、処理の一部又は全部を行うハードウェア回路（例えばＦＰＧＡ（Field-Programmable Gate Array）又はＡＳＩＣ（Application Specific Integrated Circuit））といった広義のプロセッサでもよい。
【００１８】
また、以下の説明において、「ｘｘｘテーブル」といった表現により、入力に対して出力が得られる情報を説明することがあるが、この情報は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「ｘｘｘテーブル」を「ｘｘｘ情報」と言うことができる。
【００１９】
また、以下の説明において、各テーブルの構成は一例であり、１つのテーブルは、２以上のテーブルに分割されてもよいし、２以上のテーブルの全部又は一部が１つのテーブルであってもよい。
【００２０】
また、以下の説明において、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ部によって実行されることで、定められた処理を、適宜に記憶部及び／又はインターフェース部などを用いながら行うため、処理の主語が、プロセッサ部（或いは、そのプロセッサ部を有するコントローラのようなデバイス）とされてもよい。
【００２１】
プログラムは、計算機のような装置にインストールされてもよいし、例えば、プログラム配布サーバ又は計算機が読み取り可能な（例えば非一時的な）記録媒体にあってもよい。また、以下の説明において、２以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２以上のプログラムとして実現されてもよい。
【００２２】
また、以下の説明において、「計算機システム」は、１以上の物理的な計算機を含んだシステムである。物理的な計算機は、汎用計算機でも専用計算機でもよい。物理的な計算機は、Ｉ／Ｏ（Input/Output）要求を発行する計算機（例えばホスト計算機）として機能してもよいし、Ｉ／Ｏ要求に応答してデータのＩ／Ｏを行う計算機（例えばストレージ装置）として機能してもよい。
【００２３】
すなわち、計算機システムは、Ｉ／Ｏ要求を発行する１以上のホスト計算機であるホストシステム、及び、Ｉ／Ｏ要求に応答してデータのＩ／Ｏを行う１以上のストレージ装置であるストレージシステムのうちの少なくとも１つでよい。少なくとも１つの物理的な計算機において、１以上の仮想的な計算機（例えばＶＭ（Virtual Machine））が実行されてもよい。仮想的な計算機は、Ｉ／Ｏ要求を発行する計算機でもよいし、Ｉ／Ｏ要求に応答してデータのＩ／Ｏを行う計算機でもよい。
【００２４】
また、計算機システムは、１以上（典型的には複数）の物理的なノード装置で構成された分散システムでよい。物理的なノード装置は、物理的な計算機である。
【００２５】
また、物理的な計算機（例えばノード装置）が所定のソフトウェアを実行することにより、その物理的な計算機、又は、その物理的な計算機を含んだ計算機システムに、ＳＤｘ（Software-Defined anything）が構築されてもよい。ＳＤｘとしては、例えば、ＳＤＳ（Software Defined Storage）又はＳＤＤＣ（Software-defined Datacenter）が採用されてもよい。
【００２６】
例えば、ストレージ機能を有するソフトウェアが物理的な汎用の計算機で実行されることにより、ＳＤＳとしてのストレージシステムが構築されてもよい。
【００２７】
また、少なくとも１つの物理的な計算機（例えばストレージ装置）が、ホストシステムとしての１以上の仮想的な計算機と、ストレージシステムのストレージコントローラ（典型的には、Ｉ／Ｏ要求に応答してデータをＰＤＥＶ部に対して入出力する装置）としての仮想的な計算機とが実行されてもよい。
【００２８】
言い換えれば、このような少なくとも１つの物理的な計算機は、ホストシステムの少なくとも一部としての機能と、ストレージシステムの少なくとも一部としての機能の両方を有してもよい。
【００２９】
また、計算機システム（典型的にはストレージシステム）は、冗長構成グループを有してよい。冗長構成は、Erasure Coding、ＲＡＩＮ（Redundant Array of Independent Nodes）及びノード間ミラーリングのように複数のノード装置での構成でもよいし、ＰＤＥＶ部の少なくとも一部としての１以上のＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）グループのように単一の計算機（例えばノード装置）での構成でもよい。
【００３０】
また、以下の説明において、「データセット」とは、アプリケーションプログラムのようなプログラムから見た１つの論理的な電子データの塊であり、例えば、レコード、ファイル、キーバリューペア及びタプルのうちのいずれでもよい。
【００３１】
また、以下の説明において、種々の対象の識別情報として、識別番号が使用されるが、識別番号以外の種類の識別情報（例えば、英字や符号を含んだ識別子）が採用されてもよい。
【００３２】
また、以下の説明において、同種の要素を区別しないで説明する場合には、参照符号（又は、参照符号のうちの共通符号）を使用し、同種の要素を区別して説明する場合は、要素の識別番号（又は参照符号）を使用することがある。
【００３３】
例えば、記憶領域の単位である「ページ」を特に区別しないで説明する場合には、「ページ５１」と記載し、個々のページを区別して説明する場合には、ページの番号を用いて「ページ＃０」、「ページ＃１」のように記載したり、参照符号を用いて「単独ページ５１Ｐ」、「共通ページ５１Ｃ」のように記載したりすることがある。
【００３４】
以下、図面を参照して、本発明の一実施形態を説明する。
図１は、本発明の一実施形態の例を示す図である。計算機システムの一例として、図３を用いて後で説明するストレージシステム２００が採用されている。ストレージシステム２００において、論理記憶領域（論理アドレス空間）の複数のレイヤがある。第１レイヤに属する１以上の第１論理記憶領域の一例が、１以上のプール５０３である。
【００３５】
第２レイヤ（第１レイヤよりも上位のレイヤ）に属する複数の第２論理記憶領域の一例が、複数の論理ボリューム５０１である。論理ボリューム５０１は、容量仮想化技術（典型的にはThin Provisioning）に従う仮想的な論理ボリュームである。論理ボリューム５０１のライト先論理アドレスに、プール５０３における未割当（空き）のページ５１が割り当てられる。
【００３６】
ストレージシステム２００は、図３に示すようにストレージコントローラ１０１を有する。ストレージコントローラ１０１は、プロセッサ部を含むコントローラの一例である。ストレージコントローラ１０１は、データ量削減機能として、重複排除機能を有する。また、データ量削減したまま仮想的に論理ボリュームをコピーする機能として、ボリューム複製機能を有する。
【００３７】
本実施形態では、重複データセットが格納される空間である共通領域８０と、単独データセットが格納される空間である単独領域７０とが用意される。言い換えれば、ストレージシステム２００における論理アドレス空間が、共通領域８０と単独領域７０とに論理的に区別される。例えば、複数の論理ボリューム５０１は、それぞれＩ／Ｏ元から認識され得る２以上の論理ボリュームである２以上の提供ボリューム５０１Ｐを含む。
【００３８】
ストレージコントローラ１０１は、提供ボリューム＃０をライト先としたライト要求に従う対象データセットが、いずれかの１以上のデータセットと重複するデータセットであるか否かを判定する重複判定処理を行う。重複判定処理は、ライト要求の処理に同期して行われる処理（インプロセス）と、ライト要求に従う対象データセットの格納の後にライト要求の処理と非同期に行われる処理（ポストプロセス）のいずれであってもよい。
【００３９】
重複判定処理の結果、対象データセットがいずれのデータセットとも重複しない単独データセットＡであれば、ストレージコントローラ１０１は、データセットＡに関する格納先を、単独領域７０に属し提供ボリューム＃０に対応したページ＃０とする。単独領域７０に属するページを、以下、「単独ページ」と言うことがある。図１の例によれば、ページ＃０及び＃１の各々が、単独ページ５１Ｐである。
【００４０】
重複判定処理の結果、対象データセットがいずれかの１以上のデータセットと重複するデータセットＢ（又はＣ）であれば、ストレージコントローラ１０１は、重複データセットＢ（又はＣ）に関する格納先を、共通領域８０に属するページ＃２とする。
【００４１】
ページ＃２が、重複データセットＢ及びＣの各々の複数のライト先（提供ボリューム＃０及び＃１）から直接的又は間接的に参照される。共通領域８０に属するページを、以下、「共通ページ」と言うことがある。
【００４２】
図１の例によれば、ページ＃２が、共通ページ５１Ｃである。重複判定処理がポストプロセスの場合、ストレージコントローラ１０１は、提供ボリューム＃０及び＃１にそれぞれ割り当てられている複数の単独ページ＃０及び＃１の各々から、データセットＢ及びＣを、共通ページ＃２にコピーし、複数の単独ページ＃０及び＃１の各々からデータセットＢ及びＣを削除する。
【００４３】
これにより、図２に例示する一比較例のような状況の発生、すなわち、１つのページ６０に、単独データセットＡと重複データセットＣとが混在してしまうといった状況の発生、を避けることができ、以って、図１に示す単独ページ５１Ｐに関して、ページ５１の回収、及び、ページ５１間でのデータセットのコピーを、迅速に行うことができる。
【００４４】
例えば、ストレージコントローラ１０１は、提供ボリューム＃０が削除対象とされた場合、提供ボリューム＃０に関して割り当てられている複数の単独ページ５１Ｐを、複数の単独ページ５１Ｐの各々について単独ページ５１Ｐがいずれか他の領域から参照されているか否かをチェックすること無しに、且つ、提供ボリューム＃０におけるいずれかの領域が共通領域８０を参照しているか否かをチェックすること無しに、解放する。
【００４５】
これにより、提供ボリューム＃０に割り当たっていた複数の単独ページ５１Ｐを迅速に回収することができる。
【００４６】
また、例えば、ストレージコントローラ１０１は、単独ページ５１Ｐのガベージコレクション処理において、単独ページ５１Ｐのうちの複数存在する有効な単独データセットを、いずれか別のページ５１に追記的にコピーし、コピー元の単独ページ５１Ｐの割り当てを解除する。
【００４７】
単独ページ５１Ｐに関して、ページ５１間でコピーされるデータセットは、単独データセットであり、重複データセットであることがない。故に、参照先の更新は、単独データセットの１つの論理アドレス（提供ボリューム５０１Ｐに属する論理アドレス）についてのみ行えばよく、複数の論理アドレスの各々について行う必要はない。
【００４８】
このため、単独ページ５１Ｐから別のページ５１へのデータセットのコピーを迅速に行うことができ、結果として、単独ページ５１Ｐのガベージコレクション処理が効率化される。
【００４９】
図２９は、図１の状態から提供ボリューム＃１を複製（コピー）した例を示す図である。複製前、提供ボリューム＃１は重複データセットＢ及びＣ、単独データセットＤを持つ。提供ボリューム＃１の複製ボリューム＃１１は、提供ボリューム＃１の単独データセットＤを参照する。
【００５０】
すなわち、提供ボリューム＃１を複製後、単独領域７０に存在する単独データセットＤは提供ボリューム＃１から参照され、また、提供ボリューム＃１１からも提供ボリューム＃１の論理アドレスを介して間接的に参照される。
【００５１】
複製前、提供ボリューム＃１からのみ参照されていた単独データセットＤは、複製後、提供ボリューム＃１と提供ボリューム＃１１から参照される共通データセットになる。しかし、データセットＤは重複データセットではあるが、共通領域８０には存在せず、単独領域７０に存在する。
【００５２】
従って、複製前、単独領域７０に存在する単独ページ＃１は、複製後、共通ページになるわけではない。単独領域に存在しながら、重複データセットを有する単独ページを「重複単独ページ」と呼ぶ。
【００５３】
図３０は、図２９に示す複製直後の状態から複製元と複製先の提供ボリューム＃１及び＃１１へライトした後の例を示す図である。提供ボリューム＃１の重複データセットＢをデータセットＥで更新した場合、ストレージコントローラ１０１は、データセットＥを単独領域７０に新たに確保したページ＃３に格納する。
【００５４】
同様に、提供ボリューム＃１１の重複データセットＤをデータセットＦで更新した場合、ストレージコントローラ１０１はデータセットＦを単独領域７０に新たに確保したページ＃４に格納する。
【００５５】
以上により、図３１に例示する一比較例のような状況の発生、すなわち、単独領域７０に存在するページ＃１の重複データセットＤを提供ボリューム＃１１から直接参照してしまうことにより、ページ５１の回収、及びページ５１間でのデータセットのコピーが非効率的になってしまう問題を解決する。
【００５６】
例えば、図３１において、ストレージコントローラ１０１は、提供ボリューム＃１が削除対象とされた場合、提供ボリューム＃１に関し割り当てられているページ＃１が提供ボリューム＃１１からも参照されている為、単純に解放することはできない。
【００５７】
一方、図３０の例では、提供ボリューム＃１が削除対象とされた場合、提供ボリューム＃１に割当てられているページ＃３が提供ボリューム＃１１から直接に参照されることがない為、他の領域から参照されているか否かをチェックすること無しに、解放することができる。
【００５８】
このため、提供ボリューム＃１に割り当たっていた複数の単独ページ５１Ｐを迅速に回収することができる。一方で、ページ＃１は重複単独ページである為、提供ボリューム＃１の削除契機では解放せず、非同期にいずれの提供ボリューム５０１Ｐからも参照されていない事を確認後、解放する。本処理の詳細は後述する。
【００５９】
また、例えば、ストレージコントローラ１０１は、単独ページ５１Ｐのガベージコレクション処理において、単独ページ５１Ｐのうちの複数の有効な単独データセットを、いずれか別のページ５１に追記的にコピーし、コピー元の単独ページ５１Ｐの割り当てを解除する。
【００６０】
単独ページ５１Ｐ（図３０におけるページ＃３）に関して、ページ５１間でコピーされるデータセットは、単独データセットであり、重複データセットであることがない。故に、参照先の更新は、単独データセットの１つの論理アドレス（提供ボリューム５０１Ｐに属する論理アドレス）についてのみ行えばよく、複数の論理アドレスの各々について行う必要はない。
【００６１】
このため、単独ページ５１Ｐから別のページ５１へのデータセットのコピーを迅速に行うことができ、結果として、単独ページ５１Ｐのガベージコレクション処理が効率化される。
【００６２】
更に、例えば、ストレージコントローラ１０１は、重複単独ページのガベージコレクション処理を、単独ページ５１Ｐと同様に実施する。
【００６３】
すなわち、重複単独ページ（図２９における単独ページ５１Ｐ、ページ＃１）に関して、ページ５１間でコピーされるデータセットは、共通データセットであるが、ページ＃１に存在するデータセットは複製元である提供ボリューム＃１からの参照のみであり、複製先である提供ボリューム＃１１からは提供ボリューム＃１の論理アドレスを介して間接的に参照している。
【００６４】
故に、参照先の更新は、共通データセットの１つの論理アドレス（複製元の提供ボリューム５０１Ｐに属する論理アドレス）についてのみ行えばよく、複数の論理アドレスの各々について行う必要はない。このため、重複単独ページから別のページ５１へのデータセットのコピーを迅速に行うことができ、結果として、重複単独ページのガベージコレクション処理が効率化される。
【００６５】
また、図３２に例示する一比較例のような状況の発生を防ぐ。すなわち、複製前の単独データセットは、複製後、共通データセットになる為、共通ページに格納しなければならず、複製前に単独ページに格納されていたデータセットを、共通領域８０の共通ページに移行し、複製時間が長大化してしまうことを防ぐ。このように提供ボリューム５０１Ｐの複製をデータセットの移動無しに迅速に行うことができる。
【００６６】
以下、本実施形態を詳細に説明する。
図３は、ストレージシステム２００を含むシステムの構成例を示す図である。ストレージシステム２００は、複数（又は１つ）のＰＤＥＶ２２０と、複数のＰＤＥＶ２２０に接続されたストレージコントローラ１０１とを有する。
【００６７】
ストレージコントローラ１０１は、Ｓ−Ｉ／Ｆ２１４と、Ｍ−Ｉ／Ｆ２１５と、Ｐ−Ｉ／Ｆ２１３と、メモリ２１２と、それらに接続されたプロセッサ２１１とを有する。Ｓ−Ｉ／Ｆ２１４、Ｍ−Ｉ／Ｆ２１５、及びＰ−Ｉ／Ｆ２１３が、インターフェース部の一例である。メモリ２１２が、記憶部の一例である。
【００６８】
プロセッサ２１１が、プロセッサ部の一例である。プロセッサ部は、圧縮及び伸張を行うハードウェア回路を含んでいてもよい。本実施形態では、プロセッサ２１１が、圧縮及び伸張を行う。すなわち、ストレージコントローラ１０１は、データ量削減機能として、重複排除機能の他に圧縮機能を有する。
【００６９】
Ｓ−Ｉ／Ｆ２１４は、サーバシステム２０１とストレージコントローラ１０１との間のデータのやり取りを仲介する通信インターフェースデバイスである。Ｓ−Ｉ／Ｆ２１４に、ＦＣ（Fibre Channel）ネットワーク２０３を介して、サーバシステム２０１が接続される。
【００７０】
サーバシステム２０１は、ストレージコントローラ１０１に対して、Ｉ／Ｏ先（例えばＬＵＮ（Logical Unit Number）のような論理ボリューム番号や、ＬＢＡ（Logical Block Address）のような論理アドレス）を指定したＩ／Ｏ要求（ライト要求又はリード要求）を送信する。
【００７１】
Ｍ−Ｉ／Ｆ２１５は、管理システム２０５とストレージコントローラ１０１の間のデータのやり取りを仲介する通信インターフェースデバイスである。Ｍ−Ｉ／Ｆ２１５に、ＩＰ（Internet Protocol）ネットワーク２０４を介して、管理システム２０５が接続される。
【００７２】
ネットワーク２０３及びネットワーク２０４は、同一の通信ネットワークでもよい。管理システム２０５は、ストレージシステム２００を管理する。
【００７３】
Ｐ−Ｉ／Ｆ２１３は、複数のＰＤＥＶ２２０とストレージコントローラ１０１の間のデータのやり取りを仲介する通信インターフェースデバイスである。Ｐ−Ｉ／Ｆ２１３には、複数のＰＤＥＶ２２０が接続される。
【００７４】
メモリ２１２は、プロセッサ２１１が実行するプログラムと、プロセッサ２１１が使用するデータを記憶する。プロセッサ２１１は、メモリ２１２に格納されているプログラムを実行する。本実施形態では、例えば、メモリ２１２及びプロセッサ２１１の組が二重化されている。
【００７５】
図４は、メモリ２１２の構成と、メモリ２１２内のプログラム及び管理情報との例を示す図である。メモリ２１２は、ローカルメモリ４０１、キャッシュメモリ４０２、及び共有メモリ４０４というメモリ領域を含む。これらのメモリ領域のうちの少なくとも１つは、独立したメモリであってもよい。ローカルメモリ４０１は、このローカルメモリ４０１を含むメモリ２１２と同一組に属するプロセッサ２１１により使用される。
【００７６】
ローカルメモリ４０１には、リードプログラム４１１、フロントエンドライトプログラム４１２、バックエンドライトプログラム４１３、データ量削減プログラム４１４、ＶＯＬ管理プログラム４１５、プール容量管理プログラム４１６、共通領域解放プログラム４１７、ボリューム複製制御プログラム４１８、及び重複単独領域解放プログラム４１９が格納される。これらのプログラムについては後述する。
【００７７】
キャッシュメモリ４０２には、ＰＤＥＶ２２０に対してライト又はリードされるデータセットが一時的に格納される。
【００７８】
共有メモリ４０４は、この共有メモリ４０４を含むメモリ２１２と同一組に属するプロセッサ２１１、及び異なる組に属するプロセッサ２１１の両方により使用される。共有メモリ４０４には、管理情報が格納される。
【００７９】
管理情報は、ＶＯＬ管理テーブル４２１、アドレス変換テーブル４２２、プール管理テーブル４２３、有効領域管理テーブル４２４、ページ変換テーブル４２５、ページ割当管理テーブル４２６、サブブロック管理テーブル４２７、追記先検索テーブル４２８、ハッシュ管理テーブル４２９、重複管理テーブル４３０、共通領域割当管理テーブル４３１、世代管理テーブル４３２、及び実データ位置管理ビットマップ４３３を含む。
【００８０】
これらのテーブルうち、プール管理テーブル４２３以外については、図を参照して後述する。プール管理テーブル４２３は、プール５０３に関する情報を保持するテーブルである。
【００８１】
プール管理テーブル４２３は、例えば、プール５０３毎に、プール＃（プール５０３の番号）、ＲＧ＃（プール５０３の基になっている１以上のＲＡＩＤグループの番号）、プール容量（プール５０３の容量）、及びプール使用容量（プール容量のうち使用されている容量（典型的には、プール５０３のうちの割当て済ページの総容量））の情報を保持する。
【００８２】
図５は、ストレージシステム２００内の記憶階層の例を示す図である。なお、以下の説明では、ｎ番目のレイヤを「レイヤｎ」と呼ぶ（ｎは自然数）。ｎが小さい程、上位のレイヤである。ストレージシステム２００内の記憶階層には、提供ボリューム５０１Ｐ、追記ボリューム５０２、プール５０３、及びＲＧ５０４がある。
【００８３】
提供ボリューム５０１Ｐは、レイヤ１（図３を用いて説明した第２レイヤの一例）の論理記憶領域であり、サーバシステム２０１に提供される（サーバシステム２０１から可視の）の論理ボリュームである。
【００８４】
なお、レイヤ１の論理記憶領域として、更に、本実施形態では、後述するように、共通領域８０に属する論理ボリュームでありサーバシステム２０１に提供されない（サーバシステム２０１から不可視の）共通ボリュームがある。
【００８５】
更に、レイヤ１の論理記憶領域として、本実施形態では、後述するように、単独領域７０に属する論理ボリュームでありサーバシステム２０１に提供されない（サーバシステム２０１から不可視の）重複単独ボリュームがある。
【００８６】
追記ボリューム５０２は、レイヤ２の論理記憶領域であり、追記用の論理ボリュームである。１つの追記ボリューム５０２には、いずれか１つの論理ボリューム５０１（提供ボリューム５０１Ｐなど）が関連付けられる。逆に、１つの論理ボリューム５０１には、１又は複数の追記ボリューム５０２が関連付けられる。
【００８７】
従って、追記ボリューム５０２（レイヤ２の論理記憶領域）と論理ボリューム５０１（レイヤ１の論理記憶領域）とは、１対１又は１対多の関係である。本実施形態では、説明を簡単にするために、追記ボリューム５０２と論理ボリューム５０１は１対１の関係であるとする。
【００８８】
プール５０３は、レイヤ３（図３を用いて説明した第１レイヤの一例）の論理記憶領域であり、１以上のＲＧ５０４に基づく論理記憶領域である。プール５０３は、複数のページ５１で構成されている。なお、プール５０３は、少なくとも１つのＲＧ５０４に代えて、又は加えて、ストレージシステム２００の外部の記憶資源に基づいていてもよい。
【００８９】
ＲＧ５０４は、レイヤ４の論理記憶領域であり、複数のＰＤＥＶ２２０で構成されたＲＡＩＤグループの空間である。
【００９０】
図５に例示の提供ボリューム５０１Ｐの一部は、２以上の提供ボリューム５０１Ｐのうちの少なくとも一部であり、圧縮又は重複排除が有効とされた領域である「有効領域」である。２以上の提供ボリューム５０１Ｐのうち有効領域以外の領域を、圧縮及び重複排除が無効とされた領域という意味で「無効領域」と言う。
【００９１】
ストレージコントローラ１０１は、ライト対象のデータセットＡのライト先が有効領域の場合、ライト対象のデータセットＡを圧縮し、提供ボリューム５０１Ｐに対応した追記ボリューム５０２に割り当てられたページ５１Ｐａ（ライト先のページに対して割り当てられた単独ページであるページ５１Ｐａ）に、圧縮されたデータセットＡ´を追記する。
【００９２】
すなわち、有効領域に関して、ページ５１Ｐａは、提供ボリューム５０１Ｐに対応した追記ボリューム５０２に割り当てられたページ５１、言い換えれば、提供ボリューム５０１Ｐに間接的に割り当てられたページ５１である。
【００９３】
ページ５１Ｐａには、追記的に圧縮後のデータセットＡ´が格納される。追記ボリューム５０２に割り当てられたページ（提供ボリューム５０１Ｐに間接的に割り当てられたページ）を「追記ページ」と言うことができる。
【００９４】
一方、ストレージコントローラ１０１は、ライト対象のデータセットＢのライト先が無効領域の場合、ライト対象のデータセットＢを圧縮することなしに、ライト先のページに対して割り当てられたページ５１Ｐｂに、非圧縮のデータセットＢを格納する。
【００９５】
すなわち、無効領域に関して、ページ５１Ｐｂは、提供ボリューム５０１Ｐに直接的に（追記ボリューム５０２非経由で）割り当てられたページ５１である。ページ５１Ｐｂには、非圧縮のデータセットＢが格納される。
【００９６】
提供ボリューム５０１Ｐに直接的に割り当てられたページ５１には、上書きすることができる。提供ボリューム５０１Ｐに直接的に割り当てられたページを「上書きページ」と言うことができる。
【００９７】
図６は、ページ５１Ｐａへの追記の例を示す図である。論理ボリューム５０１は、複数の単位領域である複数のブロック６０１で構成されている。本実施形態では、データセットは、ブロック単位のデータである。
【００９８】
論理ボリューム５０１に対応した追記ボリューム５０２に割り当てられたページ５１Ｐａには、圧縮後のデータセットが追記されていく。ページ５１Ｐａにおいて、圧縮後のデータセットが占める領域を、以下の説明では「サブブロック６０２」と言う。サブブロック６０２は、サブページ領域及びサブ部分領域の各々の一例である。
【００９９】
なお、ページ５１Ｐａには、非圧縮のデータセットが追記されてもよいが、本実施形態では、圧縮後データセットが追記される。プール５０３には、ページ５１Ｐａの状態が反映する。
【０１００】
図７は、重複排除処理の例を示す図である。図７には、特にポストプロセスの重複排除処理の例を示しており、大矢印の元と先に、重複排除処理前の例と重複排除処理後の例を示している。
【０１０１】
論理ボリューム５０１として、提供ボリューム５０１Ｐの他に、共通ボリューム５０１Ｃがある。共通ボリューム５０１Ｃは、上述したように、共通領域８０に属しサーバシステム２０１に提供されない論理ボリュームである。図７の共通ボリューム５０１Ｃの少なくとも一部が有効領域である。なお、有効領域に属する共通ボリュームと、無効領域に属する共通ボリュームとが用意されてもよい。
【０１０２】
アドレス変換テーブル４２２（アドレス変換テーブル４２２Ｐと４２２Ｃ）及び追記ボリューム５０２（追記ボリューム５０２Ｐと５０２Ｃ）の各々が、論理ボリューム５０１毎に設けられている。
【０１０３】
以下の説明において、論理ボリューム＃ｍ（ＶＯＬ＃が“ｍ”の論理ボリューム（ｍは０以上の整数））に対応したアドレス変換テーブル４２２を、「アドレス変換テーブル＃ｍ」と言うことがある。
【０１０４】
また、以下の説明において、論理ボリューム＃ｍに対応した追記ボリューム５０２を、「追記ボリューム＃ｍ」と言うことがある。また、以下の説明において、下記の用語を使用することがある。
【０１０５】
・提供ブロック：提供ボリュームにおけるブロック。
・共通ブロック：共通ボリュームにおけるブロック。
・重複先ブロック：重複データセットのライト先（コピー先）とされた共通ブロック 。
・追記単独ページ：単独ページ且つ追記ページであるページ。
・追記共通ページ：共通ページ且つ追記ページであるページ（共通ボリュームに対応した追記ボリュームに割り当てられたページ）。
【０１０６】
提供ボリューム＃１及び＃２があり、故に、アドレス変換テーブル＃１及び＃２と、追記ボリューム＃１及び＃２がある。また、共通ボリューム＃３があり、故に、アドレス変換テーブル＃３と追記ボリューム＃３がある。追記ボリューム＃１及び＃２が、単独領域７０に属し、追記ボリューム＃３が、共通領域８０に属する。
重複排除処理の前の状況の一例は、図７の大矢印の元に示すように、下記の通りである。
【０１０７】
・提供ボリューム＃１及び＃２がそれぞれ有する２つの提供ブロック６０１Ｐの各々に、データセットＡが存在する。結果として、追記ボリューム＃１及び＃２にそれぞれ割り当てられた２つの追記単独ページ（単独ページ５１Ｐ）の各々に、圧縮後データセットＡ´（サブブロック６０２Ｐ）が存在する。
【０１０８】
・アドレス変換テーブル＃１及び＃２の各々では、データセットＡのライト先提供ブロック（提供ブロック６０１Ｐ）の論理アドレスの参照先が、追記単独ページにおけるサブブロック６０２Ｐ（圧縮後データセットＡ´が存在するサブブロック６０２Ｐ）の論理アドレスである。
【０１０９】
・ストレージコントローラ１０１は、以上の重複排除処理の前の状況に対し、上述した重複判定処理において、提供ボリューム＃１及び＃２に重複するデータセットＡが存在することを検出する（存在すると判定する）。検出した場合、ストレージコントローラ１０１は、例えば以下の処理を含む重複排除処理を行う。
【０１１０】
・ストレージコントローラ１０１は、重複データセットＡ（圧縮後データセットＡ´の伸張後のデータセットに相当）を、提供ボリューム＃１及び＃２における有効領域の提供ブロック６０１Ｐから、共通ボリューム＃３の有効領域におけるいずれかの未使用の共通ブロック６０１Ｃにコピーする。コピー先の共通ブロック６０１Ｃが、重複先ブロック（重複先領域の一例）である。
【０１１１】
・ストレージコントローラ１０１は、重複先ブロック（共通ブロック６０１Ｃ）に対応した追記ボリューム＃３にページを割り当てる。割り当てられたページが、追記共通ページ（共通ページ５１Ｃ）である。
【０１１２】
・ストレージコントローラ１０１は、重複データセットＡを圧縮し、圧縮後データセットＡ´を、追記共通ページに追記する。
【０１１３】
・ストレージコントローラ１０１は、アドレス変換テーブル＃３を更新する。更新後のアドレス変換テーブル＃３では、重複先ブロック（共通ブロック６０１Ｃ）の論理アドレスの参照先が、追記共通ページ（共通ページ５１Ｃ）におけるサブブロック６０２Ｃ（圧縮後データセットＡ´が存在するサブブロック６０２Ｃ）の論理アドレスである。
【０１１４】
・ストレージコントローラ１０１は、アドレス変換テーブル＃１及び＃２を更新する。更新後のアドレス変換テーブル＃１及び＃２の各々では、提供ブロック６０１Ｐの論理アドレスの参照先が、追記単独ページにおけるサブブロック６０２Ｐ（圧縮後データセットＡ´が存在するサブブロック６０２Ｐ）の論理アドレスに代えて、重複先ブロックの論理アドレスとなる。
【０１１５】
・ストレージコントローラ１０１は、追記ボリューム＃１及び＃２にそれぞれ割り当てられた２つの追記単独ページの各々のうち、圧縮後データセットＡ´が格納されているサブブロック６０２Ｐを、点線で示す通り、無効サブブロック（未割当）として管理する。
【０１１６】
・ストレージコントローラ１０１は、重複管理テーブル４３０を更新する。更新後の重複管理テーブル４３０では、重複先ブロック（共通ブロック６０１Ｃ）の論理アドレスの参照元が、コピー元の２つの提供ブロック６０１Ｐの論理アドレスである。
【０１１７】
以上の手順が、重複排除処理の一例である。なお、以上の重複排除処理において、ストレージコントローラ１０１は、重複データセットＡを共通ブロック６０１Ｃにコピーすることに代えて、いずれかの圧縮後データセットＡ´を共通領域８０に属する共通ページ５１Ｃに追記的にコピーしてもよい。
【０１１８】
そして、ストレージコントローラ１０１は、２つの提供ブロック６０１Ｐの論理アドレスの参照先を、コピー先ページ（共通ページ５１Ｃ）のサブブロック６０２Ｃの論理アドレスとし、コピー元のサブブロック６０２Ｐを無効サブブロックとしてもよい。このような処理が採用される場合、共通ボリューム５０１Ｃは無くてもよい。
【０１１９】
また、ストレージコントローラ１０１が重複データセットＡを共通ブロック６０１Ｃにコピーする場合、共通ブロック６０１Ｃはキャッシュメモリ４０２に割り当てられてもよい。
【０１２０】
ストレージコントローラ１０１は、例えば、提供ボリューム＃１のうちの、データセットＡのライト先の提供ブロック６０１Ｐに、データセットＦを書き込むためのライト要求を受信したとする。
【０１２１】
この場合、追記ボリューム＃１の追記単独ページ（単独ページ５１Ｐ）に対して、下記の（ｃ１）〜（ｃ３）が行われる。（ｃ２）は、重複排除処理の前にデータセットＦのライト要求を受けた場合に行われる処理である。（ｃ３）は、重複排除処理の後にデータセットＦのライト要求を受けた場合に行われる処理である。
【０１２２】
（ｃ１）：ストレージコントローラ１０１は、旧サブブロックであるサブブロック６０２の参照元（旧参照元）が、提供ボリューム＃１におけるいずれかの提供ブロック６０１Ｐの論理アドレスであるか否かを判定する。
【０１２３】
ここで、「旧サブブロック」とは、ライト対象の圧縮後データセットＦ´の更新前の圧縮後データセットＡ´を格納したサブブロックである。「ライト対象の圧縮後データセットＦ´」とは、ライト先の提供ブロック６０１Ｐへのライト対象のデータセットＦの圧縮後データセットである。
【０１２４】
（ｃ２）：（ｃ１）の判定の結果が真の場合、ストレージコントローラ１０１は、旧サブブロックが追記単独ページに存在するため、旧サブブロックはサブブロック６０２Ｐであり、旧サブブロックであるサブブロック６０２Ｐを無効サブブロック（未使用のサブブロック）とする。
【０１２５】
そして、ストレージコントローラ１０１は、ライト対象の圧縮後データセットＦ´を新たなサブブロックに追記し、ライト先の提供ブロック６０１Ｐの論理アドレスの参照先を、旧サブブロックであるサブブロック６０２Ｐの論理アドレスから、新たなサブブロックの論理アドレスに変更する。
【０１２６】
（ｃ３）：（ｃ１）の判定の結果が偽の場合、ストレージコントローラ１０１は、旧サブブロックが追記共通ページに存在するため、旧サブブロックはサブブロック６０２Ｃであり、旧サブブロックでるサブブロック６０２Ｃを無効サブブロックとしない。
【０１２７】
そして、ストレージコントローラ１０１は、ライト対象の圧縮後データセットＦ´を追記単独ページ（単独ページ５１Ｐ）における新たなサブブロックに追記し、ライト先の提供ブロック６０１Ｐの論理アドレスの参照先を、重複先ブロックの論理アドレスから、新たなサブブロックの論理アドレスに変更する。
【０１２８】
以上のような（ｃ１）及び（ｃ２）であるため、下記の（ｘ１）及び（ｘ２）のような状況が発生し得る。
【０１２９】
（ｘ１）：追記単独ページにおいて、有効な圧縮後データセット（有効なサブブロック６０２Ｐ）の論理アドレスが非連続となる状況（有効な圧縮後データセットが離散した状況）。
（ｘ２）：共通ボリューム５０１Ｃにおける重複先ブロック（共通ブロック６０１Ｃ）が、いずれの提供ボリューム５０１Ｐにおける提供ブロック６０１Ｐからも参照されなくなっているにも関わらず、使用中のままとなり、結果として、共通ボリューム５０１Ｃの空き容量が増えず、且つ、不必要な圧縮後データブロックが共通ページ５１Ｃに残り続けてしまう状況。
【０１３０】
以上の（ｘ１）の状況が発生し得るため、単独領域７０に関しては、ガベージコレクション処理が必要となる。本実施形態では、単独領域７０に関してのガベージコレクション処理を効率的に行うことができる。
【０１３１】
すなわち、ガベージコレクション処理において、有効ないずれの圧縮後データセットも単独データセットの圧縮後データセットであるため、各有効な圧縮後データセットについて、参照元は１つであり、その１つの参照元についてのみ、参照先の変更を行えばよいからである。
【０１３２】
以上の（ｘ２）の状況が発生し得るため、ストレージコントローラ１０１は、重複先ブロックを未使用とするための解放処理を行う。
【０１３３】
具体的に、解放処理においてストレージコントローラ１０１は、重複先ブロックの１以上の参照元ブロック（１以上の提供ボリューム５０１Ｐにおける１以上の提供ブロック６０１Ｐ）から、参照先が重複先ブロックではない参照元ブロックを除外する。
【０１３４】
そして、ストレージコントローラ１０１は、１以上の参照元ブロックが除外されたために重複先ブロックを参照先とする参照元が無くなった場合、重複先ブロックを未使用へと解放する。
【０１３５】
それに伴い、ストレージコントローラ１０１は、解放される重複先ブロックの参照先のサブブロック６０２Ｃを無効サブブロックとする。なお、共通ボリューム５０１Ｃにおける重複先ブロックの参照元となる提供ブロック６０１Ｐが１つだけの場合、ストレージコントローラ１０１は、下記のうちのいずれかを行ってもよい。
【０１３６】
・ストレージコントローラ１０１は、重複先ブロックに対応した圧縮後データセットを、共通ページ５１Ｃ（サブブロック６０２Ｃ）から、参照元となる提供ブロック６０１Ｐを含む提供ボリューム５０１Ｐに対応した追記単独ページへ、追記的にコピーする。
【０１３７】
そして、ストレージコントローラ１０１は、コピー元のサブブロック６０２Ｃを未使用（未割当）とし、重複先ブロックを未使用とする。これにより、共通ボリューム５０１Ｃの空き容量を増やすことができる。
【０１３８】
・ストレージコントローラ１０１は、重複先ブロックに対応した圧縮後データセットを、共通ページ５１Ｃに格納されたままとする。これにより、ページ５１間のコピーの発生頻度を低減することができる。
【０１３９】
図３３は、ボリューム複製処理の例を示す図である。図７と同様に、論理ボリューム５０１として提供ボリューム５０１Ｐに加えて共通ボリューム５０１Ｃがあり、アドレス変換テーブル４２２（アドレス変換テーブル４２２Ｐａ、４２２Ｐ、４２２Ｓ、及び４２２Ｃ）と追記ボリューム５０２の各々が、論理ボリューム５０１毎に設けられている。
【０１４０】
また、図７の説明で定義した用語に加え、図３３の説明には下記の用語を使用することがある。
・追記重複単独ページ：単独ページ且つ追記ページ且つ共通データセットを有するページ（重複単独ボリュームに対応した追記ボリュームに割り当てられ、且つ、共通データセットを有するページ）。
【０１４１】
提供ボリューム＃１があり、故に、アドレス変換テーブル＃１と、追記ボリューム＃１がある。また、共通ボリューム＃２があり、故に、アドレス変換テーブル＃２と、追記ボリューム＃２がある。追記ボリューム＃１が、単独領域７０に属し、追記ボリューム＃２が、共通領域８０に属する。
【０１４２】
ボリューム複製前の状況の一例は、図３３の大矢印の元に示すように、下記の通りである。
・提供ボリューム＃１が有する２つの提供ブロック６０１Ｐの各々に、データセットＡ及びデータセットＢが存在する。追記ボリューム＃２に割り当てられた追記共通ページ（共通ページ５１Ｃ）に、圧縮後データセットＡ´が存在する。また、追記ボリューム＃１に割り当てられた追記単独ページに、圧縮後データセットＢ´が存在する。
【０１４３】
・アドレス変換テーブル＃１では、データセットＡのライト先の提供ブロック６０１Ｐの論理アドレスの参照先が、共通ボリューム＃２の重複先ブロックの論理アドレスであり、データセットＢのライト先の提供ブロック６０１Ｐの論理アドレスの参照先が、追記単独ページにおけるサブブロック６０２Ｐの論理アドレスである。
【０１４４】
以上の状況に対してストレージコントローラ１０１は、ボリューム複製処理において、複製先となる提供ボリューム＃３を作成する。この提供ボリューム＃３の作成に伴い、追記ボリューム＃３及びアドレス変換テーブル＃３も作成される。提供ボリューム＃３は単独領域７０に属し、下記のように図３３の大矢印の先に示した通りとなる。
【０１４５】
・ストレージコントローラ１０１は、複製元ボリュームへのライトデータを複製後に格納する為の論理ボリューム＃４を作成する。論理ボリューム＃４の作成に伴い、追記ボリューム＃４及びアドレス変換テーブル＃４も作成される。論理ボリューム＃４は単独領域に属する。
【０１４６】
複製前にサーバシステム２０１から提供ボリューム＃１に発行されていたリード要求及びライト要求は、複製後に論理ボリューム＃４へ発行されるようにするため、提供ボリューム＃１と論理ボリューム＃４のボリュームＩＤをスワップする。すなわち論理ボリューム＃４が提供ボリュームになる。なお、図３３にはスワップ前の状況を示している。
【０１４７】
また、スワップ前の提供ボリューム＃１は共通ボリューム＃２と同様にサーバシステム２０１に提供されない重複単独ボリュームとなる。以降、重複単独ボリューム＃１のことを旧世代提供ボリュームと呼び、提供ボリューム＃４（スワップ後の提供ボリューム＃１）のことを最新世代提供ボリュームと呼ぶこともある。
【０１４８】
・ストレージコントローラ１０１は、ボリューム複製によって生成されるアドレス変換テーブル＃３及びアドレス変換テーブル＃４を、例えばアドレス変換テーブル＃１の複製によって作成する。複製後のアドレス変換テーブル＃３及びアドレス変換テーブル＃４は、重複データセットＡに対応する重複元ブロック（提供ブロック６０１Ｓ及び６０１Ｐａ）の論理アドレスの参照先が、重複先ブロック（共通ブロック６０１Ｃ）の論理アドレスとなる。
【０１４９】
一方、単独データセットＢに対応する重複元ブロック（提供ブロック６０１Ｓ及び６０１Ｐａ）の参照先は、アドレス変換テーブル＃１と同じ参照先、すなわち、追記単独ページにおけるサブブロック６０２Ｐ（圧縮後データセットＢ´）の論理アドレスとするのではなく、複製元である旧世代提供ボリューム＃１の圧縮前データセットＡに対応する提供ブロック６０１Ｐの論理アドレスとなるように更新する。
【０１５０】
以上が、ボリューム複製処理の一例である。なお、図３３の大矢印の先の状態から複製先の提供ボリューム５０１Ｓの複製ボリュームを更に作成する場合も、以上と同様の処理となる。
【０１５１】
すなわち、ストレージコントローラ１０１は、更に複製先となる提供ボリューム、及びその複製元となる提供ボリューム５０１Ｓへのライトデータを格納する為の新たな提供ボリュームを単独領域７０に作成する。
【０１５２】
サーバシステム２０１から発行されるリード要求及びライト要求を、新たに作成した論理ボリュームに対して実行されるよう、提供ボリューム５０１Ｓと新たな作成した提供ボリュームのボリュームＩＤをスワップする。
【０１５３】
また、ボリューム複製処理において、ストレージコントローラ１０１は、複製先提供ボリューム＃３及び最新世代提供ボリューム＃４に対応するアドレス変換テーブル＃３及びアドレス変換テーブル＃４を、複製元の旧世代提供ボリューム＃１に対応するアドレス変換テーブル＃１から複製しなくてもよい。
【０１５４】
その場合、複製先提供ボリューム＃３及び最新世代提供ボリューム＃４へのリード処理では、世代管理テーブル４３２、及び実データ位置管理ビットマップ４３３を参照して、実データが存在するアドレス変換テーブル４２２を特定する。この処理に関する詳細は後述する。
【０１５５】
また、旧世代提供ボリューム＃１は、複数の提供ボリューム＃３及び＃４から重複データセットの論理アドレスを参照される点で共通ボリューム＃３と類似しているため、ボリューム複製処理において、共通ボリュームと同様、重複管理テーブル４３０を作成してもよい。また、旧世代提供ボリューム＃１は単独領域７０に代えて、共通領域８０に属するように変更されてもよい。
【０１５６】
ストレージコントローラ１０１は、例えば、最新世代提供ボリューム＃４のうちの、データセットＡのライト先の提供ブロック６０１Ｐａに、データセットＦを書き込むためのライト要求を受信したとする。
【０１５７】
この場合、ストレージコントローラ１０１は、アドレス変換テーブル＃４を参照し、書き込み前の旧データＡに対応するＡ´が追記共通ページ（共通ページ５１Ｃ）に存在するため、ライト対象の圧縮後データセットＦ´を追記単独ページ（追記ボリューム５０２Ｐａのページ５１Ｐａ）における新たなサブブロックに追記する。
【０１５８】
そして、ストレージコントローラ１０１は、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロック（共通ブロック６０１Ｃ）の論理アドレスから新たなサブブロックの論理アドレスに変更する。
【０１５９】
また、ストレージコントローラ１０１は、例えば、最新世代提供ボリューム＃４のうちの、データセットＢのライト先の提供ブロック６０１Ｐａに、データセットＧを書き込むためのライト要求を受信したとする。
【０１６０】
この場合、ストレージコントローラ１０１は、アドレス変換テーブル＃４を参照し、書き込み前の旧データＢに対応するＢ´が追記重複単独ページとなった単独ページ５１Ｐに存在する。
【０１６１】
このため、ライト対象の圧縮後データセットＧ´を追記単独ページ（ページ５１Ｐａ）における新たなサブブロックに追記し、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロックである提供ブロック６０１Ｐの論理アドレスから新たなサブブロックの論理アドレスに変更する。
【０１６２】
また、ストレージコントローラ１０１は、例えば、複製先提供ボリューム＃３のうちの、データセットＡのライト先の提供ブロック６０１Ｓに、データセットＨを書き込むためのライト要求を受信したとする。
【０１６３】
この場合、ストレージコントローラ１０１は、アドレス変換テーブル＃３を参照し、書き込み前の旧データＡに対応するＡ´が追記共通ページに存在するため、ライト対象の圧縮後データセットＨ´を（追記ボリューム５０２Ｓの）追記単独ページ５１Ｓにおける新たなサブブロックに追記する。
【０１６４】
そして、ストレージコントローラ１０１は、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロック（共通ブロック６０１Ｃ）の論理アドレスから新たなサブブロックの論理アドレスに変更する。
【０１６５】
また、ストレージコントローラ１０１は、例えば、複製先提供ボリューム＃３のうちの、データセットＢのライト先の提供ブロック６０１Ｓに、データセットＩを書き込むためのライト要求を受信したとする。
【０１６６】
この場合、ストレージコントローラ１０１は、アドレス変換テーブル＃３を参照し、書き込み前の旧データＢに対応するＢ´が追記重複単独ページとなった単独ページ５１Ｐに存在する。
【０１６７】
このため、ライト対象の圧縮後データセットＩ´を追記単独ページ５１Ｓにおける新たなサブブロックに追記し、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロックである提供ブロック６０１Ｐの論理アドレスから新たなサブブロックの論理アドレスに変更する。
【０１６８】
旧世代提供ボリューム＃１は共通ボリューム＃２と同様に、前述の（ｘ２）の問題が発生し得る。すなわち、旧世代提供ボリューム＃１において重複先ブロックとなった提供ブロック６０１Ｐが、いずれの最新世代の提供ボリューム５０１Ｐａにおける提供ブロック６０１Ｐａ及び複製先の提供ボリューム５０１Ｓにおける提供ブロック６０１Ｓから参照されなくなる可能性がある。
【０１６９】
そして、提供ブロック６０１Ｐは、参照されなくなっているにも関わらず、使用中のままとなり、結果として、旧世代提供ボリューム＃１の空き容量が増えず、且つ、追記重複単独ページである単独ページ５１Ｐに、不必要な圧縮後データブロックが残り続けてしまうこと、が発生し得る。
【０１７０】
この状況が発生し得るため、共通ボリューム＃２と同様に、ストレージコントローラ１０１は、重複先ブロックである提供ブロック６０１Ｐを未使用とするための解放処理を行う。
【０１７１】
具体的に、重複単独領域解放処理においてストレージコントローラ１０１は、重複先ブロックである提供ブロック６０１Ｐの１以上の参照元ブロック（１以上の提供ボリューム５０１Ｐａにおける１以上の提供ブロック６０１Ｐａ及び１以上の提供ボリューム５０１Ｓにおける１以上の提供ブロック６０１Ｓ）から、参照先が重複先ブロックではない参照元ブロックを除外する。
【０１７２】
そして、ストレージコントローラ１０１は、１以上の参照元ブロックが除外されたために重複先ブロックを参照先とする参照元が無くなった場合、重複先ブロックである提供ブロック６０１Ｐを未使用へと解放する。
【０１７３】
それに伴い、ストレージコントローラ１０１は、解放される重複先ブロックである提供ブロック６０１Ｐの参照先のサブブロック６０２Ｐを無効サブブロックとする。なお、旧世代提供ボリューム＃１における重複先ブロックの参照元ブロックが１つだけの場合、ストレージコントローラ１０１は、下記のうちのいずれかを行ってもよい。
【０１７４】
・ストレージコントローラ１０１は、重複先ブロックの提供ブロック６０１Ｐに対応した圧縮後データセットを、追記重複単独ページの単独ページ５１Ｐから、参照元の提供ブロック６０１Ｐａ（又は参照元の提供ブロック６０１Ｓ）を含む提供ボリューム５０１Ｐａ（又は提供ボリューム５０１Ｓ）に対応した追記単独ページ（ページ５１Ｐａ）又は追記単独ページ５１Ｓに、追記的にコピーする。
【０１７５】
そして、ストレージコントローラ１０１は、（重複単独ページにおける）コピー元のサブブロック６０２Ｐを未使用（未割当）とし、重複先ブロックである提供ブロック６０１Ｐを未使用とする。これにより、旧世代提供ボリューム＃１の空き容量を増やすことができる。
【０１７６】
・ストレージコントローラ１０１は、重複先ブロックである提供ブロック６０１Ｐに対応した圧縮後データセットを、重複単独ページ（単独ページ５１Ｐ）に格納されたままとする。これにより、ページ５１間のコピーの発生頻度を低減することができる。
以下、テーブルの例を説明する。
【０１７７】
図８は、ＶＯＬ管理テーブル４２１の例を示す図である。本実施形態では、提供ボリューム５０１Ｐのようにサーバシステム２０１に提供される論理ボリュームも、共通ボリューム５０１Ｃ及び追記ボリューム５０２のようにサーバシステム２０１に提供されない論理ボリュームも、「ＶＯＬ」と総称してもよい。
【０１７８】
また、ボリューム複製により、新たにサーバシステム２０１に提供される提供ボリューム５０１Ｐａと５０１Ｓ、及びサーバシステムに提供されなくなった旧世代提供ボリューム＃１である提供ボリューム５０１Ｐも、「ＶＯＬ」である。
【０１７９】
ＶＯＬ管理テーブル４２１は、ＶＯＬに関する情報を保持する。例えば、ＶＯＬ管理テーブル４２１は、ＶＯＬ毎にエントリを有する。各エントリは、ＶＯＬ＃８０１、ＶＯＬ属性８０２、ＶＯＬ容量８０３、及びプール＃８０４といった情報を格納する。以下、１つのＶＯＬ（「対象ＶＯＬ」と呼ぶ）を例に取って説明する。
【０１８０】
ＶＯＬ＃８０１は、対象ＶＯＬの番号（識別番号）の情報である。ＶＯＬ属性８０２は、対象ＶＯＬの属性の情報である（例えば、提供ボリュームは“提供”、追記ボリュームは“追記”、共通ボリュームは“共通”、ボリューム複製による旧世代の提供ボリュームは“重複単独”）。ＶＯＬ容量８０３は、対象ＶＯＬの容量の情報である。プール＃８０４は、対象ＶＯＬに関連付けられているプール５０３の番号の情報である。
【０１８１】
図９は、アドレス変換テーブル４２２の例を示す図である。アドレス変換テーブル４２２は、論理ボリューム５０１（レイヤ１の論理ボリューム）毎に設定される。アドレス変換テーブル４２２は、参照元の論理アドレスと参照先の論理アドレスとの関係に関する情報を保持する。
【０１８２】
例えば、アドレス変換テーブル４２２は、ブロック６０１毎にエントリを有する。各エントリは、ＶＯＬ内アドレス９０１、参照先ＶＯＬ＃９０２、参照先ＶＯＬ内アドレス９０３、データサイズ９０４、及び参照先ＶＯＬ種別９０５といった情報を格納する。以下、１つのブロック６０１（「対象ブロック」と呼ぶ）を例に取って説明する。
【０１８３】
ＶＯＬ内アドレス９０１は、論理ボリューム５０１における対象ブロックの論理アドレス（例えば先頭論理アドレス）の情報である。参照先ＶＯＬ＃９０２は、対象ブロックの参照先のＶＯＬ（追記ボリューム又は共通ボリューム）の番号の情報である。
【０１８４】
参照先ＶＯＬ内アドレス９０３は、対象ブロックの参照先のＶＯＬにおける対象ブロックの論理アドレスに対応する論理アドレス（参照先ＶＯＬ内の論理アドレス）の情報である。データサイズ９０４は、対象ブロックをライト先としたデータセットの圧縮後データセットのサイズの情報である。
【０１８５】
参照先ＶＯＬ種別９０５は、対象ブロックの参照先のＶＯＬの種別（“単独”（追記ボリューム）であるか、“共通”（共通ボリューム）であるか、“重複単独”（重複単独ボリューム）であるかの種別）の情報である。
【０１８６】
図１０は、有効領域管理テーブル４２４の例を示す図である。有効領域管理テーブル４２４は、論理ボリューム５０１毎に設定される。有効領域管理テーブル４２４は、有効領域に関する情報を保持する。例えば、有効領域管理テーブル４２４は、ブロック６０１毎にエントリを有する。
【０１８７】
各エントリは、ＶＯＬ内アドレス１００１及び有効フラグ１００２といった情報を格納する。以下、１つのブロック６０１（「対象ブロック」と呼ぶ）を例に取って説明する。ＶＯＬ内アドレス１００１は、対象ブロックの論理アドレスの情報である。有効フラグ１００２は、対象ブロックが有効領域に属するか（“有”）、属さないか（“無”）の情報である。
【０１８８】
図１１は、ページ変換テーブル４２５の例を示す図である。ページ変換テーブル４２５は、論理ボリューム５０１毎に、及び追記ボリューム５０２毎に、設定される。ページ変換テーブル４２５は、論理ボリューム５０１又は追記ボリューム５０２における領域（例えば、ページ５１のサイズと同数分のブロック６０１）とページ５１との関係に関する情報を保持する。
【０１８９】
例えば、ページ変換テーブル４２５は、論理ボリューム５０１又は追記ボリューム５０２における領域毎にエントリを有する。各エントリは、ＶＯＬ内アドレス１１０１、割当フラグ１１０２、及びページ＃１１０３といった情報を格納する。以下、１つの領域（「対象領域」と呼ぶ）を例に取って説明する。
【０１９０】
ＶＯＬ内アドレス１１０１は、対象領域の論理アドレス（例えば先頭論理アドレス）の情報である。割当フラグ１１０２は、対象領域にページ５１が割り当てられているか（“割当済”）、割り当てられていないか（“未割当”）の情報である。ページ番号１１０３は、対象領域に割り当てられているページ５１の番号の情報である。
【０１９１】
図１２は、ページ割当管理テーブル４２６の例を示す図である。ページ割当管理テーブル４２６は、プール５０３毎に設定される。ページ割当管理テーブル４２６は、ページ５１とその割当先との関係に関する情報を保持する。例えば、ページ割当管理テーブル４２６は、ページ５１毎にエントリを有する。
【０１９２】
各エントリは、ページ＃１２０１、割当フラグ１２０２、割当先ＶＯＬ＃１２０３、及び割当先ＶＯＬ内アドレス１２０４といった情報を格納する。以下、１つのページ５１（「対象ページ」と呼ぶ）を例に取って説明する。ページ＃１２０１は、対象ページの番号の情報である。割当フラグ１２０２は、対象ページが割り当てられているか（“割当済”）、割り当てられていないか（“未割当”）の情報である。
【０１９３】
割当先ＶＯＬ＃１２０３は、対象ページの割当先ＶＯＬ（論理ボリューム５０１又は追記ボリューム５０２）の番号の情報である。割当先ＶＯＬ内アドレス１２０４は、対象ページの割当先ＶＯＬにおける領域の論理アドレス（例えば先頭論理アドレス）の情報である。
【０１９４】
図１３は、サブブロック管理テーブル４２７の例を示す図である。サブブロック管理テーブル４２７は、追記ボリューム５０２毎に設定される。サブブロック管理テーブル４２７は、サブブロック６０２に関する情報を保持する。例えば、サブブロック管理テーブル４２７は、サブブロック６０２毎にエントリを有する。
【０１９５】
各エントリは、ページ＃１３０１、ページ内アドレス１３０２、割当フラグ１３０３、ＶＯＬ内アドレス１３０４、及びサブブロックサイズ１３０５といった情報を格納する。
以下、１つのサブブロック６０２（「対象サブブロック」と呼ぶ）を例に取って説明する。
【０１９６】
ページ＃１３０１は、対象サブブロックを含むページ５１の番号の情報である。ページ内アドレス１３０２は、ページ５１における対象サブブロックの論理アドレスの情報である。割当フラグ１３０３は、対象サブブロックが割り当てられているか（“割当済”）、割り当てられていないか（“未割当”）、言い換えれば、対象サブブロックが使用中か未使用かの情報である。
【０１９７】
ＶＯＬ内アドレス１３０４は、対象サブブロックの割当先の論理アドレス（追記ボリューム５０２における領域の論理アドレス）の情報である。サブブロックサイズ１３０５は、対象サブブロックのサイズ（対象サブブロックに格納されている圧縮後データセットのサイズ）の情報である。なお、ページ内アドレス１３０２とＶＯＬ内アドレス１３０４は同じであってもよい。
【０１９８】
図１４は、追記先検索テーブル４２８の例を示す図である。追記先検索テーブル４２８は、圧縮後データセットの追記先の情報を保持する。追記先検索テーブル４２８は、例えば、追記ボリューム５０２毎にエントリを有する。各エントリは、ＶＯＬ＃１４０１、追記先アドレス１４０２、及び終端アドレス１４０３といった情報を格納する。
【０１９９】
以下、１つの追記ボリューム５０２（「対象追記ボリューム」と呼ぶ）を例に取って説明する。ＶＯＬ＃１４０１は、対象追記ボリュームの番号の情報である。追記先アドレス１４０２は、対象追記ボリュームにおける追記先の論理アドレス（対象追記ボリュームに割り当てられた追記ページにおける追記先の論理アドレス）の情報である。
【０２００】
ここで、追記先アドレス１４０２は、追記先の先頭の論理アドレスの情報となる。終端アドレス１４０３は、追記先となり得る論理アドレスの終端の論理アドレスの情報である。  追記先の論理アドレスと終端の論理アドレスとの差に従うサイズが、圧縮後データサイズ未満の場合、追記不可のため、ガベージコレクション処理を経て、対象追記ボリュームの先頭の論理アドレスが再度追記先とされてよい。
【０２０１】
具体的には、例えば、ストレージコントローラ１０１は、対象追記ボリュームの先頭の論理アドレスに近い追記ページから優先的にガベージコレクション処理を行ってもよい。それにより、対象追記ボリュームの先頭の論理アドレスに近い追記ページから優先的に、追記ページの割当が解除され、結果として、対象追記ボリュームの先頭の論理アドレスに近い領域から優先的に、未使用とされていってよい。
【０２０２】
図１５は、重複チェックテーブル４８９の例を示す図である。重複チェックテーブル４８９は、重複判定処理において作成され使用される。重複チェックテーブル４８９は、重複判定処理の対象とされるデータについて作成され、例えばメモリ２１２に格納される。ここで言う「データ」は、典型的には、所定の処理対象のデータであり、ブロックのサイズよりも大きい。
【０２０３】
このため、重複判定処理（及び、単独領域７０又は共通領域８０へのデータの格納）は、ブロック単位（データセット単位）で行われてもよいが、本実施形態では、ブロック単位に代えて処理対象のデータの単位でまとめて行われる。
【０２０４】
具体的には、例えば、処理対象のデータは、いずれかの提供ボリューム５０１Ｐに対するライト要求に従うデータであり、ライト要求に従うデータのサイズは、ブロックのサイズの整数倍でよく、重複判定処理（及び、単独領域７０又は共通領域８０へのデータの格納）は、ライト要求に従うデータの単位（すなわち、Ｉ／Ｏ要求の単位）で行われてもよい。
【０２０５】
このように、重複判定処理（及び、単独領域７０又は共通領域８０へのデータの格納）は、処理対象のデータの単位でまとめて行われるので、効率的である。重複チェックテーブル４８９は、例えば、データを構成する１以上のデータセットにそれぞれ対応した１以上のブロック６０１の各々について、エントリを有する。
【０２０６】
各エントリは、対象ＶＯＬ＃１５０１、対象ＶＯＬ内アドレス１５０２、ハッシュ値１５０３、ヒットフラグ１５０４、比較先ＶＯＬ＃１５０５、比較先ＶＯＬ内アドレス１５０６、比較成功フラグ１５０７、格納先ＶＯＬ＃１５０８、及び格納先ＶＯＬ内アドレス１５０９といった情報を格納する。
【０２０７】
以下、１つのブロック６０１（「対象ブロック」と呼ぶ）を例に取って説明する。対象ＶＯＬ＃１５０１は、対象ブロックを含む論理ボリューム５０１の番号の情報である。対象ＶＯＬ内アドレス１５０２は、対象ブロックの論理アドレスの情報である。
【０２０８】
ハッシュ値１５０３は、対象ブロックに対応したハッシュ値（対象ブロックがライト先であるデータセットのハッシュ値）の情報である。ヒットフラグ１５０４は、ハッシュ値ヒットしたか（“Ｈｉｔ”）、バッシュ値ヒットしなかったか（“Ｍｉｓｓ”）の情報である。「ハッシュ値ヒット」とは、対象ブロックに対応したハッシュ値と一致するハッシュ値が既に存在することである。
【０２０９】
比較先ＶＯＬ＃１５０５は、対象ブロックについてハッシュ値ヒットが生じた場合に有効であり、比較先ＶＯＬの番号の情報である。「比較先ＶＯＬ」とは、対象ブロックに対応したハッシュ値と一致するハッシュ値のデータセットを格納する論理ボリューム５０１であり、データセット同士の比較先とされる論理ボリューム５０１である。比較先ＶＯＬは、提供ボリューム５０１Ｐと共通ボリューム５０１Ｃのいずれかである。
【０２１０】
比較先ＶＯＬ内アドレス１５０６は、対象ブロックに対応したハッシュ値と一致するハッシュ値のデータセットを格納するブロック６０１の論理アドレス（比較先ＶＯＬにおけるブロック６０１の論理アドレス）の情報である。対象ブロックについて、比較先ＶＯＬ＃１５０５及び比較先ＶＯＬ内アドレス１５０６の組が複数存在してもよい。
【０２１１】
比較成功フラグ１５０７は、対象ブロックについてハッシュ値ヒットが生じた場合に行われるデータセット同士の比較が成功したか（“成功”）、失敗したか（“失敗”）の情報である。データセット同士が互いに一致の場合に、比較成功フラグ１５０７は“成功”である。
【０２１２】
格納先ＶＯＬ＃１５０８は、格納先ＶＯＬの番号の情報である。「格納先ＶＯＬ」とは、対象ブロックがライト先であるデータセットの格納先の論理ボリューム５０１である。対象ブロックがライト先であるデータセットが単独データセットであれば、格納先ＶＯＬは、追記ボリューム５０２である。
【０２１３】
対象ブロックがライト先であるデータセットが重複データセットであれば、格納先ＶＯＬは、共通ボリューム５０１Ｃである。格納先ＶＯＬ内アドレス１５０９は、対象ブロックがライト先であるデータセットの格納先ブロックの論理アドレス（格納先ＶＯＬ内のブロックの論理アドレス）の情報である。
【０２１４】
図１６は、ハッシュ管理テーブル４２９の例を示す図である。ハッシュ管理テーブル４２９は、データセットのハッシュ値に関する情報を保持する。ハッシュ管理テーブル４２９は、例えば、ハッシュ値毎にエントリを有する。
【０２１５】
各エントリは、ハッシュ値１６０１、登録フラグ１６０２、ＶＯＬ＃１６０３、及びＶＯＬ内アドレス１６０４といった情報を格納する。以下、１つのハッシュ値（「対象ハッシュ値」と呼ぶ）を例に取って説明する。
【０２１６】
ハッシュ値１６０１は、対象ハッシュ値そのものの情報である。登録フラグ１６０２は、対象ハッシュ値をハッシュ値とするデータセットがストレージシステム２００に存在しているか（“済”）、存在していないか（“未”）の情報である。
【０２１７】
ＶＯＬ＃１６０３は、対象ハッシュ値をハッシュ値とするデータセットを格納する論理ボリューム５０１の番号の情報である。ＶＯＬ内アドレス１６０４は、対象ハッシュ値をハッシュ値とするデータセットを格納するブロック６０１の論理アドレスの情報である。
【０２１８】
重複判定処理において、対象ハッシュ値についてハッシュ値ヒットが生じた場合、対象ハッシュ値に対応したＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４の情報が、図１５に示した重複チェックテーブル４８９における比較先ＶＯＬ＃１５０５及び比較先ＶＯＬ内アドレス１５０６の情報とされる。
【０２１９】
図１７は、重複管理テーブル４３０の例を示す図である。重複管理テーブル４３０は、重複データセットの位置（論理アドレス）に関する情報を保持する。重複管理テーブル４３０は、例えば、共通ボリューム５０１Ｃを構成する複数の共通ブロック６０１Ｃの各々について、ＶＯＬ内アドレス（論理アドレス）を有する。
【０２２０】
参照元が存在する共通ブロック６０１Ｃには、参照元のエントリが例えばキュー形式で関連付けられる。参照元のエントリは、ＶＯＬ＃（参照元のブロック６０１を含む論理ボリューム５０１の番号）、及び、ＶＯＬ内アドレス（参照元のブロック６０１の論理アドレス）を格納する。
【０２２１】
図１８は、共通領域割当管理テーブル４３１の例を示す図である。共通領域割当管理テーブル４３１は、共通ボリューム５０１Ｃ毎に設定される。共通領域割当管理テーブル４３１は、共通ボリューム５０１Ｃの空き状況に関する情報を保持する。
【０２２２】
共通領域割当管理テーブル４３１は、例えば、共通ボリューム５０１Ｃを構成する複数の共通ブロック６０１Ｃの各々について、エントリを有する。各エントリは、ＶＯＬ内アドレス１８０１及び使用中フラグ１８０２といった情報を格納する。以下、１つの共通ブロック６０１Ｃ（「対象ブロック」と呼ぶ）を例に取って説明する。
【０２２３】
ＶＯＬ内アドレス１８０１は、対象ブロックの論理アドレスの情報である。使用中フラグ１８０２は、対象ブロックが使用中であるか（“使用中”）、使用中でないか（“未使用”）の情報である。
【０２２４】
使用中フラグ１８０２の情報が“使用中”であるとは、対象ブロックに直接的（追記ボリューム非経由）又は間接的（追記ボリューム経由）にページ５１が割り当てられていることを意味する。使用中フラグ１８０２の情報が“未使用”であるとは、対象ブロックにページ５１が割り当てられていないこと、すなわち、空きであることを意味する。
【０２２５】
図１９は、共通領域チェックテーブル４３４の例を示す図である。共通領域チェックテーブル４３４は、共通ボリューム５０１Ｃ毎に設定される。共通領域チェックテーブル４３４は、共通ボリューム５０１Ｃに対する参照状況に関する情報を保持する。
【０２２６】
共通領域チェックテーブル４３４は、例えば、共通ボリューム５０１Ｃを構成する複数の共通ブロック６０１Ｃの各々について、エントリを有する。各エントリは、ＶＯＬ内アドレス１９０１及び参照フラグ１９０２といった情報を格納する。以下、１つの共通ブロック６０１Ｃ（「対象ブロック」と呼ぶ）を例に取って説明する。
【０２２７】
ＶＯＬ内アドレス１９０１は、対象ブロックの論理アドレスの情報である。参照フラグ１９０２は、対象ブロックについて１以上の参照元となるブロック６０１が存在するか（“有”）、存在しないか（“無”）の情報である。
【０２２８】
図３４は、世代管理テーブル４３２の例を示す図である。世代管理テーブル４３２は、複製ボリュームグループ毎に設定される。複製ボリュームグループとは、ある提供ボリューム５０１Ｐのボリューム複製処理により作成される（図３３に示した）複製ボリューム（提供ボリューム５０１Ｓ）及び最新世代提供ボリューム（提供ボリューム５０１Ｐａ）のグループである。
【０２２９】
世代管理テーブル４３２は、ボリューム間の世代関係に関する情報を保持する。世代管理テーブル４３２は、ボリューム毎にエントリを有する。各エントリは、ＶＯＬ＃３４０１、親世代ＶＯＬ＃３４０２、及び子世代ＶＯＬ＃３４０３といった情報を格納する。以下、１つの最新世代提供ボリューム（「対象ボリューム」と呼ぶ）を例に取って説明する。
【０２３０】
ＶＯＬ＃３４０１は、対象ボリュームの番号の情報である。親世代ＶＯＬ＃３４０２は、対象ボリュームの複製元である旧世代ボリュームの番号の情報である。子世代ＶＯＬ＃３４０３は、対象ボリュームを複製元とした複製先ボリュームの番号の情報である。
【０２３１】
図３５は、実データ位置管理ビットマップ４３３の例を示す図である。実データ位置管理ビットマップ４３３は、複製ボリュームグループ毎に設定される。実データ位置管理ビットマップ４３３は、ボリュームの論理アドレスの参照先が示す実データが格納されているＶＯＬを特定する為の情報を保持する。
【０２３２】
例えば、実データ位置管理ビットマップ４３３は、ブロック６０１毎にエントリを有する。各エントリは、ＶＯＬ内アドレス３５０１及び世代ＶＯＬ＃毎の使用中フラグ３５０２といった情報を保持する。以下、１つのブロック６０１（「対象ブロック」と呼ぶ）を例に取って説明する。
【０２３３】
ＶＯＬ内アドレス３５０１は、対象ブロックの論理アドレスの情報である。世代ＶＯＬ＃毎の使用中フラグ３５０２は、対象ブロックに対応する実データ（いずれかのボリュームの参照先ブロックに格納されたデータ）が、存在するか（“有”）、存在しないか（“無”）の世代ＶＯＬ＃毎の情報である。
【０２３４】
なお、世代ＶＯＬ＃毎の使用中フラグ３５０２の情報が（“無”）の場合、その（“無”）に対応する実データは、その世代として新しい実データが存在せず、その世代より前の世代に存在する実データが、リード要求などに対応するデータとして利用されてもよい。
【０２３５】
以下、本実施形態で行われる処理を説明する。なお、以下の説明において、データセットの圧縮及び伸張は、データ量削減プログラム４１４により（又は、データ量削減プログラム４１４が呼び出されることにより）、実行されてもよい。
【０２３６】
図２０は、フロントエンドライト処理の流れの例を示す図である。フロントエンドライト処理は、論理ボリューム５０１に対するライト要求を受け付けた場合に行われる。
【０２３７】
フロントエンドライトプログラム４１２は、キャッシュヒットしたか否かを判定する（ステップ２００１）。ライト要求について、「キャッシュヒット」とは、ライト要求に従うライト先に対応したキャッシュセグメント（キャッシュメモリ４０２における領域）が確保されていることを意味する。
【０２３８】
ステップ２００１の判定結果が偽の場合（ステップ２００１：ＮＯ）、フロントエンドライトプログラム４１２は、キャッシュメモリ４０２からキャッシュセグメントを確保する（ステップ２００２）。
【０２３９】
ステップ２００１の判定結果が真の場合（ステップ２００１：ＹＥＳ）、又は、ステップ２００２の後、フロントエンドライトプログラム４１２は、確保されているキャッシュセグメントに、ライト要求に従うライト対象データを書き込む（ステップ２００３）。
【０２４０】
フロントエンドライトプログラム４１２は、ライト先の論理ボリューム５０１に対応した有効領域管理テーブル４２４を基に、ライト先が有効領域に属するか否かを判定する（ステップ２００４）。
【０２４１】
ステップ２００４の判定結果が真の場合（ステップ２００４：ＹＥＳ）、フロントエンドライトプログラム４１２は、ライト対象データを構成する１以上のデータセットの各々についてのライトコマンドを、データ量削減ダーティキューに蓄積する（ステップ２００５）。
【０２４２】
「データ量削減ダーティキュー」とは、ダーティのデータセット（ページ５１に未格納のデータセット）であり圧縮が必要なデータセットのライトコマンドが蓄積されるキューである。
【０２４３】
ステップ２００４の判定結果が偽の場合（ステップ２００４：ＮＯ）、フロントエンドライトプログラム４１２は、ライト対象データを構成する１以上のデータセットの各々についてのライトコマンドを、デステージダーティキューに蓄積する（ステップ２００６）。
【０２４４】
「デステージダーティキュー」とは、ダーティのデータセット（ページ５１に未格納のデータセット）であり圧縮が不要なデータセットのライトコマンドが蓄積されるキューである。
【０２４５】
ステップ２００５又はステップ２００６の後、フロントエンドライトプログラム４１２は、ＧＯＯＤ応答（ライト完了報告）を、ライト要求の送信元に返す（ステップ２００７）。なお、ライト要求に対するＧＯＯＤ応答は、バックエンドライト処理が完結した場合に返されてもよい。
【０２４６】
バックエンドライト処理は、フロントエンド処理と同期又は非同期で行われてよい。バックエンドライト処理がバックエンドライトプログラム４１３により行われる。バックエンドライトプログラム４１３は、例えば、デステージダーティキューにあるライトコマンドについて、非圧縮又圧縮後のデータセットを、ライト先に関し割り当てられたページ５１に書き込む。
【０２４７】
図２１は、データ量削減処理の流れの例を示す図である。データ量削減処理は、例えば定期的に行われる。
【０２４８】
データ量削減プログラム４１４は、データ量削減ダーティキューを参照し（ステップ２１０１）、データ量削減ダーティキューにコマンドが有るか否かを判定し（ステップ２１０２）、判定結果としてデータ量削減ダーティキューにコマンドが無ければ（ステップ２１０２：ＮＯ）、データ量削減処理が終了する。
【０２４９】
判定結果としてデータ量削減ダーティキューにコマンドが有れば（ステップ２１０２：ＹＥＳ）、データ量削減プログラム４１４は、データ量削減ダーティキューからライトコマンドを取得する、すなわち、ダーティのデータセットを選択する（ステップ２１０３）。
【０２５０】
データ量削減プログラム４１４は、ステップ２１０３で選択されたデータセットについて重複排除処理を行い（ステップ２１０４）、重複排除されたか否かを判定する（ステップ２１０５）。なお、ステップ２１０４などの別定義の処理は後で説明する。
【０２５１】
ステップ２１０３で選択されたデータセットが単独データセットであるが故に重複排除がされなかった場合（ステップ２１０５：ＮＯ）、データ量削減プログラム４１４は、重複排除されなかった単独データセットについて追記処理を行う（ステップ２１０６）。
【０２５２】
ステップ２１０３で選択されたデータセットが重複データセットであるが故に重複排除がされた場合（ステップ２１０５：ＹＥＳ）、又は、ステップ２１０６の後、データ量削減プログラム４１４は、ステップ２１０３で選択されたデータセットを破棄（例えばキャッシュメモリ４０２から削除）する（ステップ２１０７）。
【０２５３】
図２２は、重複排除処理の流れの例を示す図である。重複排除処理は、図２１のステップ２１０３で選択されたデータセットについて行われる。以下、図２２から図２４の説明において、ステップ２１０３で選択されたデータセットを「ライトデータセット」と言い、ライトデータセットのライト先のブロックを「ライト先ブロック」と言い、ライト先ブロックを含んだ論理ボリュームを「ライト先ボリューム」と言う。
【０２５４】
データ量削減プログラム４１４は、ライトデータセットについて重複判定処理を行い（ステップ２２０１）、ライトデータセットが重複しているか否かを判定し（ステップ２２０２）、ステップ２２０１の判定結果として、ライトデータセットが単独データセット（重複していなデータセット）であれば（ステップ２２０２：ＮＯ）、重複排除処理を終了する。
【０２５５】
ステップ２２０１の判定結果として、ライトデータセットが重複データセットであれば（ステップ２２０２：ＹＥＳ）、データ量削減プログラム４１４は、ライトデータセットと重複する別の重複データセットが単独領域７０に存在するか否かを判定する（ステップ２２０３）。
【０２５６】
なお、ライトデータセットと、そのライトデータセットと重複する別の重複データセットを、図２２の以下の説明において「重複データセット」と総称する。すなわち、図２２の以下の説明において、「重複データセット」は、ライトデータセットを含む２以上のデータセットのうちのいずれでもよい。
【０２５７】
重複データセットが単独領域７０に既に存在するデータセットの場合、後述のステップ２２０４及びステップ２２０５のいずれかにおいて、存在したデータセットの圧縮後データセットがデータ量削減プログラム４１４により一旦伸張され、伸張されたデータセットが、重複データセットとなってもよい。
【０２５８】
また、ステップ２２０３の判定は、例えば、ライト先ブロックに対応した比較先ＶＯＬ＃１５０５の情報が、ＶＯＬ属性８０２“提供”のＶＯＬ＃８０１の情報と一致するか、或いはＶＯＬ属性８０２の情報が“共通”のＶＯＬ＃８０１の情報と一致するか、に基づく。
【０２５９】
ライト先ブロックに対応した比較先ＶＯＬ＃１５０５の情報が、ＶＯＬ属性８０２の情報が“提供”のＶＯＬ＃８０１の情報と一致すれば、別の重複データセットが単独領域７０に存在することになるため、ステップ２２０３の判定結果が真（ＹＥＳ）である。
【０２６０】
ライト先ブロックに対応した比較先ＶＯＬ＃１５０５の情報が、ＶＯＬ属性８０２の情報が“共通”のＶＯＬ＃８０１の情報と一致すれば、別の重複データセットが共通領域８０に存在することになるため、ステップ２２０３の判定結果が偽（ＮＯ）である。
【０２６１】
以上のステップ２２０３の判定結果が真の場合（ステップ２２０３：ＹＥＳ）、データ量削減プログラム４１４は、ステップ２２０４の処理へ進む。そして、データ量削減プログラム４１４は、使用中フラグ１８０２の情報が“未使用”の共通ブロック６０１Ｃを選択する（ステップ２２０４）。
【０２６２】
以下、ステップ２２０４で選択された共通ブロック６０１Ｃを、「対象共通ブロック」と言い、対象共通ブロックを含む共通ボリューム５０１Ｃを、「対象共通ボリューム」と言う。
【０２６３】
データ量削減プログラム４１４は、重複データセットを圧縮し、その圧縮後データセットを、追記共通ページ（対象共通ボリュームに対応した追記ボリューム５０２に割り当てられた共通ページ５１Ｃ、特に対象共通ブロック）に追記する（ステップ２２０５）。
【０２６４】
データ量削減プログラム４１４は、重複管理テーブル４３０を更新し、具体的には、対象共通ブロックに、１以上の重複データセットにそれぞれ対応した１以上のブロック６０１を参照元として関連付ける（ステップ２２０６）。
【０２６５】
データ量削減プログラム４１４は、重複チェックテーブル４８９を更新し、具体的には、ライト先ブロックに対応した格納先ＶＯＬ＃１５０８の情報、及び、格納先ＶＯＬ内アドレス１５０９の情報として、対象共通ボリュームの番号、及び、対象共通ブロックの論理アドレスを登録する（ステップ２２０７）。
【０２６６】
データ量削減プログラム４１４は、ハッシュ管理テーブル４２９を更新し、例えば、ハッシュ値１６０１（重複データセットのハッシュ値）、登録フラグ１６０２（“済”）、ＶＯＬ＃１６０３（対象共通ボリュームの番号）、及びＶＯＬ内アドレス１６０４（対象共通ブロックの論理アドレス）の各々の情報を登録する（ステップ２２０８）。
【０２６７】
データ量削減プログラム４１４は、ライトデータセット以外の重複データセットを格納する提供ボリューム５０１Ｐに対応したアドレス変換テーブル４２２を更新する（ステップ２２０９）。
【０２６８】
このアドレス変換テーブル４２２の更新で、具体的には、重複データセットに対応した参照先ＶＯＬ＃９０２の情報、及び、参照先ＶＯＬ内アドレス９０３の情報が、対象共通ボリュームの番号、及び、対象共通ブロックの論理アドレスに変更され、且つ、重複データセットに対応した参照先ＶＯＬ種別９０５の情報が“共通”に変更される。
【０２６９】
データ量削減プログラム４１４は、ライトデータセット以外の重複データセットを格納する提供ボリューム５０１Ｐに対応した追記ボリューム５０２に関するサブブロック管理テーブル４２７を更新し、具体的には、ライトデータセット以外の重複データセットの圧縮後データセットを格納するサブブロックに対応した割当フラグ１３０３の情報を“未割当”に変更する（ステップ２２１０）。
【０２７０】
ステップ２２０３の判定結果が偽の場合（ステップ２２０３：ＮＯ）、データ量削減プログラム４１４は、ステップ２２１１へ進む。そして、データ量削減プログラム４１４は、重複管理テーブル４３０を更新し、具体的には、重複データセットを格納した共通ブロック６０１Ｃに、ライト先ブロックを新たな参照元として関連付ける（ステップ２２１１）。
【０２７１】
データ量削減プログラム４１４は、重複チェックテーブル４８９を更新し、具体的には、ライト先ブロックに対応した格納先ＶＯＬ内アドレス１５０９の情報と、格納先ＶＯＬ＃１５０８の情報として、重複データセットを格納した共通ブロック６０１Ｃの論理アドレスと、重複データセットを格納した共通ブロック６０１Ｃを含んだ共通ボリューム５０１Ｃの番号を登録する（ステップ２２１２）。
【０２７２】
ステップ２２１０又はステップ２２１２の後、データ量削減プログラム４１４は、ライト先ボリュームに対応したアドレス変換テーブル４２２を更新する（ステップ２２１３）。
【０２７３】
このアドレス変換テーブル４２２の更新で、具体的には、ライト先ブロック（ライトデータセット）に対応した参照先ＶＯＬ＃９０２の情報、及び、参照先ＶＯＬ内アドレス９０３の情報が、共通ボリューム５０１Ｃの番号、及び、共通ブロック６０１Ｃの論理アドレスに変更され、且つ、ライト先ブロックに対応した参照先ＶＯＬ種別９０５の情報が“共通”に変更される。
【０２７４】
データ量削減プログラム４１４は、ライトデータセットの圧縮後データセットが追記単独ページにあれば、ライト先ボリュームに対応した追記ボリューム５０２に関するサブブロック管理テーブル４２７を更新し、具体的には、ライトデータセットの圧縮後データセットを格納するサブブロックに対応した割当フラグ１３０３を“未割当”に変更する（ステップ２２１４）。
【０２７５】
本実施形態において、重複排除処理は、上述したポストプロセスとしての処理であるが、インプロセスとしての処理の場合、例えば図２２のステップ２２１４は行われなくてもよい。これは、ライトデータセットの圧縮後データセットを追記すること無しに（又はライトデータセットの圧縮をすること無しに）重複排除がされるためである。
【０２７６】
図２３は、重複判定処理の流れの例を示す図である。データ量削減プログラム４１４は、ライトデータセットに関し重複チェックテーブル４８９を作成する（ステップ２３０１）。
【０２７７】
重複排除処理が、例えば、Ｉ／Ｏ単位のような所定の処理対象のデータの単位で行われ、結果として、データが複数のデータセットを含む場合、重複チェックテーブル４８９は、それら複数のデータセットにそれぞれ対応した複数のエントリを有する。
【０２７８】
データ量削減プログラム４１４は、ライト先ブロックに対応したハッシュ値１５０３の情報として、ライトデータセットのハッシュ値を登録する（ステップ２３０２）。
【０２７９】
データ量削減プログラム４１４は、ステップ２３０２で登録したハッシュ値と一致するハッシュ値がハッシュ管理テーブル４２９に登録されているか否か、すなわち、ハッシュ値ヒットが生じるか否かを判定する（ステップ２３０３）。
【０２８０】
ステップ２３０３の判定結果が真の場合（ステップ２３０３：ＹＥＳ）、データ量削減プログラム４１４は、重複チェックテーブル４８９を更新し、具体的には、ライト先ブロックに対応した比較先ＶＯＬ＃１５０５の情報及び比較先ＶＯＬ内アドレス１５０６の情報として、ステップ２３０２で登録したハッシュ値と一致するハッシュ値に対応したＶＯＬ＃１６０３の情報及びＶＯＬ内アドレス１６０４の情報を登録する（ステップ２３０４）。
【０２８１】
データ量削減プログラム４１４は、ライトデータセットと、比較先ＶＯＬ＃１５０５の情報及び比較先ＶＯＬ内アドレス１５０６の情報を基に取得したデータセット（例えば伸張後データセット）とを比較する（ステップ２３０５）。このステップ２３０５の比較は、圧縮後データセット同士の比較でもよい。
【０２８２】
ステップ２３０３の判定結果が偽の場合（ステップ２３０３：ＮＯ）、データ量削減プログラム４１４は、ハッシュ管理テーブル４２９を更新し、具体的には、新たなエントリに、ハッシュ値１６０１（ライトデータのハッシュ値）、登録フラグ１６０２（“済”）、ＶＯＬ＃１６０３（ライト先ボリュームの番号）、及びＶＯＬ内アドレス１６０４（ライト先ブロックの論理アドレス）の各々の情報を登録する（ステップ２３０６）。
【０２８３】
ステップ２３０５又はステップ２３０６の後、データ量削減プログラム４１４は、重複チェックテーブル４８９を更新し、具体的には、ライト先ブロックに対応した比較成功フラグ１５０７の情報を登録する（ステップ２３０７）。
【０２８４】
この登録は、例えば、ステップ２３０５のデータセット同士の比較で一致が得られた場合、比較成功フラグ１５０７の情報として“成功”が登録される。ステップ２３０５のデータセット同士の比較で一致が得られなかった場合、又は、ステップ２３０６が行われた場合、比較成功フラグ１５０７の情報として“失敗”が登録される。
【０２８５】
図２４は、追記処理の流れ例を示す図である。追記処理は、図２１のステップ２１０３で選択されたデータセットについて行われる。データ量削減プログラム４１４は、ライトデータセットを圧縮し、圧縮後データセットを例えばキャッシュメモリ４０２に格納する（ステップ２４０１）。
【０２８６】
データ量削減プログラム４１４は、圧縮後データセットのサイズ以上の空きが、ライト先ボリュームに対応した追記ボリューム５０２に割当済のページ５１に有るか否かを判定する（ステップ２４０２）。
【０２８７】
この判定をするために、例えば、追記ボリューム５０２に対応した追記先アドレス１４０２の情報として登録されたアドレスが特定され、特定されたアドレスが属する領域に割り当てられているページ５１の番号をキーとして、追記ボリューム５０２に対応したサブブロック管理テーブル４２７が参照されてもよい。
【０２８８】
ステップ２４０２の判定結果が偽の場合（ステップ２４０２：ＮＯ）、データ量削減プログラム４１４は、ライト先ボリュームに対応した追記ボリューム５０２に、未割当のページ５１を割り当てる（ステップ２４０３）。
【０２８９】
ステップ２４０２の判定結果が真の場合（ステップ２４０２：ＹＥＳ）、又は、ステップ２４０３の後、データ量削減プログラム４１４は、追記先とするサブブロックを割り当てる（ステップ２４０４）。
【０２９０】
データ量削減プログラム４１４は、ライトデータセットの圧縮後データセットを追記ボリューム５０２にコピーする、例えば、圧縮後データセットを、追記ボリューム５０２用の領域（キャッシュメモリ４０２における領域）にコピーする（ステップ２４０５）。
【０２９１】
データ量削減プログラム４１４は、圧縮後データセットのライトコマンドをデステージダーティキューに登録し（ステップ２４０６）、ライト先ボリュームに対応したアドレス変換テーブル４２２を更新する（ステップ２４０７）。
【０２９２】
このアドレス変換テーブル４２２の更新で、具体的には、ライト先ブロックに対応した参照先ＶＯＬ＃９０２の情報、及び、参照先ＶＯＬ内アドレス９０３の情報が、追記ボリューム５０２の番号、及び、ステップ２４０４で割り当てたサブブロックの論理アドレスに変更され、且つ、ライト先ブロックに対応した参照先ＶＯＬ種別９０５の情報が“単独”に変更される。
【０２９３】
データ量削減プログラム４１４は、ライト先ボリュームに関連する旧世代ボリュームが存在するか否かを判定する（ステップ２４０８）。旧世代ボリュームとは、論理ボリュームの複製を取得した場合の、複製元のボリュームのことである。
【０２９４】
ステップ２４０８の判定は、世代管理テーブル４３２においてライト先ボリュームの番号とＶＯＬ＃３４０１の情報とが一致するエントリが参照され、親世代ＶＯＬ＃３４０２が設定されているか否かで判定されてもよい。
【０２９５】
ステップ２４０８の判定結果が真の場合（ステップ２４０８：ＹＥＳ）、実データ位置管理ビットマップ４３３のライト先ブロックの番号とＶＯＬ内アドレス３５０１の情報が一致するエントリのうち、ライト先ボリュームに対応する世代ＶＯＬ＃毎の使用中フラグ３５０２を（“有”）に更新する（ステップ２４０９）。
【０２９６】
ステップ２４０８の判定結果が偽の場合（ステップ２４０８：ＮＯ）、又は、ステップ２４０９の後、データ量削減プログラム４１４は、旧サブブロックの参照元（旧参照元）が、ライト先ブロックの論理アドレスであるか否か（すなわち、単独領域７０であるか否か）を判定する（ステップ２４１０）。
【０２９７】
「旧サブブロック」とは、ライトデータセットの圧縮後データセットの更新前の圧縮後データセットを格納したサブブロックである。すなわち、ステップ２４０８の判定は、ライトデータセットが、単独領域７０内のデータセットの更新後のデータセットであるか、共通領域８０内のデータセットの更新後のデータセットであるかの判定である。
【０２９８】
ステップ２４０８の判定結果が真の場合（ステップ２４０８：ＹＥＳ）、データ量削減プログラム４１４は、旧サブブロックに対応した割当フラグ１３０３の情報を“未割当”に更新する（ステップ２４０９）。
【０２９９】
図２５は、リード処理の流れの例を示す図である。リード処理は、論理ボリューム５０１に対するリード要求を受け付けた場合に行われる。
【０３００】
リードプログラム４１１は、有効領域管理テーブル４２４を基に、リード要求に従うリード元が有効領域に属するか否かを判定し（ステップ２５０１）、ステップ２５０１の判定結果が真の場合（ステップ２５０１：ＹＥＳ）、世代管理テーブル４３２を参照する（ステップ２５０２）。
【０３０１】
リードプログラム４１１は、リード元の提供ボリューム５０１Ｐの番号とＶＯＬ＃３４０１の情報とが一致するエントリを参照し、親世代ＶＯＬ＃３４０２の情報が設定されているか否かを判定する（ステップ２５０３）。
【０３０２】
ステップ２５０３の判定結果が真の場合（ステップ２５０３：ＹＥＳ）、リード元の論理ボリューム５０１の複製元が存在する事を意味し、必ずしも論理ボリューム５０１に実データが存在するわけではないので、リードプログラム４１１は、実データ位置管理ビットマップ４３３においてリード先ブロックに対応した情報をＶＯＬ内アドレス３５０１に持つエントリを参照する（ステップ２５０４）。
【０３０３】
リードプログラム４１１は、世代ＶＯＬ＃毎の使用中フラグ３５０２の中から、リード先ボリュームに対応した世代ＶＯＬ＃の使用中フラグ、及びステップ２５０２で参照した親世代ＶＯＬ＃３４０２に対応した世代ＶＯＬ＃の使用中フラグの２つの使用中フラグを参照し、実データが存在するか（実データの位置を特定できるか）否かを判定する（ステップ２５０５）。
【０３０４】
判定で参照した２つの使用中フラグのいずれか、又はいずれもが（“有”）である場合は、実データが存在するボリューム（位置）を特定できた事を意味する（ステップ２５０５：ＹＥＳ）。判定で参照した２つの使用中フラグがいずれも（“有”）である場合、リード先ボリュームに対応した世代ＶＯＬ＃のボリュームに実データが存在することになる。
【０３０５】
判定で参照した２つの使用中フラグがいずれも（“無”）である場合、実データが存在するボリュームを特定できなかった事を意味する（ステップ２５０５：ＮＯ）。ステップ２５０５の判定結果が偽の場合（ステップ２５０５：ＮＯ）、リードプログラム４１１はステップ２５０２へ戻る。
【０３０６】
そして、リードプログラム４１１は、世代管理テーブル４３２の親世代ボリュームに対応したＶＯＬ＃３４０１のエントリを参照し（ステップ２５０２）、以降、実データが存在するボリュームを特定できるまで、ステップ２５０２からステップ２５０５の処理を繰り返す。
【０３０７】
ステップ２５０３の判定結果が偽の場合（ステップ２５０３：ＮＯ）、リード元の論理ボリューム５０１には複製が存在しないことを意味し、リードプログラム４１１は、ステップ２５０６へ進む。
【０３０８】
ステップ２５０３の判定結果が偽（ステップ２５０３：ＮＯ）、又はステップ２５０５の判定結果が真（ステップ２５０５：ＹＥＳ）の場合、実データが存在するボリュームを特定できている為、リードプログラム４１１は、特定したボリュームに対応したアドレス変換テーブル４２２を参照する（ステップ２５０６）。
【０３０９】
リードプログラム４１１は、特定したボリュームを構成する各ブロックを、アドレス変換テーブル４２２に基づいて特定し、特定した各ブロックについて、以下の処理を行う。
【０３１０】
・リードプログラム４１１は、特定したブロックに対応した参照先ＶＯＬ種別９０５の情報が“単独”であるか否かを判定する（ステップ２５０７）。
【０３１１】
・ステップ２５０７の判定結果が偽の場合（ステップ２５０７：ＮＯ）、特定したブロックに対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３の情報を基に、共通ボリューム５０１Ｃに対応したアドレス変換テーブル４２２を参照する（ステップ２５０８）。
【０３１２】
・ステップ２５０７の判定結果が真の場合（ステップ２５０７：ＹＥＳ）、又はステップ２５０８の後、リードプログラム４１１は、特定したブロックに対応したページ５１を、ページ変換テーブル４２５を基に特定し（ステップ２５０９）、特定したページ５１から、特定したブロックに対応する圧縮後データセットを読み出し、圧縮後データセットを伸張し、伸張後データセットをキャッシュメモリ４０２に格納する（ステップ２５１０）。
【０３１３】
ステップ２５０１の判定結果が真の場合（ステップ２５０１：ＹＥＳ）において、リード元のボリュームを構成する各ブロックについてステップ２５１０までの処理が終了すると、リード要求に従うデータがキャッシュメモリ４０２に格納されるため、リードプログラム４１１は、格納されたデータをリード要求の発行元に転送する（ステップ２５１１）。
【０３１４】
ステップ２５０１の判定結果が偽の場合（ステップ２５０１：ＮＯ）、リードプログラム４１１は、リード元のボリュームに割り当てられているページ５１を、ページ変換テーブル４２５を基に特定し（ステップ２５０９）、特定したページ５１から、リード対象のデータを読み出し（ステップ２５１０）、読み出したデータをリード要求に送信元に転送する（ステップ２５１１）。
【０３１５】
図３６は、提供ボリューム複製処理の流れの例を示す図である。図３６の処理は、特に、処理前は複製先のボリュームが存在せず、複製元及び複製先のボリュームは有効領域に属する場合の例である。この提供ボリューム複製処理は、例えば、いずれかの提供ボリューム５０１Ｐを指定したボリューム複製要求を受け付けた場合に行われる。
【０３１６】
ボリューム複製制御プログラム４１８は、複製先の提供ボリューム５０１Ｓを作成し（ステップ３６０１）、具体的には、ＶＯＬ管理テーブル４２１のＶＯＬ＃８０１に複製先の提供ボリューム５０１Ｓの番号、ＶＯＬ属性８０２に“提供”、ＶＯＬ容量８０３、及びプール＃８０４に情報をそれぞれ設定する。
【０３１７】
ボリューム複製制御プログラム４１８は、複製先の提供ボリューム５０１Ｓに対応する追記ボリューム５０２Ｓを作成し（ステップ３６０２）、具体的には、ＶＯＬ管理テーブル４２１のＶＯＬ＃８０１に複製先の追記ボリューム５０２Ｓの番号、ＶＯＬ属性８０２に“追記”、ＶＯＬ容量８０３、及びプール＃８０４に情報をそれぞれ設定する。
【０３１８】
ボリューム複製制御プログラム４１８は、複製元の最新世代の提供ボリューム５０１Ｐａを作成し（ステップ３６０３）、具体的には、ＶＯＬ管理テーブル４２１のＶＯＬ＃８０１に複製元の最新世代の提供ボリューム５０１Ｐａの番号、ＶＯＬ属性８０２に“提供”、ＶＯＬ容量８０３、及びプール＃８０４に情報をそれぞれ設定する。
【０３１９】
ボリューム複製制御プログラム４１８は、複製元の最新世代の提供ボリューム５０１Ｐａに対応する追記ボリューム５０２Ｐａを作成し（ステップ３６０４）、具体的には、ＶＯＬ管理テーブル４２１のＶＯＬ＃８０１に複製元の最新世代の追記ボリューム５０２Ｓの番号、ＶＯＬ属性８０２に“追記”、ＶＯＬ容量８０３、及びプール＃８０４に情報をそれぞれ設定する。
【０３２０】
ボリューム複製制御プログラム４１８は、複製元の提供ボリューム５０１Ｐを重複単独ボリュームに更新し（ステップ３６０５）、具体的には、ＶＯＬ管理テーブル４２１の複製元の提供ボリューム５０１Ｐに対応するエントリのＶＯＬ属性８０２を“重複単独”に更新する。
【０３２１】
ボリューム複製制御プログラム４１８は、世代管理テーブル４３２を更新し（ステップ３６０６）、具体的には、複製元の提供ボリューム５０１Ｐに対応するエントリの子世代ＶＯＬ＃３４０３に複製元の最新世代の提供ボリューム５０１Ｐａ及び複製先の提供ボリューム５０１Ｓの番号を設定する。
【０３２２】
また、複製元の最新世代の提供ボリューム５０１Ｐａの親世代ＶＯＬ＃３４０２、及び複製先の提供ボリューム５０１Ｓの親世代ＶＯＬ＃３４０２に、複製元の提供ボリューム５０１Ｐの番号を設定する。
【０３２３】
ボリューム複製制御プログラム４１８は、複製元の提供ボリュームを含む複製ボリュームグループに対応した実データ位置管理ビットマップ４３３が存在するかを判定する（ステップ３６０７）。
【０３２４】
ステップ３６０７の判定結果が偽の場合（ステップ３６０７：ＮＯ）、実データ位置管理ビットマップ４３３が存在しないため、ボリューム複製制御プログラム４１８は、実データ位置管理ビットマップ４３３を作成する（ステップ３６０８）。
【０３２５】
実データ位置管理ビットマップ４３３の作成において、ボリューム複製制御プログラム４１８は、複製元の提供ボリューム５０１Ｐに対応するＶＯＬ＃を最古の世代とし、世代ＶＯＬ＃毎の使用中フラグ３５０２のうちの最古の世代の１以上のフラグを(“有”)に更新し、その他の世代の１以上のフラグを（“無”）に更新する。
【０３２６】
図３７は、提供ボリューム複製処理の流れの例を示す図であり、図３７の処理は、特に、複製先のボリュームが存在し、複製元及び複製先のボリュームは有効領域に属する場合の例である。この提供ボリューム複製処理は、例えば、いずれかの提供ボリューム５０１Ｐを複製元に、いずれかの提供ボリューム５０１Ｓを複製先に指定したボリューム複製要求を受け付けた場合に行われる。
【０３２７】
ボリューム複製制御プログラム４１８は、複製元の提供ボリューム５０１Ｐの複製として複製ボリュームを作成する（ステップ３７０１）。複製元の提供ボリューム５０１Ｐの複製ボリュームは、図３６で示した処理で作成される。
【０３２８】
ボリューム複製制御プログラム４１８は、世代管理テーブル４３２を更新し（ステップ３７０２）、具体的には、ステップ３７０１で作成した複製ボリュームと複製先の提供ボリューム５０１Ｓをスワップする為、複製ボリュームに対応するエントリの親世代ＶＯＬ＃３４０２と、複製先の提供ボリューム５０１Ｓに対応するエントリの親世代ＶＯＬ＃３４０２の情報を入れ替える。
【０３２９】
ボリューム複製制御プログラム４１８は、複製ボリュームの番号と複製先の提供ボリューム５０１Ｓの番号をスワップし（ステップ３７０３）、具体的には、ＶＯＬ管理テーブル４２１の複製ボリュームに対応したＶＯＬ＃８０１と複製先の提供ボリューム５０１Ｓに対応したＶＯＬ＃８０１の情報を入れ替える。
【０３３０】
図２６は、提供ボリューム削除処理の流れの例を示す図である。この提供ボリューム削除処理は、例えば、いずれかの提供ボリューム５０１Ｐを指定したボリューム削除要求を受け付けた場合に行われる。
【０３３１】
ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐが有効領域に属するか否かを、有効領域管理テーブル４２４を基に判定する（ステップ２６０１）。
【０３３２】
ステップ２６０１の判定結果が真の領域について（ステップ２６０１：ＹＥＳ）、ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐに対応した各種テーブル（具体的には、アドレス変換テーブル４２２、有効領域管理テーブル４２４、及びページ変換テーブル４２５）を削除する（ステップ２６０２）。
【０３３３】
また、ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐに対応したサブブロック管理テーブル４２７も削除する（ステップ２６０３）。
【０３３４】
ＶＯＬ管理プログラム４１５は、世代管理テーブル４３２を更新し（ステップ２６０４）、具体的には、削除対象の提供ボリューム５０１Ｐに対応するボリュームの親世代ＶＯＬ＃３４０２の番号を参照し、参照した番号と一致する番号をＶＯＬ＃３４０１に持つエントリの子世代ＶＯＬ＃をクリアする。また、削除対象の提供ボリューム５０１Ｐのエントリを削除する。
【０３３５】
ＶＯＬ管理プログラム４１５は、実データ位置管理ビットマップ４３３を更新し（ステップ２６０５）、具体的には、世代ＶＯＬ＃毎の使用中フラグ３５０２において削除対象の提供ボリューム５０１Ｐに対応する列の使用中フラグを（“無“）に更新する。
【０３３６】
ステップ２６０１の判定結果が偽の領域について（ステップ２６０１：ＮＯ）、及びステップ２６０５の後、ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐに割り当てられているページを未割当へと解放する（ステップ２６０６）。
【０３３７】
ここで、「削除対象の提供ボリューム５０１Ｐに割り当てられているページ」とは、削除対象の提供ボリューム５０１Ｐに直接的に割り当てられている１以上のページ５１と、削除対象の提供ボリューム５０１Ｐに間接的に割り当てられている１以上のページ５１（削除対象の提供ボリューム５０１Ｐに対応した追記ボリューム５０２に割り当てられている１以上のページ５１）である。
【０３３８】
ＶＯＬ管理プログラム４１５は、ＶＯＬ管理テーブル４２１を更新し（ステップ２６０７）、具体的には、ＶＯＬ管理テーブル４２１の削除対象の提供ボリューム５０１Ｐに対応するエントリを削除する。
【０３３９】
以上のように、提供ボリュームが削除対象とされた場合、提供ボリュームに直接的又は間接的に割り当てられている１以上のページを、１以上のページの各々について、ページがいずれか他の領域から参照されているか否かをチェックすること無しに、且つ、提供ボリュームにおけるいずれかの領域が共通領域８０を参照しているか否かをチェックすること無しに、解放することができる。
【０３４０】
また、ＶＯＬ管理プログラム４１５によりボリューム削除が実行された場合、削除されるボリュームはＶＯＬ属性が“提供”のボリューム、及びＶＯＬ属性が“提供”に対応する追記ボリューム（ＶＯＬ属性が“追記”のボリューム）だけであり、本実施形態ではサーバシステム２０１に提供されていない重複単独ボリューム（ＶＯＬ属性が“重複単独”のボリューム）が削除されることはない。
【０３４１】
図２７は、ガベージコレクション処理の流れの例を示す図である。図２７のガベージコレクション処理は、追記ページを回収する処理であり、例えば、定期的に開始されてもよいし、プール５０３の容量に対して未割当のページ５１の容量の比率が所定値未満になったことが、プール容量管理プログラム４１６により検出されたなどの場合に開始されてよい。
【０３４２】
プール容量管理プログラム４１６は、ガベージコレクション処理においてコピー元とするページ５１（コピー元ページ）を選択する（ステップ２７０１）。プール容量管理プログラム４１６は、コピー元ページが割り当てられている追記ボリューム５０２に対応したサブブロック管理テーブル４２７を参照し、ガベージコレクション処理において未チェックのサブブロック６０２があるか否かを判定する（ステップ２７０２）。
【０３４３】
ステップ２７０２の判定結果が真の場合（ステップ２７０２：ＹＥＳ）、プール容量管理プログラム４１６は、ステップ２７０３へ進み、未チェックのサブブロック６０２のうちの１つのサブブロック６０２を選択する（ステップ２７０３）。
【０３４４】
プール容量管理プログラム４１６は、ステップ２７０３で選択したサブブロック６０２の割当フラグ１３０３が“割当済”であれば（ステップ２７０４：ＹＥＳ）、コピー先のページ５１におけるサブブロック６０２を割り当て（ステップ２７０５）、ステップ２７０３で選択したサブブロック６０２から、ステップ２７０５で割り当てたサブブロックに圧縮後データセットをコピーする（ステップ２７０６）。
【０３４５】
ステップ２７０６により、コピー元のサブブロック６０２の参照元は、コピー元のサブブロック６０２に代えてコピー先のサブブロック６０２を参照先とすることになる。そして、プール容量管理プログラム４１６は、ステップ２７０６の後、ステップ２７０２に戻る。
【０３４６】
ステップ２７０２の判定結果が偽の場合（ステップ２７０２：ＮＯ）、言い換えれば、コピー元ページ内の有効な圧縮後データセットが全てコピー先のページ５１にコピーされた場合、プール容量管理プログラム４１６は、コピー元ページを回収する、すなわち、コピー元ページの割当フラグ１２０２の情報を“未割当”に変更する（ステップ２７０７）。
【０３４７】
以上のように、追記ページのガベージコレクション処理では、ステップ２７０６において参照先が更新されることになるが、追記ページが単独ページであれば、コピーされるデータセットは、常に、単独データセットの圧縮後データセットである。故に、コピー元のサブブロック６０２の参照元は常に１つである。
【０３４８】
このため、コピー元のサブブロック６０２それぞれについて、参照先の更新は、１つの参照元についてのみ行えばよい。従って、追記単独ページのガベージコレクション処理が効率化される。
【０３４９】
また、追記ページが複製ボリュームから間接的に参照される重複単独ページであっても、コピーされるデータセットは、共通データセットの圧縮後データセットであるものの、コピー元のサブブロック６０２の参照元は常に１つである。
【０３５０】
このため、コピー元のサブブロック６０２それぞれについて、参照先の更新は、１つの参照元についてのみ行えばよい。従って、追記重複単独ページのガベージコレクション処理も効率化される。
【０３５１】
図２８は、共通領域解放処理の流れの例を示す図である。共通領域解放処理は、例えば定期的に行われる。共通領域解放処理において、処理対象の共通ボリューム５０１Ｃに対応した共通領域チェックテーブル４３４が、共通領域解放プログラム４１７により作成されてもよいし、予め共有メモリ４０４に用意されていてもよい。
【０３５２】
共通領域解放プログラム４１７は、いずれかの共通ブロック６０１Ｃを選択する（ステップ２８０１）。ステップ２８０１で選択した共通ブロック６０１Ｃを、「対象共通ブロック」と言う。共通領域解放プログラム４１７は、重複管理テーブル４３０を参照し、対象共通ブロックを参照する参照元が１つでも存在するか否かを判定する（ステップ２８０２）。
【０３５３】
ステップ２８０２の判定結果が真の場合（ステップ２８０２：ＹＥＳ）、共通領域解放プログラム４１７は、ステップ２８０３へ進み、重複管理テーブル４３０から、対象共通ブロックに対応したいずれかの参照元エントリを選択し、選択した参照元エントリから参照元のボリューム番号及び論理アドレスを特定する（ステップ２８０３）。
【０３５４】
共通領域解放プログラム４１７は、ステップ２８０３で特定したボリューム番号に対応したアドレス変換テーブル４２２から、ステップ２８０３で特定した論理アドレスに対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３の情報を特定する（ステップ２８０４）。
【０３５５】
ステップ２８０４で特定した参照先（参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３の情報により特定されるブロック６０１）が、対象共通ブロックに一致していれば（ステップ２８０５：ＹＥＳ）、共通領域解放プログラム４１７は、対象共通ブロックに対応した参照フラグ１９０２の情報を（“有”）とする（ステップ２８０６）。
【０３５６】
一方、ステップ２８０４で特定した参照先が、対象共通ブロックに一致していなければ（ステップ２８０５：ＮＯ）、共通領域解放プログラム４１７は、ステップ２８０３で特定した参照元エントリを、対象共通ブロックに対応した参照元エントリから削除する（ステップ２８０７）。
【０３５７】
なお、対象共通ブロックに、同一の提供ボリューム５０１Ｐを参照元とする複数の参照元エントリがある場合には、同一の提供ボリューム５０１Ｐに対応した複数の参照元エントリがそれぞれ表す複数の論理アドレスについて、まとめて、ステップ２８０３からステップ２８０７が行われてよい。
【０３５８】
ステップ２８０２の判定結果が偽の場合（ステップ２８０２：ＮＯ）、対象共通ブロックに対応した１以上の参照元エントリについてステップ２８０３からステップ２８０７が行われたか、或いは、対象共通ブロックに１つも参照元エントリが無い。この場合、共通領域解放プログラム４１７は、対象共通ブロックに対応した参照フラグ１９０２の情報が（“有”）であるか否かを判定する（ステップ２８０８）。
【０３５９】
ステップ２８０８の判定結果が偽の場合（ステップ２８０８：ＮＯ）、言い換えれば、対象共通ブロックに対応した参照フラグ１９０２の情報が（“無”）の場合、対象共通ブロックを参照先とする参照元が１つも存在しないので、共通領域解放プログラム４１７は、ステップ２８０９からステップ２８１０を行う。
【０３６０】
すなわち、共通領域解放プログラム４１７は、ハッシュ管理テーブル４２９を更新し（ステップ２８０９）、具体的には、対象共通ブロックに対応した情報をＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４に格納したエントリについて、登録フラグ１６０２の情報を（“無”）に更新し、ＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４の情報を削除する（ステップ２８０９）。
【０３６１】
また、共通領域解放プログラム４１７は、対象共通ブロックを未使用へと解放し、具体的には、対象共通ブロックに対応した使用中フラグ１８０２の情報を“未使用”に更新する（ステップ２８１０）。
【０３６２】
ステップ２８０８の判定結果が真の場合（ステップ２８０８：ＹＥＳ）、ステップ２８０９からステップ２８１０は行われない。これは、対象共通ブロックを参照先とする少なくとも１つの参照元が存在するためである。
【０３６３】
以上の共通領域解放処理によれば、参照元が存在しなくなった共通ブロック６０１Ｃを検出することができ、検出された共通ブロック６０１Ｃを未使用へと解放することができる。以って、共通ボリューム５０１Ｃの空き容量（空きブロック数）を増やすことができる。
【０３６４】
図３８は、重複単独領域解放処理の流れの例を示す図である。重複単独領域解放処理は、例えば定期的に行われる。重複単独領域解放処理は、重複単独ボリューム（提供ボリューム５０１Ｐ）を処理対象とする。処理対象の重複単独ボリュームを「対象重複単独ボリューム」と言う。
【０３６５】
重複単独領域解放プログラム４１９は、いずれかの重複単独ブロック（提供ブロック６０１Ｐ）を選択する（ステップ３８０１）。ステップ３８０１で選択した重複単独ブロックを、「対象重複単独ブロック」と言う。
【０３６６】
重複単独領域解放プログラム４１９は、世代管理テーブル４３２の対象重複単独ボリュームに対応する情報をＶＯＬ＃３４０１に持つエントリを参照し（ステップ３８０２）、参照したエントリの子世代ＶＯＬ＃３４０３の情報が設定されているか否かを判定する（ステップ３８０３）。
【０３６７】
ステップ３８０３の判定結果が真の場合（ステップ３８０３：ＹＥＳ）、重複単独領域解放プログラム４１９は、実データ位置管理ビットマップ４３３の、対象重複単独ブロックに対応した情報をＶＯＬ内アドレス３５０１に持つエントリのうち、世代ＶＯＬ＃毎の使用中フラグ３５０２の情報であって、ステップ３８０２で参照した子世代ＶＯＬ＃３４０３の情報に対応する情報を参照する（ステップ３８０４）。
【０３６８】
参照した世代ＶＯＬ＃毎の使用中フラグ３５０２の情報が使用中（“有”）である場合（ステップ３８０５：ＹＥＳ）、対象重複単独ブロックは子世代のボリュームから参照されていないので、重複単独領域解放プログラム４１９は、対象重複単独ブロックが更に新しい世代のボリュームから参照されていないかを調べるため、ステップ３８０２へ戻る。
【０３６９】
ステップ３８０３の判定結果が偽の場合（ステップ３８０３：ＮＯ）、対象重複単独ボリュームの１以上の子世代のボリュームから、対象重複単独ブロックが参照されていないので、重複単独領域解放プログラム４１９は、ステップ３８０６からステップ３８０８を行う。
【０３７０】
すなわち、重複単独領域解放プログラム４１９は、対象重複単独ブロックを未使用へと解放し、具体的には、アドレス変換テーブル４２２の対象重複単独ブロックに対応するエントリを削除する（ステップ３８０６）。
【０３７１】
また、重複単独領域解放プログラム４１９は、サブブロック管理テーブル４２７の対象重複単独ブロックに対応するエントリの割当フラグ１３０３の情報を“未割当”に変更する（ステップ３８０７）。
【０３７２】
更に、重複単独領域解放プログラム４１９は、実データ位置管理ビットマップ４３３を更新し、具体的には、対象重複単独ブロックに対応するエントリの世代ＶＯＬ＃毎の使用中フラグ３５０２を（“無”）に更新する（ステップ３８０８）。
【０３７３】
ステップ３８０５の判定結果が偽の場合（ステップ３６０５：ＮＯ），対象重複単独ブロックは、子世代のボリュームから参照されている為、解放する対象は無い。
【０３７４】
以上の共通領域解放処理によれば、参照元が存在しなくなった重複単独ブロックを検出することができ、検出された重複単独ブロックを未使用へと解放することができる。以って、重複単独ボリューム（提供ボリューム５０１Ｐ）の空き容量（空きブロック数）を増やすことができる。
【０３７５】
以上、一実施形態を説明したが、これは本発明の１つの例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。例えば、上述の実施形態では、データの移動を伴わない仮想的なボリューム複製の処理を説明したが、仮想的に複製されたボリュームは、一般的にスナップショットとして利用される場合もある。
【０３７６】
スナップショットとはある時点のボリュームの状態を保存するものであるが、特にバックアップ用途でスナップショットを利用する場合は、必ずしも、複製先が提供ボリュームである必要はない。サーバシステム２０１からスナップショットデータの読み出し又は書き込みを行う時に、提供ボリュームが割当てられればよい。
【０３７７】
したがって、スナップショットを取得する時点では、スナップショット取得元である最新世代の提供ボリューム（例えば図３３における旧世代の提供ボリューム５０１Ｐ）を重複単独ボリュームとし、この重複単独ボリュームをスナップショットとし、新たに提供ボリューム（例えば図３３における最新世代の提供ボリューム５０１Ｐａ）を作成する（図３６のステップ３６０３からステップ３６０８）。
【０３７８】
また、サーバシステム２０１からスナップショットデータの読み出し又は書き込みを行う場合には、スナップショットを別の提供ボリューム（例えば図３３の複製先の提供ボリューム５０１Ｓ）にアタッチする操作などを行うことで、複製先提供ボリュームからスナップショットデータの読み出し又は書き込みを行うことができる。
【０３７９】
また、提供ボリュームにアタッチされていないスナップショット（重複単独ボリューム）を削除する場合は、重複単独ボリュームが、より新しい世代の重複単独ボリュームや、提供ボリュームから参照されているデータを有している可能性がある。
【０３８０】
このような可能性として、例えば、図３３において、複製先の提供ボリューム５０１Ｓが存在しない場合であっても、重複単独ボリュームは最新世代の提供ボリューム５０１Ｐａから参照されているデータを有している可能性がある。
【０３８１】
このため、参照されているデータは参照元のボリューム（図３３の例では、最新世代の提供ボリューム５０１Ｐａ）へ移行してから、重複単独ボリュームを削除する。
【０３８２】
また、スナップショットとして利用する場合は、複製元が本番業務を行うボリュームとして利用され、複製先がバックアップとしても利用されることもある。これに対して、バックアップからの復元操作（リストア）や、本番ボリュームからバックアップへの再同期操作（リシンク）などの運用がある。
【０３８３】
このような運用も、図３７を用いて説明した複製先有りのボリューム複製処理で、実現することが可能である。すなわち、複製元ボリュームの複製を作成し、複製ボリュームと複製先ボリュームをスワップすることにより、データの移動を不要とし、迅速なリストア・リシンク処理を実現できる。
【０３８４】
本発明は、他の種々の形態でも実施することが可能である。例えば、ライト要求のようなＩ／Ｏ要求の送信元（Ｉ／Ｏ元）は、上述の実施形態では、サーバシステム２０１であるが、ストレージシステム２００における図示しないプログラム（例えば、ＶＭ上で実行されるアプリケーションプログラム）であってもよい。
【符号の説明】
【０３８５】
４２２…アドレス変換テーブル
５１…ページ
５０１…論理ボリューム
５０２…追記ボリューム
６０１…ブロック
６０２…サブブロック
【図１】
2020047036.tif 000003
【図２】
2020047036.tif 000004
【図３】
2020047036.tif 000005
【図４】
2020047036.tif 000006
【図５】
2020047036.tif 000007
【図６】
2020047036.tif 000008
【図７】
2020047036.tif 000009
【図８】
2020047036.tif 000010
【図９】
2020047036.tif 000011
【図１０】
2020047036.tif 000012
【図１１】
2020047036.tif 000013
【図１２】
2020047036.tif 000014
【図１３】
2020047036.tif 000015
【図１４】
2020047036.tif 000016
【図１５】
2020047036.tif 000017
【図１６】
2020047036.tif 000018
【図１７】
2020047036.tif 000019
【図１８】
2020047036.tif 000020
【図１９】
2020047036.tif 000021
【図２０】
2020047036.tif 000022
【図２１】
2020047036.tif 000023
【図２２】
2020047036.tif 000024
【図２３】
2020047036.tif 000025
【図２４】
2020047036.tif 000026
【図２５】
2020047036.tif 000027
【図２６】
2020047036.tif 000028
【図２７】
2020047036.tif 000029
【図２８】
2020047036.tif 000030
【図２９】
2020047036.tif 000031
【図３０】
2020047036.tif 000032
【図３１】
2020047036.tif 000033
【図３２】
2020047036.tif 000034
【図３３】
2020047036.tif 000035
【図３４】
2020047036.tif 000036
【図３５】
2020047036.tif 000037
【図３６】
2020047036.tif 000038
【図３７】
2020047036.tif 000039
【図３８】
2020047036.tif 000040