(57)【特許請求の範囲】
【請求項１】
ホストコンピュータから任意の書き込み要求に基づいて送信されるデータを一時的に格納するメモリ部を有し前記データの入出力を制御するコントローラ部と、前記コントローラ部に接続され前記データを格納するハードディスクドライブ部と、を有するストレージ装置であって、
前記コントローラ部は、
前記ホストコンピュータから任意の書き込み要求に基づいて送信されるデータであることを示す識別番号を、データの構成単位であるデータブロック毎に付与し、
前記メモリ部に前記データを格納する前記ハードディスクドライブ部の格納先とともに、前記ハードディスクドライブ部に格納されるべき前記データの前記識別番号を期待値として格納し、
前記データブロック毎に付与される前記識別番号は、
前記ホストコンピュータから１回の書き込み要求に基づいて送信されるデータの先頭ブロック、途中ブロック、又は末尾ブロックであることを示す位置コードと、前記ホストコンピュータから１回の書き込み要求に基づいて送信されるデータであることを示す識別子と、から構成され、
前記コントローラ部は、
前記読み出し対象のデータを構成するデータブロック群から前記位置コードの配列を検証し、
前記メモリ部は、
複数のローカルメモリのそれぞれがキャッシュメモリ及び共有メモリに接続される構成であり、
前記データを構成する複数のデータブロック群のうち、前記ホストコンピュータからアクセスされるデータブロック群の前記識別番号をライトシーケンス番号情報として任意の前記ローカルメモリ及び前記キャッシュメモリに格納し、
前記データのうち前記ライトシーケンス番号情報の更新回数を管理する世代番号を前記任意のローカルメモリ及び前記共有メモリに格納し、
前記コントローラ部は、
前記読み出し対象のデータを構成する前記ライトシーケンス番号情報の最新の世代番号を前記共有メモリから取得し、
前記最新の世代番号に該当する前記ライトシーケンス番号情報を前記任意のローカルメモリ又は前記キャッシュメモリから検索し、
前記最新の世代番号に該当する前記ライトシーケンス番号情報が前記任意のローカルメモリにない場合には、前記任意のローカルメモリで管理する世代番号を、前記共有メモリで管理する最新の世代番号と同一にした後に、前記任意のローカルメモリに格納される前記識別子を前記期待値として設定し、
前記ホストコンピュータからの読み出し要求に基づいて、前記ハードディスクドライブ部から読み出し対象のデータの構成単位であるデータブロック毎に付与された識別番号と、前記読み出し対象のデータの前記期待値と、を比較して、前記読み出し対象のデータが前記任意の書き込み要求で前記ハードディスクドライブに書き込まれたデータであることを検証する
ことを特徴とするストレージ装置。
【請求項２】
前記コントローラ部は、
前記最新の世代番号に該当する前記ライトシーケンス番号情報を前記任意のローカルメモリ又は前記キャッシュメモリから検索し、
前記最新の世代番号に該当する前記ライトシーケンス番号情報が前記任意のローカルメモリ及び前記キャッシュメモリのいずれにも格納されていない場合に、前記最新の世代番号に該当する前記ライトシーケンス番号情報を前記ハードディスクドライブから読み出す
ことを特徴とする請求項１に記載のストレージ装置。
【請求項３】
前記メモリ部は、
前記キャッシュメモリ及び前記共有メモリを１つのメモリとして管理し、
前記複数のローカルメモリのそれぞれがスイッチ部を介して前記キャッシュメモリ及び前記共有メモリに接続される構成であり、
前記データの書き込み及び読み出しは前記スイッチ部が行う
ことを特徴とする請求項２に記載のストレージ装置。
【請求項４】
ホストコンピュータから任意の書き込み要求に基づいて送信されるデータを一時的に格納するメモリ部を有し前記データの入出力を制御するコントローラ部と、前記コントローラ部に接続され前記データを格納するハードディスクドライブ部と、を有するストレージ装置のデータ検証方法であって、
前記コントローラ部が、
前記ホストコンピュータから任意の書き込み要求に基づいて送信されるデータであることを示す識別番号を、データの構成単位であるデータブロック毎に付与する第１のステップと、
前記メモリ部に前記データを格納する前記ハードディスクドライブ部の格納先とともに、前記ハードディスクドライブ部に格納されるべき前記データの前記識別番号を期待値として格納する第２のステップと、
前記ホストコンピュータからの読み出し要求に基づいて、前記ハードディスクドライブ部から読み出し対象のデータの構成単位であるデータブロック毎に付与された識別番号と、前記読み出し対象のデータの前記期待値と、を比較して、前記読み出し対象のデータが前記任意の書き込み要求で前記ハードディスクドライブに書き込まれたデータであることを検証する第３のステップと、を有し、
前記データブロック毎に付与される前記識別番号は、
前記ホストコンピュータから１回の書き込み要求に基づいて送信されるデータの先頭ブロック、途中ブロック、又は末尾ブロックであることを示す位置コードと、前記ホストコンピュータから１回の書き込み要求に基づいて送信されるデータであることを示す識別子と、から構成され、
前記コントローラ部が、前記第３のステップにおいて、さらに、
前記読み出し対象のデータを構成するデータブロック群から前記位置コードの配列を検証し、
前記データブロック群の識別子と、前記読み出し対象のデータの前記期待値と比較して、前記読み出し対象のデータが前記任意の書き込み要求で書き込まれたデータであることを検証し、
前記メモリ部は、複数のローカルメモリのそれぞれがキャッシュメモリ及び共有メモリに接続される構成であり、
前記コントローラ部が、
前記第２のステップにおいて、さらに、
前記データを構成する複数のデータブロック群のうち、前記ホストコンピュータからアクセスされるデータブロック群の前記識別番号をライトシーケンス番号情報として任意の前記ローカルメモリ及び前記キャッシュメモリに格納し、
前記データのうち前記ライトシーケンス番号情報の更新回数を管理する世代番号を前記任意のローカルメモリ及び前記共有メモリに格納し、
前記第３のステップにおいて、さらに、
前記読み出し対象のデータを構成する前記ライトシーケンス番号情報の最新の世代番号を前記共有メモリから取得し、
前記最新の世代番号に該当する前記ライトシーケンス番号情報を前記任意のローカルメモリ又は前記キャッシュメモリから検索し、
前記最新の世代番号に該当する前記ライトシーケンス番号情報が前記任意のローカルメモリにない場合に、前記任意のローカルメモリで管理する世代番号を、前記共有メモリで管理する最新の世代番号と同一にした後に、前記任意のローカルメモリに格納される前記識別子を前記期待値として設定する
ことを特徴とするデータ検証方法。
【請求項５】
前記コントローラ部が、
前記第３のステップにおいて、さらに、
前記最新の世代番号に該当する前記ライトシーケンス番号情報を前記任意のローカルメモリ又は前記キャッシュメモリから検索し、
前記最新の世代番号に該当する前記ライトシーケンス番号情報が前記任意のローカルメモリ及び前記キャッシュメモリのいずれにも格納されていない場合に、前記最新の世代番号に該当する前記ライトシーケンス番号情報を前記ハードディスクドライブから読み出す
ことを特徴とする請求項４に記載のデータ検証方法。
【請求項６】
前記メモリ部は、前記キャッシュメモリ及び前記共有メモリを１つのメモリとして管理し、
複数のローカルメモリのそれぞれがスイッチ部を介して前記キャッシュメモリ及び前記共有メモリに接続される構成であり、
前記第３のステップにおいて、
前記スイッチ部が、前記データの書き込み及び読み出しを行う
ことを特徴とする請求項５に記載のデータ検証方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はストレージ装置及びそのデータ検証方法に関する発明である。好ましくは、ハードディスクドライブに記録するデータを検証するストレージ装置に適用される。
【背景技術】
【０００２】
近年、情報化社会の進展等につれて、ストレージ装置内で保存するホストコンピュータからのデータ量が急増しており、これに伴いストレージ装置内にある記憶容量の大規模化が進められている。そこで、ストレージ装置は、１又は複数のハードディスクドライブが提供する記憶領域上に１又は複数の論理的なボリューム（以下、これを論理ボリュームと呼ぶ）を形成したＲＡＩＤ（Redundant Array of Independent/Inexpensive Disks）方式で運用することで、ストレージ装置内にある記憶容量の大規模化を図っている。
【０００３】
上記のようなハードディスクドライブに記録されているデータの誤りを検出する方法としては、以下のように様々な方法が挙げられる。
【０００４】
まず、データの書き込み時に、論理ボリューム内のブロックアドレス（Logical Address）をデータに付加し、ハードディスクドライブからデータを読み出したときに、データに付加されたブロックアドレスと、実際に読み出されたブロックアドレスと、をチェックするブロックアドレスチェックという検出方法がある。この検出方法によれば、ブロックアドレスに書き込まれたデータの位置誤りを検出することができる。
【０００５】
また、ホストコンピュータから送信されるデータのビット列の排他的論理和を、あるデータブロックＤＢ毎に算出し、排他的論理和の結果をデータブロックＤＢ毎に付加するＬＲＣ（Longitudinal Redundancy Check）という検出方法がある。この検出方法によれば、データブロックＤＢ毎にパリティビット値を付加して、データブロックＤＢ内のビットの誤りを検出することができる。
【０００６】
さらに、特許文献１によれば、書き込み要求毎に固有の値をデータに付加し、読み出し時に固有の値に基づいてデータを検証することで、データの書き込み漏れを検出できる検出方法が開示されている。
【０００７】
加えて、特許文献２によれば、書き込み要求毎にデータ判別用の固有の値をデータに付加し、読み出し時にその固有の値を検証することで、データブロックＤＢ間でのデータの誤りを検出できる検出方法が開示されている。
【０００８】
【特許文献１】特開２００７−７２５７１号公報
【特許文献２】特開昭５８−１２５２０５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記に挙げた検出方法では、そもそもハードディスクドライブ側で書き込み要求自体を受け取れなかった場合であっても、ハードディスクドライブに格納されている旧データをそのまま検出してデータの誤りを検証してしまうため、書き込み要求自体を受け取れないという異常を検出することができなかった。
【課題を解決するための手段】
【００１０】
本発明は以上の点を考慮したもので、そもそもハードディスクドライブ側で書き込み要求自体を受け取れずに、全てのデータがハードディスクドライブに記録できないという異常を検出するストレージ装置及びデータ検証方法を提案しようというものである。
【００１１】
上述の課題を解決するために、本発明は、ホストコンピュータから任意の書き込み要求に基づいて送信されるデータを一時的に格納するメモリ部を有しデータの入出力を制御するコントローラ部と、コントローラ部に接続されデータを格納するハードディスクドライブ部と、を有するストレージ装置であって、コントローラ部は、ホストコンピュータから任意の書き込み要求に基づいて送信されるデータであることを示す識別番号を、データの構成単位であるデータブロック毎に付与し、メモリ部にデータを格納するハードディスクドライブ部の格納先とともに、ハードディスクドライブ部に格納されるべきデータの識別番号を期待値として格納し、ホストコンピュータからの読み出し要求に基づいて、ハードディスクドライブ部から読み出し対象のデータの構成単位であるデータブロック毎に付与された識別番号と、読み出し対象のデータの期待値と、を比較して、読み出し対象のデータが任意の書き込み要求で前記ハードディスクドライブに書き込まれたデータであることを検証することを特徴とする。
【００１２】
この結果、読み出し対象のデータが任意の書き込み要求でハードディスクドライブ内に書き込まれたデータであることを検証するため、そもそもハードディスクドライブ側で任意の書き込み要求自体を受け取れているか否かを検証することができる。
【００１３】
また、本発明は、ホストコンピュータから任意の書き込み要求に基づいて送信されるデータを一時的に格納するメモリ部を有しデータの入出力を制御するコントローラ部と、コントローラ部に接続されデータを格納するハードディスクドライブ部と、を有するストレージ装置のデータ検証方法であって、コントローラ部では、ホストコンピュータから任意の書き込み要求に基づいて送信されるデータであることを示す識別番号を、データの構成単位であるデータブロック毎に付与するステップと、メモリ部にデータを格納するハードディスクドライブ部の格納先とともに、ハードディスクドライブ部に格納されるべきデータの識別番号を期待値として格納するステップと、ホストコンピュータからの読み出し要求に基づいて、ハードディスクドライブ部から読み出し対象のデータの構成単位であるデータブロック毎に付与された識別番号と、読み出し対象のデータの期待値と、を比較して、読み出し対象のデータが任意の書き込み要求でハードディスクドライブに書き込まれたデータであることを検証するステップと、を有することを特徴とする。
【００１４】
この結果、読み出し対象のデータが任意の書き込み要求でハードディスクドライブ内に書き込まれたデータであることを検証するため、そもそもハードディスクドライブ側で任意の書き込み要求自体を受け取れているか否かを検証することができる。
【発明の効果】
【００１５】
本発明では、そもそもハードディスクドライブ側で書き込み要求自体を受け取れなかった場合であっても、ハードディスクドライブに格納される旧データをそのまま検出してデータの誤りを検証することなく、書き込み要求自体を受け取れなかったという異常を検出することができるため、ホストコンピュータから送受信されるデータを保証することができる。
【発明を実施するための最良の形態】
【００１６】
（１）第１の実施の形態
（１−１）ストレージシステムの構成
本発明のストレージシステムのシステム全体の概念図を図１に示す。
【００１７】
１は、本発明のストレージシステムを示す。本発明のストレージシステム１は、ホストコンピュータ２がネットワーク３を介してストレージ装置４と接続される構成である。
【００１８】
ホストコンピュータ２は、ＣＰＵ（Central Processing Unit）やメモリ等の情報処理資源を備えたコンピュータ装置であって、キーボード、スイッチやポインティングデバイス、マイクロフォン等の情報入力装置（図示せず）と、モニタディスプレイやスピーカ等の情報出力装置（図示せず）とを備える。
【００１９】
ネットワーク３は、例えばＳＡＮ（Storage Area Network）、ＬＡＮ（Local Area Network）、インターネット、公衆回線又は専用回線などから構成される。このネットワーク３を介したホストコンピュータ２及びストレージ装置４間の通信は、例えばネットワーク３がＳＡＮである場合にはファイバチャネルプロトコルに従って行われ、ＬＡＮである場合にはＴＣＰ／ＩＰ（Transmission Control Protocol/Internet Protocol）プロトコルに従って行われる。
【００２０】
ストレージ装置４は、ホストコンピュータ２からのデータの入出力を制御するコントローラ部５と、ホストコンピュータ２からのデータを保存するハードディスクドライブ部１１とを備えるストレージ装置である。
【００２１】
コントローラ部５では、チャネルアダプタ６、共有メモリ７、キャッシュメモリ９、ディスクアダプタ１０がスイッチ８を介して接続される構成である。そして、チャネルアダプタ６、共有メモリ７、キャッシュメモリ９、ディスクアダプタ１０間のデータやコマンドの授受は、例えば高速スイッチングによりデータ伝送を行う超高速クロスバススイッチなどのスイッチ又はバス等を介して行われる。
【００２２】
チャネルアダプタ６は、マイクロプロセッサ６０、後述するライトシーケンス番号テーブル６１０、世代番号管理テーブル６１１を格納するローカルメモリ６１、通信インタフェース６２及びＩ／Ｏプロセッサ６３等を備えたマイクロコンピュータシステムとして構成されており、ネットワーク３に接続するためのポート（図示せず）を備える。チャネルアダプタ６は、ホストコンピュータ２から送信される各種コマンドを解釈して、必要な処理を実行する。チャネルアダプタ６のポートには、それぞれを識別するためのネットワークアドレス（例えば、ＩＰアドレスやＷＷＮ）が割り当てられており、これにより、各チャネルアダプタ６Ａ、６Ｂがそれぞれ個別にＮＡＳ（Network Attached Storage）として振る舞うことができるようになされている。チャネルアダプタ６Ａ、６Ｂは、本実施の形態で特に区別する場合を除いてチャネルアダプタ６と記載し、上述したチャネルアダプタ内部の構成についても特に区別する場合を除いて、Ａ，Ｂ記載はしないものとする。
【００２３】
共有メモリ７は、チャネルアダプタ６及びディスクアダプタ１０により共有される記憶メモリである。共有メモリ７は、主にストレージ装置４の電源投入時にシステムボリュームから読み出されたシステム構成情報及び各種制御プログラムや、ホストコンピュータ２からのコマンドなどを記憶するために利用される。また共有メモリ７は、後述する世代番号管理テーブル７００を格納する。
【００２４】
キャッシュメモリ９も、チャネルアダプタ６及びディスクアダプタ１０により共有される記憶メモリである。このキャッシュメモリ９は、主にストレージ装置４に入出力するユーザデータを一時的に記憶するために利用される。キャッシュメモリ９は、後述するライトシーケンス番号テーブル９００を格納する。
【００２５】
ディスクアダプタ１０は、マイクロプロセッサ１００、メモリ１０１、Ｉ／Ｏプロセッサ１０２及びディスクコントローラ１０３を備えたマイクロコンピュータシステムとして構成され、ハードディスクドライブ部１１との通信時におけるプロトコル制御を行うインタフェースとして機能する。各ディスクアダプタ１０Ａ、１０Ｂは、例えばファイバチャネルケーブルを介してハードディスクドライブ部１１と接続されており、ファイバチャネルプロトコルに従ってハードディスクドライブ部１１との間でデータの授受を行う。ディスクアダプタ１０Ａ、１０Ｂは、本実施の形態で特に区別する場合を除いて、ディスクアダプタ１０と記載し、上述したディスクアダプタ内部の構成についても特に区別する場合を除いて、Ａ，Ｂ記載はしないものとする。
【００２６】
ディスクアダプタ１０のメモリ１０１は、後述するチェックテーブル１０４、ライトシーケンス番号保存プログラム１０５、ライトシーケンス番号チェックプログラム１０６、ライトシーケンス番号テーブル１０７及び世代番号管理テーブル１０８を格納する。
【００２７】
ハードディスクドライブ部１１は、例えばＳＣＳＩ（Small Computer System Interface）ディスク等の高価なハードディスクドライブ又はＳＡＴＡ（Serial AT Attachment）ディスク等の安価なハードディスクドライブでなる複数のハードディスクドライブＨＤＤから構成される。
【００２８】
これら複数のハードディスクドライブＨＤＤからレイドグループが形成される。本実施の形態では、レイド５方式によってハードディスクドライブＨＤＤは運用される。またハードディスクドライブＨＤＤのいずれかのハードディスクドライブＨＤＤｍには、後述するライトシーケンステーブル１１０が格納されている。
【００２９】
そしてこれらハードディスクドライブＨＤＤが提供する記憶領域上には、１又は複数の論理ボリュームＬＵが定義される。そして、この論理ボリュームＬＵにホストコンピュータ２からのデータが所定大きさのブロックを単位として読み書きされる。
【００３０】
各論理ボリュームＬＵには、それぞれ固有の識別子（ＬＵＮ：Logical Unit Number）が割り当てられる。本実施の形態の場合、ユーザデータの入出力は、この識別子と、各ブロックにそれぞれ割り当てられるそのブロックに固有の番号（ＬＢＡ：Logical Block Address）との組み合わせたものをアドレスとして、当該アドレスを指定して行われる。
【００３１】
（１−２）テーブル
（１−２−１）ライトシーケンステーブル
まずライトシーケンステーブル１１０を説明するに際して、本実施の形態によるデータ構成を説明する。
【００３２】
本実施の形態によるデータ構成は、まずホストコンピュータ２からの書き込み要求に従って送信されるデータを分割する構成である。データの分割は、ストレージシステム１のレイドレベルに合わせて行う。本実施の形態のストレージシステム１は、レイド５の運用方式を採用するため、例えば４つのハードディスクドライブＨＤＤ０〜ＨＤＤ３のうち、いずれか３つのハードディスク（例えばＨＤＤ０〜ＨＤＤ２）に格納されるデータを分割して格納し、残りのハードディスク（例えばＨＤＤ３）にパリティデータＰを格納する構成である。このため、本実施の形態では、１回の書き込み要求に基づいて送信されるデータを３分割する。また、本実施の形態のストレージシステム１において、パリティデータＰは分散してハードディスクドライブＨＤＤに格納される。
【００３３】
図２に示すように、分割したデータ（以下、分割データ）はさらにデータの最小単位であるデータブロックＤＢにブロック分けされている。
【００３４】
複数のデータブロックＤＢは、データブロックＤＢ毎にライトシーケンス番号ＷＲＳＥＱ＃（図中ではＷＲＳＥＱ＃と略記）を付与する。ライトシーケンス番号ＷＲＳＥＱ＃は、分割データの保証コードとして付加する識別番号であり、位置コードＲと、識別子であるシーケンス番号（図中ではＳＥＱ＃と略記）とからなる。
【００３５】
位置コードＲは、当該データブロックＤＢが一連の書き込み対象であるデータブロック群の中でどの位置かを示すコードである。当該データブロックＤＢがデータの中で先頭のデータブロックＤＢである場合には先頭ブロックを示す「１０」が位置コードＲとして付加される。また、途中のデータブロックＤＢである場合には途中ブロックを示す「００」が位置コードＲとして付加される。そして末尾のデータブロックＤＢである場合には末尾ブロックを示す「０１」が位置コードＲとして付加される。
【００３６】
シーケンス番号ＳＥＱ＃は、ホストコンピュータ２からの書き込み要求ごとに付与される固有の値であり、任意の書き込み要求に基づいてハードディスクドライブにデータが書き込まれたかを検証するための識別番号である。シーケンス番号ＳＥＱ＃は、１回の書き込み要求に基づいて送信されるデータブロック群には同じ値を付与する識別番号である。
【００３７】
例えば、図３に示すように、データブロック群は、位置コードＲとシーケンス番号ＳＥＱ＃（例えば、ＡＡＡＡＡＡ）とを、ライトシーケンス番号ＷＲＳＥＱ＃として、データブロックＤＢごとに付加されて構成される。同じシーケンス番号ＳＥＱ＃「ＡＡＡＡＡＡ」を付与されたデータブロック群は、１回の書き込み要求に基づいて送信されたデータであることがわかる。
【００３８】
そして図４に示すように、各ハードディスクドライブＨＤＤに割り振られたブロックアドレス内にシーケンス番号ＳＥＱ＃を付加したデータブロックＤＢを書き込んでいく。ライトシーケンス番号ＳＥＱ＃は、パリティデータＰのデータブロック毎に付加される。
【００３９】
図５は、ライトシーケンステーブル１１０である。
【００４０】
ライトシーケンステーブル１１０は、図４で説明したように、ハードディスクドライブＨＤＤ内に割り振られるブロックアドレスＬＡと、当該ブロックアドレスＬＡに書き込まれたデータブロックＤＢに付与されたライトシーケンス番号ＷＲＳＥＱ＃との対応関係を格納するテーブルである。
【００４１】
ライトシーケンステーブル１１０は、「ブロックアドレス」欄１１０Ａと「ライトシーケンス番号ＷＲＳＥＱ＃」欄１１０Ｂとから構成され、ハードディスクドライブＨＤＤ内のブロックアドレスＬＡに格納されるデータブロックＤＢのライトシーケンス番号ＷＲＳＥＱ＃が示されている。
【００４２】
例えば、１データブロックＤＢを５１２バイト、１ライトシーケンス番号ＷＲＳＥＱ＃を１バイトとすると、１４６ギガバイトの容量をもつハードディスクドライブＨＤＤでは、１ハードディスクドライブＨＤＤにつき２８５メガバイトのライトシーケンス番号ＷＲＳＥＱ＃が発生してしまう。このような膨大なライトシーケンス番号ＷＲＳＥＱ＃を、チャネルアダプタ６内のローカルメモリ６１上又はディスクアダプタ１０内のローカルメモリ１０１上に保存するのは困難である。したがって、ライトシーケンステーブル１１０の格納先は、ハードディスクドライブＨＤＤとしている。このライトシーケンステーブル１１０を格納するために専用のハードディスクドライブＨＤＤｍを設けてもよいし、各ハードディスクドライブＨＤＤに専用の格納領域を設けてもよい。
【００４３】
しかしハードディスクドライブＨＤＤにライトシーケンステーブル１１０を格納すると、頻繁に読み出したいデータがあった場合に、毎回ハードディスクドライブＨＤＤまでアクセスしなければならない。そこで、本実施の形態のストレージシステム１では、階層メモリ制御方式を用いることで、ストレージシステム１のアクセス性能を低減しないようにしている。
【００４４】
図６に示すように、階層メモリ制御方式というのは、ホストコンピュータ２から送受信されるデータブロック群のうち、後述するライトシーケンス番号テーブル９００,６１０，１０７の情報であるライトシーケンス番号の情報Ａ（以下、ライトシーケンス番号情報Ａという）を、ハードディスクドライブＨＤＤだけでなく、キャッシュメモリ９上と、チャネルアダプタ６内のローカルメモリ６１上又はディスクアダプタ１０内のローカルメモリ１０１上と、にストレージ装置４内で階層的に格納しておく制御方式をいう。ライトシーケンス番号情報Ａというのは、ライトシーケンステーブル１１０にあるデータブロック群のうち一部の情報であって、当該一部の情報をライトシーケンス番号テーブル９００，６１０，１０７の情報として、キャッシュメモリ９上と、チャネルアダプタ６内のローカルメモリ６１又はディスクアダプタ１０内のローカルメモリ１０１に保存される情報である。階層メモリ制御方式は、ハードディスクドライブＨＤＤに送受信されるデータブロック群のうち、ホストコンピュータ２が頻繁に必要とするこのライトシーケンス番号情報Ａを、キャッシュメモリ９上やローカルメモリ６１，１０１上に保存することで、後述するデータの読み書き処理を実行する。階層メモリ制御方式を採用することで、ハードディスクドライブＨＤＤへライトシーケンス番号を読み書きする速度を改善することができる。
【００４５】
さらに図７に示すように、階層メモリ制御方式では、マイクロプロセッサ６０、１００がローカルメモリ６１，１０１内の物理領域をページ単位で分け（以下、ページ領域という）、ローカルメモリ６１，１０１上に格納されるデータを管理する。マイクロプロセッサ６０、１００は、ローカルメモリ６１，１０１内の領域Ａ〜Ｄを参照する頻度を管理し、一番参照頻度の低い領域Ｃを開放し、新たな領域Ｅとして割り当てる。なお、キャッシュメモリ９は、メモリ内の物理領域をブロック単位でわけ（以下、ブロック領域という）、メモリ上に格納されるデータを管理している。
【００４６】
（１−２−２）ライトシーケンス番号テーブル
それでは次に、キャッシュメモリ９、チャネルアダプタ６のローカルメモリ６１及びディスクアダプタ１０のローカルメモリ１０１のそれぞれに格納されるライトシーケンス番号テーブル９００、６１０、１０７について説明する。ここでは、キャッシュメモリ９に格納されるライトシーケンス番号テーブル９００について説明するが、チャネルアダプタ６のローカルメモリ６１及びディスクアダプタ１０のローカルメモリ１０１に格納されるライトシーケンス番号テーブル６１０，１０７も同様の構成であるため、説明を省略する。
【００４７】
図８に示すように、ディスクアダプタ１０は、複数のマイクロプロセッサ１００Ａ、１００Ｂを有している。そしてこの複数のマイクロプロセッサ１００Ａ、１００Ｂが別々に、各自のローカルメモリ１０１Ａ、１０１Ｂ内のライトシーケンス番号情報Ａを参照し、全て又は一部のデータブロック群を更新する。マイクロプロセッサ１００Ａ、１００Ｂが個別に更新したライトシーケンス番号情報Ａは、その都度、キャッシュメモリ９内に反映される。
【００４８】
キャッシュメモリ９は、キャッシュメモリ９内の領域にライトシーケンス番号情報Ａを保存して、複数のマイクロプロセッサ１００Ａ、１００Ｂから個別に送られるライトシーケンス番号情報Ａの更新情報を反映させている。そしてライトシーケンス番号情報Ａの更新管理は、世代番号を用いて共有メモリ７上で行われる。複数のマイクロプロセッサ１００Ａ、１００Ｂ同士は、相互にライトシーケンス番号情報Ａの情報を更新しない。このため、最新のライトシーケンス番号情報Ａの情報は、キャッシュメモリ９内で管理され、最新のライトシーケンス番号情報Ａの世代番号の情報は、共有メモリ７内で管理されることになる。世代番号が大きくなるほど、ライトシーケンス番号情報Ａの更新回数が大きいことを示している。
【００４９】
図９に示す、ライトシーケンス番号テーブル９００、６１０、１０７は、上述したように、ハードディスクドライブＨＤＤに格納されるライトシーケンステーブル１１０のうち、頻繁に読み書きされるライトシーケンス番号情報Ａを格納するテーブルであり、データブロック群ＤＢとは別に、ライトシーケンス番号だけを管理するテーブルである。ライトシーケンス番号テーブル９００、６１０、１０７は、「ブロックアドレス」欄９００Ａと「ライトシーケンス番号ＷＲＳＥＱ＃」欄９００Ｂとから構成される。それぞれの項目欄は、ライトシーケンステーブルと同様の項目欄であるため、説明を省略する。図９中に示すライトシーケンス番号情報ａ、ｂは、階層メモリ制御方式で説明をした、ライトシーケンス番号の情報Ａをそれぞれ示している。
【００５０】
（１−２−３）世代番号管理テーブル
それでは次に、チャネルアダプタ６のローカルメモリ６１、ディスクアダプタ１０のローカルメモリ１０１及び共有メモリ７のそれぞれに格納される世代番号管理テーブル６１０、７００，１０８について説明する。
【００５１】
図１０は、共有メモリ７に格納される世代番号管理テーブル７００である。ローカルメモリ６１，１０１に格納される世代番号テーブル６１０，１０８も同様のテーブル構成のため、ここでは説明を省略する。
【００５２】
世代番号管理テーブル７００は、最新のライトシーケンス番号情報Ａの世代番号を管理するテーブルであり、「ブロックアドレス」欄７００Ａと「世代番号」欄７００Ｂとから構成される。
【００５３】
「ブロックアドレス」欄７００ＡにはハードディスクドライブＨＤＤ内のブロックアドレスＬＡが格納され、「世代番号」欄７００Ｂにはライトシーケンス番号情報Ａの更新回数である世代番号が格納されている。
【００５４】
（１−２−４）チェックテーブル
図１１に示すチェックテーブル１０４は、ストレージ装置４からホストコンピュータ２にデータを読み出すときに、隣接するデータブロック群同士に付加されるシーケンス番号ＳＥＱ＃の整合性を検証するためのテーブルである。
【００５５】
チェックテーブル１０４は、データブロックＤＢの位置コードＲを示す「位置コード」１０４Ｃ欄、検証対象のデータブロックＤＢに付加されるシーケンス番号ＳＥＱ＃の整合性を検証する「チェックオン」１０４Ｄ欄、及び「チェックオフ」１０４Ｅ欄、から構成される。ここでチェックとは、検証対象のデータブロックＤＢに付加されるシーケンス番号ＳＥＱ＃の整合性を検証することをいう。
【００５６】
例えば、位置コードＲ「００」及び「０１」のデータブロックＤＢに対してチェックをオンすると、１つ前のデータブロックＤＢとのシーケンス番号ＳＥＱ＃の整合性をチェックする、という意味を示す。ただし、位置コードＲ「１０」のデータブロックＤＢの場合は、先頭ブロックであるので、１つ前のデータブロックＤＢとのシーケンス番号ＳＥＱ＃の整合性を検証する必要はない。このため、位置コードＲ「１０」のデータブロックＤＢに対してチェックをオンすると、次のデータブロックＤＢについてシーケンス番号ＳＥＱ＃を検証する、という意味を示す。
【００５７】
また、位置コードＲ「１０」及び「００」のデータブロックＤＢに対してチェックがオフとなっている場合には、チェックをオンとする、という意味を示す。ただし、位置コードＲ「０１」のデータブロックＤＢに対してチェックがオフとなっている場合には、１つのシーケンスが終了するデータブロックＤＢなので、チェックをオンとする必要はない。
【００５８】
（１−３）データの書き込み時
（１−３−１）ライトシーケンス番号付加処理
それでは、上述した階層メモリ制御方式を用いて、ハードディスクドライブＨＤＤにデータを書き込む際のライトシーケンス番号付加処理について説明する。ライトシーケンス番号付加処理は、ディスクアダプタ１０のマイクロプロセッサ１００が、メモリ１０１内に格納するライトプログラム（図示せず）に基づいて実行する。
【００５９】
ライトシーケンス番号付加処理は、データの書き込み時に実行する処理であるので、まずデータの書き込み処理について説明する。
【００６０】
まずホストコンピュータ２からの書き込み要求をチャネルアダプタ６が受信すると、データの書き込み処理が開始される。そして引き続き、ホストコンピュータ２からデータをチャネルアダプタ６が受信すると、キャッシュメモリ９内の領域をブロック単位で分けたブロック領域にデータを書き込む。
【００６１】
その後、チャネルアダプタ６は、ホストコンピュータ２にデータの書き込み完了を送信する。ディスクアダプタ１０は、キャッシュメモリ９上のブロック領域に書き込まれたデータを検知すると、キャッシュメモリ９から書き込みデータを読み出してハードディスクドライブＨＤＤにデータを書き込む。ハードディスクドライブＨＤＤにデータを書き込む際に、ディスクアダプタ１０がライトシーケンス番号ＷＲＳＥＱ＃を付加する。このとき、ディスクアダプタ１０が共有メモリ７にブロック番号とデータの世代番号とを記録する。
【００６２】
具体的には、図１２及び図１３に示すように、ディスクアダプタ１０のマイクロプロセッサ１００が、データの書き込み要求を検知して、書き込みデータをキャッシュメモリ９から読み出すと、ライトシーケンス番号付加処理を開始する（Ｓ０）。
【００６３】
ディスクアダプタ１０のマイクロプロセッサ１００が、受け取った書き込みデータのうち任意のデータブロックＤＢが最初のデータブロックＤＢか否かを判断し（Ｓ１）、最初のデータブロックＤＢであると判断すると（Ｓ１：ＹＥＳ）、当該データブロックＤＢに、先頭ブロックであることを示す位置コードＲ「１０」を付加する（Ｓ２）。
【００６４】
また、ディスクアダプタ１０のマイクロプロセッサ１００が、受け取った書き込みデータのうち任意のデータブロックＤＢが最初のデータブロックＤＢではないと判断すると（Ｓ１：ＮＯ）、次に任意のデータブロックＤＢが最後のデータブロックＤＢであるか否かを判断する（Ｓ３）。そして、ディスクアダプタ１０のマイクロプロセッサ１００が、最後のデータブロックＤＢであると判断すると（Ｓ３：ＹＥＳ）、当該データブロックＤＢに、末尾ブロックであることを示す位置コード「０１」を付加する（Ｓ４）。一方、ディスクアダプタ１０のマイクロプロセッサ１００が、最後のデータブロックＤＢではなく、途中のデータブロックＤＢであると判断すると（Ｓ３：ＮＯ）、当該データブロックＤＢに、途中ブロックであることを示す位置コード「００」を付加する（Ｓ５）。
【００６５】
ディスクアダプタ１０のマイクロプロセッサ１００は、それぞれのデータブロックＤＢに位置コードを付加すると、同じ書き込み要求によって書き込まれたデータであることを示すシーケンス番号を、それぞれのデータブロックＤＢにライトシーケンス番号ＷＲＳＥＱ＃として付加する（Ｓ６）。
【００６６】
ディスクアダプタ１０のマイクロプロセッサ１００は、後述するデータ更新処理を行って、付加したライトシーケンス番号ＷＲＳＥＱ＃と、ブロックアドレスとを、階層メモリ方式によって制御されているディスクアダプタ１０のローカルメモリ１０１及びキャッシュメモリ９に書き込み、共有メモリ７に格納される世代番号をカウントアップしてテーブルの更新を行う（Ｓ７）。
【００６７】
その後、ディスクアダプタ１０のマイクロプロセッサ１００は、全てのデータブロックＤＢに対してライトシーケンス番号ＷＲＳＥＱ＃を付加したと判断すると（Ｓ８、Ｓ８：ＹＥＳ）、ハードディスクドライブＨＤＤに対してデータの書き込み処理を実行する（Ｓ９）。
【００６８】
例えば、図１４に示すように、ハードディスクドライブＨＤＤ内のブロックアドレスＬＡが１０〜１２の３ブロックにデータを正常に書き込めた場合には、ハードディスクドライブＨＤＤのライトシーケンステーブル１１０内及び、ローカルメモリ１０１並びにキャッシュメモリ９のライトシーケンス番号テーブル９００，１０７内にある、ブロックアドレスＬＡ１０〜１２に該当するデータブロックＤＢを更新する。
【００６９】
一方、ハードディスクドライブＨＤＤ内のブロックアドレスＬＡ１０〜１２の３ブロックにデータを正常に書き込めなかった場合には、メモリ１０１内及びキャッシュメモリ９内のライトシーケンス番号テーブル９００、１０７内にある、ブロックアドレスＬＡ１０〜１２に該当するデータブロックＤＢのみが正常に更新されることになる。すなわち、ハードディスクドライブＨＤＤのライトシーケンステーブル１１０内の該当するデータブロックＤＢは更新されない。
【００７０】
その後、ディスクアダプタ１０のマイクロプロセッサ１００は、次の書き込み処理のためにライトシーケンス番号ＷＲＳＥＱ＃をカウントアップし、ライトシーケンス番号ＷＲＳＥＱ＃付加処理を終了する（Ｓ１１）。
【００７１】
なお、その他の保証コードとして、ブロックアドレスＬＡやパリティビット値を付加する場合について説明する。
【００７２】
図１５に示すように、ディスクアダプタ１０のマイクロプロセッサ１００は、階層メモリ方式によって制御されているローカルメモリ１０１及びキャッシュメモリ９に書き込み、共有メモリ７に格納される世代番号をカウントアップしてテーブルの更新を行った後（Ｓ７）、ブロックアドレスＬＡをデータブロックＤＢに付加し（Ｓ７Ａ）、データブロックＤＢのパリティビット値を算出して、算出したパリティビット値をデータブロックＤＢに付加すると（Ｓ７Ｂ）、ステップＳ８の処理を行う。
【００７３】
（１−３−２）データ更新処理
それでは次にデータ更新処理について説明する。データ更新処理も、ディスクアダプタ１０のマイクロプロセッサ１００が、ライトシーケンス番号保存プログラム１０５に基づいて実行する。
【００７４】
具体的には、図１６に示すように、ディスクアダプタ１０のマイクロプロセッサ１００は、ライトシーケンス番号ＷＲＳＥＱ＃をデータブロックＤＢに付加すると（Ｓ６）、データ更新処理を開始する（Ｓ２０）。
【００７５】
ディスクアダプタ１０のマイクロプロセッサ１００は、ホストコンピュータ２から要求されたデータを保存するハードディスクドライブＨＤＤ内のブロックアドレスＬＡが、ディスクアダプタ１０のローカルメモリ１０１にあるライトシーケンス番号情報Ａとして保存されているか否かを判断し（Ｓ２１）、保存されていないと判断すると（Ｓ２１：ＮＯ）、ローカルメモリ１０１内にライトシーケンス番号情報Ａを保存するだけのページ領域を確保する（Ｓ２２）。
【００７６】
次にディスクアダプタ１０のマイクロプロセッサ１００は、ホストコンピュータ２から要求されたデータを保存するハードディスクドライブＨＤＤ内のブロックアドレスＬＡが、キャッシュメモリ９にあるライトシーケンス番号情報Ａとして保存されているか否かを判断し（Ｓ２３）、保存されていないと判断すると（Ｓ２３：ＮＯ）、キャッシュメモリ９内にライトシーケンス番号情報Ａを保存するだけのブロック領域を確保する（Ｓ２４）。
【００７７】
ディスクアダプタ１０のマイクロプロセッサ１００は、ホストコンピュータ２が要求するブロックアドレスＬＡが、ローカルメモリ１０１又はキャッシュメモリ９内のライトシーケンス番号情報Ａとして保存されていると判断した場合（Ｓ２１：ＹＥＳ又はＳ２３：ＹＥＳ）、又は、キャッシュメモリ９内にライトシーケンス番号情報Ａを保存するだけのブロック領域を確保した場合（Ｓ２４）、のいずれかの場合には、ローカルメモリ１０１内にある世代番号管理テーブル１０８に、ハードディスクドライブＨＤＤ内のブロックアドレスとデータブロックＤＢの世代番号との情報を更新する（Ｓ２５）。
【００７８】
そして、ディスクアダプタ１０のマイクロプロセッサ１００は、キャッシュメモリ９内にあるライトシーケンス番号テーブル７００に、ハードディスクドライブＨＤＤ内のブロックアドレスＬＡと、最新のライトシーケンス番号との情報を更新する（Ｓ２６）。
【００７９】
その後、ディスクアダプタ１０のマイクロプロセッサ１００は、共有メモリ７上の世代番号をカウントアップし（Ｓ２７）、ローカルメモリ１０１内の世代番号をカウントアップして更新すると、（Ｓ２８）データ更新処理を終了する（Ｓ２９）。
【００８０】
例えば、図１７に示すように、ローカルメモリ１０１内の世代番号が共有メモリ７内の世代番号と一致しない場合には、ディスクアダプタ１０のマイクロプロセッサ１００は、最新のライトシーケンス番号をキャッシュメモリ９のテーブル９００に格納させた後、ローカルメモリ１０１内の世代番号と共有メモリ７の世代番号とを一致させるように、それぞれが管理する世代番号をカウントアップさせる。
【００８１】
（１−４）データの読み出し時
（１−４−１）ライトシーケンス番号チェック処理
それでは、上述した階層メモリ制御方式を用いて、ハードディスクドライブＨＤＤにデータを読み出す際のライトシーケンス番号チェック処理について説明する。ライトシーケンス番号チェック処理は、ディスクアダプタ１０がハードディスクドライブＨＤＤからデータブロック群を読み出した際にデータの整合性を検証するための処理である。ライトシーケンス番号チェック処理は、ディスクアダプタ１０のマイクロプロセッサ１００が、ライトシーケンス番号チェックプログラム１０６に基づいて実行する。なお、ライトシーケンス番号チェック処理は、チャネルアダプタ６のマイクロプロセッサ６０が実行してもよい。
【００８２】
ライトシーケンス番号チェック処理は、データの読み出し時に実行する処理であるので、まずデータの読み出し処理について説明する。
【００８３】
まずホストコンピュータ２からの読み出し要求をチャネルアダプタ６が受信すると、データの読み出し処理が開始される。そしてチャネルアダプタ６が読み出し要求をディスクアダプタ１０に送信すると、ディスクアダプタ１０が読み出し要求を受信する。
【００８４】
その後、ディスクアダプタ１０が、ハードディスクドライブＨＤＤから読み出し対象のデータを読み出してキャッシュメモリ９に書き込む。そうすると、ディスクアダプタ１０がチャネルアダプタ６に、読み出し対象のデータをキャッシュメモリ９に書き込んだ旨を通知する。
【００８５】
チャネルアダプタ６は、キャッシュメモリ９から読み出し対象のデータを受け取り、ホストコンピュータ２へ送信する。
【００８６】
この読み出し処理を実行中に、ディスクアダプタ１０が対象データを読み出す場合又はチャネルアダプタ６が対象データをキャッシュメモリ９から読み出す場合に、ライトシーケンス番号チェック処理を実行する。
【００８７】
図１８から図２０に示すように、具体的には、ディスクアダプタ１０のマイクロプロセッサ１００がホストコンピュータからの読み出し要求を受信すると、ライトシーケンス番号チェック処理を開始する（Ｓ４０）。
【００８８】
まず、ディスクアダプタ１０のマイクロプロセッサ１００は、ライトシーケンス番号ＷＲＳＥＱ＃同士の一致をチェックするためのチェックをオフにした状態で（Ｓ４１）、ハードディスクドライブＨＤＤから読み出した対象データのデータブロック群のうち、先頭のデータブロックを選択し（Ｓ４２）、データブロックＤＢの位置コードＲとシーケンス番号ＳＥＱ＃とを取得する（Ｓ４３）。
【００８９】
ディスクアダプタ１０のマイクロプロセッサ１００は、位置コードＲのチェック処理を終えると、任意のデータブロックＤＢの位置コードＲが末尾コードである「０１」か、否かを判断する（Ｓ４４）。
【００９０】
ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢの位置コードＲが末尾コード「０１」ではないと判断すると（Ｓ４４：ＮＯ）、引き続き、位置コードＲが先頭コード「１０」か、否かを判断する（Ｓ４５）。
【００９１】
ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢの位置コードが先頭コード「１０」であると判断すると（Ｓ４５：ＹＥＳ）、チェックテーブル１０４を参照し、次ループ処理のために、チェックをオンにして（Ｓ４６）、現在のシーケンス番号ＳＥＱ＃をチェック用のシーケンス番号ＳＥＱ＃として保存する（Ｓ４７）。
【００９２】
ここで、チェック用のシーケンス番号ＳＥＱ＃とは、同一のシーケンス番号ＳＥＱ＃をもつデータブロック群のうち、最初のデータブロックＤＢのシーケンス番号ＳＥＱ＃をいう。したがって、図２１に示すように、あるデータブロック群の位置コードが、先頭コード１０、途中コード００、末尾コード０１と配列しているデータブロック群ＤＢ１では、チェック用のシーケンス番号ＳＥＱ＃とは、先頭コード１０をもつシーケンス番号ＡＡＡＡＡＡが該当する。一方、データブロック群ＤＢ２が、途中コード００のみをもつデータブロック群ＢＢＢＢＢＢであるなら、チェック用のシーケンス番号ＳＥＱ＃とは、途中コード００のうち最初に読み込んだ途中コード００をもつシーケンス番号ＢＢＢＢＢＢが該当することとなる。
【００９３】
ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢの位置コードＲが先頭ブロック「１０」はなく、途中ブロック「００」であると判断すると（Ｓ４５：ＮＯ）、次に、チェックがオンか否かを判断する（Ｓ４８）。そしてディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢに対してチェックがオフであると判断すると（Ｓ４８：ＮＯ）、次ループ処理のために、チェックをオンにして（Ｓ４６）、現在のシーケンス番号ＳＥＱ＃をチェック用のシーケンス番号ＳＥＱ＃として保存する（Ｓ４７）。
【００９４】
そしてディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢに対してチェックがオンであると判断すると（Ｓ４８：ＹＥＳ）、任意のデータブロックＤＢのシーケンス番号とチェック用のシーケンス番号ＳＥＱ＃とが一致しているか否かを判断し（Ｓ４９）、一致していると判断すると（Ｓ４９：ＹＥＳ）、ステップＳ５５に進む。
【００９５】
なお、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢのシーケンス番号とチェック用のシーケンス番号ＳＥＱ＃とが一致していないと判断すると（Ｓ４９：ＮＯ）、エラー処理を行う（Ｓ５０）。
【００９６】
一方、ステップＳ４４において、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢの位置コードＲが「０１」であると判断した場合には（Ｓ４４：ＹＥＳ）、引き続き任意のデータブロックＤＢに対してチェックをオンとすべきか否かを判断する（Ｓ５１）。そして、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢの位置コードＲ「０１」に対してチェックをオンにすると判断すると（Ｓ５１：ＹＥＳ）、現在のシーケンス番号ＳＥＱ＃とチェック用のシーケンス番号ＳＥＱ＃とが一致するかどうかを判断する（Ｓ５２）。
【００９７】
ディスクアダプタ１０のマイクロプロセッサ１００は、現在のシーケンス番号とチェック用のシーケンス番号ＳＥＱ＃とが一致していると判断すると（Ｓ５２：ＹＥＳ）、当該任意のデータブロックＤＢに対するチェックをオフにして、ステップＳ５５に進む。一方、ディスクアダプタ１０のマイクロプロセッサ１００は、現在のシーケンス番号ＳＥＱ＃とチェック用のシーケンス番号ＳＥＱ＃とが一致していないと判断すると（Ｓ５２：ＮＯ）、データの整合が合っていないため、エラー処理を行う（Ｓ５４）。
【００９８】
なお、ステップＳ５０において、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢの位置コードＲ「０１」に対してチェックする必要ないと判断すると（Ｓ５１：ＮＯ）、末尾のデータブロックの整合性を検証する必要がないため、ステップＳ５５に進む。
【００９９】
ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢが先頭又は末尾のデータブロックＤＢか否かを判断し（Ｓ５５）、任意のデータブロックＤＢが読み出し対象のデータのうち途中のデータブロックＤＢであると判断した場合には（Ｓ５５：ＮＯ）、ステップＳ５９の処理に進む。
【０１００】
一方、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢが読み出し対象のデータのうち先頭又は末尾のデータブロックＤＢであると判断すると（Ｓ５５：ＹＥＳ）、先頭又は末尾のデータブロックＤＢに対応する期待値をローカルメモリ１０１のライトシーケンス番号テーブル１０７から取得する（Ｓ５６）。ここで期待値とは、ホストコンピュータ２からの書き込み要求によって、ライトシーケンス番号テーブル１０７内に格納される最新のシーケンス番号ＳＥＱ＃であり、ハードディスクドライブＨＤＤに当該最新のシーケンス番号ＳＥＱ＃が格納されているべき値をいう。なお、ステップＳ５６の期待値取得処理は、後述する。
【０１０１】
そうして、ディスクアダプタ１０のマイクロプロセッサ１００は、先頭又は末尾のデータブロックＤＢのシーケンス番号ＳＥＱ＃と期待値とが一致するか否かを判断し（Ｓ５７）、一致すると判断した場合（Ｓ５７：ＹＥＳ）には、先頭又は末尾のデータブロックＤＢがハードディスクドライブＨＤＤに正常に書き込まれ、かつ、ハードディスクドライブＨＤＤから正常に読み出されたデータブロックＤＢであると判断する。
【０１０２】
例えば図２１に示すように、データを読み出す際に、ハードディスクドライブＨＤＤ内のブロックアドレスＬＡ１０〜１４の５ブロックから正しく書き込まれたデータを検出する場合について説明する。まず、データブロック群が正しく配列しているかどうか、位置コードＲから検証する。そうすると、読み出し対象のデータ構成は、位置コードＲが「１０」「００」「０１」からなるデータブロック群ＤＢ１と、位置コードＲが「００」「００」からなるデータブロック群ＤＢ２と、であることがわかる。このため１つ目のデータブロック群ＤＢ１は、位置コードＲ「１０」、続いて位置コードＲ「００」、その後位置コードＲ「０１」と配列されているので、正しく配列していることがわかる。次に、２つ目のデータブロック群ＤＢ２は、読み出した先頭ブロック又は末尾ブロックのシーケンス番号ＳＥＱ＃がそれぞれの期待値と一致するか否かを検証する。この結果、読み出した先頭ブロックと期待値とはシーケンス番号ＳＥＱ＃「ＡＡＡＡＡＡ」で一致し、読み出した末尾ブロックと期待値もシーケンス番号ＳＥＱ＃「ＢＢＢＢＢＢ」で一致していることがわかる。このように読み出し時に、ハードディスクドライブ側にデータが正常に書き込まれたことが検証できる。
【０１０３】
一方、図２２に示すように、データを読み出す際に、ハードディスクドライブＨＤＤ内のブロックアドレスＬＡ１０〜１４の５ブロックから正しく書き込まれなかったデータを検出する場合について説明する。まず、データブロック群が正しく配列しているかどうか、位置コードＲから検証する。そうすると、読み出し対象のデータ構成は、位置コードＲが「１０」「００」からなるデータブロック群ＤＢ３である。データブロック群ＤＢ３は、位置コードＲ「１０」の次に位置コードＲ「００」と配列しているので、正しく配列されていることがわかる。次に、読み出した先頭ブロック又は末尾ブロックのシーケンス番号ＳＥＱ＃がそれぞれの期待値と一致するか否かを検証する。この結果、読み出した末尾ブロックと期待値とはシーケンス番号ＳＥＱ＃「ＢＢＢＢＢＢ」で一致しているが、読み出した先頭ブロックはシーケンス番号ＳＥＱ＃「ＢＢＢＢＢＢ」であるのに対し、期待値は「ＡＡＡＡＡＡ」で一致していないことがわかる。したがって、書き込み要求をハードディスクドライブＨＤＤ側で受け取れずに、先頭ブロックを含めたデータがハードディスクドライブＨＤＤ側に正しく書き込まれたことが読み出し時に検証できる。
【０１０４】
このように、先頭又は末尾データブロックＤＢがそれぞれの期待値と一致しない場合には（Ｓ５７：ＮＯ）、エラー処理を行う（Ｓ５８）。
【０１０５】
そして、ディスクアダプタ１０のマイクロプロセッサ１００は、全てのデータブロックＤＢの整合性を検証したか否かを判断し（Ｓ５９）、読み出し対象のデータの全てのデータブロックＤＢについて整合性を検証したと判断すると（Ｓ５９：ＹＥＳ）、読み出した対象データをキャッシュメモリに転送して（Ｓ６０）、ライトシーケンス番号ＷＲＳＥＱ＃チェック処理を終了する（Ｓ６２）。
【０１０６】
一方、ディスクアダプタ１０のマイクロプロセッサ１００は、読み出し対象のデータの全てのデータブロックＤＢについて整合性を検証していないと判断すると（Ｓ５９：ＮＯ）、次のデータブロックＤＢを選択した後（Ｓ６１）、再びステップＳ４３に戻り、次のデータブロックＤＢについてデータの整合性を検証することになる。このように、ライトシーケンス番号チェック処理では、読み出した対象データのデータブロック群を先頭データブロックから順番に末尾データブロックまでライトシーケンス番号チェック処理を行う。
【０１０７】
なお、書き込み時に、その他の保証コードとして、ブロックアドレスＬＡやパリティビット値を付加した場合について説明する。
【０１０８】
図２３に示すように、ディスクアダプタ１０のマイクロプロセッサ１００は、ステップＳ５５又はステップＳ５７の処理を実行した後、読み出したデータブロックＤＢから、当該データブロックＤＢに付加されているブロックアドレスＬＡを取得する（Ｓ５７Ａ）。そして、ディスクアダプタ１０のマイクロプロセッサ１００は、データブロックＤＢに付加されているブロックアドレスＬＡと、実際にデータブロックＤＢをハードディスクドライブから読み出したブロックアドレスＬＡと、が一致するか否かを判断し（Ｓ５７Ｂ）、一致する場合には（Ｓ５７Ｂ：ＹＥＳ）、引き続き、読み出したデータブロックＤＢに付加されたパリティビット値を取得する（Ｓ５７Ｃ）。そしてディスクアダプタ１０のマイクロプロセッサ１００は、読み出したデータブロックＤＢから実際にパリティビット値を算出する（Ｓ５７Ｄ）。ディスクアダプタ１０のマイクロプロセッサ１００は、取得したパリティビット値と算出したパリティビット値とが一致するか否かを判断し（Ｓ５７Ｅ）、一致すると判断すると（Ｓ５７Ｅ：ＹＥＳ）、ステップＳ５９の処理を実行することとなる。
【０１０９】
一方、ディスクアダプタ１０のマイクロプロセッサ１００は、実際にデータブロックＤＢをハードディスクドライブから読み出したブロックアドレスＬＡと、が一致しない場合（Ｓ５７Ｂ）、又は、取得したパリティビット値と算出したパリティビット値とが一致しない場合には（Ｓ５７Ｅ）、エラー処理を実行する（Ｓ５７Ｆ，Ｓ５７Ｇ）。
【０１１０】
（１−４−２）期待値取得処理
それでは次に、期待値取得処理について説明する。期待値取得処理は、ホストコンピュータ２に送信する読み出し対象のデータの、最新のシーケンス番号ＷＲＳＥＱ＃を取得するための処理であり、ディスクアダプタ１０のマイクロプロセッサ１００が、ライトシーケンス番号チェックプログラム１０６に基づいて実行する。
【０１１１】
具体的には、図２４及び図２５に示すように、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢが先頭又は末尾のデータブロックＤＢであると判断すると（Ｓ５５：ＹＥＳ）、期待値取得処理を開始する（Ｓ７０）。
【０１１２】
ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢに対する最新の世代番号を共有メモリ７から取得する（Ｓ７１）。
【０１１３】
ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢがローカルメモリ１０１内のライトシーケンス番号テーブル１０７にあるか否かを判断し（Ｓ７２）、当該テーブル１０７にデータブロックＤＢがないと判断した場合には（Ｓ７２：ＮＯ）、ローカルメモリ１０１に任意のデータブロックＤＢを読み出すだけのページ領域を確保する（Ｓ７３）。
【０１１４】
次に、ディスクアダプタ１０のマイクロプロセッサ１００は、任意のデータブロックＤＢがキャッシュメモリ９内のライトシーケンス番号テーブル９００にあるか否かを判断し（Ｓ７４）、キャッシュメモリ９内のライトシーケンス番号テーブル９００に任意のデータブロックＤＢがない場合には（Ｓ７４：ＮＯ）、任意のデータブロックＤＢを含む読み出し対象のデータをハードディスクドライブＨＤＤから読み出し、キャッシュメモリ９に転送する（Ｓ７５）。
【０１１５】
そして、ディスクアダプタ１０のマイクロプロセッサ１００は、読み出し対象のデータを受け取ると、読み出し対象のデータをローカルメモリ１０１に転送して（Ｓ７６）、読み出し対象のデータに該当するローカルメモリ１０１の世代番号と、共有メモリ７の世代番号と、を同一番号にする（Ｓ７７）。
【０１１６】
一方、ステップＳ７２において、ディスクアダプタ１０のマイクロプロセッサ１００は、ローカルメモリ１０１内のライトシーケンス番号テーブル１０７に当該データブロックＤＢがあると判断した場合には（Ｓ７２：ＹＥＳ）、任意のデータブロックＤＢに該当するローカルメモリ１０１内の世代番号と共有メモリ７内の世代番号とが一致するか否かを判断する（Ｓ７８）。
【０１１７】
そしてディスクアダプタ１０のマイクロプロセッサ１００は、ローカルメモリ１０１内の世代番号と共有メモリ７内の世代番号とが一致しないと判断した場合には（Ｓ７８：ＮＯ）、上述のステップＳ７６及びステップＳ７７の処理を実行して、ローカルメモリ１０１内の世代番号と共有メモリ７内の世代番号とを一致させる。
【０１１８】
また、ディスクアダプタ１０のマイクロプロセッサ１００は、ローカルメモリ１０１内の世代番号と共有メモリ７内の世代番号を一致させた後、ローカルメモリ６１内から任意のデータブロックＤＢに該当するライトシーケンス番号ＳＥＱ＃を期待値として読み出して（Ｓ７９）、期待値取得処理を終了する（Ｓ８０）。
【０１１９】
このように、ディスクアダプタ１０のマイクロプロセッサ１００は、ホストコンピュータに送信する読み出し対象のデータの最新のライトシーケンス番号ＷＲＳＥＱ＃から期待値となるシーケンス番号を取得すると、ステップＳ５６の処理を実行する。
【０１２０】
（１−５）第１の実施の形態の効果
本実施の形態によれば、そもそもハードディスクドライブ側で書き込み要求自体を受け取れなかった場合であっても、ハードディスクドライブに格納される旧データをそのまま検出してデータの誤りを検証することなく、書き込み要求自体を受け取れなかったという異常を検出することができるため、ホストコンピュータから送受信されるデータを保証することができる。
【０１２１】
（２）第２の実施の形態
（２−１）システム構成
次に、第２の実施の形態によるストレージシステム１００について、以下に説明する。第２の実施の形態では、第１の実施の形態と同じ構成には同一の符号を付す。第２の実施の形態の説明では、第１の実施の形態と異なる構成についてのみ説明をする。
【０１２２】
図２６において、１は、本発明のストレージシステムを示す。このストレージシステム１は、ホストコンピュータ２がネットワーク３を介してストレージ装置４’と接続される構成である。
【０１２３】
ストレージ装置４’は、ホストコンピュータ２からのデータの入出力を制御するコントローラ部５と、ホストコンピュータ２からのデータを保存するハードディスクドライブ部１１とを備えるストレージ装置である。
【０１２４】
コントローラ部５’では、チャネルアダプタ６’、プロセッサ部１２、メモリ部１３、ディスクアダプタ１０’がスイッチ８’を介して接続される構成である。
【０１２５】
第２の実施の形態のスイッチ８’は、ＤＭＡ（Direct Memory Access）８０を搭載したスイッチである。プロセッサ部１２がＤＭＡ８０に対して指示を行うと、ＤＭＡ８０はプロセッサ部１２を介さずに、チャネルアダプタ６’、メモリ部１３、ディスクアダプタ１０’との間で直接データの転送を行う。
【０１２６】
第２の実施の形態では、第1の実施の形態のチャネルアダプタ６及びディスクアダプタ１０に内蔵されたマイクロプロセッサ６０，１００及びローカルメモリ６１、１０１は独立の構成とし、プロセッサ部１２のマイクロプロセッサ１２０及びローカルメモリ１２１としている。
【０１２７】
プロセッサ部１２のローカルメモリ１２１は、第1の実施の形態のチャネルアダプタ６及びディスクアダプタ１０のそれぞれのローカルメモリ６１，１０１に格納されていた各種テーブル６１０，６１１，１０４やプログラム１０５，１０６を格納する。
【０１２８】
また、第２に実施の形態では、第１の実施の形態の共有メモリ７及びキャッシュメモリ９は独立の構成とし、メモリ部１３としている。したがって、メモリ部１３は、第１の実施の形態の共有メモリ７及びキャッシュメモリ９のそれぞれに格納されていた各種テーブル７００、９００を格納する。
【０１２９】
（２−２）世代番号の管理方式
本実施の形態では、チャネルアダプタ６’がホストコンピュータ２からの書き込み要求を受信し、引き続き書き込み対象のデータをハードディスクドライブＨＤＤに書き込むと、ディスクアダプタ１０’がライトシーケンス番号ＷＲＳＥＱ＃を付加するので、ＤＭＡ８０がメモリ部１３内のライトシーケンス番号テーブル９００及び世代番号テーブル７００内のライトシーケンス番号ＷＲＳＥＱ＃と世代番号とをまとめて更新する。同時に、ＤＭＡ８０がローカルメモリ１２１にある世代番号管理テーブル６１１の世代番号も更新する。
【０１３０】
同様に、チャネルアダプタ６’がホストコンピュータ２からの読み出し要求を受信すると、ＤＭＡ８０が直接メモリ部１３にアクセスし、世代番号管理テーブル７００から最新の世代番号を取得する。そして、メモリ部１３で管理する世代番号とローカルメモリで管理する世代番号とが一致しない場合には、ＤＭＡ８０が直接メモリ部１３にある最新のライトシーケンス番号ＷＲＳＥＱ＃と世代番号とを読み出して、ローカルメモリ１２１内にあるテーブル６１０，６１１を更新させる。
【０１３１】
このように、実際のデータ転送やテーブルの更新はＤＭＡ８０がマイクロプロセッサ１２０の指示に基づいて実行する。第１の実施の形態で説明をした各種の処理は、実際のデータ転送やテーブルの更新を除いて、マイクロプロセッサ１２０が実行する。
【０１３２】
（２−３）第２の実施の形態の効果
本実施の形態によれば、そもそもハードディスクドライブ側で書き込み要求自体を受け取れなかった場合であっても、ハードディスクドライブに格納される旧データをそのまま検出してデータの誤りを検証することなく、書き込み要求自体を受け取れなかったという異常を検出することができるため、ホストコンピュータから送受信されるデータを保証することができる。
【０１３３】
また、実際のデータ転送やテーブルの更新はＤＭＡがマイクロプロセッサの指示に基づいて実行するため、メモリにアクセスする回数が少なく済み、世代番号の管理や更新を高速に処理することができる。
【図面の簡単な説明】
【０１３４】
【図１】第１の実施の形態のストレージシステム全体のブロック図である。
【図２】第１の実施の形態のデータブロックの説明図である。
【図３】第１の実施の形態のライトシーケンス番号の説明図である。
【図４】第１の実施の形態のライトシーケンス番号テーブルを作成するための説明図である。
【図５】第１の実施の形態のライトシーケンス番号テーブルを示す図である。
【図６】第１の実施の形態の階層メモリ制御方式の説明図である。
【図７】第１の実施の形態の階層メモリ制御方式を用いてローカルメモリの領域を説明する説明図である。
【図８】第１の実施の形態の各種メモリの内容を示す図である。
【図９】第１の実施の形態のライトシーケンス番号テーブルを示す図である。
【図１０】第１の実施の形態の世代番号管理テーブルを示す図である。
【図１１】第１の実施の形態のチェックテーブルを示す図である。
【図１２】第１の実施の形態のライトシーケンス番号付加処理のフローチャートである。
【図１３】第１の実施の形態のライトシーケンス番号付加処理のフローチャートである。
【図１４】第１の実施の形態のライトシーケンス番号付加処理を説明する説明図である。
【図１５】第１の実施の形態のライトシーケンス番号付加処理の一部を示すフローチャートである。
【図１６】第１の実施の形態のデータ更新処理のフローチャートである。
【図１７】第１の実施の形態のデータ更新処理を説明する説明図である。
【図１８】第１の実施の形態のライトシーケンス番号チェック処理のフローチャートである。
【図１９】第１の実施の形態のライトシーケンス番号チェック処理のフローチャートである。
【図２０】第１の実施の形態のライトシーケンス番号チェック処理のフローチャートである。
【図２１】第１の実施の形態のライトシーケンス番号チェック処理を説明する説明図である。
【図２２】第１の実施の形態のライトシーケンス番号チェック処理を説明する説明図である。
【図２３】第１の実施の形態のライトシーケンス番号チェック処理の一部を示すフローチャートである。
【図２４】第１の実施の形態のライトシーケンス番号チェック処理のフローチャートである。
【図２５】第１の実施の形態のライトシーケンス番号チェック処理のフローチャートである。
【図２６】第２の実施の形態のストレージシステム全体のブロック図である。
【符号の説明】
【０１３５】
１…ストレージシステム、  ２…ホストコンピュータ、  ４、４’…ストレージ装置、  ６…チャネルアダプタ、  ７…共有メモリ、  ８、８’…スイッチ、  ９…キャッシュメモリ、  １０…ディスクアダプタ、  １０７、６１０、９００…ライトシーケンス番号テーブル、  １０８、６１１、７００…世代番号管理テーブル、  １０４…チェックテーブル、ＷＲＳＥＱ＃…ライトシーケンス番号、  Ｒ…位置コード、ＳＥＱ＃…シーケンス番号、  ８０…ＤＭＡ。
【図１】
0005102915.tif 000002
【図２】
0005102915.tif 000003
【図３】
0005102915.tif 000004
【図４】
0005102915.tif 000005
【図５】
0005102915.tif 000006
【図６】
0005102915.tif 000007
【図７】
0005102915.tif 000008
【図８】
0005102915.tif 000009
【図９】
0005102915.tif 000010
【図１０】
0005102915.tif 000011
【図１１】
0005102915.tif 000012
【図１２】
0005102915.tif 000013
【図１３】
0005102915.tif 000014
【図１４】
0005102915.tif 000015
【図１５】
0005102915.tif 000016
【図１６】
0005102915.tif 000017
【図１７】
0005102915.tif 000018
【図１８】
0005102915.tif 000019
【図１９】
0005102915.tif 000020
【図２０】
0005102915.tif 000021
【図２１】
0005102915.tif 000022
【図２２】
0005102915.tif 000023
【図２３】
0005102915.tif 000024
【図２４】
0005102915.tif 000025
【図２５】
0005102915.tif 000026
【図２６】
0005102915.tif 000027