(57)【特許請求の範囲】
【請求項１】
第１及び第２の制御部と、前記第１の制御部から前記第２の制御部へデータが伝送される経路上にあって該データを転送する転送部とを有するストレージ制御装置であって、
前記第１の制御部は、
上位装置からライトデータの書込み要求を受け付け、前記ライトデータと、書込み先に関する付加データと、前記転送部の数と同数のダミーデータとを、前記ライトデータ、前記付加データ、前記ダミーデータの順で送信する送信部と、
最後に送信された前記ダミーデータに対する確認応答を送信先の前記転送部から受信した後で前記上位装置に書込みの完了を通知する応答部とを有し、
前記転送部は、
前記付加データのデータ長以下、かつ前記ダミーデータのデータ長以下のサイズを有し、前記付加データ及び前記ダミーデータを格納するためのバッファ領域を含む記憶部と、
受信した前記付加データを前記バッファ領域に格納した後で該付加データに対する確認応答を送信元に送信し、受信した前記ダミーデータを前記バッファ領域に格納した後で該ダミーデータに対する確認応答を前記送信元に送信する通信部とを有する
ストレージ制御装置。
【請求項２】
前記通信部は、
受信した前記付加データに対する確認応答を前記送信元に送信し、転送した該付加データに対する確認応答を転送先から受信した場合に前記バッファ領域を空にし、
受信した前記ダミーデータを空の前記バッファ領域に格納した後で該ダミーデータに対する確認応答を前記送信元に送信し、転送した該ダミーデータに対する確認応答を前記転送先から受信した場合に前記バッファ領域を空にする
請求項１に記載のストレージ制御装置。
【請求項３】
前記バッファ領域は、前記ライトデータの格納にも用いられ、
前記送信部は、
前記ライトデータを送信する前に前記バッファ領域のサイズを該ライトデータを格納可能なサイズに制御する第１の制御命令を送信し、
前記付加データを送信する前に前記バッファ領域のサイズを該付加データの格納用に設定されたサイズに制御する第２の制御命令を送信する
請求項１に記載のストレージ制御装置。
【請求項４】
前記バッファ領域のサイズは固定され、前記転送部は、前記バッファ領域とは別に前記ライトデータを格納するための他のバッファ領域をさらに有する
請求項１に記載のストレージ制御装置。
【請求項５】
前記送信部は、前記付加データ及び前記ダミーデータそれぞれに対し、前記ライトデータに付加されるデータであることを示す第１のヘッダ情報と、前記付加データと前記ダミーデータとを区別するための第２のヘッダ情報とを付加し、
前記第２の制御部は、前記第１のヘッダ情報に基づいて前記ライトデータの後に受信した前記付加データ及び前記ダミーデータを判別し、前記第２のヘッダ情報に基づいて該付加データの後に受信した前記ダミーデータを判別し、判別した該ダミーデータを破棄する
請求項１に記載のストレージ制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ制御装置に関する。
【背景技術】
【０００２】
ストレージシステムは、データを多重化することで信頼性を保証している。例えば、ストレージシステムは、データが格納されるＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）などの記憶装置を冗長化することで信頼性を高めている。また、記憶装置に対するデータの読み書きを制御するコントローラモジュール（以下、ＣＭ）を多重化し、複数のＣＭのメモリにライトデータを格納した後で記憶装置に書込むストレージシステムがある。このストレージシステムでは記憶装置の前段でライトデータが多重化されるため、さらに信頼性を高めることができる。
【０００３】
上記のストレージシステムでは、複数のＣＭで同じライトデータを共有するために、１つのＣＭがホストコンピュータから受信したライトデータは他のＣＭへと伝送される。ＣＭ同士は、例えば、ＰＣＩ  Ｅｘｐｒｅｓｓ（以下、ＰＣＩｅ）などのＩ／Ｏシリアルインターフェースを介して接続される。そして、一方のＣＭが有するＣＰＵ（Central Processing Unit）と、他方のＣＭが有するＣＰＵとの間には、例えば、ＰＣＩｅスイッチなどのバッファメモリを備えたデバイスが存在する。
【０００４】
上記のように、ＣＭを多重化することで信頼性は向上するが、ＣＭ間通信におけるデータの到達保証が実現できれば、さらに信頼性を向上することができる。データ通信網における到達保証については、通信バッファを有するデータ通信網を介して接続された送信手段と受信手段との間で処理データの到達保証を実現する技術が提案されている。この送信手段は、処理データに続いて、通信バッファ長より長いパケット長を有するダミーデータを送信し、ダミーデータに先行する処理データが受信手段へと到達したことを保証する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平６−１６４５７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記の技術における通信バッファは、格納したデータの送信元に対して応答を返すことはない。一方、ＰＣＩｅスイッチなど、ＣＭ間に介在するデバイスには、バッファメモリにデータを格納したタイミングでデータの受信が完了した旨の応答（以下、ＡＣＫ：Acknowledgement）を返す中継デバイスがある。
【０００７】
上記のような中継デバイスがあると、受信側のＣＭにあるメモリにデータを格納するＣＰＵまでデータが到達していないのに、中継デバイスから受けたＡＣＫに応じて送信側のＣＭがデータの受信完了を上位装置に返してしまう可能性が生じる。ＡＣＫを返した中継デバイスの後段でデータに異常が生じるリスクもあるから、このような中継デバイスを想定したＣＭ間通信の到達保証を実現することが信頼性のさらなる向上に寄与する。
【０００８】
１つの側面によれば、本開示の目的は、通信経路に中継デバイスを挟むコントローラ間通信の到達保証を実現可能なストレージ制御装置を提供することにある。
【課題を解決するための手段】
【０００９】
１つの側面によれば、第１及び第２の制御部と、第１の制御部から第２の制御部へデータが伝送される経路上にあって該データを転送する転送部とを有するストレージ制御装置が提供される。第１の制御部は、上位装置からライトデータの書込み要求を受け付け、ライトデータと、書込み先に関する付加データと、転送部の数と同数のダミーデータとを順に送信する送信部と、最後に送信されたダミーデータに対する確認応答を送信先の転送部から受信した後で上位装置に書込みの完了を通知する応答部とを有する。転送部は、付加データ及びダミーデータのデータ長以下のサイズを有し、付加データ及びダミーデータを格納するためのバッファ領域を含む記憶部と、受信した付加データをバッファ領域に格納した後で該付加データに対する確認応答を送信元に送信し、受信したダミーデータをバッファ領域に格納した後で該ダミーデータに対する確認応答を送信元に送信する通信部とを有する。
【発明の効果】
【００１０】
本開示によれば、通信経路に中継デバイスを挟むコントローラ間通信の到達保証を実現することが可能になる。
【図面の簡単な説明】
【００１１】
【図１】第１実施形態に係るストレージシステムの一例を示した図である。
【図２】第２実施形態に係るストレージシステムの一例を示した図である。
【図３】第２実施形態に係るＣＭ間通信の一例を示した図である。
【図４】第２実施形態に係る制御データのパケット構造の一例を示した図である。
【図５】データ区間及び制御区間について説明するための図である。
【図６】第２実施形態に係るダミーデータのパケット構造の一例を示した図である。
【図７】第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第１のシーケンス図である。
【図８】第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第２のシーケンス図である。
【図９】第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第３のシーケンス図である。
【図１０】第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第４のシーケンス図である。
【図１１】第２実施形態の一変形例に係るＣＭ間通信の一例を示した図である。
【図１２】第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第１のシーケンス図である。
【図１３】第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第２のシーケンス図である。
【図１４】第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第３のシーケンス図である。
【図１５】第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第４のシーケンス図である。
【図１６】第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第５のシーケンス図である。
【図１７】第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第６のシーケンス図である。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照しながら、本発明の実施形態について説明する。なお、本明細書及び図面において実質的に同一の機能を有する要素については、同一の符号を付することにより重複説明を省略する場合がある。
【００１３】
＜１．第１実施形態＞
図１を参照しながら、第１実施形態について説明する。図１は、第１実施形態に係るストレージシステムの一例を示した図である。
【００１４】
第１実施形態は、記憶装置に対するデータの読み書きを制御するストレージ制御装置の内部におけるＣＭ間通信に関し、バッファメモリを有する中継デバイスがＣＭ間に介在する場合でもデータの到達保証を実現できるストレージシステムを提供する。
【００１５】
図１に示すように、第１実施形態に係るストレージシステムは、上位装置１０、ストレージ制御装置２０、及び記憶装置３０を含む。
上位装置１０は、ホストコンピュータとして動作するサーバなどである。ストレージ制御装置２０は、上位装置１０から受け付けた書込み要求や読出し要求に応じて記憶装置３０に対するデータの読み書きを制御する。記憶装置３０は、ＨＤＤやＳＳＤなどである。記憶装置３０は、複数のＨＤＤやＳＳＤを組み合わせて冗長化したＲＡＩＤ（Redundant Array of Inexpensive Disks）装置であってもよい。
【００１６】
ストレージ制御装置２０は、第１の制御部２１、転送部２２、２３、及び第２の制御部２４を有する。なお、ＣＭのＣＰＵは、第１の制御部２１及び第２の制御部２４の一例である。ＣＭ間通信の主体となるＣＰＵ同士を接続するＰＣＩｅスイッチは、転送部２２、２３の一例である。
【００１７】
図１の例では、第１の制御部２１の後段に転送部２２が接続され、転送部２２の後段に転送部２３が接続され、転送部２３の後段に２４が接続されている。つまり、転送部２２、２３は、第１の制御部２１から第２の制御部２４へデータが伝送される経路上にある。そして、転送部２２、２３は、第１の制御部２１と第２の制御部２４との間で送受信されるデータを転送する中継デバイスとして動作する。
【００１８】
第１の制御部２１は、送信部２１ａ及び応答部２１ｂを有する。
送信部２１ａは、上位装置１０からライトデータＷＤの書込み要求を受け付け、ライトデータＷＤと、書込み先に関する付加データＴＤと、経路上に介在する転送部（転送部２２、２３）の数と同数のダミーデータＤＤ１、ＤＤ２とを順に送信する。送信部２１ａは、ライトデータＷＤを分割して、予め設定されたデータ長（例えば、１２８Byte）を有する複数の分割データを生成し、これら複数の分割データを順次送信してもよい。
【００１９】
付加データＴＤは、例えば、ライトデータＷＤの書込み先アドレスなど、ライトデータＷＤが書き込まれるキャッシュメモリ（非図示）の物理アドレスと論理アドレスとを対応付ける管理テーブルの更新に用いる情報を含む。付加データＴＤのデータ長は、例えば、１２８Byteなどに設定される。ダミーデータＤＤ１、ＤＤ２は、付加データＴＤと同じデータ長を有し、例えば、Ｎｕｌｌデータなどの意味のないデータを含む。
【００２０】
応答部２１ｂは、送信部２１ａにより最後に送信されたダミーデータＤＤ２に対する確認応答（ＡＣＫ）を転送部２２から受信した後で上位装置１０に書込みの完了を通知する。図１の例では、ライトデータＷＤ、付加データＴＤ、ダミーデータＤＤ１、ダミーデータＤＤ２の順で送信部２１ａから転送部２２に送信されるから、最後に送信されたデータは、ダミーデータＤＤ２になる。
【００２１】
転送部２２は、記憶部２２ｂを有する。記憶部２２ｂには、ライトデータＷＤを格納するためのバッファ領域であるＢｕｆｆｅｒ１と、付加データＴＤ及びダミーデータＤＤ１、ＤＤ２を格納するためのバッファ領域であるＢｕｆｆｅｒ２とが設けられている。Ｂｕｆｆｅｒ２は、付加データＴＤ及びダミーデータＤＤ１、ＤＤ２のデータ長以下のサイズ（例えば、１２８Byte）に設定されている。
【００２２】
転送部２３は、記憶部２３ｂを有する。記憶部２３ｂには、ライトデータＷＤを格納するためのバッファ領域であるＢｕｆｆｅｒ３と、付加データＴＤ及びダミーデータＤＤ１、ＤＤ２を格納するためのバッファ領域であるＢｕｆｆｅｒ４とが設けられている。Ｂｕｆｆｅｒ４は、付加データＴＤ及びダミーデータＤＤ１、ＤＤ２のデータ長以下のサイズ（例えば、１２８Byte）に設定されている。
【００２３】
なお、記憶部２２ｂ、２３ｂの機能は、ＲＡＭ（Random Access Memory）などの揮発性記憶装置、又はＨＤＤやフラッシュメモリなどの不揮発性記憶装置を用いて実現できる。
以下、図１に下段に示したシーケンスの例を参考に、転送部２２が有する通信部２２ａ、及び転送部２３が有する通信部２３ａについて説明する。
【００２４】
通信部２２ａは、第１の制御部２１からライトデータＷＤを受信し、Ｂｕｆｆｅｒ１に格納した後、Ｂｕｆｆｅｒ１に格納したライトデータＷＤを転送部２２に送信すると共に、ライトデータＷＤに対するＡＣＫを第１の制御部２１に送信する。
【００２５】
通信部２３ａは、転送部２２からライトデータＷＤを受信し、Ｂｕｆｆｅｒ３に格納した後、Ｂｕｆｆｅｒ３に格納したライトデータＷＤを第２の制御部２４に送信すると共に、ライトデータＷＤに対するＡＣＫを転送部２２に送信する。なお、ライトデータＷＤを受信した第２の制御部２４は、転送部２３にＡＣＫを返す。
【００２６】
通信部２２ａからＡＣＫを受信した第１の制御部２１は、送信部２１ａにより付加データＴＤを転送部２２に送信する。転送部２２のＢｕｆｆｅｒ２が空になっていない場合、通信部２２ａは、第１の制御部２１に対してＮＡＣＫを返す。ＮＡＣＫを受信した第１の制御部２１は、送信部２１ａにより再び付加データＴＤを転送部２２に送信する。
【００２７】
なお、Ｂｕｆｆｅｒ２が空になるまで、第１の制御部２１から転送部２２への付加データＴＤの送信と、転送部２２から第１の制御部２１へのＮＡＣＫの返信とが繰り返される。
【００２８】
Ｂｕｆｆｅｒ２が空になった場合、通信部２２ａは、第１の制御部２１から付加データＴＤを受信し、受信した付加データＴＤをＢｕｆｆｅｒ２に格納した後で付加データＴＤに対するＡＣＫを第１の制御部２１（付加データＴＤの送信元）に送信する。また、通信部２２ａは、Ｂｕｆｆｅｒ２に格納した付加データＴＤを転送部２３に送信する。
【００２９】
転送部２３のＢｕｆｆｅｒ４が空になっていない場合、通信部２３ａは、転送部２２に対してＮＡＣＫを返す。ＮＡＣＫを受信した転送部２２は、通信部２２ａにより再び付加データＴＤを転送部２３に送信する。
【００３０】
なお、Ｂｕｆｆｅｒ４が空になるまで、転送部２２から転送部２３への付加データＴＤの送信と、転送部２３から転送部２２へのＮＡＣＫの返信とが繰り返される。
Ｂｕｆｆｅｒ４が空になった場合、通信部２３ａは、転送部２２から付加データＴＤを受信し、受信した付加データＴＤをＢｕｆｆｅｒ４に格納した後で付加データＴＤに対するＡＣＫを転送部２２（付加データＴＤの送信元）に送信する。また、通信部２３ａは、Ｂｕｆｆｅｒ４に格納した付加データＴＤを第２の制御部２４に送信する。付加データＴＤを受信した第２の制御部２４は、転送部２３にＡＣＫを返す。
【００３１】
通信部２２ａから付加データＴＤに対応するＡＣＫを受信した第１の制御部２１は、送信部２１ａによりダミーデータＤＤ１を転送部２２に送信する。転送部２２のＢｕｆｆｅｒ２が空になっていない場合、通信部２２ａは、第１の制御部２１に対してＮＡＣＫを返す。ＮＡＣＫを受信した第１の制御部２１は、送信部２１ａにより再びダミーデータＤＤ１を転送部２２に送信する。
【００３２】
なお、Ｂｕｆｆｅｒ２が空になるまで、第１の制御部２１から転送部２２へのダミーデータＤＤ１の送信と、転送部２２から第１の制御部２１へのＮＡＣＫの返信とが繰り返される。
【００３３】
転送部２３から付加データＴＤに対応するＡＣＫを受信した後、通信部２２ａは、Ｂｕｆｆｅｒ２を空にする（Ｂｕｆｆｅｒ２  ｃｌｅａｒ）。
Ｂｕｆｆｅｒ２を空にした通信部２２ａは、第１の制御部２１からダミーデータＤＤ１を受信し、受信したダミーデータＤＤ１をＢｕｆｆｅｒ２に格納した後でダミーデータＤＤ１に対するＡＣＫを第１の制御部２１（ダミーデータＤＤ１の送信元）に送信する。また、通信部２２ａは、Ｂｕｆｆｅｒ２に格納したダミーデータＤＤ１を転送部２３に送信する。
【００３４】
転送部２３のＢｕｆｆｅｒ４が空になっていない場合、通信部２３ａは、転送部２２に対してＮＡＣＫを返す。ＮＡＣＫを受信した転送部２２は、通信部２２ａにより再びダミーデータＤＤ１を転送部２３に送信する。
【００３５】
なお、Ｂｕｆｆｅｒ４が空になるまで、転送部２２から転送部２３へのダミーデータＤＤ１の送信と、転送部２３から転送部２２へのＮＡＣＫの返信とが繰り返される。
第２の制御部２４から付加データＴＤに対応するＡＣＫを受信した通信部２３ａは、Ｂｕｆｆｅｒ４を空にする（Ｂｕｆｆｅｒ４  ｃｌｅａｒ）。
【００３６】
Ｂｕｆｆｅｒ４を空にした通信部２３ａは、転送部２２からダミーデータＤＤ１を受信し、受信したダミーデータＤＤ１をＢｕｆｆｅｒ４に格納した後でダミーデータＤＤ１に対するＡＣＫを転送部２２（ダミーデータＤＤ１の送信元）に送信する。
【００３７】
また、通信部２３ａは、Ｂｕｆｆｅｒ４に格納したダミーデータＤＤ１を第２の制御部２４に送信する。ダミーデータＤＤ１を受信した第２の制御部２４は、転送部２３にＡＣＫを返す。
【００３８】
通信部２２ａからダミーデータＤＤ１に対応するＡＣＫを受信した第１の制御部２１は、送信部２１ａによりダミーデータＤＤ２を転送部２２に送信する。転送部２２のＢｕｆｆｅｒ２が空になっていない場合、通信部２２ａは、第１の制御部２１に対してＮＡＣＫを返す。ＮＡＣＫを受信した第１の制御部２１は、送信部２１ａにより再びダミーデータＤＤ２を転送部２２に送信する。
【００３９】
なお、Ｂｕｆｆｅｒ２が空になるまで、第１の制御部２１から転送部２２へのダミーデータＤＤ２の送信と、転送部２２から第１の制御部２１へのＮＡＣＫの返信とが繰り返される。
【００４０】
転送部２３からＡＣＫを受信した通信部２２ａは、Ｂｕｆｆｅｒ２を空にする（Ｂｕｆｆｅｒ２  ｃｌｅａｒ）。Ｂｕｆｆｅｒ２を空にした通信部２２ａは、第１の制御部２１からダミーデータＤＤ２を受信し、受信したダミーデータＤＤ２をＢｕｆｆｅｒ２に格納した後でダミーデータＤＤ２に対するＡＣＫを第１の制御部２１（ダミーデータＤＤ２の送信元）に送信する。また、通信部２２ａは、Ｂｕｆｆｅｒ２に格納したダミーデータＤＤ２を転送部２３に送信する。
【００４１】
第２の制御部２４からＡＣＫを受信した通信部２３ａは、Ｂｕｆｆｅｒ４を空にする（Ｂｕｆｆｅｒ４  ｃｌｅａｒ）。Ｂｕｆｆｅｒ４を空にした通信部２３ａは、転送部２２からダミーデータＤＤ２を受信し、受信したダミーデータＤＤ２をＢｕｆｆｅｒ４に格納した後でダミーデータＤＤ２に対するＡＣＫを転送部２２（ダミーデータＤＤ２の送信元）に送信する。また、通信部２３ａは、Ｂｕｆｆｅｒ４に格納したダミーデータＤＤ２を第２の制御部２４に送信する。ダミーデータＤＤ２を受信した第２の制御部２４は、転送部２３にＡＣＫを返す。
【００４２】
転送部２２からＡＣＫを受信した応答部２１ｂは、上位装置１０に対してライトデータＷＤの書込み完了を通知する。上記のように、Ｂｕｆｆｅｒ２、４のサイズを付加データＴＤのデータ長以下に制限することにより、付加データＴＤ、ダミーデータＤＤ１、ＤＤ２が順次中継デバイスから突き出される形で転送される。そのため、第１の制御部２１がダミーデータＤＤ２に対するＡＣＫを受信した段階で、付加データＴＤが第２の制御部２４に到達することになり、付加データＴＤ及びライトデータＷＤの到達保証がされる。
【００４３】
なお、図１の例ではＢｕｆｆｅｒ１、２を分けて記載しているが、サイズを変更することが可能な１つのバッファ領域を利用して上記の到達保証を実現することもできる。例えば、ライトデータＷＤの転送前にバッファ領域のサイズをライトデータＷＤの格納に適したサイズに変更し、付加データＴＤの転送前にバッファ領域のサイズを付加データＴＤのデータ長以下に変更する方法が考えられる。Ｂｕｆｆｅｒ３、４についても同様である。
【００４４】
この方法を適用すると、バッファ領域のサイズを変更する制御が追加される一方、付加データＴＤ及びダミーデータＤＤ１、ＤＤ２の格納用に別途バッファ領域を設けなくて済むようになる。このような変形も第１実施形態の技術的範囲に属する。
【００４５】
以上、第１実施形態について説明した。
＜２．第２実施形態＞
次に、第２実施形態について説明する。第２実施形態は、ストレージシステムにおけるＣＭ間通信に関し、通信バッファを有する中継デバイスがＣＭ間に介在する場合でもデータの到達保証を実現できるストレージシステムを提供する。
【００４６】
［２−１．システム］
図２を参照しながら、第２実施形態に係るストレージシステムについて説明する。図２は、第２実施形態に係るストレージシステムの一例を示した図である。
【００４７】
図２に示すように、第２実施形態に係るストレージシステムは、サーバ１００、ストレージ制御装置２００、及び記憶装置３００を有する。
サーバ１００は、ホストコンピュータとして機能する情報処理装置である。ストレージ制御装置２００は、サーバ１００から受けた書込み要求や読出し要求に応じて記憶装置３００に対するデータの読み書きを制御する。記憶装置３００は、ＨＤＤやＳＳＤなどである。記憶装置３００は、複数のＨＤＤやＳＳＤを組み合わせて冗長化したＲＡＩＤ装置であってもよい。
【００４８】
ストレージ制御装置２００は、コントローラモジュール（ＣＭ）２０１、２０２を有する。ＣＭ２０１は、メモリ２１１、ＣＰＵ２１２、エキスパンダ２１３、ＦＣ（Fibre Channel）コントローラ２１４、及びＰＣＩｅスイッチ２１５を有する。同様に、ＣＭ２０２は、メモリ２２１、ＣＰＵ２２２、エキスパンダ２２３、ＦＣコントローラ２２４、及びＰＣＩｅスイッチ２２５を有する。
【００４９】
なお、図２に例示したストレージシステムでは、ＣＭ２０１、２０２が同じストレージ制御装置２００の筐体内にあるが、ＣＭ２０１、２０１が異なるストレージ制御装置に搭載され、ストレージ制御装置間のチャネルを介して接続されていてもよい。ここでは、説明の都合上、ストレージ制御装置２００の筐体内にＣＭ２０１、２０２が含まれる例について説明する。
【００５０】
メモリ２１１、２２１は、ＲＡＭ、ＨＤＤ、フラッシュメモリなどである。エキスパンダ２１３は、ＳＡＳ（Serial Attached SCSI）のホストコントローラとなるＣＰＵ２１２と、エンドデバイスとなる記憶装置３００などとを接続する拡張デバイスである。同様に、エキスパンダ２２３は、ＳＡＳのホストコントローラとなるＣＰＵ２２２と、エンドデバイスとなる記憶装置３００などとを接続する拡張デバイスである。エキスパンダ２１３、２２３は相互に接続されている。また、エキスパンダ２１３はＣＰＵ２２２に、エキスパンダ２２３はＣＰＵ２１２にも接続されている。
【００５１】
ＦＣコントローラ２１４、２２４は、ＦＣによりサーバ１００と接続するための通信インターフェースである。ＰＣＩｅスイッチ２１５、２２５は、Upstream側に接続されたデバイスと、Downstream側に接続されたデバイスとをＰＣＩｅ接続するスイッチである。また、ＰＣＩｅスイッチ２１５、２２５は、ＮＴＢ（Non Transparent Bridge）機能を有し、ＰＣＩｅスイッチ２１５に接続されたデバイス群と、ＰＣＩｅスイッチ２２５に接続されたデバイス群との通信を可能にする。また、ＰＣＩｅスイッチ２１５、２２５は、ＣＰＵなどのプロセッサを有する。
【００５２】
［２−２．ＣＭ間通信］
ここで、図３〜図６を参照しながら、ＣＭ間通信について説明する。
図３は、第２実施形態に係るＣＭ間通信の一例を示した図である。
【００５３】
図３に示すように、ＰＣＩｅスイッチ２１５は、通信バッファとして利用するバッファメモリを有し、バッファ領域としてデータバッファ２１５Ａ及びＴＢＬバッファ２１５Ｂが設定されている。同様に、ＰＣＩｅスイッチ２２５も、通信バッファとして利用するバッファメモリを有し、バッファ領域としてデータバッファ２２５Ａ及びＴＢＬバッファ２２５Ｂが設定されている。
【００５４】
データバッファ２１５Ａ、２２５Ａは、書込み処理や読出し処理の対象データを格納するためのバッファ領域である。ＴＢＬバッファ２１５Ｂ、２２５Ｂは、対象データに付加される制御データ、及びダミーデータを格納するためのバッファ領域である。ＴＢＬバッファ２１５Ｂ、２２５Ｂは、制御データのデータ長以下のサイズに設定されている。なお、ＣＰＵ２２２も通信バッファとして用いるバッファ２２２Ａを有する。
【００５５】
図３の例は、ＣＰＵ２１２がサーバ１００から書込み要求と共に受信したライトデータをＣＰＵ２２２に伝送するＣＭ間通信の状況を示している。この場合、ＣＰＵ２１２は、ライトデータを分割して単位サイズ（例えば、１２８Byte）のデータ＃１、…、データ＃Ｎを生成する。また、ＣＰＵ２１２は、制御データを生成する。制御データは、例えば、書込み先のアドレスなど、ＣＰＵ２２２がライトデータをキャッシュするメモリ２２１の物理アドレスと論理アドレスとを対応付ける管理テーブルの更新に用いる情報を含む。
【００５６】
また、ＣＰＵ２１２は、ＣＰＵ２１２、２２２間に介在する中継デバイス（この例ではＰＣＩｅスイッチ２１５、２２５）の数と同数のダミーデータを生成する。このとき、ＣＰＵ２１２は、ＣＰＵ２１２、２２２間の通信経路に位置し、通信バッファにデータを格納したタイミングで確認応答（ＡＣＫ）を返す中継デバイスを基準とする。図３の例では、２つのダミーデータが生成される。ダミーデータは、例えば、制御データと同じデータ長を有し、Ｎｕｌｌデータなどの意味のないデータを含む。
【００５７】
制御データは、図４に示すようなパケット構造を有する。図４は、第２実施形態に係る制御データのパケット構造の一例を示した図である。図４に示すように、制御データのパケットは、２つのヘッダ＃１、＃２を有し、その後に管理テーブルの更新に用いる情報などを含む制御情報が付加された構造を有する。
【００５８】
ヘッダ＃１は、制御区間（図５を参照）のデータであることを識別するためのタグ情報を含む。ここでは、図５に示すように、ライトデータから生成されたデータ＃１、…、データ＃Ｎを含む部分をデータ区間、制御データ及びダミーデータを含む部分を制御区間と呼んでいる。図５は、データ区間及び制御区間について説明するための図である。ヘッダ＃２は、制御データであることを識別するためのタグ情報を含む。
【００５９】
図６に示すように、ダミーデータのパケットもヘッダ＃１、＃２を含む。図６は、第２実施形態に係るダミーデータのパケット構造の一例を示した図である。ダミーデータのヘッダ＃１は、制御データのヘッダ＃１と同じタグ情報を含む。一方、ダミーデータのヘッダ＃２には、ダミーデータであることを識別するためのタグ情報が含まれる。そして、ヘッダ＃１、＃２の後にＮｕｌｌデータなどが付加される。
【００６０】
ＣＰＵ２１２は、図３に示すように、上記のパケット構造を有するデータ＃１、…、データ＃Ｎ、制御データ、及び２つのダミーデータを順にＰＣＩｅスイッチ２１５に送信する。
【００６１】
ＰＣＩｅスイッチ２１５は、データ＃１、…、データ＃Ｎを受信すると、それぞれデータバッファ２１５Ａに格納してからＣＰＵ２１２にＡＣＫを返す。また、ＰＣＩｅスイッチ２１５は、データバッファ２１５Ａに格納したデータ＃１、…、データ＃ＮをＰＣＩｅスイッチ２２５に送信する。
【００６２】
ＰＣＩｅスイッチ２２５は、データ＃１、…、データ＃Ｎを受信すると、それぞれデータバッファ２２５Ａに格納してからＰＣＩｅスイッチ２１５にＡＣＫを返す。また、ＰＣＩｅスイッチ２２５は、データバッファ２２５Ａに格納したデータ＃１、…、データ＃ＮをＣＰＵ２２２に送信する。ＣＰＵ２２２は、データ＃１、…、データ＃Ｎを受信すると、それぞれバッファ２２２Ａに格納してからＰＣＩｅスイッチ２２５にＡＣＫを返す。
【００６３】
ＰＣＩｅスイッチ２１５は、制御データを受信すると、ＴＢＬバッファ２１５Ｂに格納してからＣＰＵ２１２にＡＣＫを返す。また、ＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂに格納した制御データをＰＣＩｅスイッチ２２５に送信する。なお、ＴＢＬバッファ２１５Ｂのサイズが制御データのデータ長より小さい場合には、制御データは分割して送信される。ここでは、説明の都合上、ＴＢＬバッファ２１５Ｂ、２２５Ｂのサイズ、制御データのデータ長、ダミーデータのデータ長は同じとする。
【００６４】
ＰＣＩｅスイッチ２２５は、制御データを受信すると、ＴＢＬバッファ２２５Ｂに格納してからＰＣＩｅスイッチ２１５にＡＣＫを返す。また、ＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂに格納した制御データをＣＰＵ２２２に送信する。ＣＰＵ２２２は、制御データを受信すると、バッファ２２２Ａに格納してからＰＣＩｅスイッチ２２５にＡＣＫを返す。
【００６５】
ＰＣＩｅスイッチ２２５からＡＣＫを受信したＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂを空にする。その後、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２からダミーデータを受信する。そして、ＰＣＩｅスイッチ２１５は、受信したダミーデータをＴＢＬバッファ２１５Ｂに格納してからＣＰＵ２１２にＡＣＫを返す。
【００６６】
ＣＰＵ２２２からＡＣＫを受信したＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂを空にする。その後、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５からダミーデータを受信する。そして、ＰＣＩｅスイッチ２２５は、受信したダミーデータをＴＢＬバッファ２２５Ｂに格納してからＰＣＩｅスイッチ２１５にＡＣＫを返す。
【００６７】
ＣＰＵ２１２は、データ＃１、…、データ＃Ｎ、制御データ、２つのダミーデータの全てについてＡＣＫを受信した後、サーバ１００に対して書込み完了を示す応答を返す。ＣＰＵ２２２は、受信したダミーデータを破棄する。ＣＰＵ２２２は、上述したヘッダ＃１、＃２を参照することで、受信したデータがデータ＃１、…、データ＃Ｎであるか、制御データであるか、ダミーデータであるかを判断できる。なお、ＣＰＵ２２２は、ヘッダ＃１を参照して制御区間を判別し、制御データに続くデータをダミーデータと判断してもよい。
【００６８】
上記のように、ＴＢＬバッファ２１５Ｂ、２２５Ｂを適切なサイズに設定し、制御データに続いて２つのダミーデータを順次送信することで、各バッファから各データが突き出される形で転送されるため、制御データ以前のデータについて到達保証ができる。つまり、最後のダミーデータについてＣＰＵ２１２がＡＣＫを受信した時点で制御データがＣＰＵ２２２に到達していることになり、そのデータ以前のデータが到達保証される。
【００６９】
（ＴＢＬバッファ２１５Ｂ、２２５Ｂの効用）
例えば、サーバ１００からデータを受信したＣＰＵ２１２は、そのデータをメモリ２１１に書き込む。ＣＰＵ２１２は、複数ＣＭによる多重化を実現するため、ＤＭＡ（Direct Memory Access）を利用してメモリ２２１へのデータコピーを開始する。ＤＭＡによるデータ伝送では、通信経路上にある次段のデバイス（ＰＣＩｅスイッチ２１５）からＡＣＫが返ってきた段階で、ＣＰＵ２１２がＤＭＡ転送が完了したと判断する。
【００７０】
ＰＣＩｅスイッチ２１５がＤＭＡ転送されるデータのデータ長より大きなバッファ領域を通信バッファとして利用すると仮定した場合、最終段に位置するＣＰＵ２２２までデータが到達する前にＤＭＡ転送が完了したと判断される。そのため、ＣＰＵ２２２でデータの異常が検出され、ＣＭ間通信がリンクダウンされた場合でも、サーバ１００に対し、ＣＰＵ２１２が完了通知を送信してしまう。
【００７１】
しかし、これまで説明してきたように、ＴＢＬバッファ２１５Ｂ、２２５Ｂを利用し、中継デバイスの数と同数のダミーデータを送信することで、完了通知を誤送信するリスクを回避することができる。なお、ＣＰＵ２２２に到達し、メモリ２２１に書き込まれたデータをＣＰＵ２１２がＤＭＡ転送により再び取得し、到達完了を確認する方法も考えられるが、余分な転送処理が応答の遅延や負荷の増大などの性能劣化要因となる。しかし、これまで説明してきた方法によれば、このような性能劣化のリスクも生じない。
【００７２】
以上、第２実施形態に係るＣＭ間通信について説明した。
［２−３．シーケンス］
次に、図７〜図１０を参照しながら、第２実施形態に係るストレージシステムにおける書込み処理のシーケンスについて、さらに説明する。
【００７３】
（ライトデータの伝送）
まず、図７を参照する。図７は、第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第１のシーケンス図である。
【００７４】
（Ｓ１０１）サーバ１００は、ＣＭ２０１に対してデータの書込み要求（Ｒｅｑｕｅｓｔ（Ｗ））を送信する。サーバ１００から送信された書込み要求は、ＦＣコントローラ２１４により受信され、ＰＣＩｅスイッチ２１５を介してＣＰＵ２１２に入力される。書込み要求を受けたＣＰＵ２１２は、ＣＭ２０２のＣＰＵ２２２に書込み対象のデータ（以下、ユーザデータ）を送信するＣＭ間通信の処理を開始する。
【００７５】
（Ｓ１０２）ＣＰＵ２１２は、ユーザデータに付加するヘッダを生成する。例えば、ＣＰＵ２１２は、データ区間と制御区間と（図５を参照）を区別するタグ情報を含むヘッダ＃１を生成する。
【００７６】
（Ｓ１０３）ＣＰＵ２１２は、ユーザデータを分割し、予め設定された単位サイズ（例えば、１２８Byte）を有する分割データを生成する。そして、ＣＰＵ２１２は、Ｓ１０２で生成したヘッダ＃１を各分割データに付加する。なお、以下の説明では、分割データを単にユーザデータと呼ぶ場合がある。
【００７７】
（Ｓ１０４）ＣＰＵ２１２は、Ｓ１０３で生成した分割データ（Ｄａｔａ）を順次ＰＣＩｅスイッチ２１５に送信する。
（Ｓ１０５）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータがユーザデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１にデータ区間を示すタグ情報を含む場合にはユーザデータであると判定する。Ｓ１０４でＣＰＵ２１２から送信されたデータは分割データであるから、ＰＣＩｅスイッチ２１５は、このデータをユーザデータであると判定する。
【００７８】
（Ｓ１０６）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信した分割データをデータバッファ２１５Ａ（Ｄ−Ｂｕｆｆｅｒ）に格納する。データバッファ２１５Ａは、分割データのデータ長である単位サイズより大きなサイズ（例えば、２５ＫByte）に設定されていてもよい。
【００７９】
（Ｓ１０７）ＰＣＩｅスイッチ２１５は、分割データの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。このＡＣＫを受けてＣＰＵ２１２は次の分割データをＰＣＩｅスイッチ２１５に送信する。つまり、次の分割データについて、Ｓ１０４からＳ１１４までの処理（図７の符号Ａを付した範囲）が実行開始される。
【００８０】
（Ｓ１０８）ＰＣＩｅスイッチ２１５は、データバッファ２１５Ａに格納した分割データをＰＣＩｅスイッチ２２５に送信する。
（Ｓ１０９）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータがユーザデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１にデータ区間を示すタグ情報を含む場合にはユーザデータであると判定する。Ｓ１０８でＰＣＩｅスイッチ２１５から送信されたデータは分割データであるから、ＰＣＩｅスイッチ２２５は、受信したデータをユーザデータであると判定する。
【００８１】
（Ｓ１１０）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信した分割データをデータバッファ２２５Ａ（Ｄ−Ｂｕｆｆｅｒ）に格納する。データバッファ２２５Ａは、分割データのサイズである単位サイズより大きなサイズ（例えば、２５ＫByte）に設定されていてもよい。
【００８２】
（Ｓ１１１）ＰＣＩｅスイッチ２２５は、分割データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。このＡＣＫを受けてＰＣＩｅスイッチ２１５はデータバッファ２１５Ａにある次の分割データをＰＣＩｅスイッチ２２５に送信する。
【００８３】
（Ｓ１１２）ＰＣＩｅスイッチ２２５は、データバッファ２２５Ａに格納した分割データをＣＰＵ２２２に送信する。
（Ｓ１１３）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信した分割データをバッファ２２２Ａに格納する。
【００８４】
（Ｓ１１４）ＣＰＵ２２２は、分割データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。このＡＣＫを受けてＰＣＩｅスイッチ２２５はデータバッファ２２５Ａにある次の分割データをＣＰＵ２２２に送信する。なお、符号Ａの範囲にある処理が全ての分割データについて実行される。
【００８５】
（制御データ・ダミーデータの伝送）
次に、図８を参照する。ＣＰＵ２１２は、全ての分割データをＰＣＩｅスイッチ２１５に送信した後、制御データ及びダミーデータの送信を開始する。そして、処理は、図８のＳ１２１へと進む。
【００８６】
以下、図８〜図１０を順次参照する。図８は、第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第２のシーケンス図である。図９は、第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第３のシーケンス図である。図１０は、第２実施形態に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第４のシーケンス図である。なお、図８の線上に付したａ〜ｅは、図９の線上に付したａ〜ｅに接続され、図９の線上に付したｆ〜ｊは、図１０の線上に付したｆ〜ｊに接続される。
【００８７】
（Ｓ１２１）ＣＰＵ２１２は、ユーザデータの書込み先に関する情報を含む制御データ（Ｃｔｒｌ  ｄａｔａ）と、ＣＰＵ２１２、２２２間に介在する中継デバイスの数と同数のダミーデータ（Ｄｍｙ  ｄａｔａ）とを生成する。
【００８８】
この例では、中継デバイスとしてＰＣＩｅスイッチ２１５、２２５がＣＰＵ２１２、２２２間に介在するから、２つのダミーデータ（Ｄｍｙ１  ｄａｔａ、Ｄｍｙ２  ｄａｔａ）が生成される。なお、ダミーデータは、例えば、Ｎｕｌｌデータであり、制御データと同じデータ長（例えば、１２８Byte）を有する。
【００８９】
（Ｓ１２２）ＣＰＵ２１２は、制御データ、及びダミーデータに付加するヘッダを生成する。例えば、ＣＰＵ２１２は、データ区間と制御区間と（図５を参照）を区別するタグ情報を含むヘッダ＃１を生成する。また、ＣＰＵ２１２は、制御データとダミーデータとを区別するタグ情報を含むヘッダ＃２を生成する（図４及び図６を参照）。そして、ＣＰＵ２１２は、ヘッダ＃１、＃２を制御データ及びダミーデータに付加する。
【００９０】
（Ｓ１２３）ＣＰＵ２１２は、制御データをＰＣＩｅスイッチ２１５に送信する。
（Ｓ１２４）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ１２３でＣＰＵ２１２から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２１５は、このデータを制御区間のデータであると判定する。
【００９１】
（Ｓ１２５）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御データ（Ｃｔｒｌ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２に制御データを示すタグ情報を含む場合には制御データであると判定する。Ｓ１２３でＣＰＵ２１２から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２１５は、このデータを制御データであると判定する。
【００９２】
（Ｓ１２６）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信した制御データをＴＢＬバッファ２１５Ｂ（Ｃ−Ｂｕｆｆｅｒ）に格納する。ＴＢＬバッファ２１５Ｂは、制御データのデータ長以下のサイズ（例えば、１２８Byte）を有する。
【００９３】
（Ｓ１２７）ＰＣＩｅスイッチ２１５は、制御データの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。
（Ｓ１２８）ＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂに格納した制御データをＰＣＩｅスイッチ２２５に送信する。
【００９４】
（Ｓ１２９）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ１２８でＰＣＩｅスイッチ２１５から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２２５は、このデータを制御区間のデータであると判定する。
【００９５】
（Ｓ１３０）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御データ（Ｃｔｒｌ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２に制御データを示すタグ情報を含む場合には制御データであると判定する。Ｓ１２８でＰＣＩｅスイッチ２１５から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２２５は、このデータを制御データであると判定する。
【００９６】
（Ｓ１３１）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信した制御データをＴＢＬバッファ２２５Ｂ（Ｃ−Ｂｕｆｆｅｒ）に格納する。ＴＢＬバッファ２２５Ｂは、制御データのデータ長以下のサイズ（例えば、１２８Byte）を有する。
【００９７】
（Ｓ１３２）ＰＣＩｅスイッチ２２５は、制御データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。
（Ｓ１３３）ＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂに格納した制御データをＣＰＵ２２２に送信する。
【００９８】
（Ｓ１３４）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信したデータのヘッダ＃１、＃２を参照して、そのデータが制御データであることを確認し、その制御データをバッファ２２２Ａに格納する。
【００９９】
（Ｓ１３５）ＣＰＵ２２２は、制御データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。
（Ｓ１３６）ＣＰＵ２２２からＡＣＫを受けたＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂを空にする（Ｃ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
【０１００】
（Ｓ１３７）Ｓ１３２でＰＣＩｅスイッチ２２５から送信されたＡＣＫを受けたＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂを空にする（Ｃ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
【０１０１】
（Ｓ１３８）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２からダミーデータ（Ｄｍｙ１  ｄａｔａ）を受信する。
（Ｓ１３９）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ１３８でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータを制御区間のデータであると判定する。
【０１０２】
（Ｓ１４０）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２にダミーデータを示すタグ情報を含む場合にはダミーデータであると判定する。Ｓ１３８でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータをダミーデータであると判定する。
【０１０３】
（Ｓ１４１）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したダミーデータをＴＢＬバッファ２１５Ｂ（Ｃ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ１４２）ＰＣＩｅスイッチ２１５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。
【０１０４】
（Ｓ１４３）ＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂに格納したダミーデータ（Ｄｍｙ１  ｄａｔａ）をＰＣＩｅスイッチ２２５に送信する。
（Ｓ１４４）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ１４３でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータを制御区間のデータであると判定する。
【０１０５】
（Ｓ１４５）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２にダミーデータを示すタグ情報を含む場合にはダミーデータであると判定する。Ｓ１４３でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータをダミーデータであると判定する。
【０１０６】
（Ｓ１４６）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したダミーデータをＴＢＬバッファ２２５Ｂ（Ｃ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ１４７）ＰＣＩｅスイッチ２２５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。
【０１０７】
（Ｓ１４８）ＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂに格納したダミーデータ（Ｄｍｙ１  ｄａｔａ）をＣＰＵ２２２に送信する。
（Ｓ１４９）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信したデータのヘッダ＃１、＃２を参照して、そのデータがダミーデータであるかを判定する。Ｓ１４８でＰＣＩｅスイッチ２２５から送信されたデータはダミーデータであるから、ＣＰＵ２２２は、このデータをダミーデータであると判定する。
【０１０８】
（Ｓ１５０）ＣＰＵ２２２は、ダミーデータを破棄（Ｄｅｌｅｔｅ）する。
（Ｓ１５１）ＣＰＵ２２２は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。
【０１０９】
（Ｓ１５２）ＣＰＵ２２２からＡＣＫを受けたＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂを空にする（Ｃ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
（Ｓ１５３）Ｓ１４７でＰＣＩｅスイッチ２２５から送信されたＡＣＫを受けたＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂを空にする（Ｃ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
【０１１０】
（Ｓ１５４）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２からダミーデータ（Ｄｍｙ２  ｄａｔａ）を受信する。
（Ｓ１５５）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。Ｓ１５４でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータを制御区間のデータであると判定する。
【０１１１】
（Ｓ１５６）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。Ｓ１５４でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータをダミーデータであると判定する。
【０１１２】
（Ｓ１５７）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したダミーデータをＴＢＬバッファ２１５Ｂ（Ｃ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ１５８）ＰＣＩｅスイッチ２１５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。
【０１１３】
（Ｓ１５９）ＣＰＵ２２２は、最後に送信したダミーデータ（Ｄｍｙ２  ｄａｔａ）に対するＡＣＫ（Ｓ１５８を参照）に応じて、ユーザデータの書込みを完了した旨の完了応答（Ｒｅｓｐｏｎｓｅ）をサーバ１００に送信する。
【０１１４】
Ｓ１３４で制御データがＣＰＵ２２２のバッファ２２２Ａに格納され、これに応じてＳ１３５でＡＣＫがＰＣＩｅスイッチ２２５に返され、ＰＣＩｅスイッチ２２５のＴＢＬバッファ２２５Ｂが空にされた。この処理を受けて、Ｓ１４３で１つ目のダミーデータがＰＣＩｅスイッチ２２５により受信され、Ｓ１４６で空のＴＢＬバッファ２２５Ｂにダミーデータが格納されて、Ｓ１４７でＰＣＩｅスイッチ２１５にＡＣＫが返された。
【０１１５】
Ｓ１４７のＡＣＫを受けてＴＢＬバッファ２１５Ｂが空にされ、Ｓ１５４で２つ目のダミーデータがＰＣＩｅスイッチ２１５により受信され、Ｓ１５７で空のＴＢＬバッファ２１５Ｂにダミーデータが格納され、Ｓ１５８でＣＰＵ２１２にＡＣＫが返された。したがって、Ｓ１５８で返されたＡＣＫをＣＰＵ２１２が受けた時点で、ＣＰＵ２２２のバッファ２２２Ａに制御データが格納されたことが保証される。つまり、Ｓ１５９の完了応答は、ＣＭ間通信におけるユーザデータ及び制御データの到達保証を前提とする信頼性の高いものである。
【０１１６】
（Ｓ１６０）ＰＣＩｅスイッチ２１５は、ＴＢＬバッファ２１５Ｂに格納したダミーデータ（Ｄｍｙ２  ｄａｔａ）をＰＣＩｅスイッチ２２５に送信する。
（Ｓ１６１）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。Ｓ１６０でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータを制御区間のデータであると判定する。
【０１１７】
（Ｓ１６２）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。Ｓ１６０でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータをダミーデータであると判定する。
【０１１８】
（Ｓ１６３）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したダミーデータをＴＢＬバッファ２２５Ｂ（Ｃ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ１６４）ＰＣＩｅスイッチ２２５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。なお、このＡＣＫを受けたＰＣＩｅスイッチ２１５は、この時点で、次のＣＭ間通信に備えてＴＢＬバッファ２１５Ｂを空にしてもよい。
【０１１９】
（Ｓ１６５）ＰＣＩｅスイッチ２２５は、ＴＢＬバッファ２２５Ｂに格納したダミーデータ（Ｄｍｙ２  ｄａｔａ）をＣＰＵ２２２に送信する。
（Ｓ１６６）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信したデータのヘッダ＃１、＃２を参照して、そのデータがダミーデータであるかを判定する。Ｓ１６５でＰＣＩｅスイッチ２２５から送信されたデータはダミーデータであるから、ＣＰＵ２２２は、このデータをダミーデータであると判定する。
【０１２０】
（Ｓ１６７）ＣＰＵ２２２は、ダミーデータを破棄（Ｄｅｌｅｔｅ）する。
（Ｓ１６８）ＣＰＵ２２２は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。なお、このＡＣＫを受けたＰＣＩｅスイッチ２２５は、この時点で、次のＣＭ間通信に備えてＴＢＬバッファ２２５Ｂを空にしてもよい。Ｓ１６８の処理が完了すると、図７〜図１０に示した一連の処理は終了する。
【０１２１】
以上、第２実施形態に係るストレージシステムにおける書込み処理のシーケンスについて説明した。上記のように、ＣＰＵ２１２、２２２間に介在する中継デバイスの数と同数のダミーデータを送信すること、及びＴＢＬバッファ２１５Ｂ、２２５Ｂのサイズを制御データのデータ長以下にすることで、ユーザデータ及び制御データの到達保証ができる。そして、最後に送信したダミーデータの確認応答を待ってサーバ１００に書込み処理の完了応答を返すことで、ＣＭ間通信の到達保証を伴う信頼性の高い処理を実現できる。
【０１２２】
＜３．変形例＞
これまで、ＰＣＩｅスイッチ２１５、２２５にそれぞれ制御データ及びダミーデータを格納するためのバッファ領域を別途設ける仕組みを前提とした説明をしてきたが、サイズが可変な１つのバッファ領域を利用することで同様に到達保証を実現できる。ここでは、サイズが可変なバッファ領域（以下、容量可変バッファ）を利用する変形例について説明する。
【０１２３】
［３−１．ＣＭ間通信］
この変形例においては、図１１に示すように、容量可変バッファ２１５Ｃ、２２５Ｃが利用される。図１１は、第２実施形態の一変形例に係るＣＭ間通信の一例を示した図である。容量可変バッファ２１５Ｃ、２２５Ｃは、ライトデータを分割したデータ＃１、…、データ＃Ｎ、制御データ、及びダミーデータのいずれの格納にも利用される。また、容量可変バッファ２１５Ｃ、２２５Ｃのサイズは、指定したサイズに設定するコマンド（ＢｕｆＣＭＤ）により制御される。
【０１２４】
図１１に示すように、ＣＰＵ２１２は、データ＃１、…、データ＃Ｎを送信する前に、容量可変バッファ２１５Ｃのサイズをこれらのデータのデータ長（例えば、１２８Byte）に応じた適当なサイズ（例えば、１２ＫByte）に制御するＢｕｆＣＭＤを送信する。このＢｕｆＣＭＤを受けたＰＣＩｅスイッチ２１５は、容量可変バッファ２１５ＣのサイズをＢｕｆＣＭＤで指定されたサイズに変更する。そして、ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＣＰＵ２１２に返す。
【０１２５】
ＢｕｆＦＮＳＨを受けたＣＰＵ２１２は、データ＃１、…、データ＃Ｎを順次ＰＣＩｅスイッチ２１５に送信する。ＰＣＩｅスイッチ２１５は、データ＃１、…、データ＃Ｎを受信すると、それぞれ容量可変バッファ２１５Ｃに格納してからＣＰＵ２１２にＡＣＫを返す。
【０１２６】
ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納したデータ＃１、…、データ＃ＮをＰＣＩｅスイッチ２２５に送信する前に、ＰＣＩｅスイッチ２２５にＢｕｆＣＭＤを転送する。このＢｕｆＣＭＤを受けたＰＣＩｅスイッチ２２５は、容量可変バッファ２２５ＣのサイズをＢｕｆＣＭＤで指定されたサイズに変更する。そして、ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＰＣＩｅスイッチ２１５に返す。
【０１２７】
ＢｕｆＦＮＳＨを受けたＰＣＩｅスイッチ２１５は、データ＃１、…、データ＃Ｎを順次ＰＣＩｅスイッチ２２５に送信する。ＰＣＩｅスイッチ２２５は、データ＃１、…、データ＃Ｎを受信すると、それぞれ容量可変バッファ２２５Ｃに格納してからＰＣＩｅスイッチ２１５にＡＣＫを返す。また、ＰＣＩｅスイッチ２２５は、容量可変バッファ２１５Ｃに格納したデータ＃１、…、データ＃ＮをＣＰＵ２２２に送信する。ＣＰＵ２２２は、データ＃１、…、データ＃Ｎを受信すると、それぞれバッファ２２２Ａに格納してからＰＣＩｅスイッチ２２５にＡＣＫを返す。
【０１２８】
ＣＰＵ２１２は、制御データを送信する前に、容量可変バッファ２１５Ｃのサイズを制御データのデータ長（例えば、１２８Byte）以下のサイズ（例えば、１２８Byte）に制御するＢｕｆＣＭＤを送信する。このＢｕｆＣＭＤを受けたＰＣＩｅスイッチ２１５は、容量可変バッファ２１５ＣのサイズをＢｕｆＣＭＤで指定されたサイズに変更する。そして、ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＣＰＵ２１２に返す。
【０１２９】
ＢｕｆＦＮＳＨを受けたＣＰＵ２１２は、制御データ、及び２つのダミーデータを順次ＰＣＩｅスイッチ２１５に送信する。
ＰＣＩｅスイッチ２１５は、制御データを受信すると、容量可変バッファ２１５Ｃに格納してからＣＰＵ２１２にＡＣＫを返す。
【０１３０】
ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納した制御データをＰＣＩｅスイッチ２２５に送信する前に、ＰＣＩｅスイッチ２２５にＢｕｆＣＭＤを転送する。このＢｕｆＣＭＤを受けたＰＣＩｅスイッチ２２５は、容量可変バッファ２２５ＣのサイズをＢｕｆＣＭＤで指定されたサイズに変更する。そして、ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＰＣＩｅスイッチ２１５に返す。
【０１３１】
ＢｕｆＦＮＳＨを受けたＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納した制御データをＰＣＩｅスイッチ２２５に送信する。ＰＣＩｅスイッチ２２５は、制御データを受信すると、容量可変バッファ２２５Ｃに格納してからＰＣＩｅスイッチ２１５にＡＣＫを返す。また、ＰＣＩｅスイッチ２２５は、容量可変バッファ２１５Ｃに格納した制御データをＣＰＵ２２２に送信する。ＣＰＵ２２２は、制御データを受信すると、バッファ２２２Ａに格納してからＰＣＩｅスイッチ２２５にＡＣＫを返す。
【０１３２】
ＰＣＩｅスイッチ２２５からＡＣＫを受信したＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃを空にする。その後、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２からダミーデータを受信する。そして、ＰＣＩｅスイッチ２１５は、受信したダミーデータを容量可変バッファ２１５Ｃに格納してからＣＰＵ２１２にＡＣＫを返す。
【０１３３】
ＣＰＵ２２２からＡＣＫを受信したＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃを空にする。その後、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５からダミーデータを受信する。そして、ＰＣＩｅスイッチ２２５は、受信したダミーデータを容量可変バッファ２２５Ｃに格納してからＰＣＩｅスイッチ２１５にＡＣＫを返す。
【０１３４】
ＣＰＵ２１２は、データ＃１、…、データ＃Ｎ、制御データ、２つのダミーデータの全てについてＡＣＫを受信した後、サーバ１００に対して書込み完了を示す応答を返す。ＣＰＵ２２２は、受信したダミーデータを破棄する。
【０１３５】
上記のように、容量可変バッファ２１５Ｃ、２２５Ｃを適切なサイズに設定し、制御データに続いて２つのダミーデータを順次送信することで、各バッファから各データが突き出される形で転送されるため、制御データ以前のデータについて到達保証ができる。つまり、最後のダミーデータについてＣＰＵ２１２がＡＣＫを受信した時点で制御データがＣＰＵ２２２に到達していることになり、そのデータ以前のデータが到達保証される。
【０１３６】
［３−２．シーケンス］
次に、図１２〜図１７を参照しながら、第２実施形態の一変形例に係るストレージシステムにおける書込み処理のシーケンスについて、さらに説明する。
【０１３７】
（ライトデータの伝送）
まず、図１２を参照する。図１２は、第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第１のシーケンス図である。図１３は、第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第２のシーケンス図である。なお、図１２の線上に付したａ〜ｅは、図１３の線上に付したａ〜ｅに接続される。
【０１３８】
（Ｓ２０１）サーバ１００は、ＣＭ２０１に対してデータの書込み要求（Ｒｅｑｕｅｓｔ（Ｗ））を送信する。サーバ１００から送信された書込み要求は、ＦＣコントローラ２１４により受信され、ＰＣＩｅスイッチ２１５を介してＣＰＵ２１２に入力される。書込み要求を受けたＣＰＵ２１２は、ＣＭ２０２のＣＰＵ２２２に書込み対象のデータ（ユーザデータ）を送信するＣＭ間通信の処理を開始する。
【０１３９】
（Ｓ２０２）ＣＰＵ２１２は、ユーザデータを分割した分割データの格納に適したサイズ（例えば、１２ＫByte）を指定し、指定したサイズにバッファサイズを制御するコマンド（ＢｕｆＣＭＤ）をＰＣＩｅスイッチ２１５に送信する。
【０１４０】
（Ｓ２０３）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したＢｕｆＣＭＤに応じて、ＢｕｆＣＭＤで指定されたサイズに容量可変バッファ２１５Ｃのサイズ（Ｂｕｆｆｅｒ  ｓｉｚｅ）を変更する。
【０１４１】
（Ｓ２０４）ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＣＰＵ２１２に返す。
（Ｓ２０５）ＣＰＵ２１２は、ユーザデータに付加するヘッダを生成する。例えば、ＣＰＵ２１２は、データ区間と制御区間と（図５を参照）を区別するタグ情報を含むヘッダ＃１を生成する。
【０１４２】
（Ｓ２０６）ＣＰＵ２１２は、ユーザデータを分割し、予め設定された単位サイズ（例えば、１２８Byte）を有する分割データを生成する。そして、ＣＰＵ２１２は、Ｓ２０５で生成したヘッダ＃１を各分割データに付加する。なお、以下の説明では、分割データを単にユーザデータと呼ぶ場合がある。
【０１４３】
（Ｓ２０７）ＣＰＵ２１２は、Ｓ２０６で生成した分割データ（Ｄａｔａ）を順次ＰＣＩｅスイッチ２１５に送信する。
（Ｓ２０８）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータがユーザデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１にデータ区間を示すタグ情報を含む場合にはユーザデータであると判定する。Ｓ２０７でＣＰＵ２１２から送信されたデータは分割データであるから、ＰＣＩｅスイッチ２１５は、このデータをユーザデータであると判定する。
【０１４４】
（Ｓ２０９）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信した分割データを容量可変バッファ２１５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２１０）ＰＣＩｅスイッチ２１５は、分割データの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。このＡＣＫを受けてＣＰＵ２１２は次の分割データをＰＣＩｅスイッチ２１５に送信する。そして、次の分割データについて、前述した図７の符号Ａを付した範囲と同じ処理が実行される。なお、説明の都合上、図１３に符号Ａの範囲を示しているが、Ｓ２１０のＡＣＫ後に順次分割データについて当該処理が実行される。
【０１４５】
（Ｓ２１１）ＰＣＩｅスイッチ２１５は、分割データの格納に適したサイズ（例えば、１２ＫByte）を指定し、指定したサイズにバッファサイズを制御するＢｕｆＣＭＤをＰＣＩｅスイッチ２２５に転送する。
【０１４６】
（Ｓ２１２）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したＢｕｆＣＭＤに応じて、ＢｕｆＣＭＤで指定されたサイズに容量可変バッファ２２５Ｃのサイズ（Ｂｕｆｆｅｒ  ｓｉｚｅ）を変更する。
【０１４７】
（Ｓ２１３）ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＰＣＩｅスイッチ２１５に返す。
（Ｓ２１４）ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納した分割データをＰＣＩｅスイッチ２２５に送信する。
【０１４８】
（Ｓ２１５）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータがユーザデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１にデータ区間を示すタグ情報を含む場合にはユーザデータであると判定する。Ｓ２１４でＰＣＩｅスイッチ２１５から送信されたデータは分割データであるから、ＰＣＩｅスイッチ２２５は、受信したデータをユーザデータであると判定する。
【０１４９】
（Ｓ２１６）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信した分割データを容量可変バッファ２２５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２１７）ＰＣＩｅスイッチ２２５は、分割データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。このＡＣＫを受けてＰＣＩｅスイッチ２１５は容量可変バッファ２１５Ｃにある次の分割データをＰＣＩｅスイッチ２２５に送信する。
【０１５０】
（Ｓ２１８）ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃに格納した分割データをＣＰＵ２２２に送信する。
（Ｓ２１９）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信した分割データをバッファ２２２Ａに格納する。
【０１５１】
（Ｓ２２０）ＣＰＵ２２２は、分割データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。このＡＣＫを受けてＰＣＩｅスイッチ２２５は容量可変バッファ２２５Ｃにある次の分割データをＣＰＵ２２２に送信する。なお、符号Ａの範囲にある処理が全ての分割データについて実行される。
【０１５２】
（制御データ・ダミーデータの伝送）
次に、図１４を参照する。ＣＰＵ２１２は、全ての分割データをＰＣＩｅスイッチ２１５に送信した後、制御データ及びダミーデータの送信を開始する。そして、処理は、図１４のＳ２２１へと進む。
【０１５３】
以下、図１４〜図１７を順次参照する。図１４は、第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第３のシーケンス図である。図１５は、第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第４のシーケンス図である。図１６は、第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第５のシーケンス図である。図１７は、第２実施形態の一変形例に係るＣＭ間通信及びサーバへの応答に関する処理の流れを示した第６のシーケンス図である。
【０１５４】
なお、図１４の線上に付したａ〜ｅは、図１５の線上に付したａ〜ｅに接続され、図１５の線上に付したｆ〜ｊは、図１６の線上に付したｆ〜ｊに接続され、図１６の線上に付したｋ〜ｏは、図１７の線上に付したｋ〜ｏに接続される。
【０１５５】
（Ｓ２２１）ＣＰＵ２１２は、制御データのデータ長以下のサイズ（例えば、１２８Byte）を指定したＢｕｆＣＭＤをＰＣＩｅスイッチ２１５に送信する。
（Ｓ２２２）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したＢｕｆＣＭＤに応じて、ＢｕｆＣＭＤで指定されたサイズに容量可変バッファ２１５Ｃのサイズ（Ｂｕｆｆｅｒ  ｓｉｚｅ）を変更する。
【０１５６】
（Ｓ２２３）ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＣＰＵ２１２に返す。
（Ｓ２２４）ＣＰＵ２１２は、ユーザデータの書込み先に関する情報を含む制御データ（Ｃｔｒｌ  ｄａｔａ）と、ＣＰＵ２１２、２２２間に介在する中継デバイスの数と同数のダミーデータ（Ｄｍｙ  ｄａｔａ）とを生成する。この例では、２つのダミーデータ（Ｄｍｙ１  ｄａｔａ、Ｄｍｙ２  ｄａｔａ）が生成される。
【０１５７】
（Ｓ２２５）ＣＰＵ２１２は、制御データ、及びダミーデータに付加するヘッダを生成する。例えば、ＣＰＵ２１２は、データ区間と制御区間と（図５を参照）を区別するタグ情報を含むヘッダ＃１を生成する。また、ＣＰＵ２１２は、制御データとダミーデータとを区別するタグ情報を含むヘッダ＃２を生成する（図４及び図６を参照）。そして、ＣＰＵ２１２は、ヘッダ＃１、＃２を制御データ及びダミーデータに付加する。
【０１５８】
（Ｓ２２６）ＣＰＵ２１２は、制御データをＰＣＩｅスイッチ２１５に送信する。
（Ｓ２２７）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ２２６でＣＰＵ２１２から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２１５は、このデータを制御区間のデータであると判定する。
【０１５９】
（Ｓ２２８）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御データ（Ｃｔｒｌ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２に制御データを示すタグ情報を含む場合には制御データであると判定する。Ｓ２２６でＣＰＵ２１２から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２１５は、このデータを制御データであると判定する。
【０１６０】
（Ｓ２２９）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信した制御データを容量可変バッファ２１５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２３０）ＰＣＩｅスイッチ２１５は、制御データの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。
【０１６１】
（Ｓ２３１）ＰＣＩｅスイッチ２１５は、制御データのデータ長以下のサイズ（例えば、１２８Byte）を指定したＢｕｆＣＭＤをＰＣＩｅスイッチ２２５に転送する。
（Ｓ２３２）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したＢｕｆＣＭＤに応じて、ＢｕｆＣＭＤで指定されたサイズに容量可変バッファ２２５Ｃのサイズ（Ｂｕｆｆｅｒ  ｓｉｚｅ）を変更する。
【０１６２】
（Ｓ２３３）ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃのサイズ変更が完了した旨の応答（ＢｕｆＦＮＳＨ）をＰＣＩｅスイッチ２１５に返す。
（Ｓ２３４）ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納した制御データをＰＣＩｅスイッチ２２５に送信する。
【０１６３】
（Ｓ２３５）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ２３４でＰＣＩｅスイッチ２１５から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２２５は、このデータを制御区間のデータであると判定する。
【０１６４】
（Ｓ２３６）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御データ（Ｃｔｒｌ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２に制御データを示すタグ情報を含む場合には制御データであると判定する。Ｓ２３４でＰＣＩｅスイッチ２１５から送信されたデータは制御データであるから、ＰＣＩｅスイッチ２２５は、このデータを制御データであると判定する。
【０１６５】
（Ｓ２３７）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信した制御データを容量可変バッファ２２５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２３８）ＰＣＩｅスイッチ２２５は、制御データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。
【０１６６】
（Ｓ２３９）ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃに格納した制御データをＣＰＵ２２２に送信する。
（Ｓ２４０）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信したデータのヘッダ＃１、＃２を参照して、そのデータが制御データであることを確認し、その制御データをバッファ２２２Ａに格納する。
【０１６７】
（Ｓ２４１）ＣＰＵ２２２は、制御データの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。
（Ｓ２４２）ＣＰＵ２２２からＡＣＫを受けたＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃを空にする（Ｖ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
【０１６８】
（Ｓ２４３）Ｓ２３８でＰＣＩｅスイッチ２２５から送信されたＡＣＫを受けたＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃを空にする（Ｖ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
【０１６９】
（Ｓ２４４）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２からダミーデータ（Ｄｍｙ１  ｄａｔａ）を受信する。
（Ｓ２４５）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ２４４でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータを制御区間のデータであると判定する。
【０１７０】
（Ｓ２４６）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２にダミーデータを示すタグ情報を含む場合にはダミーデータであると判定する。Ｓ２４４でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータをダミーデータであると判定する。
【０１７１】
（Ｓ２４７）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したダミーデータを容量可変バッファ２１５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２４８）ＰＣＩｅスイッチ２１５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。
【０１７２】
（Ｓ２４９）ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納したダミーデータ（Ｄｍｙ１  ｄａｔａ）をＰＣＩｅスイッチ２２５に送信する。
（Ｓ２５０）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃１を参照し、ヘッダ＃１に制御区間を示すタグ情報を含む場合には制御区間のデータであると判定する。Ｓ２４９でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータを制御区間のデータであると判定する。
【０１７３】
（Ｓ２５１）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。例えば、ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータに付加されているヘッダ＃２を参照し、ヘッダ＃２にダミーデータを示すタグ情報を含む場合にはダミーデータであると判定する。Ｓ２４９でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータをダミーデータであると判定する。
【０１７４】
（Ｓ２５２）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したダミーデータを容量可変バッファ２２５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２５３）ＰＣＩｅスイッチ２２５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。
【０１７５】
（Ｓ２５４）ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃに格納したダミーデータ（Ｄｍｙ１  ｄａｔａ）をＣＰＵ２２２に送信する。
（Ｓ２５５）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信したデータのヘッダ＃１、＃２を参照して、そのデータがダミーデータであるかを判定する。Ｓ２５４でＰＣＩｅスイッチ２２５から送信されたデータはダミーデータであるから、ＣＰＵ２２２は、このデータをダミーデータであると判定する。
【０１７６】
（Ｓ２５６）ＣＰＵ２２２は、ダミーデータを破棄（Ｄｅｌｅｔｅ）する。
（Ｓ２５７）ＣＰＵ２２２は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。
【０１７７】
（Ｓ２５８）ＣＰＵ２２２からＡＣＫを受けたＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃを空にする（Ｖ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
（Ｓ２５９）Ｓ２５３でＰＣＩｅスイッチ２２５から送信されたＡＣＫを受けたＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃを空にする（Ｖ−Ｂｕｆｆｅｒ  ｃｌｅａｒ）。
【０１７８】
（Ｓ２６０）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２からダミーデータ（Ｄｍｙ２  ｄａｔａ）を受信する。
（Ｓ２６１）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。Ｓ２６０でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータを制御区間のデータであると判定する。
【０１７９】
（Ｓ２６２）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。Ｓ２６０でＣＰＵ２１２から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２１５は、このデータをダミーデータであると判定する。
【０１８０】
（Ｓ２６３）ＰＣＩｅスイッチ２１５は、ＣＰＵ２１２から受信したダミーデータを容量可変バッファ２１５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２６４）ＰＣＩｅスイッチ２１５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＣＰＵ２１２に返す。
【０１８１】
（Ｓ２６５）ＣＰＵ２１２は、最後に送信したダミーデータ（Ｄｍｙ２  ｄａｔａ）に対するＡＣＫ（Ｓ２６４を参照）に応じて、ユーザデータの書込みを完了した旨の完了応答（Ｒｅｓｐｏｎｓｅ）をサーバ１００に送信する。
【０１８２】
Ｓ２４０で制御データがＣＰＵ２２２のバッファ２２２Ａに格納され、これに応じてＳ２４１でＡＣＫがＰＣＩｅスイッチ２２５に返され、ＰＣＩｅスイッチ２２５の容量可変バッファ２２５Ｃが空にされた。この処理を受けて、Ｓ２４９で１つ目のダミーデータがＰＣＩｅスイッチ２２５により受信され、Ｓ２５２で空の容量可変バッファ２２５Ｃにダミーデータが格納されて、Ｓ２５３でＰＣＩｅスイッチ２１５にＡＣＫが返された。
【０１８３】
Ｓ２５３のＡＣＫを受けて容量可変バッファ２１５Ｃが空にされ、Ｓ２６０で２つ目のダミーデータがＰＣＩｅスイッチ２１５により受信され、Ｓ２６３で空の容量可変バッファ２１５Ｃにダミーデータが格納され、Ｓ２６４でＣＰＵ２１２にＡＣＫが返された。したがって、Ｓ２６４で返されたＡＣＫをＣＰＵ２１２が受けた時点で、ＣＰＵ２２２のバッファ２２２Ａに制御データが格納されたことが保証される。つまり、Ｓ２６５の完了応答は、ＣＭ間通信におけるユーザデータ及び制御データの到達保証を前提とする信頼性の高いものである。
【０１８４】
（Ｓ２６６）ＰＣＩｅスイッチ２１５は、容量可変バッファ２１５Ｃに格納したダミーデータ（Ｄｍｙ２  ｄａｔａ）をＰＣＩｅスイッチ２２５に送信する。
（Ｓ２６７）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータが制御区間（Ｃｔｒｌ  ｓｅｃｔｉｏｎ）のデータであるか否かを判定する。Ｓ２６６でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータを制御区間のデータであると判定する。
【０１８５】
（Ｓ２６８）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したデータがダミーデータ（Ｄｍｙ  ｄａｔａ）であるか否かを判定する。Ｓ２６６でＰＣＩｅスイッチ２１５から送信されたデータはダミーデータであるから、ＰＣＩｅスイッチ２２５は、このデータをダミーデータであると判定する。
【０１８６】
（Ｓ２６９）ＰＣＩｅスイッチ２２５は、ＰＣＩｅスイッチ２１５から受信したダミーデータを容量可変バッファ２２５Ｃ（Ｖ−Ｂｕｆｆｅｒ）に格納する。
（Ｓ２７０）ＰＣＩｅスイッチ２２５は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２１５に返す。
【０１８７】
（Ｓ２７１）ＰＣＩｅスイッチ２２５は、容量可変バッファ２２５Ｃに格納したダミーデータ（Ｄｍｙ２  ｄａｔａ）をＣＰＵ２２２に送信する。
（Ｓ２７２）ＣＰＵ２２２は、ＰＣＩｅスイッチ２２５から受信したデータのヘッダ＃１、＃２を参照して、そのデータがダミーデータであるかを判定する。Ｓ２７１でＰＣＩｅスイッチ２２５から送信されたデータはダミーデータであるから、ＣＰＵ２２２は、このデータをダミーデータであると判定する。
【０１８８】
（Ｓ２７３）ＣＰＵ２２２は、ダミーデータを破棄（Ｄｅｌｅｔｅ）する。
（Ｓ２７４）ＣＰＵ２２２は、ダミーデータの受信を完了した旨の確認応答（ＡＣＫ）をＰＣＩｅスイッチ２２５に返す。Ｓ２７４の処理が完了すると、図１２〜図１７に示した一連の処理は終了する。
【０１８９】
以上、第２実施形態の一変形例に係るストレージシステムにおける書込み処理のシーケンスについて説明した。上記のように、ＣＰＵ２１２、２２２間に介在する中継デバイスの数と同数のダミーデータを送信すること、制御データの送信前に容量可変バッファ２１５Ｃ、２２５Ｃを制御データのデータ長以下にすることで、ユーザデータ及び制御データの到達保証ができる。そして、最後に送信したダミーデータの確認応答を待ってサーバ１００に書込み処理の完了応答を返すことで、ＣＭ間通信の到達保証を伴う信頼性の高い処理を実現できる。
【０１９０】
以上、第２実施形態について説明した。
上記の説明では、ＰＣＩｅスイッチを介して接続されたＣＭ間の通信を想定していたが、ＳＡＳやＩｎｆｉｎｉｂａｎｄなどの接続形態で接続されたプロセッサ間の通信にも応用可能である。また、中継デバイスの数を１以上の任意の数に変更した場合でも同様に上述した技術を適用することができる。こうした応用例についても第２実施形態の技術的範囲に属する。
【符号の説明】
【０１９１】
１０  上位装置
２０  ストレージ制御装置
２１  第１の制御部
２１ａ  送信部
２１ｂ  応答部
２２、２３  転送部
２２ａ、２３ａ  通信部
２２ｂ、２３ｂ  記憶部
２４  第２の制御部
３０  記憶装置
ＷＤ  ライトデータ
ＴＤ  付加データ
ＤＤ１、ＤＤ２  ダミーデータ
【図１】
0006554989.tif 000002
【図２】
0006554989.tif 000003
【図３】
0006554989.tif 000004
【図４】
0006554989.tif 000005
【図５】
0006554989.tif 000006
【図６】
0006554989.tif 000007
【図７】
0006554989.tif 000008
【図８】
0006554989.tif 000009
【図９】
0006554989.tif 000010
【図１０】
0006554989.tif 000011
【図１１】
0006554989.tif 000012
【図１２】
0006554989.tif 000013
【図１３】
0006554989.tif 000014
【図１４】
0006554989.tif 000015
【図１５】
0006554989.tif 000016
【図１６】
0006554989.tif 000017
【図１７】
0006554989.tif 000018