(57)【特許請求の範囲】
【請求項１】
所定サイズのデータであるブロックデータを含む書込データを受信するデータ受信部と、
前記ブロックデータの更新状態を表す世代コードをブロックデータの識別情報と対応させて所定個の前記ブロックデータを含む領域に分けて記憶する世代コード記憶部と、
受信した書込データが既に書き込まれている既書込データの場合、前記既書込データに含まれるブロックデータが連続しており、且つ１つの前記領域に含まれる世代コードが記載された全てのブロックデータを含む連続データか否かを検出し、連続データの場合、受信した書込データ全体に対して１つの新しい世代コードを割り当て、連続データでない場合、受信した書込データに含まれるブロックデータのそれぞれに新しい世代コードを割り当て、割り当てた世代コードを前記世代コード記憶部に記憶させる世代コード管理部と、
前記新しい世代コードを前記書込データに含まれる前記ブロックデータ及び連続データに付加し記憶装置に書き込むデータ書込部と、
前記記憶装置から前記ブロックデータ又は連続データを読み出すデータ読出部と、
前記データ読出部により読み出された前記ブロックデータ又は連続データに付加されている世代コードと前記世代コード記憶部に記憶されている前記読み出されたブロックデータ又は連続データの世代コードとが一致するか否かを判定する判定部と、
前記判定部により前記世代コードが一致すると判定された場合、前記読み出されたブロックデータ又は連続データを送信するデータ送信部と
を備えたことを特徴とするストレージ装置。 
【請求項２】
前記世代コード管理部は、前記連続データに対して新しい世代コードを割り当てた場合、該連続データを構成するブロックデータの識別情報に対応させて新しい世代コードを前記世代コード記憶部に記憶させ、前記ブロックデータそれぞれに新しい世代コードを割り当てた場合、各前記ブロックデータの識別情報それぞれに対応させて新しい世代コードを前記世代コード記憶部に記憶させることを特徴とする請求項１に記載のストレージ装置。
【請求項３】
前記世代コード記憶部は、前記連続データの世代コードが各ブロックデータの識別情報に対応するよう記載されたテーブルである世代コントロールブロックを用いて前記世代コードを記憶することを特徴とする請求項１又は請求項２に記載のストレージ装置。 
【請求項４】
前記世代コード記憶部より容量が大きい記憶領域を有し、少なくとも前記世代コード記憶部が記憶する世代コードに対応するブロックデータ以外の前記記憶装置に記憶されているブロックデータの各世代コードが記載された前記世代コントロールブロックを記憶する世代コード退避部をさらに備え、
前記世代コード管理部は、前記書込データに含まれる前記ブロックデータの世代コードの情報が記載された世代コントロールブロックが前記世代コード退避部にある場合、前記世代コード記憶部に記憶されている最もアクセス日時の古い世代コントロールブロックと前記書込データに含まれるブロックデータの世代コードの情報を含む世代コントロールブロックとを入れ替えることを特徴とする請求項３に記載のストレージ装置。 
【請求項５】
前記世代コード管理部及び前記判定部は、前記世代コントロールブロックの格納先を示すハッシュテーブルを有しており、
前記世代コード管理部及び前記判定部は、前記ハッシュテーブルを用いて前記世代コントロールブロックを検索する
ことを特徴とする請求項３又は請求項４に記載のストレージ装置。 
【請求項６】
所定サイズのデータであるブロックデータを含む書込データを受信し、
受信した書込データが既に書き込まれている既書込データの場合、前記既書込データに含まれるブロックデータが連続しており、且つ、前記ブロックデータの更新状態を表す世代コードをブロックデータの識別情報と対応させて所定個の前記ブロックデータを含む領域に分けて記憶しているメモリにおける、１つの前記領域に含まれる世代コードが記載された全てのブロックデータを含む連続データか否かを検出し、連続データの場合、受信した書込データ全体に対して１つの新しい世代コードを割り当て、連続データでない場合、受信した書込データに含まれるブロックデータのそれぞれに新しい世代コードを割り当て、割り当てた前記世代コードを各前記ブロックデータ又は前記連続データの識別情報と対応させて前記メモリに記憶させ、
前記新しい世代コードを前記書込データに含まれる前記ブロックデータ及び連続データに付加しハードディスクに書き込み、
前記ハードディスクから前記ブロックデータ又は連続データを読み出し、
読み出した前記ブロックデータ又は連続データに付加されている世代コードと前記メモリに記憶されている前記読み出されたブロックデータ又は連続データの世代コードとが一致するか否かを判定し、
前記世代コードが一致すると判定した場合、前記読み出したブロックデータ又は連続データを送信する
ことを特徴とするストレージ装置制御方法。
【請求項７】
前記世代コード記憶部は、前記ブロックデータに対して連続データの有効無効を示すフラグを記憶し、
前記世代コード管理部は、受信した書込データが既に書き込まれている既書き込みデータの場合、前記既書き込みデータが連続データであれば、受信した書込データに対して連続データを有効とするフラグを設定し、連続データでなければ、受信した書込データに対して連続データを無効とするフラグを設定して、前記世代コード記憶部に記憶させる
ことを特徴とする請求項１〜５のいずれか一つに記載のストレージ装置。
【請求項８】
前記世代コード管理部は、前記連続データが有効となっている書込データに含まれる一部のブロックデータの世代を更新する場合、該書込データに対して前記連続データを無効とするフラグを設定し、前記一部のブロックデータの世代を更新して、前記世代コード記憶部に記憶させることを特徴とする請求項７に記載のストレージ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置及びストレージ装置制御方法に関する。
【背景技術】
【０００２】
近年、装置内に多くのＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）を内蔵するストレージ装置は、高い信頼性が要求されている。そこで、この要求に応えるべく、ストレージ装置の多くは、コンピュータなどのホストから受信したデータにチェックコード（ＤＩＦ：Ｄａｔａ  Ｉｎｔｅｇｒｉｔｙ  Ｆｉｅｌｄ）を付加している。チェックコードを付加することにより、ストレージ装置は、ＨＤＤへのデータの書き込みなどのデータ移動時にデータの整合性をチェックでき、部品故障などによるデータの不整合を未然に防止することができる。このようにして、ストレージ装置は、ＨＤＤに書き込むデータのデータ保証を行っている。
【０００３】
ストレージ装置において、ＨＤＤへのデータの書き損じが発生することがある。このＨＤＤへの書き損じとは、例えば、ＨＤＤへのデータ書き込み時において発生する、ＨＤＤ自身もエラーが検出できないデータの書き込みの失敗を指す。このＨＤＤへの書き損じの特徴として、ＨＤＤによるエラー検出がなされないため、ＨＤＤは、エラー発生の通知を出力しない。また、ＨＤＤ上に格納されているデータは更新されずに、以前の古いデータのままになってしまう。そして、データは更新されずに古いデータのままであるのに対して、チェックコードはそのまま維持されることになる。この場合、チェックコードによるデータ保証を用いた場合、チェックコードは正しいためエラーの検出をすることが困難となる。
【０００４】
そこで、ＨＤＤへの書き損じなどに対処するため、次のような技術が提案されている。まず、１つの方法として、ＨＤＤへデータを書き込んだ後、再度同じ領域のデータをＨＤＤから読み出し、書き込んだデータと読み出したデータとを比較することで書き損じを未然に防止する技術がある。この方式では、ＨＤＤへデータを書き込むたびに、データの読み出し及び比較が行われるので、Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）性能が低下してしまう。
【０００５】
また、他の方法として、ＨＤＤへのデータ書き込み時には、特別な処理は行わず、データ読み出し時に、ＲＡＩＤの冗長データも同時に読み出し、ＲＡＩＤの整合性をチェックすることで、書き損じなどを回避する従来技術がある。この従来技術では、例えば、ミラーリングされたデータ同士が比較されることになる。この方式では、書き損じが生じたことは検出できるが、どのＨＤＤで書き損じが発生したのか特定できず、データの修復を行うことが困難である。
【０００６】
そこで、データの書き込み動作毎に、インクリメントさせた書込情報をデータに付与するとともに付与した書込情報を記憶しておき、データを読み出す時に、記憶している書込情報とデータに付与されている書込情報が一致するかをチェックする従来技術がある。また、データの書き込み先の物理ディスク毎にデータにチェックコードを付加してデータを管理する従来技術がある。さらに、データに世代、時刻などの更新状態を表す更新状態値をディスクへのＩ／Ｏ単位であるブロック毎に付加して、読み出し時にその更新状態値を用いてブロック毎にチェックを行う従来技術がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特許第４４５４２０４号公報
【特許文献２】特開平１０−１７１６０８号公報
【特許文献３】特開２００６−２５２５３０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、インクリメントさせた書込情報をデータに付与する技術の場合、全てのデータに書込情報を付与していき、また読み出しの際には１つずつデータをチェックするので、書き損じを検出するため処理の負荷が高くなってしまう。また、物理ディスク毎にデータにチェックコードを付加する技術の場合、書き損じを検出するための処理の負荷がさらに高くなってしまう。また、ブロック毎に更新状態値を付加する技術の場合、ブロック単位でのエラーチェックしかできないため、エラーの検出の確率が下がり信頼性が低下してしまう。
【０００９】
開示の技術は、上記に鑑みてなされたものであって、高い信頼性を維持しつつ、書き損じを検出するための処理の負荷を軽減したストレージ装置及びストレージ装置制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本願の開示するストレージ装置及びストレージ装置制御方法は、一つの態様において、データ受信部は、所定サイズのデータであるブロックデータを含む書込データを受信する。世代コード記憶部は、前記ブロックデータの更新状態を表す世代コードをブロックデータの識別情報と対応させて所定個の前記ブロックデータを含む領域に分けて記憶する。世代コード管理部は、受信した書込データが既に書き込まれている既書込データの場合、前記既書込データに含まれるブロックデータが連続しており、且つ１つの前記領域に含まれる世代コードが記載された全てのブロックデータを含む連続データか否かを検出し、連続データの場合、受信した書込データ全体に対して１つの新しい世代コードを割り当て、連続データでない場合、受信した書込データに含まれるブロックデータのそれぞれに新しい世代コードを割り当て、割り当てた世代コードを前記世代コード記憶部に記憶させる。データ書込部は、前記新しい世代コードを前記書込データに含まれる前記ブロックデータ及び連続データに付加し記憶装置に書き込む。データ読出部は、前記記憶装置から前記ブロックデータ又は連続データを読み出す。判定部は、前記データ読出部により読み出された前記ブロックデータ又は連続データに付加されている世代コードと前記世代コード記憶部に記憶されている前記読み出されたブロックデータ又は連続データの世代コードとが一致するか否かを判定する。送信部は、前記判定部により前記世代コードが一致すると判定された場合、前記読み出されたブロックデータ又は連続データを送信する。
【発明の効果】
【００１１】
本願の開示するストレージ装置及びストレージ装置制御方法の一つの態様によれば、高い信頼性を維持しつつ、書き損じを検出するための処理の負荷を軽減することができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】図１は、実施例１に係るストレージ装置のブロック図である。
【図２】図２は、世代コントロールブロックを説明するための図である。
【図３−１】図３−１は、世代コントロールブロックへの連続世代コードの書き込みを説明するための概念図である。
【図３−２】図３−２は、連続世代コードを用いない場合の世代コントロールブロックへの世代コードの書き込みを説明するための概念図である。
【図４】図４は、連続世代コードが有効な世代コントロールブロックへの各ブロックデータ別の世代コードの書き込みを説明するための概念図である。
【図５】図５は、世代コードが付加された状態のブロックデータを表す図である。
【図６】図６は、データ書き込み時の処理を説明するための図である。
【図７】図７は、データ読み出し時の処理を説明するための図である。
【図８】図８は、実施例１に係るストレージ装置における書き込み処理のフローチャートである。
【図９】図９は、実施例１に係るストレージ装置における読み出し処理のフローチャートである。
【図１０】図１０は、実施例１に係るストレージ装置のハードウェア構成を表す構成図である。
【図１１】図１１は、実施例２に係るストレージ装置で用いられる世代コントロールブロックの一例を表す図である。
【図１２】図１２は、ハッシュテーブルの一例を表す図である。
【図１３】図１３は、実施例２に係るストレージ装置における世代コントロールブロックの記憶方法を説明するための図である。
【発明を実施するための形態】
【００１３】
以下に、本願の開示するストレージ装置及びストレージ装置制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示するストレージ装置及びストレージ装置制御方法が限定されるものではない。
【実施例１】
【００１４】
図１は、実施例１に係るストレージ装置のブロック図である。図１に示すように本実施例に係るストレージ装置１は、データ受信部１０、チェックコード付加部１１、主記憶部１２、世代コード管理部１３、世代コード退避部１４、データ書込部１５、データ読出部１６、判定部１７、データ送信部１８及び記憶装置１９を有している。また、ストレージ装置１は、ホスト２とネットワークなどを介して接続されている。そして、ストレージ装置１は、ホスト２との間でデータの送受信が可能である。
【００１５】
記憶装置１９は、複数のＨＤＤを有している。そして、記憶装置１９のＨＤＤを用いて複数のＲＡＩＤ（Redundant  Arrays  of  Inexpensive  Disks）構成（アレイセット）が作成されている。そして、各ＲＡＩＤ構成には識別子としてＲＡＩＤ番号が与えられている。さらに、各ＲＡＩＤ構成は、それぞれのＲＡＩＤ構成におけるファイルの格納位置であるＲＡＩＤ  ＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）を有している。ＲＡＩＤ  ＬＢＡは、ディスクへのＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）単位であるブロック毎に割り当てられている。すなわち、ＲＡＩＤ番号とＲＡＩＤ  ＬＢＡが特定されれば、どのＲＡＩＤ構成のどこにあるデータかが決まり、記憶装置１９の中からデータが一意的に決まることになる。以下では、１ブロックのサイズを有する個々のデータ、すなわちディスクへのＩ／Ｏ単位のデータを単に「ブロックデータ」と呼ぶことがある。
【００１６】
主記憶部１２は、ＳＤＲＡＭなどのメモリである。そして、主記憶部１２は、データキャッシュ部１２１及び世代コード記憶部１２２を有している。世代コード記憶部１２２は、図２に示すような、世代コントロールブロック２００を予め記憶しておく。主記憶部１２は、世代コントロールブロック２００に対応させてその世代コントロールブロック２００が最後にアクセスされた日時も記憶している。図２は、世代コントロールブロックを説明するための図である。世代コントロールブロック２００は、各ブロックデータの世代コードを管理するためのテーブルである。世代コード記憶部１２２は、予め決められた所定容量分の世代コントロールブロックを記憶している。ここで、図２を参照して、世代コントロールブロック２００について詳細に説明する。
【００１７】
世代コントロールブロック２００は、位置情報領域２０１、連続管理領域２０２及び世代コードテーブル２０３を有している。位置情報領域２０１には、ＲＡＩＤ番号及びＳｔｒｉｐｅ番号が記載されている。また、連続管理領域２０２には、世代コードテーブル２０３に記載された各ブロックデータの世代コードをまとめて１つとして扱うか否かを示す値である連続世代コードが有効か否かを示すフラグが記載されている。また、連続世代コードが有効の場合、連続管理領域２０２には、連続世代コードの情報が記載されている。連続世代コードについては後で詳細に説明する。世代コードテーブル２０３は、ＲＡＩＤ  ＬＢＡが連続する所定個のブロックデータの世代コードを記載する世代コード欄２３１を有している。ここで、本実施例では、世代コードテーブル２０３は、所定個の世代コード欄２３１としてＲＡＩＤ構成のストライプの数の世代コード欄２３１を有している。ここで、ストライプとは、ＲＡＩＤ構成において一度に書き込むことができる個数のデータの組を表している。ストライプの数は、例えば、ＲＡＩＤ構成において一度にデータを書き込む対象となる物理的なハードディスクの数である。
【００１８】
そして、世代コントロールブロック２００は、記憶装置１９の各ＲＡＩＤ構成のＲＡＩＤ  ＬＢＡの全て網羅する数だけ予め作成されている。例えば、記憶装置１９が１つのＲＡＩＤ構成を有しており、ＲＡＩＤ  ＬＢＡが１〜１００まである場合で説明する。言い換えれば、この記憶装置１９は、１００個のブロックデータを記憶できるものである。そして、世代コードテーブル２０３に１０個のブロックデータの世代コードが記載できるとすると、この場合、１０個の世代コントロールブロック２００が予め用意されている。これは、具体的には、ＲＡＩＤ  ＬＢＡ１〜１０に対応する世代コントロールブロック２００、ＲＡＩＤ  ＬＢＡ１０〜２０に対応する世代コントロールブロック２００、・・・、ＲＡＩＤ  ＬＢＡ９０〜１００に対応する世代コントロールブロック２００となる。
【００１９】
世代コード退避部１４は、大容量の不揮発性メモリである。この不揮発性メモリとは、例えば、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、Ｆｌａｓｈメモリ、ＨＤＤなどである。世代コード退避部１４は、予め作成されている記憶装置１９の各ＲＡＩＤ構成のＲＡＩＤ  ＬＢＡの全て網羅する数だけの世代コントロールブロック２００（以下では、「記憶容量分の世代コントロールブロック」という。）を記憶している。ここで、本実施例では世代コード退避部１４は、記憶容量分の世代コントロールブロック２００を全て記憶しているとしたが、これは他の方法でも良い。例えば、世代コード記憶部１２２が保持している世代コントロールブロック２００は、世代コード退避部１４は保持しなくても良い。
【００２０】
次に、データの書き込み側の構成及び動作について説明する。データ受信部１０は、記憶装置１９に書き込むデータである書込データをホスト２から受信する。この書込データは、１つ又は複数のブロックデータを含んでいる。このブロックデータが「所定サイズ」の一例にあたる。データ受信部１０は、受信したデータをチェックコード付加部１１へ出力する。
【００２１】
チェックコード付加部１１は、書込データに含まれる各ブロックデータに世代コード以外のチェックコードを付加する。このチェックコード付加部１１により付加されるチェックコードは、例えば、ＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｈｅｃｋ），ＲＡＩＤ番号及びＦｌａｇ、ＲＡＩＤ  ＬＢＡなどである。そして、チェックコード付加部１１は、世代コード以外のチェックコードを付加した各ブロックデータを主記憶部１２のデータキャッシュ部１２１に格納する。
【００２２】
世代コード管理部１３は、データキャッシュ部１２１に蓄積されたブロックデータを記憶装置１９に書き込む旨の通知を、書き込むブロックデータの識別情報とともに、後述するデータ書込部１５から受信する。以下では、データキャッシュ部１２１に蓄積されたブロックデータを記憶装置１９に書き込むことを「ライトバック」と呼ぶことがある。以下では、ライトバックが行われることがデータ書込部１５から通知されたブロックデータについて説明する。世代コード管理部１３は、ブロックデータのチェックコードを用いてブロックデータに含まれるブロックの世代コードが記載された世代コントロールブロックを世代コード記憶部１２２から検索する。ここで、ブロックデータに世代コードが未だ記載されていない場合には、世代コード管理部１３は、世代コントロールブロックの検索を行わない。
【００２３】
ブロックデータの世代コードが記載された世代コントロールブロックが世代コード記憶部１２２に格納されていない場合、世代コード管理部１３は、そのブロックデータの世代コードが記載された世代コントロールブロックを世代コード退避部１４から読み出す。そして、世代コード管理部１３は、世代コード記憶部１２２に記憶されているアクセス日時を用いて、アクセスされた日時が最も古い世代コントロールブロックを特定する。そして、世代コード管理部１３は、世代コード記憶部１２２に記憶されているアクセスされた日時が最も古い世代コントロールブロックを世代コード退避部１４に移動する。この時、世代コード管理部１３は、移動した世代コントロールブロックで世代コード退避部１４に記憶されている対応する世代コードコントロールテーブルを更新する。そして、世代コード管理部１３は、世代コード退避部１４から読みだした世代コントロールブロックを世代コード記憶部１２２に格納する。
【００２４】
世代コード管理部１３は、ライトバックが通知されたコントロールブロックを含むデータキャッシュ部１２１に格納されている連続するブロックデータが、世代コントロールブロックに世代コードが記載された全てのブロックデータを含むか否かを判定する。この１つの世代コードテーブルに世代コードが記載された全てのブロックデータをまとめたものを「連続データ」という。すなわち、連続データは、ある世代コードテーブルの先頭のブロックからＲＡＩＤ  ＬＢＡがストライプの数連続するブロックデータの集合である。
【００２５】
図３−１は、世代コントロールブロックへの連続世代コードの書き込みを説明するための概念図である。図３−１では、世代コントロールブロックの連続管理領域２０２及び世代コードテーブル２０３のみを抜き出して記載している。世代コントロールブロック２００ａが連続世代コードを書き込む前の状態を表す。また、世代コントロールブロック２００ｂが連続世代コードを書き込んだ後の状態を表す。世代コード管理部１３は、連続データがある場合、その連続データに対応する世代コントロールブロックの連続管理領域２０２の連続世代コードが有効か否かを示すフラグ（以下では、「連続フラグ」と言う場合がある。）を確認する。連続世代コードが無効の場合、すなわち、図３−１の世代コントロールブロック２００ａの場合、世代コード管理部１３は、その連続管理領域２０２の連続世代コードを有効にする。ここで、連続世代コードを有効にすると、世代コードテーブル２０３に含まれる個々のブロックの世代コード欄は無効になる。世代コードテーブル２００ｂの世代コードテーブル２０３が点線で表されているのは無効であることを表している。そして、世代コード管理部１３は、世代コントロールブロック２００ａの世代コードテーブル２０３に記載されている世代コードのうちの最大値を１つインクリメントしたものを連続世代コードとして連続管理領域に書き込む。これにより、世代コントロールブロック２００ｂのように、連続管理領域２０２の連続世代コードが有効となり、連続世代コードが６となる。
【００２６】
図３−２は、連続世代コードを用いない場合の世代コントロールブロックへの世代コードの書き込みを説明するための概念図である。ここで、図３−２を用いて、連続世代コードを使用しない場合の世代コードの更新を説明する。図３−２では、世代コードテーブル２０３のみ記載している。図３−２は、紙面に向かって上の状態の各世代コードが更新されて紙面に向かって下の状態になったことを表している。図３−２に示すように、各ブロックの世代コードを更新するには、各ブロックの世代コードをそれぞれ１つインクリメントして、それぞれの値を書き込んでいかなくてはならない。この点、連続世代コードを使用した場合には、連続フラグの確認と必要があれば連続フラグの変更を行い、連続世代コードの書き込みを行うだけなので、世代コードを書き込む負荷が連続世代コードを使用しない場合に比べて軽減できる。
【００２７】
連続世代コードが有効の場合、世代コード管理部１３は、その連続管理領域に記載された連続世代コードを１つインクリメントした値を書き込む。
【００２８】
図４は、連続世代コードが有効な世代コントロールブロックへの各ブロックデータ別の世代コードの書き込みを説明するための概念図である。図４は、世代コントロールブロック２００ｃの世代コード欄２３２の世代コードが更新する場合を表している。世代コード管理部１３は、書込データの連続データ以外のブロックに対して、そのブロックの世代コードが記載されている世代コントロールブロックの連続管理領域の連続世代コードが有効か否かを示すフラグを確認する。連続世代コードが有効の場合、世代コントロールブロックは、図４の世代コントロールブロック２００ｃのようになっている。そして、世代コントロールブロック２００ｃの世代コード欄２３２を更新する場合、世代コード管理部１３は、連続フラグを無効にして、連続世代コードを無効にする。これにより、世代コントロールブロック２００ｄの世代コードテーブル２０３のように、各ブロックデータの世代コードを表す世代コード欄が有効になる。そして、世代コード管理部１３は、世代コード欄２３２に記載されている値を１つインクリメントした値を、世代コード欄２３２に書き込む。このとき、世代コード管理部１３は、世代コードテーブル２０３の世代コード欄２３２以外の世代コード欄それぞれに、連続世代コードとして与えられていた値を書き込む。
【００２９】
連続世代コードが無効の場合、世代コード管理部１３は、世代コードの更新対象であるブロックデータの世代コードが記載されている世代コード欄の値を１つインクリメントした値をその欄に書き込む。
【００３０】
さらに、世代コード管理部１３は、世代コントロールブロックで記載した各ブロックデータに対応する世代コードを、データキャッシュ部１２１に記載されている各ブロックデータのチェックコードに付加する。図５は、世代コードが付加された状態のブロックデータを表す図である。世代コード管理部１３により世代コードが付加されたブロックデータは３００、図５に示すように、実際のデータ３０１及びチェックコード３０２からなる。そして、チェックコード３０２は、ＣＲＣ３２１、ＲＡＩＤ番号３２２、Ｆｌａｇ３２３、世代コード３２４及びＲＡＩＤ  ＬＢＡ３２５からなる。ここで、Ｆｌａｇ３２３は、データの有効／無効や、パリティを示すものである。このように、本実施例に係るストレージ装置では、ホスト２から受信した書込データ３００に含まれるブロックデータそれぞれに更新の状態を表す世代コード３２４が付加される。
【００３１】
データ書込部１５は、記憶装置１９の動作状態及びデータキャッシュ部１２１へのブロックデータの蓄積状態から、ブロックデータのライトバックのタイミングを決定する。そして、データ書込部１５は、ライトバックを行うブロックデータの識別情報を世代コード管理部１３へ通知する。
【００３２】
データ書込部１５は、世代コードが付加されたブロックデータをデータキャッシュ部１２１から取得する。そして、データ書込部１５は、ブロックデータのチェックコードに記載されている、ＲＡＩＤ番号及びＲＡＩＤ  ＬＢＡが示す記憶装置１９のアドレスに書込データを書き込む。
【００３３】
図６は、データ書き込み時の処理を説明するための図である。ここで、図６を参照して、本実施例に係るストレージ装置１のデータ書き込み時の処理の全体的な流れを説明する。
【００３４】
まず、書込データに含まれるブロックデータが、主記憶部１２のデータキャッシュ部１２１に格納される（ステップＳ１０１）。次に、世代コード管理部１３は、ライトバックが通知されたブロックデータの世代コードを含む世代コントロールブロックが世代コード記憶部１２２にあるか否か判定する。そして、該当する世代コントロールブロックが世代コード記憶部１２２に無い場合、世代コード管理部１３は、世代コード退避部１４から該当する世代コントロールブロックを読み込む。そして、世代コード管理部１３は、アクセスされた日時が一番古い世代コントロールブロックを世代コード記憶部１２２から世代コード退避部１４へ移動する（ステップＳ１０２）。それとともに、世代コード管理部１３は、読み込んだ世代コントロールブロックを世代コード記憶部１２２に格納する（ステップＳ１０３）。そして、世代コード管理部１３は、世代コード記憶部１２２に記憶されている世代コントロールブロックに記載されたライトバックの対象のブロックデータの世代コードを１つインクリメントし更新する。この更新には、連続世代コードを使用した場合の更新も含まれる。そして、世代コード管理部１３は、データキャッシュ部１２１に格納されているブロックデータの世代コードを世代コントロールブロックに記載した新しい世代コードに更新する（ステップＳ１０４）。そして、新しい世代コードが付加されたブロックデータは、記憶装置１９に格納される（ステップＳ１０５）。
【００３５】
図２に戻って、本実施例に係るストレージ装置１におけるデータ読み出し側の構成及び動作について説明する。データ読出部１６は、ホスト２からデータの読み出し要求を受ける。そして、データ読出部１６は、指定されたデータを記憶装置１９から読み出す。このデータは、１つ又は複数のブロックデータで構成されている。そして、データ読出部１６は、読み出したデータを主記憶部１２のデータキャッシュ部へ格納する。
【００３６】
判定部１７は、データ読出部１６が記憶装置１９から読み出しデータキャッシュ部１２１に格納したブロックデータを参照する。そして、判定部１７は、受信したブロックデータの世代コードが記載された世代コントロールブロックを、世代コード記憶部１２２に格納されている世代コントロールブロックの中から検索する。このとき、判定部１７は、受信したデータが格納されていたＲＡＩＤ番号及びストライプ（Stripe）番号と図２に記載した世代コントロールブロック２００の位置情報領域２０１とを用いて検索を行う。ストライプ番号とは、あるＲＡＩＤにおいてストライプの数のデータを一組とした場合に、どの組であるかを識別するための識別子である。
【００３７】
受信したデータに含まれるブロックデータの世代コードが記載された世代コントロールブロックが世代コード記憶部１２２に無い場合、判定部１７は、世代コード退避部１４から当該ブロックデータの世代コードが記載された世代コントロールブロックを読み込む。そして、判定部１７は、世代コード記憶部１２２に記憶されているアクセス日時を用いて、アクセスされた日時が最も古い世代コントロールブロックを特定する。そして、判定部１７は、アクセスされた日時が最も古い世代コントロールブロックを世代コード記憶部１２２から世代コード退避部１４へ移動する。この時、判定部１７は、移動した世代コントロールブロックで世代コード退避部１４に記憶されている対応する世代コードコントロールテーブルを更新する。そして、判定部１７は、読み込んだ世代コントロールブロックを世代コード記憶部１２２に格納する。
【００３８】
判定部１７は、受信したデータに含まれる各ブロックデータの世代コードと、世代コード記憶部１２２に記憶されている世代コントロールブロックに記載された当該ブロックデータの世代コードとを比較する。
【００３９】
判定部１７は、受信したデータに含まれるブロックデータの世代コードと世代コントロールブロックに記載された世代コードとが一致した場合、受信したデータの識別情報をデータ送信部１８へ出力する。
【００４０】
これに対して、受信したデータに含まれるブロックデータの世代コードと世代コントロールブロックに記載された世代コードとが一致しない場合、判定部１７は、そのブロックデータを格納していたＨＤＤで書き損じが発生したと判定する。この場合、本実施例では、判定部１７は、書き損じが発生したと判定したＨＤＤを切り離す。その後、判定部１７は、記憶装置１９に対してＲＡＩＤの縮退処理の実行を命令する。
【００４１】
ここで、本実施例では、機能構成として判定部１７と世代コード管理部１３とを分けたがこれらは１つにまとめても良い。また、本実施例では、判定部１７が、世代コード退避部１４から世代コード記憶部１２２へ世代コントロールブロックを移動する処理を行っているが、この処理を判定部１７が行わずに、世代コード管理部１３が代わりに行っても良い。その場合、判定部１７は、受信したデータに含まれるブロックデータの世代コードが記載された世代コントロールブロックが世代コード記憶部１２２に無いと判定すると、世代コード管理部１３にその旨の通知を行う。そして、世代コード管理部１３は、判定部１７からの通知を受けて、世代コード退避部１４から世代コード記憶部１２２へ世代コントロールブロックを移動する処理を行うことになる。
【００４２】
データ送信部１８は、データの識別情報の入力を判定部１７から受ける。そして、データ送信部１８は、受信した識別情報を有するデータをデータキャッシュ部１２１から読み出す。そして、データ送信部１８は、読み出したデータをホスト２へ送信する。
【００４３】
図７は、データ読み出し時の処理を説明するための図である。ここで、図７を参照して、本実施例に係るストレージ装置のデータ読み出し時の処理の全体的な流れを説明する。
【００４４】
まず、データ読出部１６により記憶装置１９から読み出されたデータが、主記憶部１２のデータキャッシュ部１２１に格納される（ステップＳ２０１）。次に、判定部１７が、読み出されたデータに含まれる各ブロックデータの世代コードが記載された世代コントロールブロックが世代コード記憶部１２２にあるか否か判定する。そして、該当する世代コントロールブロックが世代コード記憶部１２２に無い場合、判定部１７は、世代コード退避部１４から該当する世代コントロールブロックを読み込む。そして、判定部１７は、アクセスされた日時が一番古い世代コントロールブロックを世代コード記憶部１２２から世代コード退避部１４へ移動する（ステップＳ２０２）。それとともに、判定部１７は、読み込んだ世代コントロールブロックを世代コード記憶部１２２に格納する（ステップＳ２０３）。そして、判定部１７は、読み出されたデータに含まれる各ブロックデータの世代コードと、世代コード記憶部１２２に記憶されている世代コントロールブロックに記載された当該ブロックデータの世代コードとを比較する（ステップＳ２０４）。そして、判定部１７により世代コードが同じだと判定された場合、データ送信部１８は、データキャッシュ部１２１に格納されているデータをホスト２へ送信する（ステップＳ２０５）。これに対して、判定部１７により世代コードが異なると判定された場合、判定部１７は書き損じが発生したと判定する。そして、判定部１７は、書き損じが発生したＨＤＤを切り離す。そして、判定部１７は、記憶装置１９に対してＲＡＩＤの縮退処理の実行を命令する。
【００４５】
次に、図８を参照して、本実施例に係るストレージ装置における書き込み処理の流れを説明する。図８は、実施例１に係るストレージ装置における書き込み処理のフローチャートである。
【００４６】
データ受信部１０は、ホスト２から書き込みデータを受信する（ステップＳ３０１）。そして、チェックコード付加部１１は、書込データに含まれる各ブロックデータに世代コード以外のチェックコードを付加してデータキャッシュ部１２１へ格納する。そして、世代コード管理部１３は、記憶装置１９へのライトバックを開始する旨の通知をデータ書込部１５から受信するまで待機している。
【００４７】
世代コード管理部１３は、ライドバックするブロックデータに既に世代コードが付加されているか否かを判定する（ステップＳ３０２）。世代コードが付加されている場合（ステップＳ３０２肯定）、世代コード管理部１３は、当該ブロックデータの世代コードが記載された世代コントロールブロックが世代コード記憶部１２２にあるか否かを判定する（ステップＳ３０３）。世代コード記憶部１２２に該当する世代コントロールブロックがない場合（ステップＳ３０３否定）、世代コード管理部１３は、該当する世代コントロールブロックを世代コード退避部１４から世代コード記憶部１２２に移動させる（ステップＳ３０４）。この時、世代コード管理部１３は、アクセスされた日時が一番古い世代コントロールブロックを世代コード記憶部１２２から世代コード退避部１４に移動する。
【００４８】
そして、世代コード記憶部１２２に該当する世代コントロールブロックがある場合（ステップＳ３０３肯定）、世代コード管理部１３は、世代コード記憶部１２２から当該ブロックデータの世代コードを読み込む（ステップＳ３０５）。また、世代コントロールブロックを世代コード退避部１４から世代コード記憶部１２２に移動させた後、世代コード管理部１３は、世代コード記憶部１２２から当該ブロックデータの世代コードを読み込む（ステップＳ３０５）。
【００４９】
また、ライトバックするブロックデータに未だ世代コードが付加されていない場合（ステップＳ３０２否定）、ステップＳ３０６へ進む。
【００５０】
世代コード管理部１３は、書込データに含まれるブロックデータで構成された連続データにライトバックするブロックデータが含まれるか否かを判定する（ステップＳ３０６）。
【００５１】
ライトバックするブロックデータが連続データに含まれる場合（ステップＳ３０６肯定）、世代コード管理部１３は、当該ブロックデータの世代コードが記載された世代コントロールブロックの連続フラグを参照する。そして、世代コード管理部１３は、連続世代コードが有効になっているか否かを判定する（ステップＳ３０７）。連続世代コードが無効の場合（ステップＳ３０７否定）、世代コード管理部１３は、該当する世代コントロールブロックの連続フラグを変更し、連続世代コードを有効にする（ステップＳ３０８）。これに対して、連続世代コードが有効の場合（ステップＳ３０７肯定）、ステップＳ３０９に進む。
【００５２】
世代コード管理部１３は、該当する世代コントロールブロックの連続世代コードを１つインクリメントする（ステップＳ３０９）。
【００５３】
これに対して、ライトバックするブロックデータが連続データに含まれない場合（ステップＳ３０６否定）、世代コード管理部１３は、当該ブロックデータの世代コードを含む世代コントロールブロックの連続フラグを参照する。そして、世代コード管理部１３は、連続世代コードが有効になっているか否かを判定する（ステップＳ３１０）。連続世代コードが有効の場合（ステップＳ３１０肯定）、世代コード管理部１３は、該当する世代コントロールブロックの連続フラグを変更し、連続世代コードを無効にして世代コードの管理を分離する（ステップＳ３１１）。これに対して、連続世代コードが無効の場合（ステップＳ３１０否定）、ステップＳ３１２に進む。
【００５４】
世代コード管理部１３は、該当する世代コードテーブルの連続世代コードにおける書込データの各ブロックの世代コードを１つインクリメントする（ステップＳ３１２）。
【００５５】
そして、世代コード管理部１３は、ライトバックが行われる各ブロックデータに世代コードを書き込む（ステップＳ３１３）。
【００５６】
データ書込部１５は、世代コードが付加されたブロックデータを記憶装置１９に書き込む（ステップＳ３１４）。
【００５７】
次に、図９を参照して、本実施例に係るストレージ装置における読み出し処理の流れを説明する。図９は、実施例１に係るストレージ装置における読み出し処理のフローチャートである。
【００５８】
データ読出部１６は、ホスト２からの要求を受けて、指定されたデータを記憶装置１９のＨＤＤから読み出す（ステップＳ４０１）。そして、データ読出部１６は、読み出したデータをデータキャッシュ部１２１に格納する。
【００５９】
判定部１７は、データキャッシュ部１２１に書き込まれたデータに含まれる各ブロックデータの世代コードが記載された世代コントロールブロックが世代コード記憶部１２２にあるか否かを判定する（ステップＳ４０２）。該当する世代コントロールブロックが有る場合（ステップＳ４０２肯定）、ステップＳ４０４へ進む。これに対して、該当する世代コントロールブロックが無い場合（ステップＳ４０２否定）、判定部１７は、該当する世代コントロールブロックを世代コード退避部１４から世代コード記憶部１２２へ移動する（ステップＳ４０３）。この時、判定部１７は、アクセスされた日時が一番古い世代コントロールブロックを世代コード記憶部１２２から世代コード退避部１４に移動する。
【００６０】
判定部１７は、読み出したデータに含まれるブロックデータの世代コードと世代コントロールブロックに記載された世代コードとが一致するか否かを判定する（ステップＳ４０４）。読み出したデータに含まれるブロックデータの世代コードが一致した場合（ステップＳ４０４肯定）、データ送信部１８は、データをホスト２に送信する（ステップＳ４０５）。
【００６１】
これに対して、読み出したデータに含まれるブロックデータに世代コードが一致しないものがある場合（ステップＳ４０４否定）、判定部１７は、当該ブロックを含むＨＤＤを切り離す（ステップＳ４０６）。その後、ストレージ装置１は、ＨＤＤのＲＡＩＤ縮退処理を実行する。
【００６２】
図１０は、実施例１に係るストレージ装置のハードウェア構成を表す構成図である。本実施例に係るストレージ装置１は、図１０に示すように、ＣＰＵ１０１、メモリ１０２、バックアップデバイス１０３、Ｉ／Ｏコントローラ１０４及びＩ／Ｏコントローラ１０５を有しており、さらに、ＨＤＤ３を複数有している。
【００６３】
このＣＰＵ１０１が、チェックコード付加部１１、世代コード管理部１３及び判定部１７の機能を有する。また、ＣＰＵ１０１は、上述したストレージ装置１で行われる処理の制御を統括する。また、メモリ１０２が、主記憶部１２の機能を有する。また、バックアップデバイス１０３が、世代コード退避部１４の機能を有する。また、Ｉ／Ｏコントローラ１０４がデータ受信部１０及びデータ送信部１８の機能を有する。また、Ｉ／Ｏコントローラ１０５が、データ書込部１５及びデータ読出部１６の機能を有する。そして、ＨＤＤ３をまとめたものが、記憶装置１９の機能を有する。
【００６４】
以上に説明したように、本実施例に係るストレージ装置は、ＨＤＤへの書き込み時に各ブロックに更新状態を表す世代コードを付加し、読み出し時にその世代コードをチェックすることで、データの書き損じを検出することができる。特に、本実施例に係るストレージ装置は、ブロックがＲＡＩＤを構成するストライプ分連続している場合、ブロックを一つにまとめて一つの世代コードを付加し、ストライプ分連続していない場合、ブロック毎に世代コードを付加する。これにより、世代コードの付加及び付加された世代コードを用いたデータのチェックの処理の負荷を軽減することができる。したがって、高い信頼性を維持しつつ、エラーチェックのための処理の負荷を軽減することができる。
【００６５】
ここで、本実施例では、ハードディスクへの書き込みや読み出しを考慮し、連続データとして取り扱う個数である「所定個」をストライプの数として、ＲＡＩＤを構成するストライプ分データが連続した場合に連続データとして取り扱うこととした。しかし、この連続データとして取り扱う個数は他の値を用いても良い。例えば、２ストライプ分のブロックデータであってもよいし、１０００個のブロックデータなどとしてもよい。
【実施例２】
【００６６】
次に、実施例２に係るストレージ装置について説明する。本実施例に係るストレージ装置は、データの読み出しを効率化するためにハッシュテーブル及びＬＲＵリンクを用いたことが実施例１と異なるものである。本実施例に係るストレージ装置のブロック図も図１のブロック図と同様である。ここで、実施例１と同様の符号を有する各部は特に説明の無い限り本実施例においても同様の機能を有するものとする。
【００６７】
図１１は、実施例２に係るストレージ装置で用いられる世代コントロールブロックの一例を表す図である。本実施例の世代コントロールブロック２００は、図２で表される実施例１の世代コントロールブロックにハッシュ情報領域２０４及びＬＲＵリンク接続情報領域２０５をくわえたものである。ハッシュ情報領域２０４には、ハッシュリンク接続情報が記載されている。ここで、ハッシュリンク接続情報とは、世代コントロールブロック２００がリンクされているハッシュテーブル上のハッシュ値を表す情報である。このハッシュ値は、ＲＡＩＤ番号、ＲＡＩＤ  ＬＢＡ，ＢｌｏｋＣｏｕｎｔをキーにして生成される。「ＢｌｏｃｋＣｏｕｎｔ」は、ブロックデータを構成するセクタ数を表す値である。ここでは、「ＢｌｏｃｋＣｏｕｎｔ」は、１つのＲＡＩＤ  ＬＢＡがふられた領域の記憶容量を示すものである。
【００６８】
図１２は、ハッシュテーブルの一例を表す図である。世代コード管理部１３は、図１２に示すようなハッシュテーブルを記憶している。図１２に示すように、本実施例に係るハッシュテーブル４００は、各ハッシュ値に対して複数の世代コントロールブロックがぶら下がるリンク構造を有している。ここで、世代コントロールブロックの後ろに付加した「＃ｎ」は各世代コントロールブロックの識別子とする。例えば、ハッシュテーブル４００の欄４０１に記載されているハッシュ値を例に説明する。欄４０１に記載されたハッシュ値に対しては、世代コードブロック＃３、世代コントロールブロック＃６、世代コントロールブロック＃４の順にリンクされている。
【００６９】
そして、世代コード管理部１３は、データ受信部１０が割り当てたＲＡＩＤ番号、ＲＡＩＤ  ＬＢＡ，ＢｌｏｋＣｏｕｎｔをキーにハッシュ値を算出する。そして、世代コード管理部１３は、算出したハッシュ値を基にハッシュテーブルを参照し、アクセスしたい世代コントロールブロックが既に世代コード記憶部１２２上に展開されているか否かを判定する。例えば、世代コード管理部１３が、世代コントロールブロック＃６に世代コードが記載されたブロックを基に検索する場合で説明する。世代コード管理部１３は、ブロックに割り当てられたＲＡＩＤ番号、ＲＡＩＤ  ＬＢＡ及びＢｌｏｋＣｏｕｎｔからハッシュ値を算出する。ここでは、世代コード管理部１３は、ハッシュテーブル４００の欄４０１のハッシュ値を得る。そして、世代コード管理部１３は、欄４０１のハッシュ値をハッシュテーブル上で検索する。そして、世代コード管理部１３は、欄４０１のハッシュ値にリンクされている世代コントロールブロックを前から順に検索する。まず、世代コード管理部１３は、世代コントロールブロック＃３に該当するブロックデータの世代コードがあるか否か検索する。ここでは、世代コントロールブロック＃３には、該当するブロックデータの世代コードはない。そこで、次に、世代コード管理部１３は、世代コントロールブロック＃６を検索する。ここで、世代コード管理部１３は、世代コントロールブロック＃６に該当するブロックデータの世代コードが記載されていることを検出する。そして、世代コード管理部１３は、世代コントロールブロックが世代コード記憶部１２２に展開されているか否かを判定する。
【００７０】
このようにハッシュテーブルを使うことで、ハッシュを用いずに全ての世代コントロールブロックを１つずつ調べてアクセスしたい世代コントロールブロックを検索する場合に比べて、対象とする世代コントロールブロックに迅速にアクセスすることができる。
【００７１】
また、図１３は、実施例２に係るストレージ装置における世代コントロールブロックの記憶方法を説明するための図である。本実施例に係るストレージ装置では、世代コード記憶部１２２は、図１３のように、ＬＲＵ（Ｌｅａｓｔ  Ｒｅｃｅｎｔｌｙ  Ｕｓｅｄ）方式を用いて、アクセスされた日時の古い順に世代コントロールブロックを記憶している。
【００７２】
具体的には、図１１で示すように、世代コントロールブロック２００のＬＲＵリンク接続情報領域２０５に、ＬＲＵリンク接続情報が記載されている。このＬＲＵ接続情報は、世代コード記憶部１２２に記憶された日時の古いそれぞれの世代コントロールブロックの順番を示す情報である。図１３の世代コード記憶部１２２の状態では、世代コントロールブロック＃１が一番古く、世代コントロールブロック＃３、世代コントロールブロック＃４と順に新しくなり、世代コントロールブロック＃２が最も新しくアクセスされたことを表している。
【００７３】
世代コード管理部１３は、世代コード記憶部１２２の中から特定の世代コントロールブロックを検索する場合、ＬＲＵ接続情報を基にアクセスの新しいものから順に検索を行う。例えば、世代コントロールブロック＃４を検索する場合、世代コード管理部１３は、まず、世代コントロールブロック＃２を確認し、次に世代コントロールブロック＃４を確認することで検索を終えることができる。
【００７４】
そして、世代コード管理部１３は、世代コード記憶部１２２に特定の世代コントロールブロックが無い場合、世代コード退避部１４から該当する世代コントロールブロックを読み出し、世代コード記憶部１２２に記憶させる。この時、世代コード管理部１３は、ＬＲＵリンク接続情報から最も古くアクセスがあった世代コントロールブロックを取り出し、バックアップデバイスに入れる。そして、世代コード管理部１３は、特定の世代コントロールブロックを世代コード退避部１４から取得し、ＬＲＵリンク接続情報として最新のアクセスがあったことを示す値をつけ世代コード記憶部１２２に記憶させる。ここで、一例として、図１３の主記憶部１２の状態で、世代コード管理部１３が世代コントロールブロック＃５を主記憶部１２に移す場合を説明する。世代コード管理部１３は、ＬＲＵ接続情報を用いて、一番アクセスの古い世代コントロールブロック＃１を主記憶部１２から取り出し、世代コード退避部１４へ書き込む。そして、世代コード管理部１３は、世代コード退避部１４から世代コントロールブロック＃５を読み出し、ＬＲＵリンク接続情報として最新のアクセスがあったことを示す値をつけ世代コード記憶部１２２に記憶させる。図１３で表されるイメージとしては、並んでいるリンクの一番後ろに世代コントロールブロック＃５が加えられることになる。また、リンク順の途中にある世代コントロールブロックを用いる場合、世代コード管理部１３は、該当する世代コントロールブロックを抜き出し、ＬＲＵリンク接続情報として最新のアクセスがあったことを示す値をつけ世代コード記憶部１２２に記憶させる。
【００７５】
このように、ＬＲＵ方式を用いて世代コントロールブロックを記憶することで、アクセス頻度の高い世代コントロールブロックほど早く見つけることができる。このため、何度も行われる書き込み及び読み込み処理をまとめてみた場合、全体的な処理速度を向上させることができる。
【００７６】
また、判定部１７は、図１２に示すようなハッシュテーブルを記憶している。判定部１７は、ブロックに割り当てられたＲＡＩＤ番号、ＲＡＩＤ  ＬＢＡ及びＢｌｏｋＣｏｕｎｔをキーにハッシュ値を算出する。そして、判定部１７は、算出したハッシュ値を基にハッシュテーブルを参照し、アクセスしたい世代コントロールブロックが既に世代コード記憶部１２２上に展開されているか否かを判定する。
【００７７】
また、判定部１７は、世代コード記憶部１２２の中から特定の世代コントロールブロックを検索する場合、ＬＲＵ接続情報を基にアクセスの新しいものから順に検索を行う。
【００７８】
以上に説明したように、本実施例に係るストレージ装置では、ハッシュテーブル及びＬＲＵ方式を用いて、世代コントロールブロックの検索を行う。これにより、世代コントロールブロックの検索効率を向上させることができ、ストレージ装置における書き込み及び読み込み処理の速度が向上する。
【００７９】
さらに、以上で説明した各実施例の変形例として、例えば次のような変形例がある。
【００８０】
まず、ストレージ装置１の電源をオフにする場合、世代コード管理部１３は、世代コード記憶部１２２に格納されている世代コントロールブロックを、世代コード退避部１４に移動させる。この場合、世代コード退避部１４に記憶されている世代コントロールブロックは更新される。そして、世代コードブロックの移動が全て完了した後に、ストレージ装置１の電源がオフになる。
【００８１】
このようにすることで、電源オフのときにメモリ上にあった世代コントロールブロックの情報を維持することができる。これにより、電源オフの後再起動した場合でも、確実に書き損じなどのエラーをチェックすることができる。
【００８２】
また、ストレージ装置１に停電時用のバッテリを配置する。そして、停電が発生した場合、バッテリからＣＰＵ１０１、メモリ１０２、バックアップデバイス１０３、Ｉ／Ｏコントローラ１０４及びＩ／Ｏコントローラ１０５を有するコントローラボードへ電源を供給する。そして、バッテリ駆動期間中に、世代コード記憶部１２２に格納されている世代コントロールブロックを、世代コード退避部１４に移動させる。
【００８３】
このようにすることで、停電時にもメモリ上にあった世代コントロールブロックの情報を維持することができる。これにより、停電が発生した場合でも、復旧後に確実に書き損じなどのエラーをチェックすることができる。
【００８４】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００８５】
（付記１）所定サイズのデータであるブロックデータを含む書込データを受信するデータ受信部と、
前記ブロックデータの更新状態を表す世代コードをブロックデータの識別情報と対応させて記憶する世代コード記憶部と、
前記書込データにおいて所定個の連続する前記ブロックデータからなる連続データを検出し、前記検出した連続データに対して新しい世代コードを割り当て、前記書込データに含まれる前記連続データ以外のブロックデータのそれぞれに新しい世代コードを割り当て、割り当てた世代コードを前記世代コード記憶部に記憶させる世代コード管理部と、
前記新しい世代コードを前記書込データに含まれる前記ブロックデータ及び連続データに付加し記憶装置に書き込むデータ書込部と、
前記記憶装置から前記ブロックデータ又は連続データを読み出すデータ読出部と、
前記データ読出部により読み出された前記ブロックデータ又は連続データに付加されている世代コードと前記世代コード記憶部に記憶されている前記読み出されたブロックデータ又は連続データの世代コードとが一致するか否かを判定する判定部と、
前記判定部により前記世代コードが一致すると判定された場合、前記読み出されたブロックデータ又は連続データを送信するデータ送信部と
を備えたことを特徴とするストレージ装置。
【００８６】
（付記２）前記世代コード管理部は、前記連続データに対して新しい世代コードを割り当てた場合、該連続データを構成するブロックデータの識別情報に対応させて新しい世代コードを前記世代コード記憶部に記憶させ、前記ブロックデータそれぞれに新しい世代コードを割り当てた場合、各前記ブロックデータの識別情報それぞれに対応させて新しい世代コードを前記世代コード記憶部に記憶させることを特徴とする付記１に記載のストレージ装置。
【００８７】
（付記３）前記記憶装置は、複数のハードディスクから成り、且つ該ハードディスクを用いて生成されたＲＡＩＤ構成を有しており、
前記連続データは、前記ＲＡＩＤ構成におけるストライブの数の連続するブロックデータからなることを特徴とする付記１又は付記２に記載のストレージ装置。
【００８８】
（付記４）前記世代コード記憶部は、前記連続データの世代コードが各ブロックデータの識別情報に対応するよう記載されたテーブルである世代コントロールブロックを用いて前記世代コードを記憶することを特徴とする付記１〜付記３のいずれか一つに記載のストレージ装置。
【００８９】
（付記５）前記世代コード記憶部より容量が大きい記憶領域を有し、少なくとも前記世代コード記憶部が記憶する世代コードに対応するブロックデータ以外の前記記憶装置に記憶されているブロックデータの各世代コードが記載された前記世代コントロールブロックを記憶する世代コード退避部をさらに備え、
前記世代コード管理部は、前記書込データに含まれる前記ブロックデータの世代コードの情報が記載された世代コントロールブロックが前記世代コード退避部にある場合、前記世代コード記憶部に記憶されている最もアクセス日時の古い世代コントロールブロックと前記書込データに含まれるブロックデータの世代コードの情報を含む世代コントロールブロックとを入れ替えることを特徴とする付記４に記載のストレージ装置。
【００９０】
（付記６）前記世代コード管理部及び前記判定部は、前記世代コントロールブロックの格納先を示すハッシュテーブルを有しており、
前記世代コード管理部及び前記判定部は、前記ハッシュテーブルを用いて前記世代コントロールブロックを検索する
ことを特徴とする付記４又は付記５に記載のストレージ装置。
【００９１】
（付記７）所定サイズのデータであるブロックデータを含む書込データを受信し、
前記書込データにおいて所定個の連続する前記ブロックデータからなる連続データを検出し、前記検出した連続データに対して新しい世代コードを割り当て、前記書込データに含まれる前記連続データ以外のブロックデータのそれぞれに新しい世代コードを割り当て、割り当てた前記世代コードを各前記ブロックデータ又は前記連続データの識別情報と対応させてメモリに記憶させ、
前記新しい世代コードを前記書込データに含まれる前記ブロックデータ及び連続データに付加しハードディスクに書き込み、
前記ハードディスクから前記ブロックデータ又は連続データを読み出し、
読み出した前記ブロックデータ又は連続データに付加されている世代コードと前記メモリに記憶されている前記読み出されたブロックデータ又は連続データの世代コードとが一致するか否かを判定し、
前記世代コードが一致すると判定した場合、前記読み出したブロックデータ又は連続データを送信する
ことを特徴とするストレージ装置制御方法。
【符号の説明】
【００９２】
１  ストレージ装置
２  ホスト
３  ハードディスク
１０  データ受信部
１１  チェックコード付加部
１２  主記憶部
１３  世代コード管理部
１４  世代コード退避部
１５  データ書込部
１６  データ読出部
１７  判定部
１８  データ送信部
１９  記憶装置
【図１】
0005673178.tif 000002
【図２】
0005673178.tif 000003
【図３−１】
0005673178.tif 000004
【図３−２】
0005673178.tif 000005
【図４】
0005673178.tif 000006
【図５】
0005673178.tif 000007
【図６】
0005673178.tif 000008
【図７】
0005673178.tif 000009
【図８】
0005673178.tif 000010
【図９】
0005673178.tif 000011
【図１０】
0005673178.tif 000012
【図１１】
0005673178.tif 000013
【図１２】
0005673178.tif 000014
【図１３】
0005673178.tif 000015