(57)【要約】【課題】固定長データフォーマットでデータを管理するキャッシュメモリに、所定のフィールドからなる可変長データフォーマットのデータを書込むデータ書込み方法を提供する。【解決手段】可変長データフォーマットのレコードを受信するレコード受信工程と、受信したレコードのフィールドごとにフィールドチェックコードを生成するフィールドチェックコード生成工程と、受信したレコードについて固定長データの単位でブロックチェックコードを生成するブロックチェックコード生成工程と、受信したレコードを読出し、フィールドチェックコードとブロックチェックコードを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立ててキャッシュメモリに転送して書込むデータ書込み工程とを含む。【選択図】        図８
2006164141.tif 000002
【特許請求の範囲】
【請求項１】
所定のフィールドからなる可変長データフォーマットのレコードを固定長データで管理するデータ蓄積用メモリに、外部装置からの指示によって前記可変長データフォーマットのレコードを書込むデータ書込み方法であって、
可変長データフォーマットのレコードを受信するレコード受信工程と、
受信したレコードのフィールドごとにフィールドチェックコードを生成するフィールドチェックコード生成工程と、
受信したレコードについて前記固定長データの単位でブロックチェックコードを生成するブロックチェックコード生成工程と、
受信した前記レコードを読出し、前記フィールドチェックコードと前記ブロックチェックコードを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立てて前記データ蓄積用メモリに転送して書込むデータ書込み工程と、
を含むことを特徴とするデータ書込み方法。
【請求項２】
所定のフィールドからなる可変長データフォーマットのレコードを固定長データで管理するデータ蓄積用メモリに、外部装置からの指示によって前記データ蓄積用メモリ内のレコードの更新を行うデータ書込み方法であって、
更新を行う可変長データフォーマットのレコードを受信するレコード受信工程と、
更新が行われるレコードを含む固定長の被更新データを前記データ蓄積用メモリから読み出す被更新データ読出し工程と、
更新される内容を含む更新フィールドについては前記レコード受信工程で受信した前記レコード内から読出し、前記更新フィールド以外のフィールドについては前記被更新データ読出し工程で読出した前記被更新データ内から読出すデータ読出し工程と、
前記更新フィールドについてはフィールド単位でフィールドチェックコードを計算するとともに前記固定長データの長さ単位でブロックチェックコードを計算し、前記更新フィールド以外のフィールドについては前記固定長データの長さ単位でブロックチェックコードを計算するチェックコード生成工程と、
前記データ読出し工程で読み出されたデータと、前記チェックコード生成工程で生成されたフィールドチェックコードとブロックチェックコードとを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立てて前記データ蓄積用メモリに転送して書込むデータ書込み工程と、
を含むことを特徴とするデータ書込み方法。
【請求項３】
前記被更新データ読出し工程で、前記被更新データについて固定長データの単位またはフィールド単位でエラーチェックを行い、エラーが検出された場合に、データ書込処理を中止することを特徴とする請求項２に記載のデータ書込み方法。
【請求項４】
前記データ蓄積用メモリは、前記固定長データよりも短い長さのフィールド書込単位でデータの管理を行い、
前記レコード受信工程では、前記更新フィールドが含まれる前記固定長データ内のフィールド書込単位の位置を求める処理をさらに行い、
前記更新フィールドが前記固定長データの最後部を含むフィールド書込単位に含まれる場合に、
前記チェックコード生成工程では、前記更新フィールドを含まないフィールド書込単位のデータについては前記被更新データのブロックチェックコードのみを計算し、
前記データ書込み工程では、前記更新フィールドを含むフィールド書込単位のデータ、前記チェックコード生成工程で生成されたフィールドチェックコードとブロックチェックコードを用いて、固定長データの最後部のフィールド書込単位のデータのみを組み立てて前記データ蓄積用メモリに転送して書込むことを特徴とする請求項２に記載のデータ書込み方法。
【請求項５】
前記フィールドチェックコードは、前記フィールドに含まれる全体の情報を用いて計算される方法によって生成され、前記ブロックチェックコードは、前記固定長データに含まれる全体の情報を用いて計算される方法によって生成されることを特徴とする請求項１または２に記載のデータ書込み方法。
【請求項６】
所定のフィールドからなる可変長データフォーマットのレコードを固定長データで管理するデータ蓄積用メモリに、外部装置からの指示によってデータの書込み／読込みを行うチャネルアダプタであって、
可変長データフォーマットのレコードの書込要求を受け、前記レコードを受信すると、前記データ蓄積用メモリに前記レコードを書込むためのディスクリプタを生成するデータ処理手段と、
受信した前記レコードを格納する書込データ格納手段と、
前記ディスクリプタに基づいて、前記書込データ格納手段からレコードを読出すデータリード機能と、読出した前記レコードのフィールドごとにフィールドチェックコードを生成するＦＣＣ生成機能と、読出した前記レコードについて前記固定長データの単位でブロックチェックコードを生成するＢＣＣ生成機能と、前記データリード機能によって読出されたデータ、前記ＦＣＣ生成機能によって生成されたフィールドチェックコード、および前記ＢＣＣ生成機能によって生成されたブロックチェックコードを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立てて前記データ蓄積用メモリに転送して書込むデータ書込機能と、を有するデータセンド手段と、
を備えることを特徴とするチャネルアダプタ。
【請求項７】
前記データ蓄積用メモリからキャッシュデータを読出すデータリード機能と、読出された前記キャッシュデータを格納するリードデータ格納機能と、を有するデータレシーブ手段をさらに備え、
前記データ処理手段は、可変長データフォーマットのレコードの更新要求を受けると、前記データセンド手段のデータリード機能に、更新される内容を含む前記レコード中の更新フィールドについては前記書込データ格納手段から読出させ、前記更新フィールド以外の前記レコード中のフィールドは前記データレシーブ手段の前記リードデータ格納機能から読出させるディスクリプタを生成することを特徴とする請求項６に記載のチャネルアダプタ。
【請求項８】
前記データレシーブ手段は、読出した前記キャッシュデータのエラーチェックを行い、エラーが存在する場合に処理を中止するエラーチェック機能をさらに備えることを特徴とする請求項７に記載のチャネルアダプタ。
【請求項９】
前記データ蓄積用メモリは、前記固定長データよりも短い長さのフィールド書込単位でデータの管理を行い、
前記データ処理手段は、前記更新フィールドが含まれる前記固定長データ内のフィールド書込単位の位置を求める機能をさらに備え、
前記データ処理手段は、前記更新フィールドが前記固定長データの最後部を含むフィールド書込単位に含まれる場合に、前記データセンド手段のデータリード機能に、前記更新フィールドを含まないフィールド書込単位のデータを読み出す場合にのみ該データを前記ＢＣＣ生成機能にのみ流させ、前記データ書込機能に、前記データリード機能によって読出された更新フィールドを含むフィールド書込単位のデータ、前記ＦＣＣ生成機能によって生成されたフィールドチェックコード、および前記ＢＣＣ生成機能によって生成されたブロックチェックコードを用いて、固定長データの最後部のフィールド書込単位のデータのみを組み立てて前記データ蓄積用メモリに転送して書込ませるディスクリプタを生成することを特徴とする請求項７に記載のチャネルアダプタ。
【請求項１０】
前記データセンド手段の前記ＦＣＣ生成機能は、前記フィールドに含まれる全体の情報を用いてフィールドチェックコードを計算し、前記ＢＣＣ生成機能は、前記固定長データに含まれる全体の情報を用いてブロックチェックコード計算することを特徴とする請求項６に記載のチャネルアダプタ。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、固定長フォーマットでデータを管理するデータ蓄積装置での可変長データフォーマットを有するデータレコードの書込み方法と、その書込み方法を実行するチャネルアダプタに関するものである。
【背景技術】
【０００２】
ベンダ独自のオペレーティングシステムによって稼動するメインフレーム系システムにおいては、その外部記憶装置として、可変長レコードのデータフォーマットを有する磁気ディスク装置が利用されていた。この可変長レコードのデータフォーマットでは、カウント部（Count）、キー部（Key）、データ部（Data）の３つのフィールドから１つのレコードが構成され、ＣＫＤフォーマットとも呼ばれる。このＣＫＤフォーマットにおいては、１つのデータは１つのレコードを単位として管理される。
【０００３】
一方、情報処理システムに使用される外部記憶装置として、データアクセスの高速性やデータの障害耐性を高める構成を有するディスクアレイ装置（ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）装置ともいう）が多く用いられている。このディスクアレイ装置は、種類の異なる汎用的なオペレーティングシステムによって稼動するオープン系システムで多く利用されるため、固定長レコードのデータフォーマットを有している。たとえば、一般的なディスクアレイ装置では、５１２バイトを一つの論理ブロックとして、データをこの論理ブロックに合わせて格納している。
【０００４】
また、近年では、情報処理技術の進展に伴って情報処理端末が一般化してきており、情報処理システムがメインフレーム系システムとオープン系システムの混在によって構成される場合が多くなっている。そのため、固定長のデータフォーマットでデータを記憶するディスクアレイ装置において、メインフレーム系システムからでもデータのアクセスが可能なように構成されるものが提案されている（たとえば、特許文献１参照）。
【０００５】
【特許文献１】特開２００２−５５８６２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
ところで、データを外部記憶装置に記憶する際には、記憶したデータが再度読み出されるときに、エラーが生じていないかを判定するためのエラーチェックコードがデータに付される。たとえば、メインフレーム系システムのＣＫＤフォーマットでは、レコードを構成するフィールドごとにエラーチェックが行われその結果を示すコードがフィールドの最後尾に付される。また、オープン系システムの固定長データフォーマットでは、論理ブロックごとにエラーチェックが行われその結果を示すコードが論理ブロックの最後尾に付される。
【０００７】
図１１は、オープン系システムで用いられる論理ブロックごとにブロックチェックコードが付されたデータの構造を模式的に示す図である。この図に示されるように、論理ブロック１１０Ａ〜１１０Ｃは、データ部１１５Ａ〜１１５Ｃに、所定の長さのブロックチェックコード１２０Ａ〜１２０Ｃが付加されて構成される。ここで、これらの３つの論理ブロック１１０Ａ〜１１０Ｃによって構成されるデータ１５０の更新要求が出されたとする。このとき、論理ブロック１１０Ａ，１１０Ｃはデータ内容の更新が行われたが、何らかの障害によって論理ブロック１１０Ｂはデータ内容の更新が行われずに元のデータのままの状態になってしまったものとする。その後、これらの論理ブロック１１０Ａ〜１１０Ｃのデータ１５０が読み出された場合に、エラーチェックがされたとしても、更新された論理ブロック１１０Ａ，１１０Ｃのブロックチェックコード１２０Ａ，１２０Ｃも更新されなかった論理ブロック１１０Ｂのブロックチェックコード１２０Ｂも正しいために、論理ブロック１１０Ｂが更新されなかったという障害を検出することができないという問題点があった。メインフレーム系システムでも、同様に更新するはずのデータがフィールド単位で更新されなかった場合に、その障害を検出することができないという問題点があった。
【０００８】
また、上述したように、近年におけるメインフレーム系システムとオープン系システムが混在する環境下で使用されるディスクアレイ装置に記憶されるデータのエラーチェックコードの付加方法については、従来提案されていなかった。
【０００９】
本発明は、上述した従来技術による問題点を解消するためになされたものであり、障害の発生によりブロック単位またはフィールド単位でデータの更新ができなかった場合に、データが更新されなかったという障害を検出することができ、また、固定長データフォーマットでデータを管理するキャッシュメモリなどのデータ蓄積装置に可変長データフォーマット形式のデータを記憶する場合におけるデータ書込み方法を提供することを目的とする。また、このデータ書込み方法を行うディスクアレイ装置に使用されるチャネルアダプタを提供することも目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、請求項１の発明にかかるデータ書込み方法は、所定のフィールドからなる可変長データフォーマットのレコードを固定長データで管理するデータ蓄積用メモリに、外部装置からの指示によって前記可変長データフォーマットのレコードを書込むデータ書込み方法であって、可変長データフォーマットのレコードを受信するレコード受信工程と、受信したレコードのフィールドごとにフィールドチェックコードを生成するフィールドチェックコード生成工程と、受信したレコードについて前記固定長データの単位でブロックチェックコードを生成するブロックチェックコード生成工程と、受信した前記レコードを読出し、前記フィールドチェックコードと前記ブロックチェックコードを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立てて前記データ蓄積用メモリに転送して書込むデータ書込み工程と、を含むことを特徴とする。
【００１１】
また、請求項６の発明にかかるチャネルアダプタは、所定のフィールドからなる可変長データフォーマットのレコードを固定長データで管理するデータ蓄積用メモリに、外部装置からの指示によってデータの書込み／読込みを行うチャネルアダプタであって、可変長データフォーマットのレコードの書込要求を受け、前記レコードを受信すると、前記データ蓄積用メモリに前記レコードを書込むためのディスクリプタを生成するデータ処理手段と、受信した前記レコードを格納する書込データ格納手段と、前記ディスクリプタに基づいて、前記書込データ格納手段からレコードを読出すデータリード機能と、読出した前記レコードのフィールドごとにフィールドチェックコードを生成するＦＣＣ生成機能と、読出した前記レコードについて前記固定長データの単位でブロックチェックコードを生成するＢＣＣ生成機能と、前記データリード機能によって読出されたデータ、前記ＦＣＣ生成機能によって生成されたフィールドチェックコード、および前記ＢＣＣ生成機能によって生成されたブロックチェックコードを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立てて前記データ蓄積用メモリに転送して書込むデータ書込機能と、を有するデータセンド手段と、を備えることを特徴とする。
【００１２】
この請求項１，６の発明によれば、固定長データフォーマットでデータを管理するデータ蓄積用メモリに対して可変長データフォーマットのレコードが書込まれる場合に、固定長データの長さ単位でチェックコードが付されるとともに、レコードを構成するフィールドごとにもチェックコードが付され、データのエラーを２つの方法でチェックすることができる。
【００１３】
また、請求項２の発明にかかるデータ書込み方法は、所定のフィールドからなる可変長データフォーマットのレコードを固定長データで管理するデータ蓄積用メモリに、外部装置からの指示によって前記データ蓄積用メモリ内のレコードの更新を行うデータ書込み方法であって、更新を行う可変長データフォーマットのレコードを受信するレコード受信工程と、更新が行われるレコードを含む固定長の被更新データを前記データ蓄積用メモリから読み出す被更新データ読出し工程と、更新される内容を含む更新フィールドについては前記レコード受信工程で受信した前記レコード内から読出し、前記更新フィールド以外のフィールドについては前記被更新データ読出し工程で読出した前記被更新データ内から読出すデータ読出し工程と、前記更新フィールドについてはフィールド単位でフィールドチェックコードを計算するとともに前記固定長データの長さ単位でブロックチェックコードを計算し、前記更新フィールド以外のフィールドについては前記固定長データの長さ単位でブロックチェックコードを計算するチェックコード生成工程と、前記データ読出し工程で読み出されたデータと、前記チェックコード生成工程で生成されたフィールドチェックコードとブロックチェックコードとを用いて、フィールドチェックコードとブロックチェックコードをともに含む固定長データを組み立てて前記データ蓄積用メモリに転送して書込むデータ書込み工程と、を含むことを特徴とする。
【００１４】
さらに、請求項７の発明にかかるチャネルアダプタは、請求項６の発明において、前記データ蓄積用メモリからキャッシュデータを読出すデータリード機能と、読出された前記キャッシュデータを格納するリードデータ格納機能と、を有するデータレシーブ手段をさらに備え、前記データ処理手段は、可変長データフォーマットのレコードの更新要求を受けると、前記データセンド手段のデータリード機能に、更新される内容を含む前記レコード中の更新フィールドについては前記書込データ格納手段から読出させ、前記更新フィールド以外の前記レコード中のフィールドは前記データレシーブ手段の前記リードデータ格納機能から読出させるディスクリプタを生成することを特徴とする。
【００１５】
この請求項２，７の発明によれば、固定長データフォーマットでデータを管理するデータ蓄積用メモリに対して可変長データフォーマットのレコードが書込まれる場合に、固定長データの長さ単位でチェックコードが付されるとともに、レコードを構成するフィールドごとにもチェックコードが付され、データのエラーを２つの方法でチェックすることができる。また、更新フィールドでないデータの書込処理には被更新データを使用して、フィールドチェックコードの計算を省略するようにしている。
【００１６】
また、請求項３の発明にかかるデータ書込み方法は、請求項２の発明において、前記被更新データ読出し工程で、前記被更新データについて固定長データの単位またはフィールド単位でエラーチェックを行い、エラーが検出された場合に、データ書込処理を中止することを特徴とする。
【００１７】
さらに、請求項８の発明にかかるチャネルアダプタは、請求項７の発明において、前記データレシーブ手段は、読出した前記キャッシュデータのエラーチェックを行い、エラーが存在する場合に処理を中止するエラーチェック機能をさらに備えることを特徴とする。
【００１８】
この請求項３，８の発明によれば、データ蓄積用メモリから読み出されたデータについて、フィールド単位または固定長データの単位でエラーチェックを行うことができ、エラーが検出された場合には、データのアクセス処理が終了される。
【００１９】
また、請求項４の発明にかかるデータ書込み方法は、請求項２の発明において、前記データ蓄積用メモリは、前記固定長データよりも短い長さのフィールド書込単位でデータの管理を行い、前記レコード受信工程では、前記更新フィールドが含まれる前記固定長データ内のフィールド書込単位の位置を求める処理をさらに行い、前記更新フィールドが前記固定長データの最後部を含むフィールド書込単位に含まれる場合に、前記チェックコード生成工程では、前記更新フィールドを含まないフィールド書込単位のデータについては前記被更新データのブロックチェックコードのみを計算し、前記データ書込み工程では、前記更新フィールドを含むフィールド書込単位のデータ、前記チェックコード生成工程で生成されたフィールドチェックコードとブロックチェックコードを用いて、固定長データの最後部のフィールド書込単位のデータのみを組み立てて前記データ蓄積用メモリに転送して書込むことを特徴とする。
【００２０】
さらに、請求項９の発明にかかるチャネルアダプタは、請求項７の発明において、前記データ蓄積用メモリは、前記固定長データよりも短い長さのフィールド書込単位でデータの管理を行い、前記データ処理手段は、前記更新フィールドが含まれる前記固定長データ内のフィールド書込単位の位置を求める機能をさらに備え、前記データ処理手段は、前記更新フィールドが前記固定長データの最後部を含むフィールド書込単位に含まれる場合に、前記データセンド手段のデータリード機能に、前記更新フィールドを含まないフィールド書込単位のデータを読み出す場合にのみ該データを前記ＢＣＣ生成機能にのみ流させ、前記データ書込機能に、前記データリード機能によって読出された更新フィールドを含むフィールド書込単位のデータ、前記ＦＣＣ生成機能によって生成されたフィールドチェックコード、および前記ＢＣＣ生成機能によって生成されたブロックチェックコードを用いて、固定長データの最後部のフィールド書込単位のデータのみを組み立てて前記データ蓄積用メモリに転送して書込ませるディスクリプタを生成することを特徴とする。
【００２１】
この請求項４，９の発明によれば、更新フィールドが含まれるフィールド書込単位が固定長データの最後部を含む場合には、レコードの更新の前後で不変のフィールドを含むフィールド書込単位については、そのデータをブロックチェックコードの計算のみに使用して、データの書込みには使用しないようにしている。
【００２２】
また、請求項５の発明にかかるデータ書込み方法は、請求項１または２の発明において、前記フィールドチェックコードは、前記フィールドに含まれる全体の情報を用いて計算される方法によって生成され、前記ブロックチェックコードは、前記固定長データに含まれる全体の情報を用いて計算される方法によって生成されることを特徴とする。
【００２３】
さらに、請求項１０の発明にかかるチャネルアダプタは、請求項６の発明において、前記データセンド手段の前記ＦＣＣ生成機能は、前記フィールドに含まれる全体の情報を用いてフィールドチェックコードを計算し、前記ＢＣＣ生成機能は、前記固定長データに含まれる全体の情報を用いてブロックチェックコード計算することを特徴とする。
【００２４】
この請求項５，１０の発明によれば、フィールドに含まれる全体の情報と固定長データに含まれる全体の情報を用いて計算されるチェックコードを、それぞれフィールドごとおよび固定長データ単位に付すようにしている。
【発明の効果】
【００２５】
請求項１，６の発明によれば、データの更新時にたとえば１つのフィールド全体が更新されなかったデータをリード処理する場合に、フィールドチェックコードによるチェックは正しくても、ブロックチェックコードによるチェックはエラーとなるので、フィールド全体が更新されなかったような障害の発生を検出することができるという効果を有する。また、同様に、固定長データ全体が更新されなかったような障害の発生も検出することができる。その結果、データ蓄積用メモリに格納されるデータの信頼性を一層高めることができる。
【００２６】
請求項２，７の発明によれば、データの更新時にたとえば１つのフィールド全体が更新されなかったデータをリード処理する場合に、フィールドチェックコードによるチェックは正しくても、ブロックチェックコードによるチェックはエラーとなるので、フィールド全体が更新されなかったような障害の発生を検出することができるという効果を有する。また、同様に、固定長データ全体が更新されなかったような障害の発生も検出することができる。その結果、データ蓄積用メモリに格納されるデータの信頼性を一層高めることができる。さらに、更新フィールドでないデータの書込処理には被更新データを使用して、フィールドチェックコードの計算を省略するようにしているので、全て更新データを用いて更新する場合に比して、データの更新処理にかかる時間を短縮することができるという効果を有する。
【００２７】
請求項３，８の発明によれば、データ蓄積用メモリに以前更新されたデータが、たとえばフィールド単位や固定長データの長さの単位で更新されなかったという障害が発生したことを検出することができるという効果を有する。
【００２８】
請求項４，９の発明によれば、更新フィールドが含まれるフィールド書込単位が固定長データの最後部を含む場合には、レコードの更新の前後で不変のフィールドを含むフィールド書込単位のデータをデータ蓄積用メモリに書込まず、更新フィールドが含まれるフィールド書込単位のみをデータ蓄積用メモリに書込むようにして、全て更新データを用いて更新する場合に比して、データの更新処理にかかる時間を短縮することができるという効果を有する。
【００２９】
請求項５，１０の発明によれば、チェックコードが付される位置よって計算されるチェックコードの場合では、フィールド全体または固定長データ全体が更新されなかったような障害を検出することができないが、フィールドに含まれる全体の情報または固定長データに含まれる全体の情報を用いて計算されるチェックコードを用いることで、フィールド全体または固定長データ全体が更新されなかったような障害を検出することができ、データの信頼性を一層高めることができるという効果を有する。
【発明を実施するための最良の形態】
【００３０】
以下に添付図面を参照して、この発明にかかるデータ書込み方法とチャネルアダプタの好適な実施例を詳細に説明する。
【実施例１】
【００３１】
この発明にかかるデータ書込み方法は、固定長のデータフォーマットに可変長のデータフォーマットのデータを格納する形式でデータを管理し、固定長データへのアクセスも可変長データへのアクセスもともに対処可能な記憶装置（データ蓄積用メモリ）に対して適用することができる。以下の説明では、このようなデータ書込み方法およびその方法を実行する装置として、ディスクアレイ装置におけるキャッシュメモリへのデータのリード／ライトを行うチャネルアダプタを例に挙げて説明する。
【００３２】
図１は、本発明にかかるデータ書込み方法が適用されるディスクアレイ装置の構成を模式的に示すブロック図である。ディスクアレイ装置１０は、ホストコンピュータ４０の外部記憶装置として機能する装置であり、データを格納するディスクアレイ部２０と、ディスクアレイ部２０の制御を行うディスクアレイ制御部３０と、を備えて構成される。なお、ホストコンピュータ４０は、特許請求の範囲における外部装置に対応している。
【００３３】
ディスクアレイ部２０は、複数の磁気ディスク装置２１Ａ，２１Ｂと、複数の磁気ディスク装置２１Ａ，２１Ｂの切り替えを行うスイッチ２２Ａ，２２Ｂとから構成される。この磁気ディスク装置２１Ａ，２１Ｂは、一般的にデータアクセスの速さとデータの冗長性の段階に応じて分類されるＲＡＩＤのレベルによって異なる構成を有する。たとえば、データを格納するための磁気ディスク装置と、この磁気ディスク装置に格納されたデータをミラーリングするための磁気ディスク装置と、磁気ディスク装置に格納されたデータに対して作成されたパリティデータを格納するための磁気ディスク装置というように、ＲＡＩＤのレベルに対応してそれぞれの磁気ディスク装置の用途が分かれている。なお、磁気ディスク装置２１Ａ，２１Ｂは、固定長のデータフォーマットでデータを格納しているものとする。
【００３４】
ディスクアレイ制御部３０は、ホストコンピュータ４０に対するインタフェース制御を行うチャネルアダプタ３１と、磁気ディスク装置２１Ａ，２１Ｂから読み出したデータを一時的に保持するキャッシュメモリ３２と、データのリード／ライト時の各種制御を行い、キャッシュメモリ３２の管理を行うキャッシュマネージャ３３と、データのリード／ライト時にキャッシュマネージャ３３の指示に基づいてそれぞれの磁気ディスク装置２１Ａ，２１Ｂに対する制御を行うディスクアダプタ３４と、を備えて構成される。
【００３５】
キャッシュマネージャ３３は、ホストコンピュータ４０から読み出し要求のあったデータがキャッシュメモリ３２上にない場合に、磁気ディスク装置２１Ａ，２１Ｂからデータを読み出してキャッシュメモリ３２上に置いて、チャネルアダプタ３１によって読み込み可能な状態とする機能を有する。なお、キャッシュメモリ３２の容量が飽和した場合には、使われていないデータや最後にアクセスされてから所定の期間が経過したデータなどを廃棄して新たなデータを書込むための領域の確保が行われる。また、キャッシュマネージャ３３は、ホストコンピュータ４０からの書込要求によってキャッシュメモリ３２に書込まれたデータを磁気ディスク装置２１Ａ，２１Ｂへ書込むようにディスクアダプタ３４に指示する機能も有する。
【００３６】
キャッシュメモリ３２は、キャッシュマネージャ３３によって磁気ディスク装置２１Ａ，２１Ｂから読み出されたデータを格納したり、ホストコンピュータ４０からの書込要求のあったデータを格納したりする機能を有する。ディスクアダプタ３４は、キャッシュマネージャ３３からの指示に基づいて、磁気ディスク装置２１Ａ，２１Ｂからデータを読み込んだり、磁気ディスク装置２１Ａ，２１Ｂにデータを書込んだりする機能を有する。なお、キャッシュメモリ３２は、特許請求の範囲におけるデータ蓄積用メモリに対応している。
【００３７】
チャネルアダプタ３１は、ホストコンピュータ４０からの読み出し要求に対応するデータをキャッシュメモリ３２から読み出して、ホストコンピュータ４０に転送するとともに、ホストコンピュータ４０から書込要求のあったデータをキャッシュメモリ３２上に書込む処理を行う機能を有する。
【００３８】
以上の構成において、本発明にかかるデータ書込み方法は、チャネルアダプタ３１とキャッシュメモリ３２との間のデータの書込みに対して適用することができる。そこで、チャネルアダプタ３１とキャッシュメモリ３２との間でデータを転送する際のフォーマット変換とチェックコードについて説明する。まず、磁気ディスク装置２１Ａ，２１Ｂでは、データを固定長の論理ブロックで管理するものとする。なお、以下の説明ではこのときの固定長を５１２バイトであるものとする。
【００３９】
図２は、キャッシュメモリで管理されるデータの構造を模式的に示す図である。キャッシュメモリ３２では、磁気ディスク装置２１Ａ，２１Ｂから読み出したデータについて、５１２バイトの論理ブロックごとに行われたエラーチェックの結果である８バイトのエラーチェックコード（以下、ブロックチェックコード（ＢＣＣ）という）１２０が論理ブロック１１０の後に付されたものを格納している。つまり、キャッシュメモリ３２に書込まれるデータ１００は、５１２バイトの論理ブロック１１０ごとにエラー保護のための８バイトのブロックチェックコード１２０が続いて付加され、全体として５２０バイトのデータ長となる。
【００４０】
また、キャッシュメモリ３２では、論理ブロック１１０の半分の単位、すなわち２５６バイトの固定長でデータが管理されるものとする。この論理ブロックの半分の単位を、以下ではハーフ論理ブロック１１１というものとする。また、ハーフ論理ブロック１１１内は、６４バイトごとの小ブロックに区切られており、この小ブロックをフィールド書込ブロック１１２というものとする。
【００４１】
つぎに、この固定長データフォーマットに可変長データフォーマットのデータを格納する際の取り決めについて説明する。この説明では、可変長データフォーマットとしてＣＫＤフォーマットを用いるものとする。図３は、ＣＫＤフォーマットのデータの構造を模式的に示す図である。ＣＫＤフォーマットのレコード２００は、カウント部(Count)２０１、キー部(Key)２０２、データ部(Data)２０３の３つから構成される。カウント部２０１は、固定長であり、レコード２００のアドレスとデータ長の情報を含む。キー部２０２は、可変長であり、オペレーティングシステムがレコード２００を識別するために用いられる。データ部２０３は、可変長であり、ユーザデータが格納される領域である。
【００４２】
上述したように、キャッシュメモリ３２ではハーフ論理ブロック１１１の単位でデータを管理しているので、可変長データ（ＣＫＤデータ）はハーフ論理ブロック１１１の先頭から格納される。そのため、ハーフ論理ブロック１１１内には、２つ以上の可変長データ（ＣＫＤデータ）のレコード２００が格納されることはない。また、レコード２００の各フィールド２０１〜２０３は、ハーフ論理ブロック１１１内のフィールド書込ブロック１１２の先頭から書込まれるものとし、２つの異なるフィールド２０１〜２０３たとえばカウント部２０１とキー部２０２やキー部２０２とデータ部２０３が同一のフィールド書込ブロック１１２内に書かれることはない。また、フィールド２０１〜２０３ごとにエラー保護のために計算された８バイトのエラーチェックコード（以下、フィールドチェックコード（ＦＣＣ）という）１３０が書込まれる。このフィールドチェックコード１３０は、フィールド書込ブロック１１２の最後の８バイトに書込まれるものとする。
【００４３】
なお、ブロックチェックコード１２０は、論理ブロック１１０内の全体のデータを使用して計算した結果生成されるものが望ましく、フィールドチェックコード１３０も、フィールド２０１〜２０３内の全体のデータを使用して計算した結果生成されるものが望ましい。本明細書では、エラーチェック方法として巡回冗長検査（Cyclic Redundancy Check）を用い、チェックコードとしてこの巡回冗長検査によって生成される巡回冗長検査符号（以下、ＣＲＣという）を用いるものとする。また、この明細書では、論理ブロック１１０ごとに付されるＣＲＣをＢＣＣ−ＣＲＣといい、フィールド２０１〜２０３ごとに付されるＣＲＣをＦＣＣ−ＣＲＣというものとする。
【００４４】
つぎに、本発明にかかるデータ書込み方法を実行するこのディスクアレイ装置１０内のチャネルアダプタ３１の構成について説明する。図４は、チャネルアダプタの機能構成を模式的に示すブロック図であり、図５は、チャネルアダプタ中のプロトコル−ＤＭＡチップの機能構成を模式的に示すブロック図である。チャネルアダプタ３１は、ＭＰＵ（Micro Processing Unit）チップセット３１０、メモリ３２０、プロトコル−ＤＭＡ（Direct Memory Access）チップ３３０を含んで構成される。ＭＰＵチップセット３１０、プロトコル−ＤＭＡチップ３３０は、ＰＣＩ（Peripheral Component Interconnect）バス３５０によって接続されており、相互にデータを転送することができる。
【００４５】
ＭＰＵチップセット３１０は、チャネルアダプタ３１全体の動作制御をつかさどるプロセッサとメモリインタフェース部分を有するＬＳＩであり、データ書込み方法に関係する機能モジュールとしてデータ処理ブロック３１１を有している。データ処理ブロック３１１は、ＣＫＤフォーマットを有するデータを新たにキャッシュメモリ３２に書込んだり更新したりする際に必要なディスクリプタを生成する機能を有する。たとえば、キャッシュメモリ３２に新たにＣＫＤフォーマットを有するデータを書込むディスクリプタを生成したり、ＣＫＤフォーマットを有する更新データを受信する前に、ホストコンピュータ４０との間でそのデータについての情報をやり取りして更新データ中の更新するフィールドについての更新情報を取得するとともに、受信した更新データと更新情報に基づいてデータ更新処理（以下、ReadModifyWrite処理という）を実行するためのディスクリプタを生成したりする機能を有する。このデータ処理ブロック３１１は、特許請求の範囲におけるデータ処理手段に対応する。ここで、ディスクリプタとは、プロトコル−ＤＭＡチップ３３０によるデータアクセス処理を実行するために必要な手順を記述したものである。
【００４６】
図６−１は、更新データブロックによって生成されるデータリード用ディスクリプタの構成の一例を示す図であり、図６−２は、更新データブロックによって生成されるデータライト用ディスクリプタの構成の一例を示す図である。図６−１に示されるデータリード用ディスクリプタ６１０は、後述するプロトコル−ＤＭＡチップ３３０内のセンドエンジン３４２で使用されるディスクリプタかレシーブエンジン３３７で使用されるディスクリプタかを識別するディスクリプタ識別子を格納する「ＳＮＥ／ＲＶＥ」フィールド６１１と、リード処理の内容を示す「ｍｏｄｅ（ｒ）」フィールド６１２と、データ転送長を指定する「ｄｌ（ｒ）」フィールド６１３と、転送元のキャッシュメモリ３２上のアドレスを指定する「ｃｍａ（ｒ）」フィールド６１４と、転送先のレシーブエンジン３３７のリードデータ格納バッファ３４１内のアドレスを指定する「ｍｅｍａ（ｒ）」フィールド６１５と、を含んで構成される。本実施例１では、上記「ｍｏｄｅ（ｒ）」フィールド６１２として、このデータリード用ディスクリプタ６１０に記述された処理の終了後にＭＰＵチップセット３１０へ割り込みを行って通知するモードと、読み込んだデータのＢＣＣのチェック処理の終了後にＭＰＵチップセット３１０への割り込みを行わないモードと、読み込んだデータのＦＣＣのチェック処理の終了後にＭＰＵチップセット３１０への割り込みを行わないモードとの３種類のモードを選択することができる。
【００４７】
また、図６−２に示されるデータライト用ディスクリプタ６２０は、プロトコル−ＤＭＡチップ３３０内のセンドエンジン３４２で使用されるディスクリプタかレシーブエンジン３３７で使用されるディスクリプタかを識別するディスクリプタ識別子を格納する「ＳＮＥ／ＲＶＥ」フィールド６２１と、リード処理の内容を示す「ｍｏｄｅ（ｓ）」フィールド６２２と、データ転送長を指定する「ｄｌ（ｓ）」フィールド６２３と、転送先のキャッシュメモリ３２上のアドレスを指定する「ｃｍａ（ｓ）」フィールド６２４と、転送元の後述するプロトコル−ＤＭＡチップ３３０内のプロトコルコントローラ３３４の書込データバッファ３３５内のアドレスまたはレシーブエンジン３３７のリードデータ格納バッファ３４１内のアドレスを指定する「ｍｅｍａ（ｓ）」フィールド６２５と、を含んで構成される。本実施例１では、上記「ｍｏｄｅ（ｓ）」フィールド６２２として、このデータライト用ディスクリプタ６２０に記述された処理の終了後にＭＰＵチップセット３１０へ割り込みを行って通知するモードと、書込んだデータのＢＣＣの生成を指定してＭＰＵチップセット３１０への割り込みを行わないモードとの２種類を選択することができる。
【００４８】
メモリ３２０は、ＭＰＵチップセット３１０の処理で使用されるデータなどを格納する記憶装置であり、ＭＰＵチップセット３１０と接続される。このメモリ３２０には、ＭＰＵチップセット３１０のデータ処理ブロック３１１によって生成されたディスクリプタを格納するディスクリプタ格納領域３２１が設けられる。図７は、メモリのディスクリプタ格納領域内の様子を模式的に示す図である。この図に示されるように、ディスクリプタ格納領域３２１内には、ＭＰＵチップセット３１０によって生成されたディスクリプタが順に蓄積されていく。ここでは、新しいディスクリプタほど図の下方に付加されていくものとする。この図では、上から順に、データライト用ディスクリプタ（１）、データリード用ディスクリプタ（２）、データライト用ディスクリプタ（３）、・・・、ディスクリプタ（ｘ）が蓄積されており、最も下のディスクリプタ（ｘ）が最も新しく生成されたディスクリプタであることを示している。また、データライト用ディスクリプタ（１）は、新たにデータをキャッシュメモリ３２に書込むディスクリプタを示しており、データリード用ディスクリプタ（２）とデータライト用ディスクリプタ（３）とは連続して実行されてキャッシュメモリ３２上のＣＫＤフォーマットのデータ（レコード）を更新する後述するReadModifyWrite処理用のディスクリプタを示している。
【００４９】
プロトコル−ＤＭＡチップ３３０は、ホストコンピュータ４０との接続に用いられるファイバチャネルのプロトコルを制御するとともに、キャッシュマネージャ３３とのインタフェースを担当するＬＳＩである。データの書込みなどのアクセス要求を出すホストコンピュータ４０とキャッシュメモリ３２との間に位置し、プロセッサ（ＭＰＵチップセット３１０）を経由することなくホストコンピュータ４０とキャッシュメモリ３２との間でデータを転送するＤＭＡ機能を内蔵し、ＭＰＵチップセット３１０からの指示にしたがってキャッシュマネージャ３３との間で通信処理を行う。なお、この図４では、ホストコンピュータ４０とディスクアレイ装置１０とが光ファイバで接続される場合を例示しており、プロトコル−ＤＭＡチップ３３０のホストコンピュータ４０との接続側には、ホストコンピュータ４０から送られてくる光信号を電気信号に変換し、ディスクアレイ装置１０からの電気信号を光信号に変換する光−電気変換部３６０が設けられている。
【００５０】
プロトコル−ＤＭＡチップ３３０は、ＭＰＵチップセット３１０とのインタフェースとなるＰＣＩ  Ｉ／Ｆ３３１と、ホストコンピュータ４０とのインタフェースとなるホストＩ／Ｆ３３２と、キャッシュマネージャ３３とのインタフェースとなるＣＭ  Ｉ／Ｆ３３３と、ホストコンピュータ４０との接続に用いられるファイバチャネルのプロトコルを制御するプロトコルコントローラ３３４と、ＭＰＵチップセット３１０がメモリ３２０にセットしたディスクリプタをリードするディスクリプタリードブロック３３６と、キャッシュメモリ３２からデータを読み込む際の処理を行うレシーブエンジン３３７と、ホストコンピュータ４０からのデータの書込要求に応じてキャッシュメモリ３２に対するデータ処理を行うセンドエンジン３４２と、を備えて構成される。
【００５１】
プロトコルコントローラ３３４は、ホストコンピュータ４０から送信される書込要求のあったデータ（以下、書込データという）や更新要求のあったデータ（以下、更新データという）を格納する書込データバッファ３３５を有している。この書込データバッファ３３５は、特許請求の範囲における書込データ格納手段に対応している。また、ディスクリプタリードブロック３３６は、ＭＰＵチップセット３１０のデータ処理ブロック３１１によってメモリ３２０に格納されたディスクリプタをリードし、関係する処理部に読み込んだディスクリプタ情報を通知する機能を有する。
【００５２】
レシーブエンジン３３７は、キャッシュメモリ３２からデータをリードするモジュールであり、さらに、キャッシュメモリ３２上からキャッシュデータを読み込む処理を行うＣＭリードブロック３３８と、キャッシュメモリ３２から読み込んだキャッシュデータの論理ブロックごとの保証を行うＢＣＣチェックブロック３３９と、キャッシュメモリ３２から読み込んだキャッシュデータのフィールドごとの保証を行うＦＣＣチェックブロック３４０と、ＣＭリードブロック３３８によって読み込まれたキャッシュデータを格納するリードデータ格納バッファ３４１と、を備えて構成される。このレシーブエンジン３３７は、特許請求の範囲におけるデータレシーブ手段に対応し、キャッシュデータは同様に被更新データ対応している。
【００５３】
ＣＭリードブロック３３８は、データリード用ディスクリプタ６１０に記述されたキャッシュアドレス「ｃｍａ（ｒ）」フィールド６１４に基づいてキャッシュメモリ３２からキャッシュデータを読み込み、そのキャッシュデータをデータリード用ディスクリプタ６１０中の「ｍｅｍａ（ｒ）」フィールド６１５で指定されたリードデータ格納バッファ３４１のアドレスに書込む処理を行う。また、データリード用ディスクリプタ６１０中の「ｍｏｄｅ（ｒ）」フィールド６１２の指定によって、読み込んだデータをＢＣＣチェックブロック３３９またはＦＣＣチェックブロック３４０に渡す。なお、「ｍｏｄｅ（ｒ）」フィールド６１２として「ＭＰＵチップセットへの通知」が選択されている場合には、単なるデータのリード処理であり、リードデータ格納バッファ３４１へのデータの書込終了後にデータ転送終了通知をＭＰＵチップセット３１０へ通知する。このＣＭリードブロック３３８は、特許請求の範囲におけるデータレシーブ手段のデータリード機能に対応している。
【００５４】
ＢＣＣチェックブロック３３９は、ＣＭリードブロック３３８から渡されたキャッシュデータについて論理ブロックごとにエラーチェックを行い、論理ブロックに付されたブロックチェックコードと比較して、リードデータ格納バッファ３４１に格納されたデータにエラーがないかを検査する機能を有する。エラーと判定された場合には、ＢＣＣチェックブロック３３９は、データリード用ディスクリプタ６１０中の「ｍｏｄｅ（ｒ）」フィールド６１２の設定にかかわらず、キャッシュメモリ３２から読み込んだデータにエラーがある旨の報告をＭＰＵチップセット３１０に対して行い、実行中の処理を終了する。
【００５５】
ＦＣＣチェックブロック３４０は、ＣＭリードブロック３３８から渡されたキャッシュデータについてフィールドごとにエラーチェックを行い、フィールドに付されたフィールドチェックコードと比較して、リードデータ格納バッファ３４１に格納されたデータにエラーがないかを検査する機能を有する。エラーと判定された場合には、ＦＣＣチェックブロック３４０は、データリード用ディスクリプタ６１０中の「ｍｏｄｅ（ｒ）」フィールド６１２の設定にかかわらず、キャッシュメモリ３２から読み込んだデータにエラーがある旨の報告をＭＰＵチップセット３１０に対して行い、実行中の処理を終了する。これらのＢＣＣチェックブロック３３９とＦＣＣチェックブロック３４０は、特許請求の範囲におけるデータレシーブ手段のエラーチェック機能に対応している。
【００５６】
リードデータ格納バッファ３４１は、ＣＭライトブロック３４６によってキャッシュメモリ３２から読み込まれたキャッシュデータを、データリード用ディスクリプタ６１０の「ｍｅｍａ（ｒ）」フィールド６１５で指定されたアドレスに格納する。このリードデータ格納バッファ３４１は、特許請求の範囲におけるデータレシーブ手段のリードデータ格納機能に対応している。
【００５７】
センドエンジン３４２は、ホストコンピュータ４０から新たに書込むデータや更新を行うデータをキャッシュメモリ３２に転送するモジュールであり、さらに、キャッシュメモリ３２に書込むデータを読み込むデータリードブロック３４３と、読み込んだデータについて論理ブロックごとにフィールドチェックコードの生成を行うＢＣＣ生成ブロック３４４と、読み込んだデータが更新される内容を含む更新フィールドである場合にそのフィールド部分についてフィールドチェックコードの生成を行うＦＣＣ生成ブロック３４５と、データリードブロック３４３、ＢＣＣ生成ブロック３４４およびＦＣＣ生成ブロック３４５からのデータからキャッシュメモリ３２に書込む論理ブロック長のデータを生成するＣＭライトブロック３４６と、を備えて構成される。このセンドエンジン３４２は、特許請求の範囲におけるデータセンド手段に対応している。
【００５８】
データリードブロック３４３は、データライト用ディスクリプタ６２０に基づいてプロトコルコントローラ３３４の書込データバッファ３３５またはレシーブエンジン３３７のリードデータ格納バッファ３４１から選択的にデータをフィールド単位（フィールド書込ブロック単位）ごとに読み込む機能を有する。具体的には、データライト用ディスクリプタ６２０が新たなデータの書込みである場合には、プロトコルコントローラ３３４の書込データバッファ３３５に格納されている書込データを読み込み、そのデータをＣＭライトブロック３４６、ＢＣＣ生成ブロック３４４およびＦＣＣ生成ブロック３４５へと流す処理を行う。また、データライト用ディスクリプタ６２０が更新データの書込みすなわちReadModifyWrite処理である場合には、更新される内容を含むフィールド（以下、更新フィールドという）をプロトコルコントローラ３３４の書込データバッファ３３５から読み込み、そのデータをＣＭライトブロック３４６、ＢＣＣ生成ブロック３４４およびＦＣＣ生成ブロック３４５へと流し、更新されない内容を含むフィールドをレシーブエンジン３３７のリードデータ格納バッファ３４１から読み込み、そのデータをＣＭライトブロック３４６およびＢＣＣ生成ブロック３４４へと流す処理を行う。このデータリードブロック３４３は、特許請求の範囲におけるデータセンド手段のデータリード機能に対応している。
【００５９】
ＢＣＣ生成ブロック３４４は、データライト用ディスクリプタ６２０に基づいて、データリードブロック３４３から渡されたデータについて論理ブロック単位でＢＣＣを計算して生成し、生成したＢＣＣ−ＣＲＣをＣＭライトブロック３４６に出力する機能を有する。このとき、書込データを新たに書込む場合またはReadModifyWrite処理で更新される内容を含むフィールドを書込む場合には、そのフィールド内の所定の位置に付加されるべきＦＣＣ−ＣＲＣの値をＦＣＣ生成ブロック３４５から取得して計算する。上述したように、データリードブロック３４３によって読み出されるデータの切り替えが行われるので、ＢＣＣを計算するにあたって、更新されないフィールドについてはリードデータ格納バッファ３４１に格納されるキャッシュデータが用いられ、更新フィールドについては書込データバッファ３３５に格納される更新データが用いられる。このＢＣＣ生成ブロック３４４は、特許請求の範囲におけるデータセンド手段のＢＣＣ生成機能に対応している。
【００６０】
ＦＣＣ生成ブロック３４５は、データライト用ディスクリプタ６２０に基づいて、データリードブロック３４３がプロトコルコントローラ３３４の書込データバッファ３３５からのデータ、すなわち更新される内容を含む更新フィールドを流している場合に、そのデータについてフィールドごとにＦＣＣを計算して生成し、生成したＦＣＣ−ＣＲＣをＣＭライトブロック３４６に出力する機能を有する。このＦＣＣ生成ブロック３４５は、特許請求の範囲におけるデータセンド手段のＦＣＣ生成機能に対応している。
【００６１】
ＣＭライトブロック３４６は、データライト用ディスクリプタ６２０に基づいて、データリードブロック３４３から渡されたデータと、ＢＣＣチェックブロック３３９から入力されるＢＣＣ−ＣＲＣと、ＦＣＣチェックブロック３４０から入力されるＦＣＣ−ＣＲＣとからキャッシュメモリ３２に書込む固定長データ（論理ブロック）を生成する機能を有する。具体的には、本実施例１のディスクアレイ装置１０ではデータは５１２バイトの固定長の論理ブロックで管理されるので、データリードブロック３４３からのデータが５１２バイトになると、その後にＢＣＣ−ＣＲＣを付加する処理を行う。また、新たにデータを書込む場合には各フィールドの最後部を含むフィールド書込ブロックの所定の位置に、そして論理ブロック内に更新内容を含むフィールドを含む場合にはそのフィールドの最後部を含むフィールド書込ブロックの所定の位置に、ＦＣＣ−ＣＲＣを付加する処理を行う。なお、キャッシュメモリ３２へのデータの書込みは、ハーフ論理ブロック単位で行われる。このＣＭライトブロック３４６は、特許請求の範囲におけるデータセンド手段のデータ書込機能に対応している。
【００６２】
このように、センドエンジン３４２では、更新データをキャッシュメモリに書込む際に、ＢＣＣ−ＣＲＣの書換えをデータの更新と同時に実施するようにしている。これは、データの書換えとＢＣＣ−ＣＲＣの更新を別々に実施すると、データの書換え後ＢＣＣ−ＣＲＣを書換えるまでの間、その論理ブロックではＢＣＣによる保証ができなくなってしまうからである。
【００６３】
ここで、チャネルアダプタ３１によるキャッシュメモリ３２へ新たにデータを書込む書込処理と、既に格納されているデータを更新するReadModifyWrite処理について、順に説明する。図８は、キャッシュメモリへの新たなデータの書込処理の手順の一例を示すフローチャートである。なお、このデータの書込処理は、ＣＫＤフォーマットを有するデータを、固定長データフォーマットでデータを管理しているディスクアレイ装置１０に書込む場合におけるディスクアレイ装置１０のチャネルアダプタ３１での処理の内容を示すものである。
【００６４】
まず、ホストコンピュータ４０によって新たなデータの書込要求とともにその書込データを受信すると、ＭＰＵチップセット３１０のデータ処理ブロック３１１は、その受信した書込データをプロトコル−ＤＭＡチップ３３０のプロトコルコントローラ３３４の書込データバッファ３３５に格納する（ステップＳ１１）。また、データ処理ブロック３１１は、受信した書込データに基づいて、書込処理を実行するためのデータライト用ディスクリプタ６２０を生成する（ステップＳ１２）。生成したデータライト用ディスクリプタ６２０はメモリ３２０のディスクリプタ格納領域３２１に生成された順に格納される。このときデータ処理ブロック３１１によって生成されるデータライト用ディスクリプタ６２０は、たとえば図６−２において、「ＳＮＥ／ＲＶＥ」フィールド６２１に「ＳＮＥ（センドエンジン）」が設定され、「ｍｏｄｅ（ｓ）」フィールド６２２に「ＭＰＵチップセットへの通知」が設定され、「ｄｌ（ｓ）」フィールド６２３には書込むレコード（ＣＫＤデータフォーマットを有するデータ）の長さが設定され、「ｃｍａ（ｓ）」フィールド６２４には書込先のキャッシュメモリ３２上のアドレスが設定され、「ｍｅｍａ（ｓ）」フィールド６２５には書込データバッファ３３５内の書込データの格納されているアドレスが設定される。
【００６５】
ついで、ディスクリプタリードブロック３３６は、メモリ３２０のディスクリプタ格納領域３２１に格納されるデータライト用ディスクリプタ６２０を読み込む（ステップＳ１３）。ディスクリプタリードブロック３３６は読み込んだデータライト用ディスクリプタ６２０にしたがって、関連する処理部、この場合にはセンドエンジン３４２にディスクリプタに含まれるディスクリプタ情報を通知して、データの書込処理を開始する。センドエンジン３４２のデータリードブロック３４３は、データライト用ディスクリプタ６２０の「ｍｅｍａ（ｓ）」フィールド６２５に指定された書込データバッファ３３５のアドレスから書込データ中のフィールドを読み出し（ステップＳ１４）、そのデータをＣＭライトブロック３４６、ＦＣＣ生成ブロック３４５およびＢＣＣ生成ブロック３４４に流す（ステップＳ１５）。
【００６６】
ＦＣＣ生成ブロック３４５では、読み出されたデータについて、フィールド単位でＦＣＣを計算してＦＣＣ−ＣＲＣを生成する（ステップＳ１６）。そして、ＦＣＣ生成ブロック３４５は、計算する単位のフィールドの長さに達すると、生成したＦＣＣ−ＣＲＣをＣＭライトブロック３４６に流す（ステップＳ１７）。
【００６７】
一方、ＢＣＣ生成ブロック３４４では、そのデータについて、論理ブロック単位でＢＣＣを計算してＢＣＣ−ＣＲＣを生成する（ステップＳ１８）。そして、ＢＣＣ生成ブロック３４４は、計算する単位が論理ブロックの長さに達すると、生成したＢＣＣ−ＣＲＣをＣＭライトブロック３４６に流す（ステップＳ１９）。なお、書込データバッファ３３５からデータが流れている場合には、そのＦＣＣの計算結果がＦＣＣ生成ブロック３４５からＢＣＣ生成ブロック３４４へと通知され、そのＦＣＣの計算結果に基づいてＢＣＣが計算される。
【００６８】
その後、ＣＭライトブロック３４６は、ステップＳ１５でＣＭライトブロック３４６に流されたデータと、ステップＳ１７で流されたＦＣＣ−ＣＲＣと、ステップＳ１９で流されたＢＣＣ−ＣＲＣを用いて、キャッシュメモリ３２にデータを書込む際の取り決めにしたがって、論理ブロック単位でデータを組み立てる（ステップＳ２０）。すなわち、フィールドごとにそのフィールドの最後の部分が格納されるフィールド書込ブロックの最後部にステップＳ１６で生成されたＦＣＣ−ＣＲＣを書込むとともに、論理ブロックごとにその最後部にステップＳ１８で生成されたＢＣＣ−ＣＲＣを付加する。また、このとき、１つのフィールド書込ブロック内には２以上のフィールドが含まれないように書込み、また、あるレコードに引き続いて異なるレコードを書込む際にはハーフ論理ブロックの先頭からつぎのレコードを書込むなどの上述したキャッシュメモリ３２でデータを管理する取り決めにしたがってＣＫＤフォーマットのデータが固定長フォーマットで管理されるデータに書込まれる。
【００６９】
ＣＭライトブロック３４６は、組み立てたデータを、キャッシュメモリ３２での管理単位でキャッシュメモリ３２に転送して書込む処理を行う（ステップＳ２１）。その後、書込データのキャッシュメモリ３２への転送がすべて完了したか否かを判定する（ステップＳ２２）。書込データのキャッシュメモリ３２への転送がまだ完了していない場合（ステップＳ２２でＮｏの場合）には、ステップＳ１４へと戻り上述した処理が繰り返し実行される。また、書込データのキャッシュメモリ３２への転送が完了した場合（ステップＳ２２でＹｅｓの場合）には、ＣＭライトブロック３４６はディスクリプタリードブロック３３６にデータ転送終了通知を送信し、また、ＭＰＵチップセット３１０にもデータライト用ディスクリプタ６２０の処理が終了したことを割り込みで通知して、キャッシュメモリ３２への書込み処理が終了する。
【００７０】
つぎに、既に格納されているデータを更新するReadModifyWrite処理について説明する。図９−１〜図９−２は、キャッシュメモリのデータを更新するReadModifyWrite処理の手順の一例を示すフローチャートである。なお、このデータのReadModifyWrite処理も、ＣＫＤフォーマットを有するデータを、固定長データフォーマットでデータを管理しているディスクアレイ装置１０に書込む場合におけるディスクアレイ装置１０のチャネルアダプタ３１での処理の内容を示すものである。
【００７１】
まず、ホストコンピュータ４０によるＣＫＤフォーマットのレコードの更新要求を、チャネルアダプタ３１が受けると（ステップＳ５１）、ＭＰＵチップセット３１０のデータ処理ブロック３１１は、ホストコンピュータ４０との間で更新データ（レコード）についての情報をやり取りし、後の工程で送信される更新データのうちどのフィールドが更新されるのかなどの更新情報を取得する（ステップＳ５２）。
【００７２】
その後、ホストコンピュータ４０から更新データを受信すると、その更新データはプロトコル−ＤＭＡチップ３３０のプロトコルコントローラ３３４の書込データバッファ３３５に格納される（ステップＳ５３）。また、ＭＰＵチップセット３１０のデータ処理ブロック３１１は、更新情報と更新データに基づいて、ReadModifyWrite処理を実行するためのディスクリプタを生成し（ステップＳ５４）、メモリ３２０のディスクリプタ格納領域３２１に格納する。データ処理ブロック３１１によって生成されるReadModifyWrite処理用のディスクリプタは、キャッシュメモリ３２から更新される内容を含む論理ブロックを読み込むデータリード用ディスクリプタ６１０と、内容を更新したデータをキャッシュメモリ３２に書込むデータライト用ディスクリプタ６２０との連続したディスクリプタから構成される。
【００７３】
このうち、データリード用ディスクリプタ６１０は、たとえば図６−１において、「ＳＮＥ／ＲＶＥ」フィールド６１１に「ＲＶＥ（レシーブエンジン）」が設定され、「ｍｏｄｅ（ｒ）」フィールド６１２に「ＢＣＣをチェックする」または「ＦＣＣをチェックする」が設定され、「ｄｌ（ｒ）」フィールド６１３には読み込んでリードデータ格納バッファ３４１へ転送するレコード（ＣＫＤフォーマットを有するデータ）の長さが設定され、「ｃｍａ（ｒ）」フィールド６１４には読み込むキャッシュメモリ３２上のアドレスが設定され、「ｍｅｍａ（ｒ）」フィールド６１５にはリードデータ格納バッファ３４１内に書込むアドレスが設定される。
【００７４】
また、データライト用ディスクリプタ６２０は、たとえば図６−２において、「ＳＮＥ／ＲＶＥ」フィールド６２１に「ＳＮＥ（センドエンジン）」が設定され、「ｍｏｄｅ（ｓ）」フィールド６２２に「ＭＰＵチップセットへの通知」が設定され、「ｄｌ（ｓ）」フィールド６２３には書込むレコード（ＣＫＤデータフォーマットを有するデータ）の長さが設定され、「ｃｍａ（ｓ）」フィールド６２４には書込むキャッシュメモリ３２上のアドレスが設定され、「ｍｅｍａ（ｓ）」フィールド６２５には書込データバッファ３３５内の更新データの格納されているアドレスまたはリードデータ格納バッファ３４１内のキャッシュデータの格納されているアドレスが設定される。
【００７５】
上記のデータリード用ディスクリプタ６１０の「ｍｏｄｅ（ｒ）」フィールド６２２で「ＭＰＵチップセットへ通知する」と設定されていないことによって、ディスクリプタ格納領域３２１のこのデータリード用ディスクリプタ６１０のつぎに格納されているデータライト用ディスクリプタ６２０が続けて実行されることをディスクリプタリードブロック３３６は認識する。つまり、２つのディスクリプタを連続して実行することで、ReadModifyWrite処理が行われることになる。なお、データライト用ディスクリプタ６２０は、更新される内容を含むフィールドについてはプロトコルコントローラ３３４の書込データバッファ３３５から読み込み、それ以外のフィールドについてはレシーブエンジン３３７のリードデータ格納バッファ３４１から読み込むように設定されるように複数生成される。
【００７６】
ついで、ディスクリプタリードブロック３３６は、メモリ３２０のディスクリプタ格納領域３２１に格納されるデータリード用ディスクリプタ６１０を読み込む（ステップＳ５５）。ディスクリプタリードブロック３３６は読み込んだデータリード用ディスクリプタ６１０にしたがって、関連する処理部、この場合にはレシーブエンジン３３７、にデータリード用ディスクリプタ６１０に含まれるディスクリプタ情報を通知する。
【００７７】
レシーブエンジン３３７のＣＭリードブロック３３８は、データリード用ディスクリプタ６１０の「ｃｍａ（ｒ）」フィールド６１４に指定されるキャッシュメモリ３２上のアドレスからデータを読み込み（ステップＳ５６）、データリード用ディスクリプタ６１０の「ｍｅｍａ（ｒ）」フィールド６１５で指定されるリードデータ格納バッファ３４１上のアドレスに書込む（ステップＳ５７）。このとき、書込まれるデータは、可変長データを含む１以上の論理ブロックである。
【００７８】
また、ＣＭリードブロック３３８は、同時に読み込んだデータをデータリード用ディスクリプタ６１０の「ｍｏｄｅ（ｒ）」フィールド６１２の設定に基づいて、ＢＣＣチェックブロック３３９またはＦＣＣチェックブロック３４０に渡し、ＢＣＣまたはＦＣＣを用いてエラーチェックを行い（ステップＳ５８）、読み込んだデータにエラーがあるか否かを判定する（ステップＳ５９）。ＢＣＣチェックブロック３３９またはＦＣＣチェックブロック３４０によるエラーチェックの結果、エラーが存在する場合（ステップＳ５９でＹｅｓの場合）には、ＢＣＣチェックブロック３３９またはＦＣＣチェックブロック３４０は、データリード用ディスクリプタ６１０の「ｍｏｄｅ（ｒ）」フィールド６１２の設定にかかわらずＭＰＵチップセット３１０に読み込んだデータにエラーが存在することを通知し（ステップＳ６０）、ReadModifyWrite処理を終了する。一方、ＢＣＣチェックブロック３３９またはＦＣＣチェックブロック３４０によるエラーチェックの結果、エラーがない場合（ステップＳ５９でＮｏの場合）には、ＢＣＣチェックブロック３３９またはＦＣＣチェックブロック３４０はその結果をＣＭリードブロック３３８に通知し、ＣＭリードブロック３３８は、ディスクリプタリードブロック３３６にデータ転送終了通知を通知して（ステップＳ６１）、データリード用ディスクリプタ６１０に基づくレシーブエンジンの処理が終了する。
【００７９】
データ転送終了通知を受信したディスクリプタリードブロック３３６は、メモリ３２０のディスクリプタ格納領域３２１に格納されるつぎのデータライト用ディスクリプタ６２０を読み込み（ステップＳ６２）。ディスクリプタリードブロック３３６は読み込んだデータライト用ディスクリプタ６２０にしたがって、関連する処理部、この場合にはセンドエンジン３４２、にデータライト用ディスクリプタ６２０に含まれるディスクリプタ情報を通知する。
【００８０】
センドエンジン３４２のデータリードブロック３４３は、読み込む論理ブロック上の位置が更新される内容を含むフィールド（以下、更新フィールドという）か否かを判定する（ステップＳ６３）。読み込むデータの位置が更新フィールドである場合（ステップＳ６３でＹｅｓの場合）には、データリードブロック３４３はプロトコルコントローラ３３４の書込データバッファ３３５から、更新される内容を含むフィールドの長さ分だけデータを読み出し（ステップＳ６４）、そのデータをＣＭライトブロック３４６、ＦＣＣ生成ブロック３４５およびＢＣＣ生成ブロック３４４に流す（ステップＳ６５）。ＦＣＣ生成ブロック３４５では、その更新フィールドについてＦＣＣを計算して、ＦＣＣ−ＣＲＣを生成する（ステップＳ６６）。そして、ＦＣＣ生成ブロック３４５は、生成したＦＣＣ−ＣＲＣをＣＭライトブロック３４６に流す（ステップＳ６７）。また、同時に、ＢＣＣ生成ブロック３４４では、そのデータについて、論理ブロック単位でＢＣＣを計算して、ＢＣＣ−ＣＲＣを生成する（ステップＳ７０）。そして、ＢＣＣ生成ブロック３４４は、計算する単位が論理ブロックの長さに達すると、生成したＢＣＣ−ＣＲＣをＣＭライトブロック３４６に流す（ステップＳ７１）。なお、ＦＣＣ生成ブロック３４５が更新フィールドのＦＣＣ−ＣＲＣを生成した場合には、ＢＣＣ生成ブロック３４４は、そのＦＣＣ−ＣＲＣの計算結果をＢＣＣ生成ブロック３４４から通知され、そのＦＣＣ−ＣＲＣに基づいてＢＣＣを計算する。
【００８１】
一方、ステップＳ６３で読み込むデータの位置が更新フィールドでない場合（ステップＳ６３でＮｏの場合）には、センドエンジン３４２のデータリードブロック３４３は、レシーブエンジン３３７のリードデータ格納バッファ３４１からキャッシュデータを読み出し（ステップＳ６８）、そのデータをＣＭライトブロック３４６とＢＣＣ生成ブロック３４４に流す（ステップＳ６９）。その後、上述したステップＳ７０〜Ｓ７１で説明したように、ＢＣＣ生成ブロック３４４によって、論理ブロック単位でＢＣＣが計算されてＢＣＣ−ＣＲＣが生成され、ＣＭライトブロック３４６に流される。なお、この場合には、更新されないフィールドであるためにＦＣＣ生成ブロック３４５によってＦＣＣ−ＣＲＣは生成されず、キャッシュデータ内のフィールドに格納されるＦＣＣ−ＣＲＣが使用される。
【００８２】
上述したステップＳ６５，Ｓ６７，Ｓ６９，Ｓ７１の後に、データリードブロック３４３は、ＣＭライトブロック３４６に流したデータ長が論理ブロック長か否かを判定する（ステップＳ７２）。流したデータ長が論理ブロック長でない場合（ステップＳ７２でＮｏの場合）には、再びステップＳ６３へと戻り、データ長が論理ブロック長となるまで上述した処理が繰り返される。また、流したデータ長が論理ブロック長である場合（ステップＳ７２でＹｅｓの場合）には、ＣＭライトブロック３４６は、ステップＳ６５またはＳ６９でＣＭライトブロック３４６に流されたデータと、ステップＳ６７で流されたＦＣＣ−ＣＲＣと、ステップＳ７１で流されたＢＣＣ−ＣＲＣを用いて、キャッシュメモリ３２にデータを書込む際の取り決めにしたがって、データを組み立てる（ステップＳ７３）。すなわち、更新されないフィールドと更新フィールドとを順番にしたがって組み立て、更新フィールドの最後の部分が格納されるフィールド書込ブロックの最後部にステップＳ６６で生成されたＦＣＣ−ＣＲＣを書込むとともに、論理ブロックごとにその最後部にステップＳ７０で生成されたＢＣＣ−ＣＲＣを付加する。また、このとき、１つのフィールド書込ブロック内には２以上のフィールドが含まれないように書込み、また、あるレコードに引き続いて異なるレコードを書込む際にはハーフ論理ブロックの先頭から書込むなどの上述したキャッシュメモリ３２でデータを管理する取り決めにしたがってＣＫＤフォーマットのデータが固定長フォーマットで管理されるデータに書込まれる。
【００８３】
ＣＭライトブロック３４６は、組み立てたデータを、キャッシュメモリ３２での管理単位でキャッシュメモリ３２に転送して書込む処理を行う（ステップＳ７４）。その後、更新される内容を含む論理ブロックのデータのキャッシュメモリ３２への転送がすべて完了したか否かを判定する（ステップＳ７５）。データのキャッシュメモリ３２への転送がまだ完了していない場合（ステップＳ７５でＮｏの場合）には、ステップＳ６３へと戻り上述した処理が繰り返し実行される。また、データのキャッシュメモリ３２への転送が完了した場合（ステップＳ７５でＹｅｓの場合）には、ＣＭライトブロック３４６はディスクリプタリードブロック３３６にデータ転送終了通知を送信し、また、ＭＰＵチップセット３１０にもデータライト用ディスクリプタ６２０の処理が終了したことを割り込みで通知して、キャッシュメモリ３２への更新データのReadModifyWrite処理が終了する。
【００８４】
上述してきたように、実施例１によれば、固定長データフォーマットで可変長データフォーマット形式のデータも管理する記憶装置において、固定長データごとおよび可変長データを構成するフィールドごとに、それぞれのデータの全体の内容を用いて計算して得られるエラーチェックコードであるＢＣＣおよびＦＣＣを付すようにしてデータを管理するようにしたので、データの信頼性を高めることができるという効果を有する。特に、データの更新時において、障害の発生によって、ある固定長データ部分ごとまたはあるフィールドごと更新されなかった場合でも、その部分のデータの読み込み時にそのエラーを検出することができるという効果を有する。
【００８５】
また、可変長データフォーマットでデータの更新を行う場合に、データとしては、更新される内容を含むフィールドに対応するフィールド書込ブロックのみを更新するだけでよく、全てのデータを更新する必要がない。この他に更新したフィールド部分のＦＣＣ−ＣＲＣと更新したフィールドを含む論理ブロックのＢＣＣ−ＣＲＣを計算してそれぞれ所定の位置に付加すればよいので、異なるデータフォーマット間におけるデータの更新も素早く行うことができるという効果を有する。
【実施例２】
【００８６】
実施例１で説明した例におけるディスクアレイ装置のキャッシュメモリでは、固定長データ５１２バイト＋ＢＣＣ−ＣＲＣ８バイトでデータを格納するが、データの管理は２５６バイトのハーフ論理ブロックを単位として行っている。そこで、ReadModifyWrite処理において、更新データが、論理ブロック（固定長データ）の前半のハーフ論理ブロックにある場合と、後半のハーフ論理ブロックにある場合とで処理を分けることによって、データの更新をさらに効率的に行うことができる。この実施例２では、その方法について説明する。
【００８７】
実施例２で使用されるディスクアレイ装置で使用されるチャネルアダプタとプロトコル−ＤＭＡチップの構成は、実施例１の図４と図５と同じであるのでその説明を省略する。ただし、図４のＭＰＵチップセット３１０のデータ処理ブロック３１１は、実施例１の機能に加えて、更新フィールドが論理ブロック中のどの位置に存在するのかを求める更新フィールド位置算出機能をさらに有している。この更新フィールド位置算出機能は、具体的には、キャッシュメモリ３２でのデータ管理単位が、論理ブロック長よりも短く複数に分けられる際に、論理ブロック内のどのデータ管理単位に更新フィールドが位置するのかを求める処理を行う。そして、この求めた更新フィールドの位置に応じてディスクリプタを生成する。
【００８８】
たとえば、データのReadModifyWrite処理を行う前にホストコンピュータ４０とチャネルアダプタ３１との間でやり取りされる更新情報には、レコード（ＣＫＤデータ）内のどのフィールドが更新されるのかという情報が含まれている。また、ＣＫＤデータのカウント部には、キー部とデータ部の長さに関する情報が含まれており、しかもカウント部は固定長である。これらの情報から、データ（レコード）の先頭から何バイト目からが更新されるデータを含むフィールドかが計算される。そして、上述した実施例１のように、キャッシュメモリ３２が論理ブロックの半分の単位（ハーフ論理ブロック）でデータ管理を行っている場合には、その更新されるデータの位置が、前半のハーフ論理ブロックか後半のハーフ論理ブロックかを容易に求めることが可能である。もちろん、レコード（ＣＫＤデータ）の長さが１論理ブロック長を超える長さである場合には、レコードに含まれ得る個数の論理ブロック長を減算して同様の計算を行うことによって更新フィールドの位置を求めることができる。また、レコードが論理ブロックの後半のハーフ論理ブロックから始まり、ハーフ論理ブロックの長さよりも長いデータである場合にも、ハーフ論理ブロック長を減算し、さらに必要な場合には含まれ得る個数の論理ブロック長を減算して同様に更新フィールドの位置を求めることができる。
【００８９】
そして、データ処理ブロック３１１は、更新データが前半のハーフ論理ブロックに存在する場合には、実施例１と同一のReadModifyWrite処理を実行するようにディスクリプタを生成し、更新データが後半のハーフ論理ブロックに存在する場合には、前半のハーフ論理ブロックについてはキャッシュメモリ３２から読み込んだデータを用いてＢＣＣ−ＣＲＣの計算のみに使用し、後半のハーフ論理ブロックについては実施例１と同一のReadModifyWrite処理を実行するようにデータリード用ディスクリプタ６１０およびデータライト用ディスクリプタ６２０を生成する。
【００９０】
つぎに、実施例２におけるチャネルアダプタ３１の処理手順について説明する。なお、更新フィールドが論理ブロックの前半のハーフ論理ブロックにある場合には、上述した実施例１と同じように処理を行う必要があり、既に説明したのでその説明を省略し、ここでは、更新フィールドが論理ブロックの後半のハーフ論理ブロックにある場合について説明する。ただし、更新データを含む論理ブロックを読み込む処理までは、上述した実施例１の図９−１と同じであるので、その説明を省略し、その後のデータの書込処理について図１０のフローチャートを参照しながら説明する。図１０は、後半のハーフ論理ブロックに更新フィールドがある場合のReadModifyWrite処理の手順の一例を示すフローチャートである。
【００９１】
まず、実施例１の図９−１で説明したように、更新要求を受け、プロトコルコントローラ３３４の書込データバッファ３３５に更新データを格納した後に、ＭＰＵチップセット３１０のデータ処理ブロック３１１は、ReadModifyWrite処理用のディスクリプタを生成する。そのデータリード用ディスクリプタ６１０に基づいて、キャッシュメモリ３２上のキャッシュデータをレシーブエンジン３３７のリードデータ格納バッファ３４１に格納する。ついで、データライト用ディスクリプタ６２０がディスクリプタリードブロック３３６によって読み込まれ、関連する処理部、この場合にはセンドエンジン３４２、にデータライト用ディスクリプタ６２０に含まれるディスクリプタ情報が通知される（ステップＳ５１〜Ｓ６２）。ただし、データ処理ブロック３１１によって生成されるデータライト用ディスクリプタ６２０は、前半のハーフ論理ブロックはキャッシュデータを用いてＢＣＣ−ＣＲＣのみを計算してデータのＣＭライトブロック３４６への転送を行わず、後半のハーフ論理ブロックは更新フィールドについては書込データバッファ３３５中のデータを使用し、更新フィールド以外のフィールドについてはキャッシュデータを用いて更新データを生成するものである。
【００９２】
ついで、センドエンジン３４２のデータリードブロック３４３は、更新フィールドが含まれる論理ブロック中の位置が後半のハーフ論理ブロック内であることをデータライト用ディスクリプタ６２０から認識し、前半のハーフ論理ブロックをレシーブエンジン３３７のリードデータ格納バッファ３４１から読出し（ステップＳ１０１）、ＢＣＣ生成ブロック３４４に流す（ステップＳ１０２）。このとき、読出したデータは、ＣＭライトブロック３４６には流さない。つまり、論理ブロック全体のＢＣＣ−ＣＲＣの生成に必要となるＢＣＣの計算のみを行う（ステップＳ１０３）。
【００９３】
前半のハーフ論理ブロックの読み出し処理が終了すると（ステップＳ１０４）、後半のハーフ論理ブロックの書込処理が開始される。センドエンジン３４２のデータリードブロック３４３は、読み込む論理ブロック上の位置が更新フィールドか否かを判定する（ステップＳ１０５）。読み込むデータの位置が更新フィールドである場合（ステップＳ１０５でＹｅｓの場合）には、データリードブロック３４３はプロトコルコントローラ３３４の書込データバッファ３３５から、更新される内容を含むフィールドの長さ分だけデータを読み出し（ステップＳ１０６）、そのデータをＣＭライトブロック３４６、ＦＣＣ生成ブロック３４５およびＢＣＣ生成ブロック３４４に流す（ステップＳ１０７）。ＦＣＣ生成ブロック３４５では、その更新フィールドについてＦＣＣを計算して、ＦＣＣ−ＣＲＣを生成する（ステップＳ１０８）。そして、ＦＣＣ生成ブロック３４５は、生成したＦＣＣ−ＣＲＣをＣＭライトブロック３４６に流す（ステップＳ１０９）。また、同時に、ＢＣＣ生成ブロック３４４では、その更新フィールドについて、ステップＳ１０３で計算したＢＣＣ−ＣＲＣを使用して論理ブロック単位でＢＣＣを計算して、ＢＣＣ−ＣＲＣを生成する（ステップＳ１１２）。そして、ＢＣＣ生成ブロック３４４は、計算する単位が論理ブロックの長さに達すると、生成したＢＣＣ−ＣＲＣをＣＭライトブロック３４６に流す（ステップＳ１１３）。なお、ＦＣＣ生成ブロック３４５が更新フィールドのＦＣＣ−ＣＲＣを生成した場合には、ＢＣＣ生成ブロック３４４はそのＦＣＣ−ＣＲＣの計算結果をＦＣＣ生成ブロック３４５から通知され、そのＦＣＣ−ＣＲＣを用いてＢＣＣを計算する。
【００９４】
一方、ステップＳ１０５で読み込むデータの位置が更新フィールドでない場合（ステップＳ１０５でＮｏの場合）には、センドエンジン３４２のデータリードブロック３４３は、レシーブエンジン３３７のリードデータ格納バッファ３４１からキャッシュデータを読み出し（ステップＳ１１０）、そのデータをＣＭライトブロック３４６とＢＣＣ生成ブロック３４４に流す（ステップＳ１１１）。その後、上述したステップＳ１１２〜Ｓ１１３で説明したように、ＢＣＣ生成ブロック３４４によって、ステップＳ１０３で計算されたＢＣＣ−ＣＲＣを使用して論理ブロック単位でＢＣＣが計算されてＢＣＣ−ＣＲＣが生成され、ＣＭライトブロック３４６に流される。なお、この場合には、更新されないフィールドであるためにＦＣＣ生成ブロック３４５によってＦＣＣ−ＣＲＣは生成されず、キャッシュデータ内のフィールドに格納されるＦＣＣ−ＣＲＣが使用される。
【００９５】
上述したステップＳ１０７，Ｓ１０９，Ｓ１１１，Ｓ１１３の後に、データリードブロック３４３は、読み出したデータ長が論理ブロック長か否かを判定する（ステップＳ１１４）。読みだしたデータ長が論理ブロック長でない場合（ステップＳ１１４でＮｏの場合）には、再びステップＳ１０５へと戻り、読み出したデータ長が論理ブロック長となるまで上述した処理が繰り返される。また、読み出したデータ長が論理ブロック長である場合（ステップＳ１１４でＹｅｓの場合）には、ＣＭライトブロック３４６は、ステップＳ１０７またはＳ１１１でＣＭライトブロック３４６に流されたデータと、ステップＳ１０９で生成されたＦＣＣ−ＣＲＣと、ステップＳ１１３で生成されたＢＣＣ−ＣＲＣを用いて、キャッシュメモリ３２にデータを書込む際の取り決めに基づいて、後半のハーフ論理ブロックのみを組み立てる（ステップＳ１１５）。すなわち、後半のハーフ論理ブロックについてのみ更新されないフィールドと更新フィールドとを順番にしたがって組み立て、更新フィールドの最後の部分が格納されるフィールド書込ブロックの最後部にステップＳ１０８で生成されたＦＣＣ−ＣＲＣを書込むとともに、論理ブロックごとにその最後部にステップＳ１１２で生成されたＢＣＣ−ＣＲＣを付加する。また、このとき、１つのフィールド書込ブロック内には２以上のフィールドが含まれないように書込み、また、あるレコードに引き続いて異なるレコードを書込む際にはつぎのレコードのハーフ論理ブロックの先頭から書込むなどの上述したキャッシュメモリ３２でデータを管理する取り決めにしたがってＣＫＤフォーマットのデータが固定長フォーマットで管理されるデータに書込まれる。
【００９６】
ＣＭライトブロック３４６は、組み立てた後半のハーフ論理ブロックを、キャッシュメモリ３２に転送して書込む処理を行う（ステップＳ１１６）。その後、更新される内容を含む論理ブロックのデータのキャッシュメモリ３２への書込みがすべて完了したか否かを判定する（ステップＳ１１７）。データのキャッシュメモリ３２への書込みがまだ完了していない場合（ステップＳ１１７でＮｏの場合）には、ステップＳ１０５へと戻り上述した処理が繰り返し実行される。また、データのキャッシュメモリ３２への書込みが完了した場合（ステップＳ１１７でＹｅｓの場合）には、ＣＭライトブロック３４６はディスクリプタリードブロック３３６にデータ転送終了通知を送信し、また、ＭＰＵチップセット３１０にもデータライト用ディスクリプタ６２０の処理が終了したことを割り込みで通知して、キャッシュメモリ３２への更新データのReadModifyWrite処理が終了する。
【００９７】
上述してきたように、本実施例２では、キャッシュメモリ３２の管理単位でReadModifyWrite処理の前後で内容が不変のデータについては、キャッシュメモリ３２へのデータの書込みを行わず、ＢＣＣのみを計算するようにしたので、ReadModifyWrite処理におけるプロトコル−ＤＭＡチップ３３０にかかる負荷を抑えることができるという効果を有する。
【００９８】
なお、上述した説明では、キャッシュメモリが、５１２バイトの固定長の論理ブロックを格納し、その半分の２５６バイトのハーフ論理ブロック単位でデータの書込みを行う場合を例に挙げたが、これは一例であり、固定長データの長さは任意の長さでよい。また、キャッシュメモリのデータの書込みを行う単位も任意の長さに設定することができ、一つの固定長データ内に２以上の書込単位が存在してもよい。この場合、実施例２に示したReadModifyWrite処理を実行するには、固定長データの最後部を含む書込単位に更新データが含まれる場合と含まれない場合に分けて処理を実行すればよい。
【産業上の利用可能性】
【００９９】
以上のように、本発明にかかるデータ書込み方法は、メインフレーム系システムとオープン系システムの両方で使用される外部記憶装置で使用されるキャッシュメモリに対するデータの書込みに有用であり、特に、固定長データフォーマットで可変長データフォーマットのデータも管理することができるディスクアレイ装置に適している。
【図面の簡単な説明】
【０１００】
【図１】ディスクアレイ装置の構成の一例を模式的に示すブロック図である。
【図２】キャッシュメモリで管理されるデータの構造を模式的に示す図である。
【図３】ＣＫＤフォーマットのデータの構造を模式的に示す図である。
【図４】チャネルアダプタの機能構成を示すブロック図である。
【図５】プロトコル−ＤＭＡチップの機能構成を示すブロック図である。
【図６−１】データリード用ディスクリプタの構成の一例を示す図である。
【図６−２】データライト用ディスクリプタの構成の一例を示す図である。
【図７】メモリのディスクリプタ格納領域の様子を模式的に示す図である。
【図８】キャッシュメモリへの新たなデータの書込処理の一例を示すフローチャートである。
【図９−１】キャッシュメモリのデータを更新するReadModifyWrite処理の手順の一例を示すフローチャートである。
【図９−２】キャッシュメモリのデータを更新するReadModifyWrite処理の手順の一例を示すフローチャートである。
【図１０】後半のハーフ論理ブロックに更新フィールドがある場合のReadModifyWrite処理の手順の一例を示すフローチャートである。
【図１１】論理ブロックにおけるデータの構造の従来例を模式的に示す図である。
【符号の説明】
【０１０１】
１０    ディスクアレイ装置
２０    ディスクアレイ部
２１Ａ，２１Ｂ    磁気ディスク装置
２２Ａ，２２Ｂ    スイッチ
３０    ディスクアレイ制御部
３１    チャネルアダプタ
３２    キャッシュメモリ
３３    キャッシュマネージャ
３４    ディスクアダプタ
４０    ホストコンピュータ
３１０    ＭＰＵチップセット
３１１    データ処理ブロック
３２０    メモリ
３２１    ディスクリプタ格納領域
３３０    プロトコル−ＤＭＡチップ
３３１    ＰＣＩ  Ｉ／Ｆ
３３２    ホスト  Ｉ／Ｆ
３３３    ＣＭ  Ｉ／Ｆ
３３４    プロトコルコントローラ
３３５    書込データバッファ
３３６    ディスクリプタリードブロック
３３７    レシーブエンジン
３３８    ＣＭリードブロック
３３９    ＢＣＣチェックブロック
３４０    ＦＣＣチェックブロック
３４１    リードデータ格納バッファ
３４２    センドエンジン
３４３    データリードブロック
３４４    ＢＣＣ生成ブロック
３４５    ＦＣＣ生成ブロック
３４６    ＣＭライトブロック
３６０    光−電気変換部
【図１】
2006164141.tif 000003
【図２】
2006164141.tif 000004
【図３】
2006164141.tif 000005
【図４】
2006164141.tif 000006
【図５】
2006164141.tif 000007
【図６−１】
2006164141.tif 000008
【図６−２】
2006164141.tif 000009
【図７】
2006164141.tif 000010
【図８】
2006164141.tif 000011
【図９−１】
2006164141.tif 000012
【図９−２】
2006164141.tif 000013
【図１０】
2006164141.tif 000014
【図１１】
2006164141.tif 000015