以下に図面を参照して、本発明にかかるストレージ制御装置、および制御プログラムの実施の形態を詳細に説明する。
(実施の形態)
図1は、実施の形態にかかるストレージ制御装置101の一実施例を示す説明図である。図1において、ストレージ制御装置101は、上位装置102からのストレージ103に対するI/O(Input/Output)要求を処理するコンピュータである。
上位装置102は、CKD方式によってストレージ103にアクセスするコンピュータである。CKD方式は、カウント、キー、データの順序でデータを書き込む方式であり、ブロックサイズは可変長である。上位装置102は、例えば、メインフレームコンピュータである。
ストレージ103は、FBA方式でアクセスを行う記憶装置であり、データを記憶する1以上の記憶装置Dを含む。FBA方式は、ブロックサイズが固定長の方式である。記憶装置Dは、例えば、ハードディスク、光ディスク、フラッシュメモリなどである。以下の説明では、記憶装置Dとして「ハードディスク」を例に挙げて説明する。
上位装置102からのデータの書き込み・読み出しの要求は、CKDコマンドとCKD−EX(extended)コマンドとの2体系の要求方法があり、例えば、表1,表2のようなコマンド列(CCW:Channel Command Word)により実施される。
CKDコマンド体系においては、コマンド「Set Sector」で「トラック上のセクタ指定位置付け」を行う。また、CKD−EXコマンド体系においては、コマンド「Locate Record」で「トラック上のセクタ指定位置付け」を行う。この「トラック上のセクタ指定位置付け」は、次に続く「レコードのカウント部検索実施」を短縮するために行われる。なお、CKD−EXコマンド体系のLRコマンドは、CKDコマンド体系のSKとSSとSCHIDEの機能をまとめたコマンドである。
ここで、図2Aを用いて、CKD方式のトラック・フォーマットについて説明する。なお、トラックとは、プラッタ上の論理的な同心環、すなわち、スピンドルを軸とするプラッタ上の同心円のことである。ここでは、32バイトを1セルとして扱い、レコードはセル単位で格納される。
図2Aは、CKD方式のトラック・フォーマットの一例を示す説明図である。図2Aにおいて、トラック・フォーマット210は、同心円状のトラックを直線状に展開して表したものである。ここで、INDEX(インデックス・マーク)は、トラックの論理的な起点を示す。G1(Gap 1)は、INDEXとHAを区切るものである。G1の長さは、504バイトである。
HA(ホーム・アドレス)は、各トラックの一番初めのデータ・ブロックであり、そのトラックの状態(正常、不良、交代の区別等)およびトラックの物理位置を示す。G20(Gap 20)は、HAとR0のCOUNTを区切る。G20の長さは、248バイトである。
R0(レコード0)は、HAに続く、最初のレコードであり、データを記録することもできるが、一般に、R1〜Rnとは異なる性質を持つ。例えば、R0は、通常KEY長はゼロ、すなわち、KEYを持っていない。また、R0のDATA長は、8バイトを標準とする。R0のCOUNT(カウント部)は、セル番号、物理アドレス、シリンダ番号、ヘッド番号、レコード番号、KEY長、DATA長などを含む。R0のCOUNTの長さは、40バイトである。R0のG2(Gap 2)は、R0のCOUNTとDATAとを区切る。R0のG2の長さは、224バイトである。R0のDATA(データ部)は、COUNTに含まれるDATA長の長さのデータと、32バイト単位に調整するフィルデータとからなる。G3(Gap 3)は、直前のレコードのDATAとRnのCOUNTとを区切る。G3の長さは、216バイトである。
Rn(レコードn)は、ユーザが実際に使用できるデータ・ブロックであり、レコードR0の後に記録される(n=1,2,…)。RnのCOUNTの内容は、R0のCOUNTと同様である。G2(Gap 2)は、RnのCOUNTとKEYとを区切る。RnのG2の長さは、224バイトである。RnのKEY(キー部)は、RnのCOUNTに含まれるKEY長で、1〜255バイトが指定されている場合のみ存在する。KEY長が0の場合、RnのKEYは、KEYの前のG2とともに存在しない。RnのKEYは、後に続くDATAの論理的な識別情報を示すKEY長の長さのデータと、32バイト単位に調整するフィルデータとからなる。G2(Gap 2)は、RnのKEYとDATAを区切る。RnのG2の長さは、224バイトである。RnのDATA(データ部)は、COUNTに含まれるDATA長の長さのデータと、32バイト単位に調整するフィルデータとからなる。
つぎに、図2Bを用いて、FBA方式のトラック・フォーマットについて説明する。ここでは、256バイトを1ブロックとして扱い、レコードはブロック単位で格納される。
図2Bは、FBA方式のトラック・フォーマットの一例を示す説明図である。図2Bにおいて、トラック・フォーマット220は、同心円状のトラックを直線状に展開して表したものである。R0のC,Dおよび各RnのC,K,Dは、図2Aに示したR0のCOUNT,DATAおよび各RnのCOUNT,KEY,DATEに対応する。
ここで、R0(レコード0)のDATA長が8バイト、R1(レコード1)以降のKEY長が100バイト、DATA長が200バイトの等長レコードのトラック・フォーマットを想定する。
この場合、CKD方式での各レコードの所要長は、例えば、下記式(1)および(2)を用いて表すことができる。ただし、R0所要長は、R0(レコードR0)の先頭から次のレコードまでの長さである。R1以降の所要長は、Rn(レコードRn)の先頭から次のレコードまでの長さである。()内の小数点は切り上げる。()内の分子の12は、CRC(Cyclic Redundancy Check)コードに相当する。
また、FBA方式での各レコードの所要長は、例えば、下記式(3)および(4)を用いて表すことができる。ただし、キャッシュメモリにおけるアクセス単位を64バイトとする。()内の小数点は切り上げる。()内の分子の8は、CRCコードに相当する。
CKD方式では、7セル(224バイト)を1セクタとして扱い、セクタ番号(セクタ値)によって各レコードに位置付けすることができる。したがって、図2Aに示したトラック・フォーマット210の場合、例えば、R0のセクタ番号は3、R1のセクタ番号は5、R2のセクタ番号は10となる。このため、例えば、トラック・フォーマット210で書き込み/読み込みしたいレコードがR2の場合、セクタ番号5〜9で位置付けると、R2の手前に位置付けることができ、レコードの検索が効率的に行える。
一方、FBA方式のブロック番号(ブロック値)で考えると、例えば、R0のブロック番号は1、R1のブロック番号は2、R2のブロック番号は4となる。すなわち、R0のセクタ番号「3」に対応するブロック番号は「1」であり、R1のセクタ番号「5」に対応するブロック番号は「2」であり、R2のセクタ番号「10」に対応するブロック番号は「4」である。
このため、R0のDATA長を8、RnのKEY長を100、RnのDATA長を200とすると、セクタ番号とブロック番号との相関を近似式で表すと、「y=0.1027x+1.1446」となる。しかし、RnのKEY長を0にすると、相関の近似式は、「y=0.6339x+1.1736」となり、先程の近似式とは一致しない。すなわち、等長レコードでなければ、セクタ番号とブロック番号との変換には法則がなく、FBA方式のトラック・フォーマットでは、近似式を用いたセクタ番号によるレコードの位置付けはできない。
ところが、ストレージ装置において、セクタ番号をブロック番号に変換できなければ、セクタ番号による位置付けを行うことができず、トラックの先頭から、書き込み/読み込みしたいレコードの検索を行って位置付けるため非効率である。例えば、R2(レコード2)を検索する場合、セクタ番号をブロック番号に変換できなければ、ストレージ装置は、処理開始レコード位置をR0に設定して、R0のカウント部を読み出し、カウント部に含まれるレコード番号「R0」がR2であるか否かを判定する。
ここで、R2ではない場合、ストレージ装置は、R0のカウント部に含まれるKEY長(KL)、DATA長(DL)から、FBA形式のR0のレコード長(所要長)を算出する。上記式(3)によれば、R0の所要長は、128(=64(C)+0(K)+(((8+8)÷64※)×64)(D)=64+0+64)となる。このため、R0のブロック長は、256(=(128÷256※)×256)となる。
なお、※は、小数点を切り上げることを表す。また、FBA方式のトラック・フォーマットでは、256バイトでブロックを丸め込むこととする。
つぎに、ストレージ装置は、算出したR0の所要長から、次のレコードであるR1の先頭ブロック番号を算出する。R1の先頭ブロック番号は、2(=R0の先頭ブロック番号+(R0のブロック長÷256)=1+(256÷256)=1+1)となる。そして、ストレージ装置は、算出したR1の先頭ブロック番号「2」から、R1のカウント部を読み出し、カウント部に含まれるレコード番号「R1」がR2であるか否かを判定する。
ここで、R2ではない場合、ストレージ装置は、レコード番号「R2」が読み出せるまで、R0のときと同様の処理を繰り返すことになり、セクタ番号による位置付けを行う場合に比べて検索効率が悪い。書き込み/読み込みしたいレコードの検索に時間がかかると、I/O要求の処理時間が増加し、I/Oレスポンスが悪化するおそれがある。
そこで、本実施の形態では、FBA方式のストレージSTにアクセスするストレージ制御装置101において、CKD方式のセクタ番号による効率的な位置付けを可能にする制御方法について説明する。以下、ストレージ制御装置101の処理例について説明する。
(1)ストレージ制御装置101は、上位装置102からのトラック・フォーマットの変更を伴う書き込み要求に応じて、変換情報110を参照して、書き込み要求で指定されるセクタ番号に対応するブロック番号を特定する。ここで、変換情報110は、ストレージST内の記憶装置Dのトラックのセクタ番号とブロック番号との対応関係を示す情報である。
変換情報110は、指定されたセクタ番号でレコードの位置付けを行った場合に、位置付けされたレコードのブロック番号を取り出せるものとなっている。ただし、初期状態では、変換情報110には、R0(例えば、図2B参照)への位置付けを行うための情報のみが示され、セクタ番号「3」以降は対象レコードなしを意味する「−」が格納される。
トラック・フォーマットの変更を伴う書き込み要求とは、レコードの追加・削除といったトラック上のフォーマットが変更される書き込み要求である。トラック・フォーマットの変更を伴う書き込み要求では、例えば、最後に追加されたレコードに位置付けするためのセクタ番号が指定される。ただし、初期状態では、R0のみが保持された状態のため、R0に位置付けするためのセクタ番号が指定される。
図1の例では、上位装置102から、あるトラック#のセクタ番号「2」を指定した書き込み要求120(CCW)を受け付けた場合を想定する。この場合、ストレージ制御装置101は、変換情報110を参照して、書き込み要求120で指定されるセクタ番号「2」に対応するブロック番号「1」を特定する。
(2)ストレージ制御装置101は、特定したブロック番号から読み出されるレコードRのフォーマット情報に基づいて、レコードRの次のレコードRの先頭ブロック番号と先頭セクタ番号とを算出する。ここで、フォーマット情報とは、例えば、レコードRのKEY長、DATA長などを含むカウント部の情報である。
図1の例では、ストレージ制御装置101は、メモリ(例えば、後述の図4に示すキャッシュメモリ405)上に展開したトラック#の、特定したブロック番号「1」の位置からカウント部情報130を読み出す。カウント部情報130には、レコードR0のKEY長、DATA長が含まれる。この場合、ストレージ制御装置101は、例えば、カウント部情報130に含まれるレコードR0のKEY長、DATA長に基づいて、FBA方式によるレコードR0の第1のレコード長を算出する。そして、ストレージ制御装置101は、算出した第1のレコード長とレコードRの先頭ブロック番号とに基づいて、レコードR0の次のレコードR1の先頭ブロック番号を算出する。ここでは、次のレコードR1の先頭ブロック番号「2」が算出された場合を想定する。
また、ストレージ制御装置101は、例えば、カウント部情報130に含まれるレコードR0のKEY長、DATA長に基づいて、CKD方式によるレコードR0の第2のレコード長を算出する。そして、ストレージ制御装置101は、算出した第2のレコード長とレコードRの先頭セクタ番号とに基づいて、次のレコードR1の先頭セクタ番号を算出する。ここでは、次のレコードR1の先頭セクタ番号「5」が算出された場合を想定する。
(3)ストレージ制御装置101は、算出した次のレコードRの先頭セクタ番号への位置付けを行う際に指定されるセクタ番号を、算出した次のレコードRの先頭ブロック番号と対応付けて変換情報110に記憶する。ここで、あるレコードRに位置付けする場合、コマンド「Set Sector」の仕様上、そのレコードRよりも前のセクタ番号を指定することになる。
このため、ストレージ制御装置101は、書き込み要求で指定されるセクタ番号の次のセクタ番号から、次のレコードRの先頭セクタ番号の一つ前のセクタ番号までの少なくともいずれかのセクタ番号を、算出された次のレコードRの先頭ブロック番号と対応付けて変換情報110に記憶する。図1の例では、次のレコードR1の先頭セクタ番号「5」への位置付けを行う際に指定されるセクタ番号「3,4」が、次のレコードRの先頭ブロック番号「2」と対応付けられている。
(4)ストレージ制御装置101は、算出した次のレコードRの先頭ブロック番号から書き込み要求に応じたデータの書き込みを行って、算出した次のレコードRの先頭セクタ番号を上位装置102に通知する。図1の例では、ストレージ制御装置101は、次のレコードR1の先頭ブロック番号「2」から書き込み要求120に応じたデータの書き込みを行って、次のレコードR1の先頭セクタ番号「5」を上位装置102に通知する。
このように、ストレージ制御装置101によれば、上位装置102からのトラック・フォーマットの変更を伴う書き込み要求に応じて、新たに追加されるレコードRに位置付けする際に指定されるセクタ番号を、当該レコードRの先頭ブロックと対応付けて変換情報110に記憶することができる。また、ストレージ制御装置101によれば、算出した次のレコードRの先頭ブロック番号から、書き込み要求で指定されるデータの書き込みを行って、次のレコードRの先頭セクタ番号を上位装置102に通知することができる。これにより、以降において、上位装置102は、ストレージ制御装置101から通知されたセクタ番号をもとに、新たに追加したレコードRに一発位置付けすることが可能となる。
(ストレージシステム300のシステム構成例)
つぎに、図1に示したストレージ制御装置101をストレージシステム300に適用した場合について説明する。
図3は、ストレージシステム300のシステム構成例を示す説明図である。図3において、ストレージシステム300は、ストレージ装置301と、メインフレーム302と、を含む。ストレージシステム300において、ストレージ装置301およびメインフレーム302は、FC(Fibre Channel)やiSCSI(Internet Small Computer System Interface)で相互に通信可能に接続される。具体的には、例えば、ストレージ装置301の不図示のCA(Channel Adapter)と、メインフレーム302の不図示のCH(Channel)とがそれぞれ接続される。
ここで、ストレージ装置301は、ストレージ制御装置101とストレージSTとを含む。ストレージSTは、複数のHDD(Hard Disk Drive)を含む。図1に示したストレージ103は、例えば、ストレージSTに対応する。ストレージ制御装置101は、メインフレーム302からのストレージSTに対するI/O要求を処理する。ストレージ制御装置101は、例えば、RAID(Redundant Arrays of Inexpensive Disks)コントローラやディスクコントローラなどである。
I/O要求は、ボリュームに対する書き込み要求または読み出し要求である。ボリュームは、メインフレーム302に提供される論理ボリューム(仮想ボリューム)である。ストレージSTは、ボリュームに割り当てる物理記憶領域を有する。ストレージ制御装置101は、FBA方式によってストレージSTに対するアクセスを行う。
なお、図示は省略するが、ストレージ制御装置101は、構成情報や割当情報を有する。構成情報は、例えば、装置内に作成されたボリュームや、RAIDを構成するディスクについての種々の管理情報を含む。割当情報は、例えば、シン・プロビジョニング構成における割り当て単位(チャンク)ごとの情報や、割り当て済みのチャンクに対する論理アドレスと物理アドレスの対応情報を含む。
メインフレーム302は、ストレージシステム300により提供される論理ボリュームに対するデータの書き込みまたは読み出しを要求するコンピュータである。メインフレーム302は、CKD方式によってストレージSTに対するアクセスを行う。例えば、メインフレーム302は、銀行や官公庁の基幹業務を行う大型コンピュータである。図1に示した上位装置102は、例えば、メインフレーム302に相当する。
なお、図3の例では、ストレージ制御装置101およびメインフレーム302をそれぞれ1台のみ表記したが、ストレージシステム300に複数のストレージ制御装置101やメインフレーム302が含まれることにしてもよい。
(ストレージ制御装置101のハードウェア構成例)
図4は、ストレージ制御装置101のハードウェア構成例を示すブロック図である。図4において、ストレージ制御装置101は、プロセッサの一例であるCPU(Central Processing Unit)401と、メモリ402と、通信I/F(Interface)403と、I/Oコントローラ404と、を有する。また、各構成部は、バス400によってそれぞれ接続される。
ここで、CPU401は、ストレージ制御装置101の全体の制御を司る。メモリ402は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU401のワークエリアとして使用される。メモリ402に記憶されるプログラムは、CPU401にロードされることで、コーディングされている処理をCPU401に実行させる。また、RAMには、キャッシュメモリ405が含まれる。キャッシュメモリ405には、例えば、メインフレーム302から要求されるI/Oのデータや、後述の図5に示すような変換テーブル500が一時的に格納される。
通信I/F403は、通信回線を通じてネットワークに接続され、ネットワークを介して外部装置(例えば、図3に示したメインフレーム302)に接続される。そして、通信I/F403は、ネットワークと装置内部とのインターフェースを司り、外部装置からのデータの入出力を制御する。通信I/F403は、例えば、CAを含む。I/Oコントローラ404は、CPU401の制御にしたがって、ストレージST(図3参照)に対するアクセスを行う。
なお、メインフレーム302についても、ストレージ制御装置101と同様のハードウェア構成により実現することができる。
(変換テーブル500の記憶内容)
つぎに、ストレージ制御装置101が用いる変換テーブル500の記憶内容について説明する。変換テーブル500は、例えば、ストレージST内のHDDのトラックTRごとに設けられ、トラックTRのシリンダ番号およびヘッド番号と対応付けて管理される。変換テーブル500は、例えば、図4に示したストレージ制御装置101のメモリ402のキャッシュメモリ405に記憶される。
図5は、変換テーブル500の記憶内容の一例を示す説明図である。図5において、変換テーブル500は、トラック・フォーマットに応じて、セクタ番号とブロック番号とを対応付けて記憶する。セクタ番号は、トラックTR上のセクタを指定する値である。ブロック番号は、トラックTR上のブロックを指定する値である。
変換テーブル500は、セクタ番号「0〜221」をオフセットとして使用し、指定されたセクタ番号でレコードの位置付けを行った場合、位置付けされたレコードのブロック番号を取り出せるものとなっている。ただし、Set Sectorのコマンドの仕様上、位置付けを実施するレコードよりも前のセクタを指定することで、目的のレコードに位置付けする。
例えば、R2に位置付けたい場合、セクタ番号は5〜9のいずれかを指定する。なお、R#は、レコード番号「R#」のレコードを表す。セクタ番号「10」を指定しないのは、セクタ10にはR2のカウント部の先頭が載っており、先頭位置を行き過ぎたと判断されて、R3に位置付けられるためである。セクタ番号の最大221は、トラック長(49728)とセクタ長(224)から導き出された値であり、222セクタ(49728÷224=222セクタ)以上のテーブルの保持が不要のためである。
指定されたセクタ番号に対応するブロック番号が、トラックTR上のレコードの先頭位置を示しており、カウント部のデータの読み出しが可能になる。トラックTR上のレコードは、運用するソフトウェアごとにフォーマット(データ長)やレコード数が可変である。このため、変換テーブル500は、トラックTRごとに保持・管理される。
なお、図5中、レコード番号は、説明の都合上表記したものであり、実際のテーブルには格納されない情報である。レコード番号は、ブロック番号をもとに、実際のレコードのカウント部を読み出したときにカウント情報から取得される。
(TFT600の記憶内容)
つぎに、ストレージ制御装置101が用いるTFT(Track Format Table)600の記憶内容について説明する。TFT600は、例えば、図4に示したストレージ制御装置101のメモリ402に記憶される。
図6は、TFT600の記憶内容の一例を示す説明図である。図6において、TFT600は、CCH、フォーマットフラグ、データ長、先頭レコード番号およびレコード数のフィールドを有する。各フィールドに情報を設定することで、トラックTRごとのTF情報(例えば、TF情報600−1,600−2)がレコードとして記憶される。
ここで、CCHは、トラックTRのシリンダ番号およびヘッド番号である。フォーマットフラグは、トラックTRがスタンダード・トラック(STD)であるか、ノン・スタンダード・トラック(Non−STD)であるかを示す。スタンダード・トラック(STD)は、以下の条件(i)、(ii)を満たすトラックTRの呼称である。ノン・スタンダード・トラック(Non−STD)は、以下の条件(i)、(ii)を満たさないトラックTRの呼称である。
(i)R0のKEY長=0、DATA長=8
(ii)R1以降の全レコードのKEY長=0、DATA長=等長
データ長は、トラックTR上に書き込まれている全データの長さである。先頭レコード番号は、トラックTR上に書き込まれている先頭のレコードRのレコード番号である。レコード数は、トラックTR上に書き込まれているレコードRの数である。FF、FFFFは、無効な場合の値である。ノン・スタンダード・トラック(Non−STD)の場合、データ長、先頭レコード番号およびレコード数は無効となる。
(ストレージ制御装置101の機能的構成例)
図7は、ストレージ制御装置101の機能的構成例を示すブロック図である。図7において、ストレージ制御装置101は、作成部701と、受付部702と、特定部703と、算出部704と、アクセス制御部705と、を含む。作成部701〜アクセス制御部705は制御部となる機能であり、具体的には、例えば、図4に示したメモリ402に記憶されたプログラムをCPU401に実行させることにより、または、通信I/F403、I/Oコントローラ404により、その機能を実現する。各機能部の処理結果は、例えば、メモリ402に記憶される。
作成部701は、トラックTRのセクタ番号とブロック番号との対応関係を示す変換情報を作成する。変換情報は、例えば、図5に示したような変換テーブル500である。変換テーブル500は、例えば、ストレージ装置301からメインフレーム302に提供される論理ボリュームの初期化フォーマット処理を実施する際にトラックTRごとに作成(初期化)される。
ただし、初期状態(初期化時)では、変換テーブル500には、R0への位置付けを行うための情報のみが格納される。変換テーブル500は、例えば、トラックTRの先頭ブロック(先頭256バイト)または最終ブロックに格納される。なお、変換テーブル500の作成例(初期化)については、図8を用いて後述する。
受付部702は、メインフレーム302からのトラック・フォーマットの変更を伴う書き込み要求を受け付ける。ここで、メインフレーム302からの書き込み要求は、アクセス対象のトラックTR、トラックTR上の位置付けするセクタ、および検索対象のレコードRを指定するCKD方式の書き込み要求である。また、トラック・フォーマットの変更を伴う書き込み要求とは、トラックTR上のフォーマットが変更されるライトコマンドを含む書き込み要求であり、レコードRの追加・削除を伴う書き込み要求である。
ライトコマンドには、フォーマットライトコマンドとアップデートライトコマンドとがある。フォーマットライトコマンドは、トラックTR上のレコードRのKEY長とDATA長とを指定してデータの書き込みを行うコマンドであり、トラックTR上のフォーマットが変更されるコマンドである。
アップデートライトコマンドは、既存のレコードRのキー部(KEY)とデータ部(DATA)の中身の変更を行うコマンドであり、トラックTR上のフォーマットが変更されないコマンドである。すなわち、トラック・フォーマットの変更を伴う書き込み要求は、フォーマットライトコマンドを含む書き込み要求である。一方、トラック・フォーマットの変更を伴わない書き込み要求は、アップデートライトコマンドを含む書き込み要求である。
フォーマットライトコマンドのコマンドコードは、例えば、Write CKDやWrite CKD Next Trackである。アップデートライトコマンドのコマンドコードは、例えば、Write Data、Write KD、Write Update Data、Write Update KDである。
以下の説明では、トラック・フォーマットの変更を伴う書き込み要求、すなわち、フォーマットライトコマンドを含む書き込み要求を、「書き込み要求(FC)」と表記する場合がある。また、トラック・フォーマットの変更を伴わない書き込み要求、すなわち、アップデートライトコマンドを含む書き込み要求を、「書き込み要求(UC)」と表記する場合がある。
メインフレーム302からの書き込み要求は、例えば、図1で説明した表1,表2のようなコマンド列(CCW)により実施される。具体的には、例えば、受付部702は、メインフレーム302から、書き込み要求(FC)として、表3のようなコマンド列(CCW)を順次受け付ける。
SFMコマンドは、動作モードを指定するコマンドである。SKコマンドは、アクセス対象のトラックTRのシリンダ番号、ヘッド番号を指定するコマンドである。SSコマンドは、トラックTR上の位置付けするセクタのセクタ番号を指定するコマンドである。SCHIDEコマンドは、検索対象のレコードRのレコード番号を指定するコマンドである。WCKDコマンドは、書込データを指定するコマンドである。RSコマンドは、直前に処理したレコードRの先頭セクタ番号を取得するコマンドである。
特定部703は、メインフレーム302からの書き込み要求(FC)に応じて、作成された変換情報を参照して、書き込み要求(FC)で指定されるセクタ番号に対応するブロック番号を特定する。具体的には、例えば、特定部703は、変換テーブル500を参照して、メインフレーム302からのSSコマンドにより指定されるセクタ番号に対応するブロック番号を特定する。
算出部704は、特定されたブロック番号から読み出されるレコードRのフォーマット情報に基づいて、当該レコードRの次のレコードRの先頭ブロック番号と先頭セクタ番号とを算出する。ここで、レコードRのフォーマット情報は、レコードRのKEY長、DATA長を含む情報であり、例えば、レコードRのカウント部の情報である。次のレコードRは、新たに追加する書込対象のレコードRである。
具体的には、例えば、算出部704は、特定されたブロック番号をもとに、キャッシュメモリ405上のトラックTRのトラックデータから、レコードRのカウント部の情報を読み出す。つぎに、算出部704は、読み出したレコードRのカウント部の情報に基づいて、レコードRの所要長(FBA)と所要長(CKD)とを算出する。
ここで、所要長(FBA)は、FBA方式によるレコードRのレコード長である。所要長(CKD)は、CKD方式によるレコードRのレコード長である。そして、算出部704は、算出した所要長(FBA)とレコードRの先頭ブロック番号とに基づいて、次のレコードRの先頭ブロック番号を算出する。また、算出部704は、算出した所要長(CKD)とレコードRの先頭セクタ番号とに基づいて、次のレコードRの先頭セクタ番号を算出する。
なお、次のレコードR(書込対象のレコードR)の先頭ブロック番号と先頭セクタ番号とを算出する具体的な処理内容については、図9を用いて後述する。
作成部701は、算出された次のレコードRの先頭セクタ番号への位置付けを行う際に指定されるセクタ番号を、算出された次のレコードRの先頭ブロック番号と対応付けて変換情報に記憶する。ここで、あるレコードRに位置付けする場合、SSコマンドの仕様上、そのレコードRよりも前のセクタを指定することになる。
このため、作成部701は、例えば、書き込み要求(FC)で指定されるセクタ番号の次のセクタ番号から先頭セクタ番号の一つ前のセクタ番号までのセクタ番号を、算出された次のレコードRの先頭ブロック番号と対応付けて変換テーブル500に記憶する。これにより、メインフレーム302からの書き込み要求(FC)に応じて変換テーブル500を更新することができる。
なお、変換テーブル500の更新例については、図9を用いて後述する。
アクセス制御部705は、算出された次のレコードRの先頭ブロック番号から、書き込み要求(FC)に応じたデータの書き込みを行う。具体的には、例えば、アクセス制御部705は、キャッシュメモリ405上のトラックTRのトラックデータの該当ブロック(次のレコードRの先頭ブロック番号の位置)から、次のレコードRを書き込む。次のレコードRは、カウント部(COUNT)とキー部(KEY)とデータ部(DATA)とを含む。キー部(KEY)とデータ部(DATA)は、WCKDコマンドによって指定される。
なお、ストレージST内のHDDのトラックTRへの次のレコードRの書き込みは、例えば、キャッシュメモリ405上から次のレコードRが追い出される際に実施される。
また、アクセス制御部705は、算出された次のレコードRの先頭セクタ番号をメインフレーム302に通知する。具体的には、例えば、アクセス制御部705は、メインフレーム302からのRSコマンドに対する応答として、直前に処理したレコードRの先頭セクタ番号を通知する。
これにより、以降において、メインフレーム302は、書き込み要求(FC)によって新たに追加したレコードRの先頭セクタ番号をもとに、トラックTR上の当該レコードRへの位置付けを行うことができる。
また、受付部702は、メインフレーム302からの読み出し要求を受け付ける。ここで、読み出し要求は、レコードRの読み出し要求である。メインフレーム302からの読み出し要求は、アクセス対象のトラックTR、トラックTR上の位置付けするセクタ、および検索対象のレコードRを指定するCKD方式の読み出し要求である。メインフレーム302からの読み出し要求は、例えば、図1で説明した表1,表2のようなコマンド列(CCW)により実施される。
特定部703は、メインフレーム302からの読み出し要求に応じて、変換情報を参照して、読み出し要求で指定されるセクタ番号に対応するブロック番号を特定する。具体的には、例えば、特定部703は、変換テーブル500を参照して、メインフレーム302からのSSコマンドにより指定されるセクタ番号に対応するブロック番号を特定する。
アクセス制御部705は、特定されたブロック番号から、読み出し要求で指定されるレコードRの読み出しを行う。具体的には、例えば、アクセス制御部705は、キャッシュメモリ405上のトラックTRのトラックデータの該当ブロック(レコードRの先頭ブロック番号の位置)から、レコードRの読み出しを行う。そして、アクセス制御部705は、読み出したレコードRのレコードデータをメインフレーム302に送信する。
また、受付部702は、メインフレーム302からのトラック・フォーマットの変更を伴わない書き込み要求、すなわち、書き込み要求(UC)を受け付ける。上述したように、書き込み要求(UC)は、トラックTR上のフォーマットが変更されない書き込み要求であり、既存のレコードRを更新する書き込み要求である。
なお、フォーマットライトコマンドとアップデートライトコマンドは、コマンドコードから判別可能である。
特定部703は、メインフレーム302からの書き込み要求(UC)に応じて、変換情報を参照して、書き込み要求(UC)で指定されるセクタ番号に対応するブロック番号を特定する。具体的には、例えば、特定部703は、変換テーブル500を参照して、メインフレーム302からのSSコマンドにより指定されるセクタ番号に対応するブロック番号を特定する。
アクセス制御部705は、特定されたブロック番号から、書き込み要求(UC)に応じたデータの書き込みを行う。具体的には、例えば、アクセス制御部705は、キャッシュメモリ405上のトラックTRのトラックデータの該当ブロック(既存のレコードRの先頭ブロック番号の位置)から、レコードRの書き込みを行う。
レコードRは、カウント部(COUNT)とキー部(KEY)とデータ部(DATA)とを含む。キー部(KEY)とデータ部(DATA)は、アップデートライトコマンド(例えば、WDコマンド)によって指定される。なお、ストレージST内のHDDのトラックTRへのレコードRの書き込みは、例えば、キャッシュメモリ405上からレコードRが追い出される際に実施される。
これにより、メインフレーム302からのセクタ番号を指定した書き込み要求(UC)に応じて、既存のレコードRを更新することができる。なお、既存のレコードRを更新する際の処理例については、図10を用いて後述する。
また、作成部701は、トラックTRのTF(トラック・フォーマット)情報を作成する。ここで、TF情報は、トラックTRのフォーマットフラグ、データ長、先頭レコード番号およびレコード数を含む(例えば、図6参照)。
具体的には、例えば、作成部701は、トラックTRに対する書き込み要求(FC)が実行されたことに応じて、トラックTRのTF情報が未作成であれば、トラックTRのTF情報を作成し、図6に示したようなTFT600に記憶する。また、作成部701は、トラックTRに対する書き込み要求(FC)が実行されたことに応じて、TFT600内のトラックTRのTF情報を更新する。
より詳細に説明すると、TF情報のフォーマットフラグは、トラックTRが、上述した条件(i)、(ii)を満たしている間は「STD」となり、条件(i)、(ii)を満たさなくなった時点で「Non−STD」となる。また、TF情報のデータ長、先頭レコード番号およびレコード数は、トラックTRが、上述した条件(i)、(ii)を満たしている間は逐次更新され、条件(i)、(ii)を満たさなくなった時点で無効(FF、FFFF)となる。
また、特定部703は、メインフレーム302からの書き込み要求(FCまたはUC)に応じて、トラックTRのTF情報に基づいて、トラックTRが等長レコードのフォーマットであるか否かを判定することにしてもよい。具体的には、例えば、特定部703は、TFT600内のトラックTRのフォーマットフラグを参照して、トラックTRが等長レコードのフォーマットであるか否かを判定する。
より詳細に説明すると、特定部703は、トラックTRのフォーマットフラグが「STD」の場合、トラックTRが等長レコードのフォーマットであると判定する。一方、特定部703は、トラックTRのフォーマットフラグが「Non−STD」の場合、トラックTRが等長レコードのフォーマットではないと判定する。
ここで、データの書き込み・読み出しの処理方法としては、通常トラックアクセスと、高速化トラックアクセスとがある。ストレージ制御装置101は、通常トラックアクセスおよび高速化トラックアクセスのいずれの処理方法も採用することができる。
通常トラックアクセスでは、ストレージ制御装置101は、例えば、メインフレーム302からのトラックTRへの書き込み要求に応じて、要求のあったトラックデータを、ストレージSTからキャッシュメモリ405上に読み込む。そして、ストレージ制御装置101は、キャッシュメモリ405上に読み込んだトラックデータに、メインフレーム302から受け付けたデータを書き込む。
一方、高速化トラックアクセスでは、ストレージ制御装置101は、例えば、メインフレーム302からのトラックTRへの書き込み要求に応じて、TFT600を参照して、トラックTRが等長レコードのフォーマットであるか否かを判定する。そして、ストレージ制御装置101は、トラックTRが等長レコードのフォーマットである場合、ストレージSTからのデータの読み出しを行わず、キャッシュメモリ405上に書き込み領域を確保し、メインフレーム302から受け付けたデータを書き込む。
このように、高速化トラックアクセスでは、ストレージST(HDD)からのデータの読み出しを削減することで、メインフレーム302の待ち時間を短縮して、アクセス速度を向上させることができる。高速化トラックアクセスは、トラックTRがスタンダード・トラック(STD)である場合に実施可能である。
トラックTRがスタンダード・トラック(STD)の場合、TFT600内のトラックTRのデータ長とレコード数から、各レコードRのブロック番号を算出することができる。すなわち、実データ(トラックデータ)をストレージSTから読み出さなくともレコードRの位置付けを行うことができる。
そこで、特定部703は、トラックTRが等長レコードのフォーマットの場合、TF情報に含まれる等長レコードのデータ長とレコード数とに基づいて、書き込み要求(FCまたはUC)で指定されるセクタ番号に対応するブロック番号を特定することにしてもよい。
具体的には、例えば、特定部703は、上記式(1)〜(4)を用いて、TF情報に含まれる等長レコードのデータ長とレコード数とに基づいて、変換テーブル500を作成する。ただし、上記式(1)〜(4)は、R0のDATA長が8バイト、R1以降のKEY長が100バイト、DATA長が200バイトの場合の計算式である。また、レコード番号「R#」の「#」は、インクリメントされていくものとする。そして、特定部703は、作成した変換テーブル500を参照して、書き込み要求(FCまたはUC)で指定されるセクタ番号に対応するブロック番号を特定する。
なお、書き込み要求(FC)の場合、算出部704は、例えば、特定されたブロック番号とTF情報とに基づいて、次のレコードRの先頭ブロック番号と先頭セクタ番号とを算出する。そして、アクセス制御部705は、算出された次のレコードRの先頭ブロック番号から、書き込み要求(FC)に応じたデータの書き込みを行って、算出された次のレコードRの先頭セクタ番号をメインフレーム302に通知する。また、書き込み要求(UC)の場合には、アクセス制御部705は、特定されたブロック番号から、書き込み要求(UC)に応じたデータの書き込みを行う。
このように、トラックTRがスタンダード・トラック(STD)の場合には、実データ(トラックデータ)をストレージSTから読み出すことなく、TFT600をもとにレコードRの位置付けを行うことで、高速化トラックアクセスを実現することができる。
(変換テーブル500の作成例)
つぎに、図8を用いて、変換テーブル500の作成例(初期化)について説明する。
図8は、変換テーブル500の作成例を示す説明図である。図8において、トラック・フォーマット800は、論理ボリュームの初期化フォーマット処理時のトラックTRのFBAフォーマット(データ構造)を示す。変換テーブル500は、例えば、トラックTRの先頭256バイトの領域に格納される。初期化フォーマット処理時は、R0のレコードRのみが書かれた状態となる。
作成部701は、トラック・フォーマット800に従って、変換テーブル500を作成する。具体的には、図8に示すように、変換テーブル500には、R0への位置付けを行うための情報(図8中、点線枠810)のみが格納され、セクタ番号「3」以降は対象レコードなしを意味する「FF」が格納される。
R0のセクタ番号「3」は固定である。このため、SS(Set Sector)コマンドで、セクタ番号「0〜2」を指定した場合、読み出し・書き込み可能なレコードRはR0となる。SSコマンドでセクタ番号「3」が指定された場合、R0のカウント部を通過したとみなされ、読み出し・書き込み可能なレコードは、R0の次と判断される。ところが、初期化状態では、セクタ番号「3」以降が対象レコードなしを意味する「FF」のため、検索対象なしとなる。
(変換テーブル500の更新例)
つぎに、図9を用いて、変換テーブル500の更新例について説明する。
図9は、変換テーブル500の更新例を示す説明図である。ここでは、トラック・フォーマット900に示すように、初期化状態のトラックTR(図8参照)に、表3に示したコマンド列(CCW)でR1,R2を追加する場合の変換テーブル500の更新例について説明する。なお、以下の(1)〜(5)は、表3の(1)〜(5)のコマンドに対応する。一部のコマンドについて説明を省略する場合がある。
(1)特定部703は、SKコマンドで指定されたシリンダ番号/ヘッド番号から、トラックTRの位置付けを行う。そして、特定部703は、位置付けしたトラックTRの変換テーブル500を参照して、SSコマンドで指定されたセクタ番号「2」に対応するブロック番号「1」を特定する(図9中、(9−1))。
(2)算出部704は、SCHIDEコマンドに応じて、レコードRの検索を行う。なお、初期状態では、R0のみのため、検索対象はR0となる。具体的には、例えば、算出部704は、特定されたブロック番号から、R0のカウント部を読み出し、検索カウントデータ「R0」との比較を行う。ここでは、R0のカウント部に含まれるレコード番号「R0」が検索カウントデータ「R0」と一致するため、フォーマットライトコマンドに進む。
(3)算出部704は、WCKDコマンドに応じて、FBA方式により、R1の書き込みのために、R0の所要長(FBA)を算出し、R1の先頭ブロック番号を算出する。具体的には、例えば、算出部704は、上記式(3)を用いて、R0のカウント部の情報に基づいて、R0の所要長(FBA)を算出する(単位:バイト)。
R0の所要長(FBA)=64(C)+0(K)+64(D)=128
つぎに、算出部704は、算出したR0の所要長(FBA)から、R0の所要ブロック長を算出する(単位:バイト)。なお、※は、小数点を切り上げることを表す。
R0の所要ブロック長=(128÷256※)×256=256
つぎに、算出部704は、算出したR0の所要ブロック長から、R0の所要ブロック数を算出する(単位:ブロック)。
R0の所要ブロック数=256÷256=1
そして、算出部704は、R0の先頭セクタ番号とR0の所要ブロック数から、R1の先頭ブロック番号を算出する。
R1の先頭ブロック番号=R0の先頭ブロック番号+R0の所要ブロック数
=1+1=2
以上の計算から、アクセス制御部705は、算出されたブロック番号「2」から、WCKDコマンドで指定されるR1の書き込みを行う。
また、算出部704は、R1の先頭セクタ番号を求めるために、CKD方式により、HA部の所要長(CKD)とR0の所要長(CKD)を取得する(単位:バイト)。
HA部の所要長(CKD)=504+40+248=792
R0の所要長(CKD)=40(C)+224(G2)+216(G3)+(((8+12)÷32※)×32)=512
そして、算出部704は、HA部の所要長(CKD)とR0の所要長(CKD)から、R1の先頭セクタ番号を算出する。
R1の先頭セクタ番号=(792+512)÷224
=5.82(小数点切捨て)=5
以上の計算から、セクタ番号「3(R0の先頭セクタ番号)」〜セクタ番号「4(R1の先頭セクタ番号−1)」が指定された場合、R1が位置付けられる。このため、作成部701は、R1の先頭セクタ番号への位置付けを行う際に指定されるセクタ番号「3,4」を、算出されたR1の先頭ブロック番号「2」と対応付けて、変換テーブル500に記憶する(図9中、(9−2))。
(4)算出部704は、WCKDコマンドに応じて、FBA方式により、R2の書き込みのために、R1の所要長(FBA)を算出し、R2の先頭ブロック番号を算出する。具体的には、例えば、算出部704は、上記式(4)を用いて、R1のカウント部の情報に基づいて、R1の所要長(FBA)を算出する(単位:バイト)。
R1の所要長(FBA)=64(C)+((100+8)÷64※)×64(K)+((200+8)÷64※)×64(D)=64+128+256=448
なお、R1のKEY長が100バイト以外、DATA長が200バイト以外の場合には、上記式(4)のKEY長、DATA長に相当する値を、R1のKEY長、DATA長に置き換えることで、R1の所要長(FBA)を算出することができる。
つぎに、算出部704は、算出したR1の所要長(FBA)から、R1の所要ブロック長を算出する(単位:バイト)。なお、※は、小数点を切り上げることを表す。
R1の所要ブロック長=(448÷256※)×256=512
つぎに、算出部704は、算出したR1の所要ブロック長から、R1の所要ブロック数を算出する(単位:ブロック)。
R1の所要ブロック数=512÷256=2
そして、算出部704は、R1の先頭ブロック番号とR1の所要ブロック数から、R2の先頭ブロック番号を算出する。
R2の先頭ブロック番号=R1の先頭ブロック番号+R1の所要ブロック数
=2+2=4
以上の計算から、アクセス制御部705は、算出されたブロック番号「4」から、WCKDコマンドで指定されるR2の書き込みを行う。
また、算出部704は、R2の先頭セクタ番号を求めるために、CKD方式により、HA部の所要長(CKD)とR0の所要長(CKD)とR1の所要長(CKD)を取得する(単位:バイト)。
HA部の所要長(CKD)=504+40+248=792
R0の所要長(CKD)=40(C)+224(G2)+216(G3)+(((8+12)÷32※)×32)=512
R1の所要長(CKD)=40(C)+224(G2:K)+224(G2:D)+216(G3)+((100+12)÷32※)×32)+((200+12)÷32※)×32=40+224+224+216+128(K)+224(D)=1056
そして、算出部704は、HA部の所要長(CKD)とR0の所要長(CKD)とR1の所要長(CKD)から、R2の先頭セクタ番号を算出する。
R2の先頭セクタ番号=(792+512+1056)÷224
=10.53(小数点切捨て)=10
以上の計算から、セクタ番号「5(R1の先頭セクタ番号)」〜セクタ番号「9(R2の先頭セクタ番号−1)」が指定された場合、R2が位置付けられる。このため、作成部701は、R2の先頭セクタ番号への位置付けを行う際に指定されるセクタ番号「5〜9」を、算出されたR2の先頭ブロック番号「4」と対応付けて、変換テーブル500に記憶する(図9中、(9−3))。
(5)アクセス制御部705は、RSコマンドに応じて、直前に処理したレコードRのセクタ番号の読み出しを実施する。ここでは、上記(4)において、R2の書き込みが行われたため、R2の先頭セクタ番号である「10」が読み出される。そして、アクセス制御部705は、読み出したR2の先頭セクタ番号「10」をメインフレーム302に通知する。
この先頭セクタ番号「10」は、次に当該トラックTRにアクセスする際のSSコマンドで指定されるセクタ番号の情報として利用される。ただし、先頭セクタ番号「10」を指定すると、R2に位置付けできないため、SSコマンドでは、例えば、−1した「9」の値が指定される。
なお、トラック・フォーマット900のトラックTRに対して、表3に示したコマンド列(CCW)でR3を追加する場合には、ストレージ制御装置101は、例えば、以下のように処理する。ただし、ここでは一部の処理を抜粋して説明する。
表3に示したコマンド列(CCW)でR3を追加する場合、R2の先頭セクタ番号に位置付けするためのセクタ番号「9(=10−1)」が指定される。この場合、変換テーブル500から、セクタ番号「9」に対応するブロック番号「4」が特定され、ブロック番号「4」からR2のカウント部が読み出される。
算出部704は、例えば、上記式(4)を用いて、R2のカウント部の情報に基づいて、R2の所要長(FBA)を算出する。なお、R2のKEY長が100バイト以外、DATA長が200バイト以外の場合には、上記式(4)のKEY長、DATA長に相当する値を、R2のKEY長、DATA長に置き換えることで、R2の所要長(FBA)を算出することができる。
つぎに、算出部704は、算出したR2の所要長(FBA)から、R2の所要ブロック長を算出する。また、算出部704は、算出したR2の所要ブロック長から、R2の所要ブロック数を算出する。そして、算出部704は、R2の先頭ブロック番号とR2の所要ブロック数とを加算することで、R3の先頭ブロック番号を算出する。
また、算出部704は、例えば、上記式(2)を用いて、R2のカウント部の情報に基づいて、R2の所要長(CKD)を算出する。なお、R2のKEY長が100バイト以外、DATA長が200バイト以外の場合には、上記式(2)のKEY長、DATA長に相当する値を、R2のKEY長、DATA長に置き換えることで、R2の所要長(CKD)を算出することができる。
つぎに、算出部704は、算出したR2の所要長(CKD)から、R2の所要セクタ数を算出する。そして、算出部704は、R2の先頭セクタ番号とR2の所要セクタ数とを加算することで、R3の先頭セクタ番号を算出する。
(変換テーブル500の更新例)
つぎに、図10を用いて、変換テーブル500の参照例について説明する。
図10は、変換テーブル500の参照例を示す説明図である。ここでは、符号1000に示すように、R1〜R7が書き込まれたトラックTRに対して、表1に示したようなコマンド列(CCW)で既存のR6を更新する場合について説明する。変換テーブル500は、トラックTRに、R1〜R7が書き込まれた後のものである。
既存のR6を更新する場合、SSコマンドにより、R6の先頭セクタ番号に位置付けするためのセクタ番号として、23〜27のいずれかの値が指定される。例えば、セクタ番号「27」が指定されると、変換テーブル500から、セクタ番号「27」に対応するブロック番号「12」が特定される。
ブロック番号「12」は、R6の先頭ブロック番号である。このように、変換テーブル500によれば、既存のR6を更新する際に、SSコマンドによって、23〜27のいずれかのセクタ番号を指定することで、R6に一発位置付けすることができる。
(ストレージ制御装置101の制御処理手順)
つぎに、ストレージ制御装置101の制御処理手順について説明する。ストレージ制御装置101の制御処理は、メインフレーム302からの書き込み要求(FC,UC)または読み出し要求に応じて実行される。
図11は、ストレージ制御装置101の制御処理手順の一例を示すフローチャートである。図11のフローチャートにおいて、まず、ストレージ制御装置101は、トラックTRの位置付け処理を実行する(ステップS1101)。位置付け処理の具体的な処理手順については、図12を用いて後述する。
つぎに、ストレージ制御装置101は、レコードRの検索処理を実行する(ステップS1102)。検索処理の具体的な処理手順については、図14を用いて後述する。そして、ストレージ制御装置101は、検索結果が一致するか否かを判断する(ステップS1103)。
なお、図14を用いて詳細は後述するが、検索結果が一致するとは、レコードRのカウント部の情報に含まれるレコード番号が、メインフレーム302から指定される検索カウントデータと一致することに相当する。
ここで、検索結果が一致する場合(ステップS1103:Yes)、ストレージ制御装置101は、書き込み処理または読み出し処理を実行して(ステップS1104)、本フローチャートによる一連の処理を終了する。書き込み処理の具体的な処理手順については、図15を用いて後述する。読み出し処理の具体的な処理手順については、図16を用いて後述する。
また、ステップS1103において、検索結果が一致しない場合(ステップS1103:No)、ストレージ制御装置101は、メインフレーム302にエラー情報を送信して(ステップS1105)、本フローチャートによる一連の処理を終了する。エラー情報は、後述の図14に示すステップS1404において作成される。
これにより、メインフレーム302からの書き込み要求または読み出し要求に応じて、書き込み処理または読み出し処理を実行することができる。
つぎに、図12を用いて、図11に示したステップS1101の位置付け処理の具体的な処理手順について説明する。
図12は、位置付け処理の具体的処理手順の一例を示すフローチャートである。図12のフローチャートにおいて、まず、ストレージ制御装置101は、SFMコマンドで指定されるFile Mask情報を取得する(ステップS1201)。つぎに、ストレージ制御装置101は、SKコマンドで指定されるSeek情報を取得する(ステップS1202)。
つぎに、ストレージ制御装置101は、SSコマンドで指定されるSector情報を取得する(ステップS1203)。そして、ストレージ制御装置101は、キャッシュアロケーション処理を実行する(ステップS1204)。キャッシュアロケーション処理の具体的な処理手順については、図13を用いて後述する。
つぎに、ストレージ制御装置101は、キャッシュメモリ405上にトラックTRのトラックデータがあるか否かを判断する(ステップS1205)。ここで、トラックデータがある場合(ステップS1205:Yes)、ストレージ制御装置101は、キャッシュメモリ405上のトラックTRの先頭ブロックから変換テーブル500を読み込む(ステップS1206)。
そして、ストレージ制御装置101は、変換テーブル500を参照して、取得したSector情報から特定されるセクタ番号に対応するブロック番号を特定し(ステップS1207)、位置付け処理を呼び出したステップに戻る。
また、ステップS1205において、トラックデータがない場合(ステップS1205:No)、ストレージ制御装置101は、トラックTRのTF情報に含まれるデータ長とレコード数とに基づいて、変換テーブル500を作成し(ステップS1208)、ステップS1207に移行する。
これにより、メインフレーム302から指定されるセクタ番号によるレコードRの位置付けを行うことができる。また、トラックTRがスタンダード・トラック(STD)の場合には、実データ(トラックデータ)をストレージSTから読み出すことなく、トラックTRのTF情報をもとにレコードRの位置付けを行うことができる。
つぎに、図13を用いて、図12に示したステップS1204のキャッシュアロケーション処理の具体的な処理手順について説明する。
図13は、キャッシュアロケーション処理の具体的処理手順の一例を示すフローチャートである。図13のフローチャートにおいて、まず、ストレージ制御装置101は、図12のステップS1202において取得したSeek情報(シリンダ番号、ヘッド番号)からアクセス対象のトラックTRを特定する(ステップS1301)。
つぎに、ストレージ制御装置101は、TFT600から、特定したトラックTRのTF情報を取得する(ステップS1302)。つぎに、ストレージ制御装置101は、図12のステップS1201において取得したFile Mask情報を参照して、ライト許可フラグを判定する(ステップS1303)。
つぎに、ストレージ制御装置101は、取得したTF情報を参照して、トラックTRのフォーマットフラグを判定する(ステップS1304)。そして、ストレージ制御装置101は、ライト許可フラグ「ライト許可」、かつ、フォーマットフラグ「STD」であるか否かを判断する(ステップS1305)。
ここで、ライト許可フラグ「ライト許可」、かつ、フォーマットフラグ「STD」ではない場合(ステップS1305:No)、ストレージ制御装置101は、ストレージSTからキャッシュメモリ405に、トラックTRのトラックデータを読み出して(ステップS1306)、キャッシュアロケーション処理を呼び出したステップに戻る。
一方、ライト許可フラグ「ライト許可」、かつ、フォーマットフラグ「STD」の場合(ステップS1305:Yes)、ストレージ制御装置101は、キャッシュアロケーション処理を呼び出したステップに戻る。
これにより、読み出し要求時や、トラックTRがノン・スタンダード・トラック(Non−STD)の場合に、ストレージST内のHDDに格納されたトラックTRのトラックデータを、キャッシュメモリ405上にステージングすることができる。
つぎに、図14を用いて、図11に示したステップS1102の検索処理の具体的な処理手順について説明する。
図14は、検索処理の具体的処理手順の一例を示すフローチャートである。図14のフローチャートにおいて、まず、ストレージ制御装置101は、SCHIDEコマンドで指定される検索カウントデータを取得する(ステップS1401)。
つぎに、ストレージ制御装置101は、図12のステップS1207において特定されたブロック番号をもとに、キャッシュメモリ405上のトラックTRのトラックデータから、レコードRのカウント部の情報を読み出す(ステップS1402)。ただし、キャッシュメモリ405上にトラックTRのトラックデータがない場合には、ストレージ制御装置101は、トラックTRのTF情報(レコード長、レコード数)に基づいて、レコードRのカウント部の情報を作成する。レコードRは、特定されたブロック番号を先頭ブロック番号とするレコードである。
そして、ストレージ制御装置101は、レコードRのカウント部の情報(レコード番号)が、取得した検索カウントデータ(レコード番号)と一致するか否かを判断する(ステップS1403)。ここで、検索カウントデータと一致する場合(ステップS1403:Yes)、ストレージ制御装置101は、検索処理を呼び出したステップに戻る。
これにより、検索カウントデータで指定されるレコードRを検索することができる。一方、検索カウントデータと一致しない場合(ステップS1403:No)、ストレージ制御装置101は、検索データが見つからなかった旨のエラー情報を作成して(ステップS1404)、検索処理を呼び出したステップに戻る。
つぎに、図15を用いて、図11に示したステップS1104の書き込み処理の具体的な処理手順について説明する。
図15は、書き込み処理の具体的処理手順の一例を示すフローチャートである。図15のフローチャートにおいて、まず、ストレージ制御装置101は、ライトコマンドで指定される書込データを取得する(ステップS1501)。つぎに、ストレージ制御装置101は、ライトコマンドが、フォーマットライトコマンドであるか否かを判断する(ステップS1502)。
ここで、アップデートライトコマンドの場合(ステップS1502:No)、ストレージ制御装置101は、ステップS1507に移行する。
一方、フォーマットライトコマンドの場合(ステップS1502:Yes)、ストレージ制御装置101は、図14のステップS1402において読み出し/作成されたレコードRのカウント部の情報に基づいて、当該レコードRの次のレコードRの先頭ブロック番号を算出する(ステップS1503)。また、ストレージ制御装置101は、レコードRのカウント部の情報に基づいて、当該レコードRの次のレコードRの先頭セクタ番号を算出する(ステップS1504)。
なお、表3で示したように、2以上のレコードR(例えば、R1,R2)を一括して書き込む場合がある。この場合、ストレージ制御装置101は、ステップS1501において取得された書込データに含まれる書込対象レコードRのカウント部の情報も用いて、順次レコードRの先頭ブロック番号、先頭セクタ番号を算出する。
そして、ストレージ制御装置101は、算出した次のレコードRの先頭ブロック番号および先頭セクタ番号に基づいて、変換テーブル500を更新する(ステップS1505)。具体的には、ストレージ制御装置101は、次のレコードRの先頭セクタ番号への位置付けを行う際に指定されるセクタ番号を、次のレコードRの先頭ブロック番号と対応付けて変換テーブル500に記憶する。
つぎに、ストレージ制御装置101は、キャッシュメモリ405上のトラックTRの先頭ブロックに、更新した変換テーブル500を書き込む(ステップS1506)。そして、ストレージ制御装置101は、キャッシュメモリ405上に、取得した書込データを書き込んで(ステップS1507)、書き込み処理を呼び出したステップに戻る。
具体的には、フォーマットライトコマンドの場合、ストレージ制御装置101は、ステップS1503において算出した次のレコードRの先頭ブロック番号から、取得した書込データの書き込みを行う。一方、アップデートライトコマンドの場合、ストレージ制御装置101は、図12のステップS1207において特定したブロック番号から、取得した書込データの書き込みを行う。
これにより、メインフレーム302からの書き込み要求(FC,UC)に応じて、レコードRを追加・更新することができる。また、メインフレーム302からの書き込み要求(FC)に応じて、変換テーブル500を更新することができる。
なお、ストレージ制御装置101は、ステップS1504において算出した次のレコードRの先頭セクタ番号をメインフレーム302に通知する。具体的には、ストレージ制御装置101は、メインフレーム302からのRSコマンドに対する応答として、直前に処理したレコードRの先頭セクタ番号を通知する。これにより、以降において、メインフレーム302は、書き込み要求(FC)によって新たに追加したレコードRの先頭セクタ番号をもとに、トラックTR上の位置付けを行うことができる。
つぎに、図16を用いて、図11に示したステップS1104の読み出し処理の具体的な処理手順について説明する。
図16は、読み出し処理の具体的処理手順の一例を示すフローチャートである。図16のフローチャートにおいて、まず、ストレージ制御装置101は、図12のステップS1207において特定したブロック番号をもとに、キャッシュメモリ405上のトラックTRからレコードRを読み出す(ステップS1601)。
そして、ストレージ制御装置101は、読み出したレコードRのレコードデータをメインフレーム302に送信して(ステップS1602)、読み出し処理を呼び出したステップに戻る。これにより、メインフレーム302からの読み出し要求に応じて、レコードRを読み出すことができる。
以上説明したように、実施の形態にかかるストレージ制御装置101によれば、メインフレーム302からの書き込み要求(FC)に応じて、変換テーブル500を参照して、書き込み要求(FC)で指定されるセクタ番号に対応するブロック番号を特定することができる。また、ストレージ制御装置101によれば、特定したブロック番号から読み出されるレコードRのフォーマット情報に基づいて、次のレコードRの先頭ブロック番号と先頭セクタ番号とを算出することができる。そして、ストレージ制御装置101によれば、算出した次のレコードRの先頭セクタ番号への位置付けを行う際に指定されるセクタ番号を、算出した次のレコードRの先頭ブロック番号と対応付けて変換テーブル500に記憶することができる。また、ストレージ制御装置101によれば、算出した次のレコードRの先頭ブロック番号から、書き込み要求(FC)で指定される書込データの書き込みを行って、算出した次のレコードRの先頭セクタ番号をメインフレーム302に通知することができる。
これにより、新たに追加されるレコードRに位置付けする際に指定されるセクタ番号を、当該レコードRの先頭ブロックと対応付けて変換テーブル500に登録することができる。また、以降において、メインフレーム302は、書き込み要求(FC)によって新たに追加したレコードRの先頭セクタ番号をもとに、トラックTR上の当該レコードRへの位置付けを行うことができる。
また、ストレージ制御装置101によれば、メインフレーム302からの読み出し要求に応じて、変換テーブル500を参照して、読み出し要求で指定されるセクタ番号に対応するブロック番号を特定することができる。そして、ストレージ制御装置101によれば、特定したブロック番号から、読み出し要求で指定されるレコードRの読み出しを行って、読み出したレコードRのレコードデータをメインフレーム302に送信することができる。
これにより、メインフレーム302からの読み出し要求に応じて、当該読み出し要求で指定されたセクタ番号に対応するレコードRへの位置付けを行って、レコードRを読み出すことができる。
また、ストレージ制御装置101によれば、メインフレーム302からの書き込み要求(UC)に応じて、変換テーブル500を参照して、書き込み要求(UC)で指定されるセクタ番号に対応するブロック番号を特定することができる。そして、ストレージ制御装置101によれば、特定したブロック番号から、書き込み要求(UC)で指定される書込データの書き込みを行うことができる。
これにより、メインフレーム302からの書き込み要求(UC)に応じて、当該書き込み要求(UC)で指定されたセクタ番号に対応するレコードRへの位置付けを行って、レコードRを更新することができる。
また、ストレージ制御装置101によれば、メインフレーム302からの書き込み要求(FC)に応じて、TFT600内のトラックTRのTF情報に基づいて、トラックTRが等長レコードのフォーマットであるか否かを判定することができる。そして、ストレージ制御装置101によれば、トラックTRが等長レコードのフォーマットの場合、TF情報に含まれるデータ長とレコード数とに基づいて、書き込み要求(FC)で指定されるセクタ番号に対応するブロック番号を特定することができる。
これにより、トラックTRがスタンダード・トラック(STD)の場合には、実データ(トラックデータ)をストレージSTから読み出すことなく、TFT600をもとにレコードRの位置付けを行うことで、高速化トラックアクセスを実現することができる。
また、ストレージ制御装置101によれば、キャッシュメモリ405上のトラックTRのトラックデータの先頭ブロックまたは最終ブロックに変換テーブル500を格納することができる。これにより、トラックTRにアクセスする際に、トラックTRのトラックデータから変換テーブル500を読み込んで使用することができる。
これらのことから、実施の形態にかかるストレージシステム300およびストレージ制御装置101によれば、メインフレーム302に接続されたFBA方式のストレージ装置301において、CKD方式のセクタ番号による位置付けを効率的に行うことができる。
なお、本実施の形態で説明した制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本制御プログラムは、ハードディスク、フレキシブルディスク、CD(Compact Disc)−ROM、MO(Magneto−Optical disk)、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本制御プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)FBA(Fixed Block Architecture)方式の記憶装置に対するアクセスを制御するストレージ制御装置であって、
CKD(Count Key Data)方式によって前記記憶装置にアクセスする上位装置からのトラック・フォーマットの変更を伴う書き込み要求に応じて、前記記憶装置のトラックのセクタ番号とブロック番号との対応関係を示す変換情報を参照して、前記書き込み要求で指定されるセクタ番号に対応するブロック番号を特定し、
特定した前記ブロック番号から読み出されるレコードのフォーマット情報に基づいて、前記レコードの次のレコードの先頭ブロック番号と先頭セクタ番号とを算出し、
算出した前記先頭セクタ番号への位置付けを行う際に指定されるセクタ番号を、算出した前記先頭ブロック番号と対応付けて前記変換情報に記憶し、
算出した前記先頭ブロック番号から前記書き込み要求に応じたデータの書き込みを行って、算出した前記先頭セクタ番号を前記上位装置に通知する、
制御部を有することを特徴とするストレージ制御装置。
(付記2)前記制御部は、
前記上位装置からの読み出し要求に応じて、前記変換情報を参照して、前記読み出し要求で指定されるセクタ番号に対応するブロック番号を特定し、
特定した前記ブロック番号から、前記読み出し要求で指定されるレコードの読み出しを行って、読み出した前記レコードのデータを前記上位装置に送信する、ことを特徴とする付記1に記載のストレージ制御装置。
(付記3)前記制御部は、
前記上位装置からのトラック・フォーマットの変更を伴わない書き込み要求に応じて、前記変換情報を参照して、前記書き込み要求で指定されるセクタ番号に対応するブロック番号を特定し、
特定した前記ブロック番号から、前記書き込み要求に応じたデータの書き込みを行う、ことを特徴とする付記1または2に記載のストレージ制御装置。
(付記4)前記上位装置からのトラック・フォーマットの変更を伴う書き込み要求に応じて、前記トラックのトラック・フォーマット情報に基づいて、前記トラックが等長レコードのフォーマットであるか否かを判定し、
前記トラックが等長レコードのフォーマットの場合、前記トラック・フォーマット情報に含まれるデータ長とレコード数とに基づいて、前記書き込み要求で指定されるセクタ番号に対応するブロック番号を特定する、ことを特徴とする付記1〜3のいずれか一つに記載のストレージ制御装置。
(付記5)前記変換情報は、前記記憶装置からキャッシュメモリ上に読み出される前記トラックのデータの先頭ブロックまたは最終ブロックに格納される、ことを特徴とする付記1〜4のいずれか一つに記載のストレージ制御装置。
(付記6)前記制御部は、
前記レコードのフォーマット情報に基づいて、FBA方式による前記レコードの第1のレコード長と、CKD方式による前記レコードの第2のレコード長とを算出し、
算出した前記第1のレコード長と前記レコードの先頭ブロック番号とに基づいて、前記次のレコードの先頭ブロック番号を算出し、
算出した前記第2のレコード長と前記レコードの先頭セクタ番号とに基づいて、前記次のレコードの先頭セクタ番号を算出する、ことを特徴とする付記1〜5のいずれか一つに記載のストレージ制御装置。
(付記7)前記上位装置は、メインフレームコンピュータである、ことを特徴とする付記1〜6のいずれか一つに記載のストレージ制御装置。
(付記8)前記先頭セクタ番号への位置付けを行う際に指定されるセクタ番号は、前記書き込み要求で指定されるセクタ番号の次のセクタ番号から前記先頭セクタ番号の一つ前のセクタ番号までの少なくともいずれかのセクタ番号である、ことを特徴とする付記1〜7のいずれか一つに記載のストレージ制御装置。
(付記9)FBA方式の記憶装置に対するアクセスを制御するコンピュータに、
CKD方式によって前記記憶装置にアクセスする上位装置からのトラック・フォーマットの変更を伴う書き込み要求に応じて、前記記憶装置のトラックのセクタ番号とブロック番号との対応関係を示す変換情報を参照して、前記書き込み要求で指定されるセクタ番号に対応するブロック番号を特定し、
特定した前記ブロック番号から読み出されるレコードのフォーマット情報に基づいて、前記レコードの次のレコードの先頭ブロック番号と先頭セクタ番号とを算出し、
算出した前記先頭セクタ番号への位置付けを行う際に指定されるセクタ番号を、算出した前記先頭ブロック番号と対応付けて前記変換情報に記憶し、
算出した前記先頭ブロック番号から前記書き込み要求に応じたデータの書き込みを行って、算出した前記先頭セクタ番号を前記上位装置に通知する、
処理を実行させることを特徴とする制御プログラム。