(57)【要約】【課題】  ドライブ筐体からホストコンピュータにストレージコントローラを介さずに直接データを転送する高性能なストレージシステムを提供する。【解決手段】  少なくとも一つのホストコンピュータと第１のネットワークを介して接続される少なくとも一つのドライブ筐体と、ドライブ筐体に接続されるストレージコントローラとを有し、ストレージコントローラは、ドライブ筐体に対し、論理ボリュームの作成を指示し、ドライブ筐体は、ストレージコントローラからの指示に従って、論理ボリュームを作成し、ホストコンピュータに対してストレージシステムの記憶領域を提供し、ホストコンピュータから、ストレージシステムの記憶領域に対し、ＩＯコマンドを受信する。【選択図】図１
2020161103.tif 000002
【特許請求の範囲】
【請求項１】
記憶装置を有する少なくとも一つのドライブ筐体と、前記ドライブ筐体に接続されるストレージコントローラとを有し、ホストコンピュータにネットワークを介して接続されるストレージシステムであって、
前記ドライブ筐体は、
前記ストレージコントローラからの指示に従って、指定された識別名を有する論理ボリュームを作成し、前記ホストコンピュータに対して前記論理ボリュームを記憶領域として提供し、
前記ホストコンピュータから前記論理ボリュームを提供する前記ドライブ筐体に対して発行された第１のコマンドを受信し、
前記ストレージコントローラに、前記第１のコマンドに対応する第２のコマンドを送信し、
前記ストレージコントローラは、
前記第２のコマンドへの応答を前記ドライブ筐体に送信し、
前記ドライブ筐体は、
前記第２のコマンドへの応答を前記ストレージコントローラから受信すると、前記第２のコマンドへの応答に従って、前記ホストコンピュータに前記第１のコマンドの応答を行い、
前記論理ボリュームは、前記ストレージコントローラがデータ保護するデータ格納領域に対応することを特徴とするストレージシステム。
【請求項２】
請求項１に記載のストレージシステムにおいて、
前記第１のコマンドは第１のリードコマンドであり、
前記第２のコマンドは第２のリードコマンドであり、
前記ストレージコントローラは、
前記第２のリードコマンドで指定される前記論理ボリュームの論理アドレス範囲のデータ転送に用いるデータ転送パラメータを作成して前記ドライブ筐体に送信し、
前記ドライブ筐体は、
前記データ転送パラメータを前記ストレージコントローラから受信すると、前記データ転送パラメータに従って、前記記憶装置からデータを読み出し、前記ホストコンピュータに前記データを転送するとともに、前記応答を行うことを特徴とするストレージシステム。
【請求項３】
請求項２に記載のストレージシステムにおいて、
前記第１のリードコマンドは、コマンド種別、前記論理ボリュームにおける開始アドレス及びデータ転送長の情報を含み、
前記第２のリードコマンドは、前記第１のリードコマンドにかかるコマンド種別、リードコマンドの対象の前記論理ボリュームにおける開始アドレス、データ転送長、リードコマンドの送信元の前記ホストコンピュータの識別子、前記第１のリードコマンドを受信したドライブ筐体の識別子、前記ホストコンピュータのデータ格納先のメモリアドレスを含むことを特徴とするストレージシステム。
【請求項４】
請求項２に記載のストレージシステムにおいて、
前記ストレージコントローラは、
前記第２のリードコマンドに指定された前記論理ボリュームのアドレス範囲に対応するデータが前記ストレージコントローラのキャッシュ上にない場合、前記第２のリードコマンドに指定される前記論理ボリュームのアドレス範囲のデータ転送に用いる前記データ転送パラメータを作成して前記ドライブ筐体に送信し、
前記第２のリードコマンドに指定された前記論理ボリュームのアドレス範囲に対応するデータが前記ストレージコントローラのキャッシュ上にある場合、前記キャッシュ上のデータを前記ホストコンピュータへ送信するデータとして用いることを特徴とするストレージシステム。
【請求項５】
請求項４に記載のストレージシステムにおいて、
前記ストレージコントローラは、前記第２のリードコマンドに指定された前記論理ボリュームのアドレス範囲に対応するデータが前記ストレージコントローラのキャッシュ上にある場合、前記キャッシュ上のデータを前記ドライブ筐体に送信し、
前記ドライブ筐体は、前記ストレージコントローラから受信した前記データを、前記ホストコンピュータに転送することを特徴とするストレージシステム。
【請求項６】
請求項２に記載のストレージシステムにおいて、
前記ストレージコントローラは、前記論理ボリュームの論理アドレスと、前記論理ボリュームを構成する前記記憶装置の物理アドレスとの対応を管理するアドレス変換テーブルに基づいて、前記第１のリードコマンドで指定される前記論理ボリュームの論理アドレスから前記データ転送パラメータを生成することを特徴とするストレージシステム。
【請求項７】
請求項４に記載のストレージシステムにおいて、
前記データ転送パラメータは、前記ホストコンピュータの識別子、前記ホストコンピュータのデータ格納先のメモリアドレス等の情報、データ格納先の前記記憶装置の識別子と前記記憶装置内のアドレス、データ転送長を含むことを特徴とするストレージシステム。
【請求項８】
請求項２に記載のストレージシステムにおいて、
前記ストレージコントローラは、前記ストレージコントローラの管理する前記論理ボリュームの論理アドレスと、前記記憶装置の物理アドレスとの対応関係を管理し、前記第１のリードコマンド及び前記第２のリードコマンドに含まれるデータ範囲の論理アドレスを対応する前記記憶領域の物理アドレスに変換して前記データ転送パラメータに含ませることを特徴とするストレージシステム。
【請求項９】
請求項１に記載のストレージシステムにおいて、
前記ネットワークは、前記ホストコンピュータと前記ドライブ筐体とを接続する第１のネットワークと、前記ドライブ筐体と前記ストレージコントローラとを接続する第２のネットワークとを有することを特徴とするストレージシステム。
【請求項１０】
請求項１に記載のストレージシステムにおいて、
前記ドライブ筐体は、
前記ホストコンピュータからライトコマンドを受領すると、前記ストレージコントローラに前記ライトコマンドを転送し、
前記ストレージコントローラから書き込み準備ができたこと示すメッセージを受領すると、前記ライトコマンドのライトデータを前記ストレージコントローラに転送することを特徴とするストレージシステム。
【請求項１１】
請求項１に記載のストレージシステムにおいて、
前記第１のコマンドは第１のライトコマンドであり、コマンド種別、前記論理ボリュームにおける開始アドレス及びデータ転送長の情報を含んでおり、
前記第２のコマンドは第２のライトコマンドであり、前記第１のライトコマンドにかかるデータの論理アドレスを含んでおり、
前記ドライブ筐体は、
前記記憶装置に、前記第１のライトコマンドに対応する前記データを格納することを特徴とするストレージシステム。
【請求項１２】
請求項１１に記載のストレージシステムにおいて、
前記ストレージコントローラは、
前記ストレージコントローラの管理する前記論理ボリュームの論理アドレスと、前記記憶装置の物理アドレスとを対応付けたアドレス変換テーブルを管理し、
前記第２のライトコマンドを受信したら、ライト対象のデータを格納する物理アドレスを設定し、前記物理アドレスを前記第２のコマンドの応答として前記ドライブ筐体に送信し、
前記第２のライトコマンドに含まれる論理アドレスと、設定した物理アドレスに基づいて、前記アドレス変換テーブルを更新することを特徴とするストレージシステム。
【請求項１３】
請求項１１に記載のストレージシステムにおいて、
前記ストレージコントローラは、
前記ストレージコントローラの管理する前記論理ボリュームの論理アドレスと、前記記憶装置の物理アドレスとを対応付けたアドレス変換テーブルを管理し、
前記ドライブ筐体は、
ライト対象データを格納するための物理アドレスを設定し、
前記設定した物理アドレスと、前記第１のライトコマンドにかかるデータの論理アドレスとを含む前記第２のライトコマンドを前記ストレージコントローラに送信し、
前記ストレージコントローラは、
受信した前記第２のライトコマンドに含まれる論理アドレス及び物理アドレスに基づいて、前記アドレス変換テーブルを更新することを特徴とするストレージシステム。
【請求項１４】
請求項１１に記載のストレージシステムにおいて、
前記ドライブ筐体は、
複数のドライブを用いて、ライト対象のデータを複数個格納する第１の冗長化を行うことを特徴とするストレージシステム。
【請求項１５】
請求項１４に記載のストレージシステムにおいて、
前記第１の冗長化は、前記ホストコンピュータへの前記第１のライトコマンドの応答前に行い、
前記応答の後に、前記ライト対象のデータの冗長データを作成して格納するとともに、複数個格納した前記ライト対象のデータの個数を減らす第２の冗長化を行うことを特徴とするストレージシステム。
【請求項１６】
請求項１１に記載のストレージシステムにおいて、
前記ストレージコントローラは、
前記ドライブ筐体から、前記ライト対象のデータに対する書込み処理の完了通知を受領した後、前記アドレス変換テーブルの更新を行うことを特徴とするストレージシステム。
【請求項１７】
請求項１６に記載のストレージシステムにおいて、
前記ストレージコントローラは、前記ドライブ筐体に前記アドレス変換テーブルの更新の完了を報告し、
前記ドライブ筐体は、前記アドレス変換テーブルの更新の完了を受領すると、前記ホストコンピュータに前記第１のライトコマンドの応答を送信することを特徴とするストレージシステム。
【請求項１８】
請求項１１に記載のストレージシステムにおいて、
前記第２のライトコマンドは、前記第１のライトコマンドにかかるコマンド種別、ライトコマンドの対象の前記論理ボリュームにおける開始アドレス、データ転送長、ライトコマンドの送信元の前記ホストコンピュータの識別子、前記第１のライトコマンドを受信したドライブ筐体の識別子、前記ホストコンピュータのデータ格納先のメモリアドレスを含むことを特徴とするストレージシステム。
【請求項１９】
記憶装置を有する少なくとも一つのドライブ筐体と、前記ドライブ筐体に接続されるストレージコントローラとを有し、ホストコンピュータにネットワークを介して接続されるストレージシステムのデータ転送方法において、
前記ドライブ筐体は、
前記ストレージコントローラからの指示に従って、指定された識別名を有する論理ボリュームを作成し、前記ホストコンピュータに対して前記論理ボリュームを記憶領域として提供し、
前記ホストコンピュータから前記論理ボリュームを提供する前記ドライブ筐体に対して発行された第１のコマンドを受信し、
前記ストレージコントローラに、前記第１のコマンドに対応する第２のコマンドを送信し、
前記ストレージコントローラは、
前記第２のコマンドへの応答を前記ドライブ筐体に送信し、
前記ドライブ筐体は、
前記第２のコマンドへの応答を前記ストレージコントローラから受信すると、前記第２のコマンドへの応答に従って、前記ホストコンピュータに前記第１のコマンドの応答を行い、
前記論理ボリュームは、前記ストレージコントローラがデータ保護するデータ格納領域に対応することを特徴とするストレージシステムのデータ転送方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システム、ストレージシステム及びデータ転送方法に関し、例えば、フラッシュドライブを搭載したシステムに適用して好適なものである。
【背景技術】
【０００２】
従来、ストレージシステムのドライブボックスはJBOD(Just a Bunch Of Disks)で、ドライブスロットにSAS/SATAドライブを搭載し、外部I/FとしてSAS(Serial Attached SCSI)ネットワークに接続できるものが主流であった。SASはコネクション単位でバスを占有する通信I/Fであり、多数のドライブ接続に適している一方でコネクション処理のオーバーヘッドが高く性能向上に適していない。また、高速なSSD向けのNVMeプロトコルに対応したJBODにおいても、ストレージシステムのストレージコントローラとJBODの接続が、PCI Express (PCIe)で直結した構成となるため、ドライブ接続の拡張性が低く、多数のドライブと接続することができない。最近は、SSD(Solid State Drive)等のフラッシュドライブの高性能化に伴い、高性能なI/Fを持つFBOF(Fabric-attached Bunch of Flash)がJBODの代替として出てきている。FBOFはEthernet、Infiniband等の高性能なネットワークに接続可能で、NVMe over Fabrics(NVMeoF)に対応しているという特徴がある。NVMeoFとは、NVMeプロトコルをネットワーク上で用いることができる規格である。この様な背景の下、SSDの高い性能を引き出すために、ストレージシステムにおいて高速なデータ転送と、ネットワーク接続によるドライブ接続の高拡張性が求められている。
【０００３】
（従来ストレージにおけるデータ転送帯域の問題）
従来ストレージでは、ストレージのフロントエンド(Frontend。以降、FEと略記する)ネットワークにホストコンピュータを接続し、フロントエンドネットワークとは互いに独立したバックエンド(Backend。以降、BEと略記する)ネットワークにドライブボックスを接続していた。FEネットワークはFC(Fibre Channel)ネットワークやEtherネットワークが主流であり、BEネットワークはSASネットワークが主流である。ホストコンピュータからのコマンドをストレージコントローラが受信すると、例えばリードコマンドの場合、ストレージコントローラがドライブボックス内のドライブからデータを読み出し、ホストコンピュータにデータ転送を行う。ストレージのBEネットワークを、FBOFの高性能なI/Fに対応したネットワークに変更することによって、SASネットワークに比べてBEネットワークのデータ転送帯域を拡大できるメリットがある。ところが、上述のデータ転送の経路は従来から変わらず、ストレージコントローラがホストコンピュータにデータ転送をすることから、FBOFを複数台接続してもストレージコントローラのデータ転送帯域がボトルネックとなり、FBOFの性能を引き出すことができないという問題がある。
【０００４】
（高速なデータ転送の実現方法）
近年、ホストコンピュータおよびストレージでは主にEtherネットワークベースで、FBOFと同様にNVMe over Fabrics規格への対応が行われている。FBOFはEtherネットワークに接続可能なI/Fを持ち、NVMe over Fabrics規格に対応しているので、ストレージのFEネットワークにおいてホストコンピュータとFBOF間でストレージコントローラを介さずに直接データ転送(以降、直転送と記す)することができる。この直転送によりストレージコントローラの性能ボトルネックを解消し、高速なデータ転送を実現することができる。
【０００５】
（直転送実現の課題）
直転送を実現するにあたり、以下の２つの課題がある。
【０００６】
（課題１）ストレージシステムの提供する論理ボリュームについて、ホストコンピュータから見たアドレス空間と、FBOF内のドライブのアドレス空間が異なり、ホストコンピュータは所望のデータがFBOF内のドライブのどのアドレスに格納されているか識別できない。
【０００７】
（課題２）ストレージシステムのキャッシュを使うことでデータアクセスの高性能化を行う場合、キャッシュに新データがある時は、ストレージのキャッシュからデータを読み込む必要があるが、ホストコンピュータは新データの有無を判断できない。
【０００８】
このような課題に対して、例えば特許文献１には、ホストコンピュータで動作するAgentソフトウエアが、ホストコンピュータのアクセス先データに対応するFBOF内のドライブとそのアドレスをストレージコントローラに問い合わせ、得られた情報を元に直接FBOF内のドライブにアクセスする発明が開示されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】US9,800,661号明細書
【発明の概要】
【発明が解決しようとする課題】
【００１０】
特許文献１に開示された発明では、ホストコンピュータが直接FBOFのドライブにアクセスできる一方で、AgentソフトウエアでRAIDなどのデータ保護のための計算をしなくてはならず、ホストコンピュータ側に高信頼な処理を行うための計算負荷がかかる問題がある。
【００１１】
また、ストレージコントローラで動作するSnapshot、Thin Provisioningなどのプログラムプロダクト（ストレージ装置の機能）の動作と、Agentソフトウエアの動作との競合を避けるため、ネットワークを介した排他制御が必要となり、性能低下させる問題がある。
【００１２】
本発明は以上の点を考慮してなされたもので、Agentソフトウエアのようなストレージのデータ処理を行う特殊なソフトウエアをホストコンピュータに導入する必要がなく、FBOFからの直転送による高速なデータ転送を実現する情報処理システム、ストレージシステム及びデータ転送方法を提案しようとするものである。
【００１３】
また、ストレージ装置によるデータ保護とプログラムプロダクト機能を提供することができ、FBOFからの直転送による高速なデータ転送を実現する情報処理システム、ストレージシステム及びデータ転送方法を提案しようとするものである。
【課題を解決するための手段】
【００１４】
かかる課題を解決するために本発明の情報処理システムの一側面は、
記憶装置を有する少なくとも一つのドライブ筐体と、ドライブ筐体に接続されるストレージコントローラとを有し、ホストコンピュータにネットワークを介して接続されるストレージシステムであって、ドライブ筐体は、ストレージコントローラからの指示に従って、指定された識別名を有する論理ボリュームを作成し、ホストコンピュータに対して論理ボリュームを記憶領域として提供し、ホストコンピュータから論理ボリュームを提供するドライブ筐体に対して発行された第１のコマンドを受信し、ストレージコントローラに、第１のコマンドに対応する第２のコマンドを送信し、ストレージコントローラは、第２のコマンドへの応答をドライブ筐体に送信し、ドライブ筐体は、記第２のコマンドへの応答をストレージコントローラから受信すると、第２のコマンドへの応答に従って、ホストコンピュータに第１のコマンドの応答を行い、
論理ボリュームは、ストレージコントローラがデータ保護するデータ格納領域に対応する。
【発明の効果】
【００１５】
本発明によれば、高信頼かつ高性能な情報処理システムを構築しうる、情報処理システム、ストレージシステム及びデータ転送方法を実現できる。
【図面の簡単な説明】
【００１６】
【図１】実施例１の情報処理システム構成図である。
【図２】実施例１のドライブ筐体の構成図である。
【図３】実施例１のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャにおいてプログラムの構成図である。
【図４】NVMe over FabricsにおけるホストとNVM Subsystemの識別名を示す図である。
【図５】ユーザデータのアドレスマッピングの概念図である。
【図６】実施例１のストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。
【図７】実施例１のドライブエンクロージャにおけるデータ転送のオフロードコマンドの処理手順を示すフローチャートである。
【図８】転送方法の判定で用いるデータ転送条件を示す図である。
【図９Ａ】ホストコマンドのフォーマットを示した図である。
【図９Ｂ】ストレージコントローラのホスト情報テーブルを示した図である。
【図９Ｃ】ドライブ情報テーブルを示した図である。
【図９Ｄ】オフロードコマンドのフォーマットを示した図である。
【図１０】実施例２のキャッシュレスのストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。
【図１１】実施例１のストレージコントローラにおけるホストコマンド(通常のコマンド)処理を示すフローチャートである。
【図１２】実施例１のストレージコントローラにおけるデステージの処理手順を示すフローチャートである。
【図１３】実施例２のキャッシュレスのストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。
【図１４】実施例３のドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成を示す図である。
【図１５】実施例３のNVMe over FabricsにおけるホストコンピュータとNVM Subsystemの識別名を示す図である。
【図１６】実施例３のドライブエンクロージャにおけるホストコマンドとオフロードコマンドの処理手順を示すフローチャートである。
【図１７】実施例３のストレージコントローラにおけるエンクロージャコマンドの処理手順を示すフローチャートである。
【図１８】実施例３のストレージコントローラにおけるデステージの処理手順を示すフローチャートである。
【図１９】実施例４の情報処理システムの構成を示すブロック図である。
【図２０】実施例１のドライブエンクロージャにおけるコントローラコマンドの処理手順を示すフローチャートである。
【図２１】実施例３のドライブエンクロージャにおけるコントローラコマンドの処理手順を示すフローチャートである。
【図２２】ドライブエンクロージャのホスト情報テーブルを示す図である。
【図２３】エンクロージャコマンドのフォーマットを示す図である。
【図２４】実施例５のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャにおいてプログラムの構成図である。
【図２５】実施例５のドライブエンクロージャにおけるホストコマンドの処理手順を示すフローチャートである。
【図２６】実施例５のドライブエンクロージャにおけるコントローラコマンドの処理手順を示すフローチャートである。
【図２７】実施例５のストレージコントローラにおけるエンクロージャコマンドの処理手順を示すフローチャートである。
【図２８】実施例５のドライブエンクロージャにおける２重化領域とパリティ生成済み領域を示す図である。
【図２９】実施例５のドライブエンクロージャにおける2重書きの対応関係を示す図である。
【図３０】実施例７のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャにおいてプログラムの構成図である。
【図３１】実施例７のドライブエンクロージャにおけるホストコマンドの処理手順を示すフローチャートである。
【図３２】実施例７のストレージコントローラにおけるエンクロージャコマンドの処理手順を示すフローチャートである。
【図３３】実施例９のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャにおいてプログラムの構成図である。
【図３４】実施例９のストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。
【図３５】実施例９のドライブエンクロージャにおけるオフロードコマンドの処理手順を示すフローチャートである。
【図３６Ａ】アドレス変換テーブルの一例を示す図である。
【図３６Ｂ】データ保護ドライブグループテーブルの一例を示す図である。
【発明を実施するための形態】
【００１７】
以下、図面を参照して本発明の実施形態を説明する。以下の記載および図面は、本発明を説明するための例示であって、説明の明確化のため、適宜、省略および簡略化がなされている。本発明は、他の種々の形態でも実施する事が可能である。特に限定しない限り、各構成要素は単数でも複数でも構わない。
【００１８】
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていてもよい。識別情報について説明する際に、「識別情報」、「識別子」、「名」、「ＩＤ」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
【００１９】
同一あるいは同様な機能を有する構成要素が複数ある場合には、基本的に同一の符号を付して説明する。
【００２０】
また、以下の説明では、プログラムを実行して行う処理を実行する場合があるが、プログラムは、中央処理部であるプロセッサ（例えばＣＰＵ）によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）および／またはインターフェースデバイス（例えば通信ポート）等を用いながら行うため、処理の主体がプロセッサとされてもよい。
【００２１】
プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバまたは計算機が読み取り可能な記憶メディアであってもよい。プログラムソースがプログラム配布サーバの場合、プログラム配布サーバはプロセッサと配布対象のプログラムを記憶する記憶資源を含み、プログラム配布サーバのプロセッサが配布対象のプログラムを他の計算機に配布してもよい。また、以下の説明において、２以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２以上のプログラムとして実現されてもよい。
【００２２】
（発明の概要）
FBOFは、ストレージコントローラから提供されたデータ転送情報に基づき、ストレージシステムのドライブからリードしたデータを、ホストコンピュータに転送(直転送)する。データ転送情報は、ホストコンピュータからのリードコマンドに指定された論理ボリュームのアドレスに対応するFBOF内のドライブとドライブ内のアドレスを含む。上記の、論理ボリュームのアドレスと、FBOF内のドライブとドライブ内のアドレスの対応関係は、ストレージ装置が構成情報に基づいて導出する。尚、ストレージコントローラは、図面上、ＣＴＬと表記する場合がある。また、ドライブを含むストレージシステムと対比し、ストレージコントローラをストレージ装置と呼ぶ場合がある。
【００２３】
ストレージコントローラがホストコンピュータからコマンドを受け取る場合、データ転送情報には、ホストコンピュータのデータ格納先のアドレス等の情報を含む。キャッシュを搭載するストレージコントローラにおいては、ストレージコントローラがキャッシュヒット、ヒットミス判定を行い、キャッシュヒットしたデータについてはストレージコントローラがホストコンピュータにデータを転送し、キャッシュヒットミスしたデータについてはFBOFがホストコンピュータにデータを転送する。
【００２４】
本実施の形態のストレージ装置およびデータ転送方法によれば、ストレージコントローラの通信Ｉ／Ｆと、キャッシュ制御やバッファを使わず、FBOFとホストコンピュータの間で直接データ転送することによるリードIO性能の向上とレイテンシの削減（応答性能向上）が見込める。更に、リードIO性能については、FBOF追加による性能スケーリングが見込める。
【実施例１】
【００２５】
以下図面について、本発明の一実施の形態を詳述する。
（１）実施例１の情報処理システムの構成
図１は実施例１の情報処理システム構成図である。図１は、ホストコンピュータやストレージコントローラと同じネットワークにドライブ筐体を接続する形態(接続形態１：実施例１、実施例２、実施例３、実施例５、実施例７、実施例９)による情報処理システムの構成を示している。
【００２６】
この情報処理システム１００は、１又は複数のホストコンピュータ１１０と、ストレージ装置１２０と、ドライブ筐体１４０を備え、これらがＬＡＮ（Local Area Network）又はインターネット等からなるネットワーク１５０を介して相互に接続されて構成されている。ドライブ筐体１４０がFBOFである。ドライブ筐体は、図面の表記の関係で、ＥＮＣ、或いはドライブエンクロージャと呼ぶことがある。ストレージ装置１２０とドライブ筐体１４０とでストレージシステムを構成する。ネットワーク１５０は、例えば、Ethernet（登録商標）、Infiniband（登録商標）等の高性能なネットワークで、NVMe over Fabrics(NVMeoF)に対応している。
【００２７】
ホストコンピュータ１１０は、ＣＰＵ（Central Processing Unit）及びメモリ等の情報資源を備えたコンピュータ装置であり、例えば、オープン系のサーバや、クラウドサーバ等から構成される。ホストコンピュータ１１０は、ユーザ操作や、実装されたプログラムからの要求に応じてネットワーク１５０を介してストレージ装置１２０にライトコマンドやリードコマンドを送信する。
【００２８】
ストレージ装置１２０は、ストレージとしての機能をホストコンピュータ１１０に提供するための必要なソフトウエアが実装された装置であり、冗長化されたストレージコントローラ１２１とストレージコントローラ１２２から構成される。ストレージコントローラ１２１は、マイクロプロセッサ１２３、メモリ１２５、フロントエンドインタフェース（ネットワークI/F）１２６及び記憶装置１２９とを備える。ストレージコントローラ１２２はストレージ１２１と同じ構成である。
【００２９】
マイクロプロセッサ１２３は、ストレージコントローラ１２１全体の動作制御を司るハードウェアであり、１又は複数のプロセッサコア１２４を有する。各プロセッサコア１２４は、ホストコンピュータ１１０から与えられたリードコマンドやライトコマンドに応じて、対応するドライブ筐体（FBOF）１４０にデータを読み書きする。
【００３０】
またメモリ１２５は、例えば、ＳＤＲＡＭ（Synchronous Dynamic Random Access Memory）等の半導体メモリから構成され、必要なプログラム（ＯＳ（Operating System）を含む）やデータを記憶保持するために利用される。メモリ１２５は、マイクロプロセッサ１２３の主記憶であり、マイクロプロセッサ１２３が実行するプログラム（ストレージ制御プログラム等）や、マイクロプロセッサ１２３が参照する管理テーブル等が格納される。また、メモリ１２５は、ストレージコントローラ１２１のディスクキャッシュ（キャッシュメモリ）としても使用される。
【００３１】
メモリ１２５に格納されたプログラム（図３、図１４、図２３に示すプログラム）をマイクロプロセッサ１２３のプロセッサコア１２４が実行することにより、ストレージ機能をホストコンピュータ１１０に提供するための各種処理が実行される。ただし、以下においては、理解の容易化のため、かかるプログラムをマイクロプロセッサ１２３が実行するものとして説明を進める。
【００３２】
ネットワークI/F１２６は、ホストコンピュータ１１０に対するインタフェースであり、ネットワーク１５０を介したホストコンピュータ１１０との通信時におけるプロトコル制御を行う。
【００３３】
記憶装置１２９には、ＯＳやストレージ制御プログラム、管理テーブルのバックアップ等が格納される。記憶装置１２９は、例えばＨＤＤやＳＳＤ(Solid State Drive)である。
【００３４】
ストレージコントローラ１２２はストレージコントローラ１２１と同じ内部構成のため、図示を省略した。ストレージコントローラ１２１とストレージコントローラ１２２間はNon transparent bridge等のＭＰ間Ｉ／Ｆ１３４で接続され、ユーザデータや、ストレージ構成情報などを含む制御情報が通信される。ストレージコントローラ１２２の動作もストレージコントローラ１２１と同様であり、説明の簡略化のために、特に断りがない限り以降ではストレージコントローラ１２１のみ説明する。
【００３５】
（２）ドライブ筐体の構成
図２は、ドライブ筐体の構成図である。ドライブ筐体１４０は、ドライブの制御と、外部から記憶装置であるドライブに読み書きする機能を提供するための必要なソフトウエアが実装された装置である。また、ドライブ筐体は、冗長化されたドライブエンクロージャ２００とドライブエンクロージャ２０１、１又は複数のドライブ２１８から構成される。ドライブエンクロージャの冗長化はドライブ筐体の可用性と信頼性向上のために望ましいが、必須ではない。ドライブ筐体を冗長化の無い単一のドライブエンクロージャから構成しても良い。
【００３６】
ドライブエンクロージャ２００は、マイクロプロセッサ２０２、メモリ２０４、ネットワークI/F２０５及びＰＣＩｅスイッチ２１４と、記憶装置２０８とを備える。ドライブ２１８はデュアルポートのＮＶＭｅドライブで、ＰＣＩｅ接続ポート２１９と２２２を備える。ＰＣＩｅ接続ポート２１９と２２２は、それぞれドライブエンクロージャ２００のＰＣＩｅ ＳＷ（Switch）２１４のＰＣＩｅ接続ポート２２１と、ドライブエンクロージャ２０１のＰＣＩｅ ＳＷ２１４のＰＣＩｅ接続ポート２２１に、それぞれＰＣＩｅリンク２２０とＰＣＩｅリンク２２３で接続される。ドライブ２１８は、ストレージシステムの記憶領域を構成し、ホストコンピュータからのデータを格納する記憶装置である。なお、ドライブ２１８は必ずしもＮＶＭｅドライブである必要はなく、例えばＳＡＳドライブやＳＡＴＡドライブであってもよい。またドライブ２１８は必ずしもデュアルポートである必要はなく、シングルポートであってもよい。
【００３７】
マイクロプロセッサ２０２は、ドライブエンクロージャ２００全体の動作制御を司るハードウェアであり、１又は複数のプロセッサコア２０３を有する。各プロセッサコア２０３は、ストレージ装置１２０から与えられたリードコマンドやライトコマンドに応じて、対応するドライブ２１８にデータを読み書きするとともに、ストレージ装置１２０から与えられたデータ転送コマンドに応じて、ホストコンピュータ１１０との間のデータ転送を行う。
【００３８】
またメモリ２０４は、例えば、ＳＤＲＡＭ（Synchronous Dynamic Random Access Memory）等の半導体メモリから構成され、必要なプログラム（ＯＳ（Operating System）を含む）やデータを記憶保持するために利用され、キャッシュメモリとして機能する。
【００３９】
メモリ２０４は、マイクロプロセッサ２０２の主記憶であり、マイクロプロセッサ２０２が実行するプログラム（ドライブエンクロージャ制御プログラム等）や、マイクロプロセッサ２０２が参照する管理テーブル等が格納される。メモリ２０４に格納されたプログラムをマイクロプロセッサ２０２のプロセッサコア２０３が実行することにより、FBOFを含むドライブエンクロージャ機能をストレージ装置１２０とホストコンピュータ１１０に提供するための各種処理が実行される。ただし、以下においては、理解の容易化のため、かかるプログラムをマイクロプロセッサ２０２が実行するものとして説明を進める。
【００４０】
ネットワークI/F２０５とＰＣＩｅ ＳＷ２１４のＰＣＩｅポート２１５は、それぞれマイクロプロセッサ２０２のＰＣＩｅポート２０７とＰＣＩｅポート２１７に、それぞれＰＣＩｅリンク２０６とＰＣＩｅリンク２１６で接続される。
【００４１】
記憶装置２０８には、ＯＳやドライブエンクロージャ制御プログラム、管理テーブルのバックアップ等が格納される。記憶装置２０８は例えばＨＤＤやＳＳＤである。
【００４２】
ドライブエンクロージャ２０１はドライブエンクロージャ２００と同じ内部構成のため、図示を省略した。ドライブエンクロージャ２００とドライブエンクロージャ２０１間はNon transparent bridge等のＭＰ間Ｉ／Ｆ２１３で接続され、ユーザデータや、ドライブエンクロージャ構成情報などを含む制御情報が通信される。ドライブエンクロージャ２０１の動作もドライブエンクロージャ２００と同様であり、説明の簡略化のために、特に断りがない限り以降ではドライブエンクロージャ２００のみ説明する。
【００４３】
（３）ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成
図３は、実施例１のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャにおいて実施例１に直接関与するプログラムの構成の図であり、ストレージコントローラがホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態による(ターゲット構成形態１：実施例１、実施例２、実施例９)を示す。
【００４４】
ホストコンピュータ１１０のプログラムはアプリケーションプログラム３００、イニシエータドライバ３０１および図示しないＯＳ（Ｏｐｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ）から構成される。
【００４５】
アプリケーションプログラム３００は、例えば、数値計算プログラムや、データベース、Ｗｅｂサービス等のプログラムである。イニシエータドライバ３０１は、ターゲットドライバが提供するＮＶＭｅｏＦ（NVMe over Fabrics）対応の記憶領域を認識し、リード、ライト等のコマンドのアプリケーションＩ／Ｆをアプリケーションプログラムに対して提供する。実施例１では、ホストコンピュータ１１０のイニシエータドライバ３０１は、ストレージコントローラ１２１のターゲットドライバ３０２と、ドライブエンクロージャ２００のターゲットドライバ３０８の提供するＮＶＭｅｏＦ対応の記憶領域を認識する。
【００４６】
ストレージコントローラ１２１のプログラムは、ターゲットドライバ３０２、イニシエータドライバ３０３、ホストコマンド処理部３０４、データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５、キャッシュ制御部３０６、データ転送オフロード部３０７、オフロードコマンド通信部(イニシエータ)３１５、デステージ処理部３１４、アドレス変換部３１８、および図示しないＯＳから構成される。
【００４７】
ターゲットドライバ３０２は、イニシエータドライバ３０１に対してＮＶＭｅｏＦ対応の記憶領域を提供するとともに、ホストコマンドの受信、コマンドの完了応答の送信を行う。
【００４８】
イニシエータドライバ３０３は、ターゲットドライバ３０８の提供するＮＶＭｅｏＦ対応の記憶領域を認識するとともに、ドライブエンクロージャ２００との間でコマンドの送信、コマンドの完了応答の受信を行う。ストレージコントローラ１２１がドライブエンクロージャ２００に発行するコマンドをコントローラコマンドと呼ぶ。
【００４９】
ホストコマンド処理部３０４は、ホストコンピュータが発行したコマンドを、ターゲットドライバ３０２を介して受信し、コマンドの解析、リードコマンド・ライトコマンド・管理コマンドの処理、コマンドの完了応答の作成、ターゲットドライバ３０２を介したコマンドの完了応答の送信等を行う。
【００５０】
データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５は、ホストコマンド処理部３０４の指示に従い、ＮＶＭｅｏＦに対応したストレージコントローラとホストコンピュータとの間のデータ転送処理を行う。
【００５１】
キャッシュ制御部３０６は、キャッシュデータの検索に基づくキャッシュヒット、ヒットミスの判定、ダーティデータ（物理ドライブへの書込み前の状態）とクリーンデータ（物理ドライブへの書込み後の状態）の各状態間の遷移、キャッシュ領域のリザーブ及びリリース等の制御を行う。キャッシュヒット、ヒットミスの判定は、ホストコンピュータからのＩＯコマンドに応答するデータがストレージコントローラのキャッシュメモリ２０４にあるか否かを判定する。例えば、ホストコンピュータからのＩＯコマンドがリードコマンドの場合、リードコマンドに応答するデータがキャッシュメモリ２０４上にあるか否を判定する。これらのキャッシュ制御の各処理は広く知られた技術であり、ここでの詳細な説明を省略する。
【００５２】
データ転送オフロード部３０７は、データ転送のオフロードコマンド（データ転送パラメータ）を作成し、ドライブエンクロージャ（２００もしくは２０１）に対してホストコンピュータへのデータ転送をオフロードコマンドで指示する。オフロードコマンド通信部(イニシエータ)３１５は、ドライブエンクロージャとの間でオフロードコマンドの送信、応答の受信を行う。
【００５３】
デステージ処理部３１４は、イニシエータドライバ３０３を介して、キャッシュ内のデータをドライブに書き込むデステージ処理を行う。アドレス変換部３１８は、ストレージコントローラの管理するname space５０４のデータ範囲５０５と、データの格納先であるドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９とのマッピングテーブルを持ち、データ範囲５０５のアドレスを、対応するドライブエンクロージャ２００、ドライブ、ドライブ内の記憶領域のアドレスに変換する。
【００５４】
ドライブエンクロージャ２００のプログラムは、ターゲットドライバ３０８、コントローラコマンド処理部３０９、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)３１０、データ転送制御部(ストレージコントローラとドライブエンクロージャ間)３１６、オフロードコマンド通信部(ターゲット)３１３、オフロードコマンド処理部３１１、ドライブ制御部３１２、バッファ制御部３１７、および図示しないＯＳから構成される。
【００５５】
ターゲットドライバ３０８は、イニシエータドライバ３０１とイニシエータドライバ３０３に対してＮＶＭｅｏＦ対応の記憶領域を提供するとともに、ホストコンピュータとの間でホストコマンドの受信、コマンドの完了応答の送信を行い、ストレージコントローラとの間でコントローラコマンドの受信、コマンドの完了応答の送信を行う。
【００５６】
コントローラコマンド処理部３０９は、ストレージコントローラが発行したコマンドを、ターゲットドライバ３０８を使用して受信し、コマンドの解析、リード・ライト処理、コマンドの完了応答の作成、ターゲットドライバ３０８を介したイニシエータドライバ３０３に対するコマンドの完了応答の送信等を行う。
【００５７】
データ転送制御部(ホストコンピュータとエンクロージャ間)３１０は、オフロードコマンド処理部３１１の指示に従い、ＮＶＭｅｏＦに対応したホストコンピュータとドライブエンクロージャとの間のデータ転送処理を行う。データ転送制御部(ストレージコントローラとエンクロージャ間)３１６は、コントローラコマンド処理部３０９の指示に従い、ＮＶＭｅｏＦに対応したストレージコントローラとドライブエンクロージャとの間のデータ転送処理を行う。
【００５８】
オフロードコマンド通信部(ターゲット)３１３は、ストレージコントローラからのオフロードコマンドの受信と応答の送信を行う。オフロードコマンド処理部３１１は、ストレージコントローラ１２１からのデータ転送のオフロードコマンドを受信し、オフロードコマンドの解析、リード処理、オフロードコマンドの完了応答の作成、オフロードコマンドの完了応答の送信等を行う。
【００５９】
ドライブ制御部３１２は、ドライブ２１８の管理と、コントローラコマンド処理部３０９およびオフロードコマンド処理部３１１の指示に従ってドライブ２１８に対してリード・ライト処理を行う。バッファ制御部３１７は、データ転送を行うための一時的なメモリ領域であるバッファの確保と解放を行う。
【００６０】
（４）NVMe over FabricsにおけるホストコンピュータとNVM Subsystemの識別名
図４は、NVMe over FabricsにおけるホストコンピュータとNVM Subsystemの識別名を示す図である。つまり、ターゲット構成形態１によるNVMe over FabricsにおけるホストコンピュータとNVM Subsystemの識別名を示す図である。
【００６１】
識別名とはNVMe over Fabrics規格のNQN (NVMe Qualified Name)であり、ファブリック内でユニークである。NVM Subsystemとは、記憶領域（NVMe規格ではnamespaceと呼ばれる）と、管理コマンドおよびリード・ライト等のＩＯコマンドの処理機能を持つ論理的なドライブである。図４のNQNは、理解の容易化のため、規格で定められたフォーマットではない簡略化した文字列で表している。
【００６２】
ホストコンピュータ１１０は、少なくとも１つの識別名４０１（ホストNQN）を持つ。ホストコンピュータ１１０は複数でもよいが、図示を省略した。ドライブエンクロージャ２００は、少なくとも１つの識別名４０２（NVM Subsystem NQN）を持つ。例えば、ドライブ筐体１４０のドライブ２１８毎に１つの識別名４０２を持つ。上記はドライブエンクロージャ２０１についても同様であり、説明は省略する。ドライブエンクロージャ２００とドライブエンクロージャ２０１は二つ以上でもよいが、図示を省略した。
【００６３】
ストレージコントローラ１２１は、少なくとも１つの識別名４０３（NVM Subsystem NQN）を持つ。この識別名４０３に対応するNVM Subsystemの中に、ストレージプールの一部を割り当てた論理的な記憶領域がnamespaceとして割り当てられる。ストレージプールとは、複数のドライブ２１８の記憶領域から構築され、ＲＡＩＤ等のデータ保護がされた記憶領域である。上記はストレージコントローラ１２２のNVM Subsystemについても同様であり、説明は省略する。
【００６４】
ストレージ装置１２０とドライブ筐体１４０の起動後、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）は、上記識別名４０２を持つNVM Subsystemを作成する。また、ストレージコントローラ１２１（およびストレージコントローラ１２２）は、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）に対してconnectコマンドを送ることで、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）のNVM Subsystemにコマンド送信およびデータ転送できるようにするとともに、上記識別名４０３を持つNVM Subsystemを作成する。
【００６５】
ホストコンピュータ１１０は、ストレージコントローラ１２１（およびストレージコントローラ１２２）とドライブエンクロージャ２００（およびドライブエンクロージャ２０１）に対してconnectコマンドを送ることで、ストレージコントローラ１２１（およびストレージコントローラ１２２）とドライブエンクロージャ２００（およびドライブエンクロージャ２０１）のNVM Subsystemにコマンド送信およびデータ転送できるようにする。
【００６６】
（５）ユーザデータのアドレスマッピング
図５は、ユーザデータのアドレスマッピングの説明に供する概念図である。つまり、ユーザデータのアドレスマッピングの説明に供する概念図である。
【００６７】
ホストコンピュータ１１０はＯＳがアプリケーションプログラムに提供する連続した仮想メモリ５００と、実際のデータの格納先である物理メモリ５０２を備える。
【００６８】
ホストコンピュータ１１０のアプリケーションプログラムは、例えばストレージコントローラ１２１にリードコマンドを発行するときに、仮想メモリ５００内にリードデータの格納先として仮想メモリ領域５０１を確保する。仮想メモリ領域５０１は、メモリ管理単位であるページ単位で、物理メモリ内の物理メモリ領域５０３に対応している。アプリケーションプログラム３００がストレージ装置１２０に発行するリードコマンドは、リード対象のnamespace５０４（ストレージ装置において論理ボリュームに相当する）と、namespace５０４内のデータ範囲５０５に対応するnamespace５０４内のアドレスと、データ転送長と、ホストコンピュータ１１０内でデータ転送に用いる物理メモリ領域５０３の情報と、を指定するフィールドを有する。
【００６９】
データ範囲５０５「ａ」−「ｄ」のデータは、ストレージコントローラ１２１内のキャッシュ５０６のキャッシュ管理単位であるキャッシュセグメント５０７、もしくは、ドライブエンクロージャ２００に接続するドライブ５０８内の記憶領域５０９に格納される。キャッシュ５０６はデータの一時的な格納に用いられる。１つのキャッシュセグメントには、例えば、６４ＫＢのデータを格納することができる。実施例１では、キャッシュ管理単位をキャッシュセグメントとして説明するが、１又は複数のキャッシュセグメントを関連付けたキャッシュスロットの単位で管理してもよい。
【００７０】
図５では、一例として、データ範囲５０５内の「ａ」箇所にデータが書き込まれ、キャッシュセグメント５０７に新データが格納され、ドライブ５０８内の記憶領域５０９の「ａ」箇所のデータが旧データとなった状態を示している。ストレージコントローラ１２１のデステージング処理によりキャッシュセグメント５０７のデータが記憶領域５０９の「ａ」箇所に書き込まれ、新データに更新されると、キャッシュセグメント５０７は解放され、再利用できる状態となる。
【００７１】
namespace５０４内のデータ範囲５０５に対応するキャッシュセグメント５０７とのマッピング、もしくはドライブエンクロージャ２００と、ドライブ５０８と、記憶領域５０９のアドレスとのマッピングは、ストレージコントローラ１２１で管理する。
【００７２】
namespace５０４内のデータ範囲５０５に対応するキャッシュセグメント５０７とのマッピングは、従来のキャッシュメモリと同じであり説明を省略する。
namespace５０４内のデータ範囲５０５に対応するドライブエンクロージャ２００と、ドライブ５０８と、記憶領域５０９のアドレスとのマッピングは、図３６Ａにて説明する。
【００７３】
（３６）アドレス変換テーブル、データ保護ドライブグループテーブル
図３６Ａはアドレス変換テーブル、図３６Ｂはデータ保護ドライブグループテーブルを示す図である。これらアドレス変換テーブル及びデータ保護ドライブグループテーブルは、ストレージコントローラ１２１によって管理される。
【００７４】
図３６Ａは、namespace５０４内のデータ範囲５０５とデータ格納先のアドレスのマッピング情報である、アドレス変換テーブル３６００を示す図である。アドレス変換テーブル３６００は、論理ボリュームのアドレスからデータ格納先のアドレスに変換するアドレス変換処理で使用される。アドレス変換テーブル３６００は、論理アドレス３６０１、ドライブ領域番号３６０２、ドライブアドレス３６０３の項目を含む。
【００７５】
実際のストレージシステムでは、論理ボリューム、ストレージプール、キャッシュ、ＲＡＩＤやミラーリング等で保護された記憶領域、ドライブという複数の階層が存在し、アドレス変換処理は多段となる。本実施例では説明を簡単にするため、実施例の説明に必要となる階層以外を省略し、例として論理ボリュームとドライブのアドレスの対応関係のみを述べる。論理ボリュームはNVM SubsystemとNamespaceのペアに対応する。例では、論理ボリューム毎に1つアドレス変換テーブル３６００が存在するものとした。論理アドレス３６０１は、論理ボリューム内の論理アドレスである。ドライブ領域番号３６０２は、ドライブ５０８の識別番号である。
【００７６】
ドライブ領域番号３６０２は、図９Ｃにて詳細を説明する。ドライブアドレス３６０３は、ドライブ５０８内のデータ格納先のアドレスである。以降の説明で、ドライブアドレスを物理アドレスと呼ぶ場合がある。ドライブアドレス３６０３のテーブル要素の形態はデータの格納方式に依存する。本実施例ではデータ保護方式をＲＡＩＤとして、アドレス変換テーブル３６００で論理アドレス３６０１とドライブ領域番号３６０２、ドライブアドレス３６０３を対応付ける。データ保護方式がミラーリングの場合は、アドレス変換テーブル３６００で論理アドレス３６０１と、ミラー元とミラー先のそれぞれのドライブ領域番号３６０２、ドライブアドレス３６０３を対応付ける。
【００７７】
アドレス変換テーブルにおけるアドレスの管理単位、すなわち論理アドレスとドライブアドレスの対応付けの単位は、例えばＲＡＩＤストライプ単位である。論理ボリュームのブロックサイズは例えば512B、ＲＡＩＤストライプサイズは例えば512KB(=1024 Block)である。本実施例では論理アドレスとデータ格納先の対応関係を容易に理解できるように、アドレス変換テーブルを用いてアドレス変換処理を説明した。ＲＡＩＤやミラーリング等のデータ保護方式では、計算によりアドレス変換をすることが可能であり、アドレス変換処理は本方法に限定されるものではない。例えば、ＲＡＩＤではパリティサイクルの単位で論理アドレスとドライブアドレスの対応付けに周期性があり、ＲＡＩＤグループのドライブ構成と周期性を用いて、論理アドレス３６０１からドライブ領域番号３６０２、ドライブアドレス３６０３を計算することができる。ＲＡＩＤグループのドライブ構成は、図３６Ｂで説明する。
【００７８】
図３６Ｂは、データ保護に用いるドライブグループの管理情報である、データ保護ドライブグループテーブル３６１０を示す図である。データ保護ドライブグループテーブル３６１０は、ドライブグループ番号３６１１、データ保護方式３６１２、ドライブ構成３６１２の項目を含む。
【００７９】
ドライブグループ番号３６１１は、ドライブグループの識別番号である。データ保護方式３６１２は、ドライブグループのデータ保護方式を示している。例えばＲＡＩＤ５（３Ｄ＋１Ｐ）、ＲＡＩＤ６（６Ｄ＋２Ｐ）、ミラーリングなどである。“Ｄ”はデータドライブ、“Ｐ”はパリティドライブを示している。例えば“３Ｄ＋１Ｐ”は３台のデータドライブ、１台のパリティドライブで、合計４台のドライブで構成されることを示している。ドライブ構成３６１２は、ドライブグループを構成するドライブのドライブ領域番号を示している。データ保護ドライブグループテーブル３６１０は、ストレージシステムの構成情報の１つとして、ストレージ装置１２０が管理・保存する。
【００８０】
（６）ストレージコントローラにおけるホストコマンドの処理手順
図６は、実施例１のストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。つまり、ターゲット構成形態１によるストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。
【００８１】
ストレージコントローラ１２１のターゲットドライバ３０２がホスト１１０からコマンドを受信すると、ホストコマンド処理部３０４がステップ６００以降の処理を開始する。
【００８２】
始めに、ホストコマンド処理部３０４は、ストレージコントローラのホスト情報テーブル９２０の情報を用いて、NVM Subsystem NQNである識別名９２３（図４の４０３）を得る（図９Ｂ参照）とともに、受信したNVMeコマンドを解析し(受信したNVMeコマンドについては図９Ａ参照)、コマンド種別９１２、namespaceの識別子であるNID (namespace ID)９１３、開始アドレス９１４、データ転送長のフィールド９１５を読み込む（ステップ６０１）。
【００８３】
次に、コマンドの種別で処理を分岐する（ステップ６１３）。コマンド種別９１２がIOコマンド(リードコマンドもしくはライトコマンド)の場合はステップ６０２に進む。コマンド種別が管理コマンド(namespaceの作成や削除のコマンド、NVM Subsystemの情報取得コマンド、NVM Subsystemの設定コマンド等)の場合はステップ６１４に進む。以下では、ステップ６１３においてコマンド種別がIOコマンドの場合のフローについて説明する。
【００８４】
ステップ６１３からステップ６０２に処理が分岐すると、ターゲットドライバ３０２から得られるストレージコントローラの識別名４０３、受信したNVMeコマンドのNID、開始アドレスとデータ転送長の情報に基づき、キャッシュ制御部３０６がキャッシュヒット、ヒットミス判定を行う（ステップ６０２）。
【００８５】
次に、上記キャッシュヒット、ヒットミス判定と、上記コマンド種別とデータ転送長の情報に基づきデータ転送方法の判定を行う（ステップ６０３）。データ転送方法の判定は、図８に示すテーブルに従って、通常のデータ転送を行うか、ドライブ筐体にデータ転送をオフロードするか、を判定する。
【００８６】
次に、データ転送方法で処理を分岐する（ステップ６０４）。データ転送方法が通常のデータ転送の場合はステップ６０５に進み、データ転送方法がオフロードの場合はステップ６０６に進む。通常のデータ転送を行う場合、通常のコマンド処理を行う（ステップ６０５）。通常のコマンド処理については、図１１にて説明する。最後に、処理を完了する（ステップ６１０）。
【００８７】
以下、フローチャートのステップ６０６以降の説明に戻り、ドライブ筐体にデータ転送をオフロードする処理のフローについて説明する。
ステップ６０４からステップ６０６に処理が分岐すると、データ転送オフロード部３０７がデータ転送に必要なデータ転送パラメータ（オフロードコマンド）を、開始アドレスとデータ転送長の情報に基づき、アドレス変換テーブル３６００を参照して作成する（ステップ６０６）。つまり、ストレージコントローラは、アドレス変換テーブル３６００を参照し、ホストから受領したコマンドに対応するデータの格納先のドライブに対し、物理アドレスを含むオフロードコマンドを生成する。
【００８８】
オフロードコマンドには、ホストコンピュータを識別するホストNQN、ホストコンピュータのデータ格納先のアドレス等の情報、データ格納先のドライブアドレス、データ転送長を含む。オフロードコマンドに必要な制御データを含み、その作成方法は図９Ａ−Ｄの説明で行う。
【００８９】
次に、データ転送オフロード部３０７はステップ６０１で得られた識別名９２３(図４の４０３)、NID、開始アドレスに対応するデータ格納先のドライブエンクロージャ２００を、アドレス変換テーブル３６００を参照することでアドレス変換部３１８によって識別し、オフロードコマンド通信部 (イニシエータ)３１５を使用してドライブエンクロージャ２００にオフロードコマンドを送信する（ステップ６０７）。
【００９０】
次に、ドライブエンクロージャ２００からのオフロードコマンドの完了を待つ（ステップ６０８）。次に、データ転送オフロード部３０７はオフロードコマンド通信部 (イニシエータ)３１５を使用してドライブエンクロージャ２００からのオフロードコマンドの完了応答を受信し、オフロードコマンドのコマンドの完了応答を解析する（ステップ６１１）。ＮＶＭｅプロトコルでは、一つのコマンドをキューによって処理するため、コマンド発行元に対して、必ずコマンドを処理するデバイスが完了応答を行う必要がある。つまり、ホストコンピュータからのコマンドがリードコマンドである場合、完了応答はコマンドの依頼先であるストレージコントローラからホストコンピュータに返す必要があるためである。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【００９１】
次に、ホストコマンド処理部３０４はホストコンピュータのリードコマンドに対するコマンドの完了応答を作成する（ステップ６１２）。次に、ターゲットドライバ３０２を使用してホストコンピュータ１１０にリードコマンドの完了応答を送信し（ステップ６０９）、処理を完了する（ステップ６１０）。なお、転送対象のデータが複数のドライブエンクロージャ２００のドライブ２１８にまたがる場合は、複数のドライブエンクロージャ２００に対して、ステップ６０６とステップ６０７の処理を行う。また、ステップ６０８では、オフロードコマンドを送信した先の全ドライブエンクロージャ２００からのオフロードコマンドの完了を待つものとする。
【００９２】
以下、フローチャートのステップ６１４以降の説明に戻り、ステップ６１３においてコマンド種別が管理コマンドの場合のフローについて説明する。
ステップ６１３からステップ６１４に処理が分岐すると、管理コマンドで指定された内容に従い、ホストコマンド処理部３０４は管理コマンドの処理を行う（ステップ６１４）。次に、管理コマンドの処理の結果を含むコマンドの完了応答を作成する（ステップ６１５）。次に、ターゲットドライバ３０２を使用してホストコンピュータ１１０にコマンドの完了応答を送信する（ステップ６１６）。
【００９３】
このように、IOコマンド、例えば、リードコマンドを受領すると、キャッシュヒットした場合は、ストレージコントローラがホストコンピュータに対しリードデータを転送し、キャッシュミスした場合、アドレス変換テーブルを参照してオフロードコマンドを作成し、ドライブ筐体（FBOF）にリードデータを直接ホストコンピュータに転送するように制御する。尚、リードデータは、ドライブ筐体からホストコンピュータに直接転送するが、コマンドの完了応答は、ホストコンピュータからコマンドを受領したストレージコントローラのホストコマンド処理部３０４がターゲットドライバ３０２を介して行う必要がある。
【００９４】
（１１）ストレージコントローラにおけるホストコマンドの処理手順の続き(通常のコマンド処理)
図１１は、実施例１のストレージコントローラにおけるホストコマンドの処理手順の続きで、通常のコマンド処理の処理手順を示すフローチャートである。つまり、ターゲット構成形態１によるストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートのステップ６０５の処理である(通常のコマンド処理)。
【００９５】
始めに、ホストコマンド処理部３０４は、コマンド種別で処理を分岐する（ステップ１１０１）。コマンド種別がリードコマンドの場合、ステップ１１０２に進む。コマンド種別がライトコマンドの場合、ステップ１１１３に進む。
【００９６】
ステップ１１０１からステップ１１０２に処理が分岐した場合、キャッシュヒット/ヒットミスで処理が分岐する（ステップ１１０２）。キャッシュヒットの場合は、ステップ１１０３に進む。ヒットミスの場合はステップ１１０６に進む。ここで、キャッシュヒット、ヒットミスの判定は、ホストコンピュータからのＩＯコマンドに応答するデータがストレージコントローラのキャッシュメモリ２０４にあるか否かを判定する。例えば、ホストコンピュータからのＩＯコマンドがリードコマンドの場合、リードコマンドに応答するデータがキャッシュメモリ２０４上にあるか否を判定する。
【００９７】
次に、フローチャートのステップ１１０１においてコマンド種別がリードコマンドで、ステップ１１０２でキャッシュヒットの場合のフローについて説明する。ステップ１１０３に処理が分岐すると、データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５は、リードコマンドで指定されたアドレス範囲のデータを、キャッシュ５０６から、リードコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３に転送する（ステップ１１０３）。
【００９８】
次に、ホストコマンド処理部３０４はコマンドの完了応答を作成する（ステップ１１０４）。次にターゲットドライバ３０２を使用してホストコンピュータへコマンドの完了応答を送信する（ステップ１１０５）。最後に、処理を完了する（ステップ１１１８）。
【００９９】
次に、フローチャートのステップ１１０１においてコマンド種別がリードコマンドで、ステップ１１０２でキャッシュヒットミスの場合のフローについて説明する。ステップ１１０１からステップ１１０２に処理が分岐し、ステップ１１０２からステップ１１０６に処理が分岐すると、キャッシュ制御部３０６がリードデータを格納するためのキャッシュ領域の確保を行う（ステップ１１０６）。次に、ホストコマンド処理部３０４は、ステップ６０１で得られた識別名４０３、NID、開始アドレスに対応するデータ格納先のドライブエンクロージャ２００とドライブ５０８を、アドレス変換テーブル３６００を参照することでアドレス変換部３１８によって識別し、イニシエータドライバ３０３を使用してドライブエンクロージャ２００にコントローラコマンドのリードコマンドを発行する（ステップ１１０７）。
【０１００】
リードコマンドの読み込み先はアドレス変換部３１８のアドレス変換で得られ、それはデータ範囲５０５に対応するドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９である。リードデータの転送先として、ステップ１１０６で確保したキャッシュ領域のアドレスをコマンドに指定する。なお、NVMeトランスポートにRDMAを用いる場合、NVMeoF規格ではデータ転送に必要な情報として、コマンド発行元のメモリ領域のアドレスを指定する。また、NVMeoF規格では、connectコマンドによりホストコンピュータとNVM Subsystemの間にAdminキュー、およびIOキューを作成し、これらのキューを介してコマンドと完了応答の送受信を行う。以降では説明を簡単にするため、ドライブ５０８に対応するNVM Subsystemとのコマンドと完了応答の送受信を、単にドライブ５０８とのコマンドと完了応答の送受信と記載する。
【０１０１】
次に、ドライブエンクロージャ２００からのリードコマンド完了を待つ（ステップ１１０８）。次に、ホストコマンド処理部３０４はイニシエータドライバ３０３を使用してドライブエンクロージャ２００からのリードコマンドの完了応答を受信し、リードコマンドのコマンドの完了応答を解析する（ステップ１１０９）。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１０２】
次に、データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５は、キャッシュ内に格納されたリードデータを、キャッシュ５０６から、リードコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３に転送する（ステップ１１１０）。
【０１０３】
データ転送の完了後、ホストコマンド処理部３０４はホストコンピュータのリードコマンドに対するコマンドの完了応答を作成する（ステップ１１１１）。次に、ターゲットドライバ３０２を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ１１１２）。最後に、処理を完了する（ステップ１１１８）。
【０１０４】
次に、フローチャートのステップ１１０１においてコマンド種別がライトコマンドの場合のフローについて説明する。ステップ１１０１からステップ１１１３に処理が分岐すると、キャッシュ制御部３０６がライトデータを格納するためのキャッシュ領域の確保を行う（ステップ１１１３）。
【０１０５】
次に、データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５は、ライトコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３のデータを、確保したキャッシュ領域に転送する（ステップ１１１４）。次に、キャッシュ領域に転送したライトデータをもう片方のストレージコントローラに転送し、両方のストレージコントローラのキャッシュ領域にライトデータを格納する（ステップ１１１５）。これをキャッシュの二重書きをと呼ぶ。
【０１０６】
次に、ホストコマンド処理部３０４は、ホストコンピュータ１１０のライトコマンドに対応するコマンド完了応答を作成する（ステップ１１１６）。次に、ターゲットドライバ３０２を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ１１１７）。最後に、処理を完了する（ステップ１１１８）。
【０１０７】
（１２）ストレージコントローラにおけるデステージの処理手順
図１２はストレージコントローラにおけるデステージの処理手順を示すフローチャートである。つまり、ターゲット構成形態１によるストレージコントローラにおけるデステージの処理手順を示すフローチャートである。
【０１０８】
デステージ処理部３１４がデステージ条件を満たすと判定（例えば、ダーティキャッシュ量が閾値以上など）すると、デステージ処理部３１４がステップ１２００以降の処理を開始する。
【０１０９】
デステージ処理部３１４は、キャッシュ内に格納されたデステージ対象データをドライブに書き込むまで以降の処理を繰り返す（ステップ１２０１）。デステージ対象データの選択方法については本実施例の本質ではないため、説明を省略する。デステージ処理部３１４は、デステージ対象データを書き込むコントローラコマンドのライトコマンドを作成する（ステップ１２０２）。
【０１１０】
ライトコマンドの書き込み先はアドレス変換部３１８のアドレス変換で得られ、それはデータ範囲５０５に対応するドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９である。次に、ドライブエンクロージャ２００にイニシエータドライバ３０３を介してライトコマンドを送信する（ステップ１２０３）。次に、ドライブエンクロージャ２００からのコマンド完了を待つ（ステップ１２０４）。次に、ドライブエンクロージャ２００からのコマンドの完了応答を、イニシエータドライバ３０３を介して受信し、コマンドの完了応答の解析を行う（ステップ１２０５）。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１１１】
次に、ステップ１２０１の繰り返しが続く場合は、ステップ１２０２に進む。ステップ１２０１の繰り返しが終了すると、デステージが完了したキャッシュ領域の解放を行う（ステップ１２０６）。最後に、処理を終了する（ステップ１２０７）。
【０１１２】
（２０）ドライブエンクロージャにおけるコントローラコマンドの処理手順
図２０はドライブエンクロージャにおけるコントローラコマンドの処理手順を示すフローチャートである。ドライブエンクロージャ２００のターゲットドライバ３０８がストレージコントローラ１２１からコントローラコマンドを受信すると、コントローラコマンド処理部３０９がステップ２０００以降の処理を開始する。
【０１１３】
始めに、コントローラコマンド処理部３０９は、ストレージコントローラ１２１から受信したコマンドを解析し、コマンド種別、namespaceの識別子であるNID (namespace ID)、開始アドレス、データ転送長のフィールドを読み込む（ステップ２００１）。
【０１１４】
次に、コマンド種別で処理を分岐する（ステップ２００２）。コマンド種別がリードコマンドの場合、ステップ２００３に進む。コマンド種別がライトコマンドの場合、ステップ２００９に進む。コマンド種別が管理コマンドの場合、ステップ２０１５に進む。
【０１１５】
以下、ステップ２００２において、コマンド種別がリードコマンドの場合のフローについて説明する。ステップ２００２からステップ２００３に処理が分岐すると、コントローラコマンド処理部３０９は、リードデータを格納するためのバッファ領域を確保する（ステップ２００３）。次に、確保したバッファ領域にリード対象のデータをドライブから読み出す（ステップ２００４）。リード対象のデータを格納したドライブ５０８は、コントローラコマンドの送信先の識別名４０２で識別する。ドライブに発行するリードコマンドのnamespace IDと開始アドレス、データ転送長には、ステップ２００１のフィールドの値を指定する。つまり、ドライブエンクロージャは、ストレージコントローラからのコントローラコマンドに従って、記憶装置であるドライブからデータを読み出す。ドライブエンクロージャが自身のドライブからデータをリードする方法は一般的な方法であり、詳細は割愛する。
【０１１６】
次に、バッファ領域に格納したリードデータをストレージコントローラへデータ転送する(ステップ２００５)。本実施例では、NVMeoF規格においてNVMeトランスポートにRDMA  （Ｒｅｍｏｔｅ  Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）を用いることを前提とする。すなわち、データ転送はコマンドに指定されたコマンド発行元のメモリ領域に対するRDMA Writeで行う。次に、ストレージコントローラ１２１からのリードコマンドに対応するコマンドの完了応答を作成する（ステップ２００７）。次に、コマンドの完了応答を、ターゲットドライバ３０８を介してストレージコントローラ１２１に送信する（ステップ２００８）。最後に、処理を終了する（ステップ２０１８）。
【０１１７】
次に、フローチャートのステップ２００９以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。ステップ２００２からステップ２００９に処理が分岐すると、ライトデータを格納するバッファ領域を確保する（ステップ２００９）。次に、ストレージコントローラ１２１からライトデータを転送する（ステップ２０１０）。データ転送は、NVMeトランスポートにRDMAを用いる場合のNVMeoFの規格に従い、コマンドに指定されたコマンド発行元のメモリ領域に対するRDMA Readで行う。
【０１１８】
次に、バッファ領域に格納したライトデータをドライブへ書き込む（ステップ２０１１）。ライト対象のドライブ５０８は、コントローラコマンドの送信先の識別名４０２で識別する。ドライブに発行するライトコマンドのnamespace IDと開始アドレス、データ転送長には、ステップ２００１のフィールドの値を指定する。ドライブエンクロージャが自身のドライブにデータをライトする方法は一般的な方法であり、詳細は割愛する。
【０１１９】
次に、ストレージコントローラ１２１からのライトコマンドに対応するコマンドの完了応答を作成する（ステップ２０１２）。次に、コマンドの完了応答を、ターゲットドライバ３０８を介してストレージコントローラ１２１に送信する（ステップ２０１４）。最後に、処理を終了する（ステップ２０１８）。
【０１２０】
次に、フローチャートのステップ２０１５以降の説明に戻り、コマンド種別が管理コマンドの場合の処理フローについて説明する。ステップ２００２からステップ２０１５に処理が分岐すると、管理コマンドの処理を行う（ステップ２０１５）。次に、ストレージコントローラ１２１からの管理コマンドに対応するコマンドの完了応答を作成する（ステップ２０１６）。次に、コマンドの完了応答を、ターゲットドライバ３０８を介してストレージコントローラ１２１に送信する（ステップ２０１７）。最後に、処理を終了する（ステップ２０１８）。
【０１２１】
（７）ドライブエンクロージャにおけるデータ転送のオフロードコマンドの処理手順
図７は、実施例１のドライブエンクロージャにおけるデータ転送のオフロードコマンドの処理手順を示すフローチャートである。ターゲット構成形態１によるドライブエンクロージャにおけるデータ転送のオフロードコマンドの処理手順を示すフローチャートである。
【０１２２】
ドライブエンクロージャ２００のオフロードコマンド処理部３１１は、ストレージコントローラ１２１からオフロードコマンド通信部(ターゲット)３１３を介してオフロードコマンドを受信すると、ステップ７００以降の処理を開始する。
【０１２３】
始めに、オフロードコマンド処理部３１１はオフロードコマンドの各フィールドを読み込む（ステップ７０１）。各フィールドについては、図９Ｄにて説明する。次に、リードデータを格納するためのバッファをメモリ２０４に確保する（ステップ７０８）。次に、ステップ７０１で読み込んだフィールドのNVM Subsystem NQNとNIDの情報と、ドライブエンクロージャ内のNVM Subsystem NQNとドライブ２１８のマッピング情報から、対応するドライブ２１８を識別し、ドライブ２１８にリードコマンドを発行する。当該リードコマンドの開始アドレスとデータ転送長には、ステップ７０１で読み込んだフィールドの開始アドレスと、データ転送長と、データの格納先としてステップ７０８で確保したバッファのアドレスを指定する（ステップ７０２）。ドライブはオフロードコマンドに従って、データの格納する記憶装置からデータを読み出す。
【０１２４】
次に、ドライブ２１８からのリードコマンドの完了を待つ（ステップ７０３）。次に、ドライブ２１８からのリードコマンドの完了応答を受信し、完了応答の内容を解析する（ステップ７０７）。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１２５】
次に、データ転送制御部(ホストコンピュータとエンクロージャ間)３１０がバッファのリードデータをホストコンピュータ１１０にデータ転送する（ステップ７０４）。データ転送制御部(ホストコンピュータとエンクロージャ間)３１０は、ドライブエンクロージャ２２０とホストコンピュータ１１０との間でネットワークI/F２０５を介したRDMAによるデータ転送を行う。
【０１２６】
データ転送制御部(ホストコンピュータとエンクロージャ間)３１０は、リードデータのデータ転送のためのRDMA Writeコマンドを作成し、RDMA通信のためのキューにコマンドをエンキューする。RDMA Writeコマンドには、データ転送長と、データ転送元となるバッファのアドレスと、データ転送先となるホストコンピュータ１１０の物理メモリ領域５０３を識別する情報として、ステップ７０１で読み込んだフィールドのメモリアドレスとR_keyと、を指定する。RDMA通信のためのキューは前記のconnectコマンドでホストコンピュータのネットワークＩ／ＦとネットワークI/F２０５の間で事前に作成されている。
【０１２７】
ＮＶＭｅプロトコルでは、一つのコマンドをキューによって処理するため、コマンド発行元に対して、必ずコマンドを処理するデバイスが完了応答を行う必要がある。つまり、ホストコンピュータからのコマンドがリードコマンドである場合、完了応答はコマンドの依頼先であるストレージコントローラからホストコンピュータに返す必要があるためである。ただし、コマンドに応答するデータは必ずしも、キューで結ばれたコマンドの依頼先のデバイスから転送される必要がないため、ドライブエンクロージャからホストコンピュータに直接データを転送し、ストレージコントローラのボトルネックを解消している。
【０１２８】
次に、データ転送制御部(ホストコンピュータとエンクロージャ間)３１０のデータ転送の完了後、オフロードコマンド処理部３１１はバッファを開放(ステップ７０９)する。次に、ストレージコントローラ１２１にオフロードコマンド通信部(ターゲット)３１３を介してオフロードコマンドの完了応答を送信し（ステップ７０５）、処理を終了する（ステップ７０６）。
【０１２９】
（８）データ転送方法の判定
図８は、転送方法の判定で用いるデータ転送条件とデータ転送種別を示す図である。データ転送種別は、IOパターン８００として示され、IOパターンはデータ転送長が閾値よりも小さい、もしくは大きい場合と、リード、もしくはライトのコマンド種別と、で分類される。各分類について、キャッシュヒットした場合８０１と、キャッシュヒットミスした場合８０２で転送条件が決定される。
【０１３０】
実施例１において、ドライブ筐体１４０からホストコンピュータ１１０に直接データ転送できる条件はコマンド種別がリードかつ、キャッシュヒットミスした場合である。なお、データ転送長が大きい場合はシーケンシャルアクセスの可能性が高く、直接データ転送することによる性能向上メリットが大きい。一方で、データ転送長が小さい場合は、ランダムアクセスの可能性が高く、キャッシュヒットによる性能向上メリットが大きいため、通常のコマンド処理でデータのキャッシュ５０６へのコピーを行う。
【０１３１】
なお、上記データ転送長の閾値は固定である必要はなく、ストレージ装置のワークロードに応じて変更できるようにして良い。
【０１３２】
（９）ホストコマンドのフォーマット、ストレージコントローラのホスト情報テーブル、ドライブ情報テーブル、オフロードコマンドのフォーマット
図９Ａはホストコマンドのフォーマット、図９Ｂはストレージコントローラのホスト情報テーブル、図９Ｃはドライブ情報テーブル、図９Ｄはオフロードコマンドのフォーマットを示す図である。
【０１３３】
図９Ａに示した、ホストコマンドのフィールドは、コマンド識別子９１１、コマンド種別９１２、NID９１３、開始アドレス９１４、データ転送長９１５、メモリアドレス９１６、R_key９１７を含む。
【０１３４】
コマンド識別子９１１は、個々のコマンドを識別するため識別子である。例えば、複数のコマンドを多重に実行する仕組みにおいて、発行したコマンドと、コマンドの完了応答を対応させることに使用する。コマンド識別子によるコマンド識別はコマンド実行において広く知られた方法であり、詳しい説明を省略する。
【０１３５】
コマンド種別９１２は、リードコマンド、ライトコマンド、管理コマンドを示すコード(符合)である。
【０１３６】
NID９１３は、NVM Subsystem内のnamespace IDである。当該NVM Subsystemは、実施例１では、ストレージコントローラ１２１のNVM Subsystemである。また、このNVM SubsystemのNQNは、図９Ｂのホスト情報テーブルのNVM Subsystem NQN９２３に登録されている。
【０１３７】
開始アドレス９１４とデータ転送長９１５は、データ転送対象のデータの、namespace内のアドレスとデータ転送長である。
【０１３８】
メモリアドレス９１６は、ホストコンピュータ１１０の指定するデータ転送先のホストコンピュータ内メモリ領域のアドレスである。R_key９１７は上記ホストコンピュータ内メモリ領域の識別子である。なお、ホストコマンドのうち、実施例１の説明で重要度の低いフィールドであるメタデータポインタ等については図から省略した。メタデータとは、ドライブや論理ボリュームの論理ブロック単位(例えば512B)に割り当てられた付加的なデータである。メタデータのあり、なしに関わらず実施例１は適用可能であるので、説明を省略する。
【０１３９】
また、説明を簡単にするため、図９Ａではメモリアドレス９１６とR_key９１７の組が１つしかないが、複数の組から成るリストであっても良い。同様に、以降のオフロードコマンドの説明を含め、以降ではメモリアドレスとR_keyを1つの組として説明をするが、複数の組から成るリストであっても良い。
【０１４０】
図９Ｂは、ストレージコントローラのホスト情報テーブルである。ホスト情報テーブル９２０は、キュー番号９２１、ホストNQN９２２、NVM Subsystem NQN９２３の項目を含む。
【０１４１】
キュー番号９２１は、ホストコンピュータとNVM Subsystemの間のIOキューの番号である。ストレージコントローラ１２１は、IOキューを内部で管理するために、ホストコンピュータ１１０からconnectコマンドを受信してIOキューを作成する時に、当該キュー番号を採番する。キュー番号はストレージコントローラ１２１の内部でユニークな値である。ホストNQN９２２とNVM Subsystem NQN９２３は、それぞれ、上記IOキューでつながったホストコンピュータ１１０のNQNとストレージコントローラ１２１のNVM SubsystemのNQNである。
【０１４２】
図９Ｃに示したドライブ情報テーブル９３０は、ドライブ領域番号９３１、ドライブエンクロージャ（ENC）番号９３２、NVM Subsystem NQN９３３、NID９３４の項目を含む。
【０１４３】
ドライブ領域番号９３１は、ストレージコントローラ１２１で使用するドライブ２１８の領域の番号である。ドライブ２１８は図５ではドライブ５０８に対応する。ストレージコントローラ１２１はドライブ２１８の領域をnamespace単位で、管理するために当該ドライブ領域番号を採番する。ドライブ領域番号はストレージコントローラ１２１の内部でユニークな値である。
【０１４４】
ドライブエンクロージャ番号９３２は、当該ドライブ２１８を内部に持つドライブエンクロージャ２００の番号である。ストレージコントローラ１２１はドライブエンクロージャ２００を管理するために当該ドライブエンクロージャ番号９３２を採番する。ドライブエンクロージャ番号９３２はストレージコントローラ１２１の内部でユニークな値である。NVM Subsystem NQN９３３とNID９３４は、ドライブ２１８に対応する識別名４０２とドライブ２１８内のnamespace IDである。
【０１４５】
図９Ｄはオフロードコマンドのフォーマットを示す。オフロードコマンド９００のフィールドは、コマンド識別子９０８、ホストNQN９０１、メモリアドレス９０２、R_key９０３、データ転送方向９０９、NVM Subsystem NQN９０４、NID９０５、開始アドレス９０６、データ転送長９０７、を含む。
【０１４６】
コマンド識別子９０８は、個々のコマンドを識別するため識別子である。ホストNQN９０１は、ドライブ筐体１４０がデータ転送する先のホストコンピュータ１１０のホストNQNである。メモリアドレス９０２は、ホストコンピュータ１１０の指定するデータ転送先のホストコンピュータ内メモリ領域のアドレスである。R_key９０３は上記ホストコンピュータ内メモリ領域の識別子である。データ転送方向９０９は、ドライブエンクロージャ２００からホストコンピュータ１１０へのデータ転送、もしくは、ホストコンピュータ１１０からドライブエンクロージャ２００へのデータ転送、のどちらかを示す。NVM Subsystem NQN９０４と、NID９０５は、それぞれドライブエンクロージャ２００のNVM SubsystemのNVM Subsystem NQNと、NVM Subsystem内のnamespace IDである。開始アドレス９０６とデータ転送長９０７は、データ転送対象のデータの、namespace内のアドレスとデータ転送長である。NID９０５、開始アドレス９０６、データ転送長９０７は、ホストコマンドの論理アドレスからアドレス変換テーブル３６００を参照して得られる情報である。
【０１４７】
上記オフロードコマンドのフィールド９０１〜９０９の値は、ホストコマンド処理部３０４が次のようにして設定する。
【０１４８】
ホストコマンド処理部３０４は、ストレージコントローラ１２１のターゲットドライバ３０２がホストコンピュータ１１０からコマンドを受領したIOキューと、ストレージコントローラのホスト情報テーブル９２０のエントリを照らし合わせ、IOキューに対応するホストNQN９２２をホストNQN９０１に設定し、NVM Subsystem NQN９２３を識別名４０３として識別する。この処理は図６のステップ６０１で行われる。
【０１４９】
ホストコマンド処理部３０４は、ホストコンピュータ１１０がホストコマンド内に指定するメモリアドレス９１６とR_key９１７を、メモリアドレス９０２とR_key９０３に設定する。ホストコマンド処理部３０４は、アドレス変換部３１８を用いて、ステップ６０１で得られた識別名４０３（NVM Subsystem NQN９２３に対応する）、ホストコマンドのNID９１３、開始アドレス９１４とデータ転送長９１５の情報から、データ格納先のドライブ５０８とデータ格納先のアドレスを識別する。
【０１５０】
具体的には、次のように行う。最初にアドレス変換部３１８は、ステップ６０１で得られた「（Ａ）識別名４０３(NVM Subsystem NQN)」、「（Ｂ）ホストコマンドのNID９１３」（ストレージ装置において論理ボリュームに相当する）、「（Ｃ）開始アドレス９１４」（namespace内の論理アドレスに相当する）を、アドレス変換テーブル３６００を用いて、「（Ｄ）ドライブ領域番号３６０２」、「（Ｅ）ドライブアドレス３６０３」に変換する。
【０１５１】
次にアドレス変換部３１８は、「（Ｄ）ドライブ領域番号３６０２」から、ドライブ情報テーブル９３０を用いて、「（Ｆ）ＥＮＣ番号９３２」、「（Ｇ）NVM Subsystem NQN９３３」、「（Ｈ）ＮＩＤ９３４」に変換する。
【０１５２】
オフロードコマンドの転送先のドライブエンクロージャ２００は、「（Ｆ）ＥＮＣ番号」で識別される。オフロードコマンドのNVM Subsystem NQN９０４、NID９０５、開始アドレス９０６は、それぞれ「（Ｇ）NVM Subsystem NQN」、「（Ｈ）ＮＩＤ」、「（Ｅ）ドライブアドレス」に対応する。
【０１５３】
コマンド識別子９０８は、実行中のオフロードコマンドの間でユニークな値である。実施例１では、リードコマンドのときのみオフロードを行うので、データ転送方向９０９はドライブエンクロージャ２００からホストコンピュータ１１０のみである。
【０１５４】
尚、図９Ｄのオフロードコマンドの各フィールドの情報は、上記した順に限定されるものではない。例えば、ホストコマンドから設定できる情報を纏めて設定することもできる。
【０１５５】
以上、実施例１によれば、ホストコンピュータからのリードコマンドを受領したストレージコントローラが、キャッシュミス判定し、リードコマンドのデータ転送長が閾値より長い場合、FBOFであるドライブ筐体からホストコンピュータに対して、直接リードデータを転送する。そのため、ストレージコントローラに、複数のドライブ筐体を接続した場合であっても、ストレージコントローラのボトルネックを解消し、高速なデータ転送を実現することができる。
【実施例２】
【０１５６】
実施例１では、ストレージコントローラがキャッシュを有する形態を説明したが、実施例２では、キャッシュを有さない形態を説明する。キャッシュレスのストレージコントローラにおいても、情報処理システムの構成と、ストレージコントローラ、ドライブエンクロージャの処理は類似点が多いため、以降では、実施例１との違いについて説明する。実施例２において、実施例２で説明する相違点以外は、実施例１の説明と同様であるため、説明は割愛する。
【０１５７】
キャッシュレスのストレージコントローラでは、構成上の違いとして図３のキャッシュ制御部３０６と、図５のキャッシュ５０６が無くなるという違いがある。そのため、ライトデータはドライブエンクロージャ２００に接続するドライブ５０８内の記憶領域５０９に転送（デステージング）されることにより、ドライブ５０８内の記憶領域５０９のデータが即時反映されることになる。ただし、デステージング中は、ドライブ５０８内の記憶領域５０９に新データと旧データが混在することになり、ストレージ装置として一貫性のあるデータをホストコンピュータに応答できるように、図６の制御の一部ステップが変更となる。ドライブ５０８内の記憶領域５０９がデステージングかどうかを判定するために、ストレージコントローラ１２１は記憶領域５０９毎にデステージング状態を示すビットマップを持って管理しても良い。
【０１５８】
データ転送方法の判定については、キャッシュレスとなるため、図８において、キャッシュヒットミスの場合８０２のみとなるとともに、リードの場合は常に直転送とする。すなわち、図８において、キャッシュヒット８０１の場合が無く、さらに閾値が０バイトの場合のデータ転送方法の判定に相当する。
【０１５９】
（１０）キャッシュレスのストレージコントローラにおけるホストコマンドの処理手順
図１０はキャッシュレスのストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。
【０１６０】
ステップ１００２を除き、ステップ６００〜ステップ６１６とステップ１０００〜ステップ１０１６の内容は同じである。ステップ１００２では、ターゲットドライバ３０２から得られる識別名４０３、ステップ１００１で得られるNID、開始アドレスとデータ転送長の情報に基づき、ホストコマンド処理部３０４は、当該領域のデータがデステージング済みかどうかを判定し、デステージング中の場合はデステージ完了を待つ。デステージ完了後、ドライブに最新のデータが反映された状態となる。
【０１６１】
（１３）キャッシュレスのストレージコントローラ(実施例２)におけるホストコマンドの処理手順 (通常のコマンド処理)
図１３はキャッシュレスのストレージコントローラ(実施例２)におけるホストコマンドの処理手順の続きで、通常のコマンド処理の処理手順を示すフローチャートである。
【０１６２】
始めに、ホストコマンド処理部３０４は、コマンド種別で処理を分岐する（ステップ１３０１）。コマンド種別がリードコマンドの場合はステップ１３０２に進む。コマンド種別がライトコマンドの場合は、ステップ１３０９に進む。以下では、ステップ１３０１においてコマンド種別がリードコマンドの場合のフローについて説明する。
【０１６３】
ステップ１３０１からステップ１３０２に処理が分岐すると、ホストコマンド処理部３０４はリードデータを格納するためのバッファ領域の確保をする（ステップ１３０２）。
【０１６４】
次に、識別名４０３、NID、開始アドレスに対応するデータ格納先のドライブエンクロージャ２００とドライブ５０８をアドレス変換部３１８によって識別し、ホストコマンド処理部３０４はイニシエータドライバ３０３を使用してドライブエンクロージャ２００にリードコマンドを発行する（ステップ１３０３）。ドライブに発行するリードコマンドのnamespace IDと開始アドレスはアドレス変換部３１８のアドレス変換によって得られ、データ転送長には、ステップ１００１のフィールドの値を指定する。
【０１６５】
次に、ドライブエンクロージャ２００からのリードコマンド完了を待つ（ステップ１３０４）。次に、リードコマンド完了応答を受信し、完了応答を解析する（ステップ１３０５）。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１６６】
次に、データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５は、リードコマンドで指定されたアドレス範囲のデータを、確保したバッファ領域から、リードコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３に転送する（ステップ１３０５）。データ転送の完了後、ホストコマンド処理部３０４はホストコンピュータ１１０のリードコマンドに対するコマンドの完了応答を作成する（ステップ１３０７）。次に、ターゲットドライバ３０２を介してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ１３０８）。最後に、処理を完了する（ステップ１３２２）。
【０１６７】
次に、フローチャートのステップ１３０９以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。図１１との処理の主な違いは、ホストコンピュータにライトコマンドの完了応答を送信するタイミングである。すなわち、キャッシュ有りの場合は、ライトデータのキャッシュ二重書き後にホストコンピュータへライトコマンドの完了応答を送信し、デステージの条件が満たされたときにドライブへの書き込みを行っていたのに対して、キャッシュ無しの場合は、ライトデータをドライブに書き込み完了した後に、ホストコンピュータへライトコマンドの完了応答を送信する。
【０１６８】
ステップ１３０１からステップ１３０９に処理が分岐すると、ライトデータとRAIDストライプを格納するためのバッファ領域の確保を行う（ステップ１３０９）。次に、データ転送制御部(ホストコンピュータとストレージコントローラ間)３０５は、ライトコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３のデータを、確保したバッファ領域に転送する（ステップ１３１０）。データ転送は、NVMeトランスポートにRDMAを用いる場合のNVMeoFの規格に従い、RDMA Readで行う。
【０１６９】
次に、ライトコマンドの書き込み先に対応するRAIDストライプをドライブからリードするコントローラコマンドのリードコマンドを作成する（ステップ１３１１）。ライトコマンドの書き込み先はアドレス変換部３１８のアドレスに変換で得られ、それはデータ範囲５０５に対応するドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９である。次に、ホストコマンド処理部３０４はイニシエータドライバ３０３を使用してリードコマンドをドライブエンクロージャに送信する（ステップ１３１２）。RAIDストライプはRAIDを構成する複数のドライブエンクロージャ２００の複数のドライブに跨ることがある。その場合は、各ドライブエンクロージャの各ドライブに対して上記の通りリードコマンドを発行する。
【０１７０】
次にリードコマンドの完了を待つ（ステップ１３１３）。次に、リードコマンドの完了応答の受信と完了応答の解析を行う（ステップ１３１４）。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１７１】
次に、読み出したRAIDストライプからパリティを計算する（ステップ１３１５）。次に、RAIDストライプの更新データとパリティをドライブにライトするライトコマンドを作成する（ステップ１３１６）。次に、ドライブエンクロージャ２００にコントローラコマンドのライトコマンドを送信する（ステップ１３１７）。前述の通り、RAIDストライプが複数のドライブエンクロージャ２００の複数のドライブに跨る場合は、各ドライブエンクロージャの各ドライブに対して上記の通りライトコマンドを発行する。次に、ライトコマンドの完了を待つ（ステップ１３１８）。次に、ライトコマンドの完了応答を受信し、完了応答の解析を行う（ステップ１３１９）。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１７２】
次に、ホストコンピュータ１１０からのライトコマンドに対応するコマンドの完了応答を作成する（ステップ１３２０）。次に、ホストコンピュータ１１０にコマンドの完了応答を送信する（ステップ１３２１）。最後に、処理を終了する（ステップ１３２２）。
【０１７３】
実施例２では、図１０のステップ１００４で、ホストコンピュータからのリードコマンドに対し、キャッシュレスとなるため、図８において、キャッシュヒットミスの場合８０２のみとなるとともに、閾値が０バイトの場合のデータ転送方法に該当すると判定し、リードの場合は常に直転送とする。
【０１７４】
実施例２によると、リードの場合は常に直転送となるため、ストレージコントローラに、複数のドライブ筐体を接続した場合であっても、ストレージコントローラのボトルネックを解消し、高速なデータ転送を実現することができる。
【実施例３】
【０１７５】
（１４）ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態による(ターゲット構成形態２：実施例３、実施例４、実施例５、実施例６、実施例７、実施例８)のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成
図１４は、ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態による(ターゲット構成形態２：実施例３、実施例４、実施例５、実施例６、実施例７、実施例８)のホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成を示す図である。
【０１７６】
ストレージコントローラ１２１のプログラムは、エンクロージャコマンド通信部(ターゲット)１４０１、エンクロージャコマンド処理部１４０２、データ転送制御部(ストレージコントローラとエンクロージャ間)１４０３、キャッシュ制御部１４０４、データ転送オフロード部１４０５、オフロードコマンド通信部(イニシエータ)１４０６、デステージ処理部１４０７、コントローラコマンド送信部(イニシエータ)１４０８、アドレス変換部１４１９および図示しないＯＳから構成される。
【０１７７】
エンクロージャコマンド通信部(ターゲット)１４０１は、エンクロージャコマンド通信部(イニシエータ)１４１１に対してＮＶＭｅｏＦ対応の記憶領域を提供する。
【０１７８】
エンクロージャコマンド処理部１４０２は、ドライブエンクロージャ２００が発行したコマンドを、エンクロージャコマンド通信部(ターゲット)１４０１を使用して受信し、コマンドの解析、リード・ライト処理、コマンドの完了応答の作成、エンクロージャコマンド通信部(ターゲット)１４０１を介したコマンドの完了応答の送信等を行う。
【０１７９】
データ転送制御部(ストレージコントローラとエンクロージャ間)１４０３は、エンクロージャコマンド処理部１４０２の指示に従い、ストレージコントローラとドライブエンクロージャとの間のデータ転送処理を行う。キャッシュ制御部１４０４は、キャッシュデータの検索に基づくキャッシュヒット、ヒットミスの判定、ダーティデータ（物理ドライブへの書込み前の状態）とクリーンデータ（物理ドライブへの書込み後の状態）の各状態間の遷移、キャッシュ領域のリザーブ及びリリース等の制御を行う。これらのキャッシュ制御の各処理は広く知られた技術であり、ここでの詳細な説明を省略する。
【０１８０】
データ転送オフロード部１４０５は、データ転送のオフロードコマンドを作成し、ドライブエンクロージャ２００に対してホストコンピュータへのデータ転送を指示する。オフロードコマンドは、ホストコンピュータから受領したＩＯコマンドから、アドレス変換テーブル等のストレージの構成情報に基づき作成し、ドライブ筐体側でＩＯコマンド処理を行うためのコマンドであり、そのため、図９Ｄで示すような、ホスト識別子、メモリアドレス、ドライブの識別子、ドライブのＮＳ、開始アドレス、データ長などのデータ転送パラメータを含む。
【０１８１】
オフロードコマンド通信部(イニシエータ)１４０６は、ドライブエンクロージャとの間でオフロードコマンドの送信、応答の受信を行う。デステージ処理部１４０７は、キャッシュ内のデータをドライブに書き込むデステージ処理を行う。コントローラコマンド送信部(イニシエータ)１４０８は、ドライブエンクロージャとの間でコントローラコマンドの送信と完了応答の受信を行う。アドレス変換部１４１９は、データ範囲５０５と、データの格納先であるドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９とのマッピングテーブルを持ち、データ範囲５０５のアドレスを、対応するドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９のアドレスに変換する。
【０１８２】
ドライブエンクロージャ２００のプログラムはターゲットドライバ１４０９、ホストコマンド処理部１４１０、エンクロージャコマンド通信部(イニシエータ)１４１１、データ転送制御部(ストレージコントローラとエンクロージャ間)１４１３、データ転送制御部(ホストコンピュータとエンクロージャ間)１４１４、オフロードコマンド通信部(ターゲット)１４１５、オフロードコマンド処理部１４１６、コントローラコマンド通信部(ターゲット)１４１７、ドライブ制御部１４１８、バッファ制御部１４１２、コントローラコマンド処理部１４２０、および図示しないＯＳから構成される。
【０１８３】
ターゲットドライバ１４０９は、ホストコンピュータの１１０のイニシエータドライバ３０１に対してＮＶＭｅｏＦ対応の記憶領域を提供する。ホストコマンド処理部１４１０は、ホストコンピュータもしくはストレージコントローラが発行したコマンドを、ターゲットドライバ１４０９を使用して受信し、コマンドの解析、リード・ライト処理、コマンドの完了応答の作成、ターゲットドライバ１４０９を介したコマンドの完了応答の送信等を行う。エンクロージャコマンド通信部１４１１は、エンクロージャコマンド通信部(ターゲット)１４０１の提供するＮＶＭｅｏＦ対応の記憶領域を認識する。データ転送制御部１４１３(コントローラとエンクロージャ間)は、ストレージコントローラとドライブエンクロージャとの間のデータ転送処理を行う。データ転送制御部(ホストコンピュータとエンクロージャ間)１４１４は、ホストコマンド処理部１４１０およびオフロードコマンド処理部１４１６の指示に従い、ＮＶＭｅｏＦに対応したホストコンピュータとドライブエンクロージャとの間のデータ転送処理を行う。
【０１８４】
オフロードコマンド通信部(ターゲット)１４１５は、ストレージコントローラ１２１からのデータ転送のオフロードコマンドの受信と、完了応答の送信を行う。オフロードコマンド処理部１４１６は、オフロードコマンドの解析、リード処理、オフロードコマンドの完了応答の作成、オフロードコマンド通信部(ターゲット)１４１５を介したオフロードコマンドの完了応答の送信等を行う。コントローラコマンド通信部(ターゲット)１４１７は、ストレージコントローラ１２１との間でコントローラコマンドの受信と完了応答の送信を行う。
【０１８５】
ドライブ制御部１４１８は、ドライブ２１８の管理と、ホストコマンド処理部１４１０およびオフロードコマンド処理部１４１６の指示に従ってドライブ２１８に対してリード・ライト処理を行う。バッファ制御部１４１２は、データ転送を行うための一時的なメモリ領域であるバッファの確保と解放を行う。コントローラコマンド処理部１４２０は、ストレージコントローラが発行したコマンドを、ターゲットドライバ１４０９を使用して受信し、コマンドの解析、リード・ライト処理、コマンドの完了応答の作成、ターゲットドライバ１４０９を介したコマンドの完了応答の送信等を行う。
【０１８６】
（１５）ターゲット構成形態２によるNVMe over FabricsにおけるホストコンピュータとNVM Subsystemの識別名
図１５は、ターゲット構成形態２によるNVMe over FabricsにおけるホストコンピュータとNVM Subsystemの識別名を示す図である。
ホストコンピュータ１１０は、少なくとも１つの識別名４０１（ホストNQN）を持つ。ホストコンピュータ１１０は複数でもよいが、図示を省略した。ドライブエンクロージャ２００は、少なくとも１つの識別名１５０３（NVM Subsystem NQN）を持つ。この識別名１５０３に対応するNVM Subsystemの中に、ストレージプールの一部を割り当てた論理的な記憶領域がnamespaceとして割り当てられる。ストレージプールとは、複数のドライブ２１８の記憶領域から構築され、ＲＡＩＤ等のデータ保護がされた記憶領域である。上記はドライブエンクロージャ２０１についても同様であり、説明は省略する。ドライブエンクロージャ２００とドライブエンクロージャ２０１は２以上でもよいが、図示を省略した。本ターゲット構成形態では、ドライブエンクロージャがホストコンピュータのコマンドを受信するために、ストレージコントローラのNVM Subsystemが不要となり、ストレージコントローラのNVM Subsystemがない点が図４と異なる。
【０１８７】
ドライブエンクロージャのNVM Subsystemの作成はマスタースレーブ方式で行う。ストレージ装置１２０がマスターとなり、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）がスレーブとなる。これは、ドライブエンクロージャのNVM Subsystemを定義する情報を、ストレージ装置の構成情報として、データ保護機能を持つストレージ装置１２０が管理・保存するためである。これにより、ストレージコントローラのデータ保護機能やストレージコントローラで動作するSnapshot、Thin Provisioningなどのプログラムプロダクト（ストレージ装置の機能）の機能を提供できる。NVM Subsystemを定義する情報とは、NVM Subsystem NQN(ここでは、識別名１５０３を指す)、NVMトランスポートの情報(ホストコンピュータとNVM Subsystemの間の接続を定義する情報。ここでは、ドライブエンクロージャのIPアドレス、TCP/UDPポートなどを指す)、シリアル番号やモデル番号などである。
【０１８８】
ストレージ装置１２０がドライブエンクロージャのドライブを認識し、ホストコンピュータに記憶領域を提供するまでの主な流れは次の通りである。はじめに、ストレージ装置１２０は、ドライブエンクロージャからドライブ５０８の実装情報を取得し、図９Ｃのドライブ情報テーブル９３０を作成する。次にストレージ装置１２０は、ドライブ情報テーブル９３０のドライブ５０８の記憶領域を組み合わせ、データ保護方式に応じてＲＡＩＤやミラーリング等で保護された記憶領域を構築する。記憶領域の組み合わせとデータ保護方式の設定は自動でも手動でも良い。ここで言う自動とは、ストレージ装置１２０が自動で設定することを意味し、手動とは、ユーザ指示に従ってストレージ装置１２０が設定することを意味する。データ保護に用いる記憶領域の組み合わせは、データ保護ドライブグループテーブル３６１０で管理・保存される。ストレージシステムにおけるデータ保護方式は良く知られた技術であり、説明を省略する。次にストレージ装置１２０は、ＲＡＩＤやミラーリング等で保護された記憶領域をまとめてストレージプールを構築する。次にストレージ装置１２０は、ストレージプールの一部の記憶領域を切り出し、論理ボリュームを構築する。次にストレージ装置１２０は、NVM Subsystemを作成し、namespaceとして論理ボリュームを割り当てる。ストレージ装置１２０では、論理ボリュームの論理アドレスとドライブの物理アドレスとの対応をアドレス変換テーブル３６００として管理する。
【０１８９】
NVM Subsystemの作成において、ドライブエンクロージャがストレージ装置１２０の論理的な記憶領域をホストコンピュータに対して提供できるように、ストレージ装置１２０は上記のNVM Subsystemを定義する情報をパラメータとして指定して、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）にNVM Subsystemの作成を指示する。ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）は指示に従い、NVM Subsystemを作成する。NVM Subsystemの作成は、例えば、起動時、ドライブエンクロージャの増設時、構成変更時に行う。
【０１９０】
これにより、ドライブエンクロージャは、自身の記憶領域をホストコンピュータに提供することができ、ストレージコントローラは各ドライブエンクロージャの記憶領域を、例えばＲＡＩＤ技術等で、データ保護することができる。即ち、ストレージコントローラの構成情報に基づき、NVM Subsystemの作成を各ドライブエンクロージャに指示することで、ストレージコントローラからの指示に基づいて、NVM Subsystemの作成したドライブエンクロージャは、作成したNVM Subsystemをホストコンピュータに記憶領域として提供することになる。
【０１９１】
ホストコンピュータ１１０は、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）に対してconnectコマンドを送ることで、ドライブエンクロージャ２００（およびドライブエンクロージャ２０１）のNVM Subsystemにコマンド送信およびデータ転送できるようにする。
【０１９２】
（１６）ターゲット構成形態２によるドライブエンクロージャにおけるホストコマンドとオフロードコマンドの処理手順
図１６は、ターゲット構成形態２によるドライブエンクロージャにおけるホストコマンドとオフロードコマンドの処理手順を示すフローチャートである。
【０１９３】
ドライブエンクロージャ２００のターゲットドライバ１４０９がホストコンピュータ１１０からコマンドを受信すると、ホストコマンド処理部１４１０がステップ１６００以降の処理を開始する。
【０１９４】
始めに、ホストコマンド処理部１４１０は受信したNVMeコマンドを解析し(コマンドのフォーマットについてはホストコマンドの図９Ａのフォーマット９１０を参照)、コマンド種別９１２、namespaceの識別子であるNID (namespace ID)９１３、開始アドレス９１４、データ転送長９１５のフィールドを読み込む（ステップ１６０１）。
【０１９５】
次に、コマンドの種別で処理を分岐する（ステップ１６０２）。コマンド種別がリードコマンドの場合はステップ１６０３に進む。コマンド種別がライトコマンドの場合はステップ１６２３に進む。コマンド種別が管理コマンドの場合はステップ１６１７に進む。以下では、ステップ１６０１においてコマンド種別がリードコマンドの場合のフローについて説明する。
【０１９６】
ステップ１６０３に処理が分岐すると、ホストコマンド処理部１４１０はリードデータを格納するためのバッファ領域の確保を行う（ステップ１６０３）。次に、エンクロージャコマンドのリードコマンド（リード要求）を作成する（ステップ１６０４）。このリードコマンドは、ホストコンピュータ１１０のリードコマンドで指定されたアドレス範囲のデータを読み込み、確保したバッファ領域にデータを格納する。ドライブエンクロージャがストレージコントローラに発行するコマンドをエンクロージャコマンドと呼ぶ。エンクロージャコマンドのフォーマットおよび作成方法は図２２で説明する。
【０１９７】
次に、作成したエンクロージャコマンドを、エンクロージャコマンド通信部（イニシエータ）１４１１を使用してストレージコントローラ１２１に送信する（ステップ１６０５）。次に、ストレージコントローラ１２１からのコマンド完了応答を待つ（ステップ１６０６）。次に、エンクロージャコマンド通信部（イニシエータ）１４１１を介してストレージコントローラ１２１からのリードコマンドの完了応答を受信し、リードコマンドのコマンドの完了応答を解析する（ステップ１６０７）。ステップ１６０７で、ストレージコントローラは、アドレス変換テーブルに基づき、ホストコマンドの対象データがホストコマンドを受領したターゲットドライバ１４０９と同じドライブ筐体１４０内に接続されたドライブ２１８に格納されていない場合には、通常のリード応答を含む完了応答をエンクロージャに送信し、ホストコマンドの対象データがホストコマンドを受領したターゲットドライバ１４０９と同じドライブ筐体１４０内のドライブに格納されている場合には、オフロード指示を含む完了応答を送信する。完了応答がエラーの場合は異常発生時の処理を行うが、ここでは説明を省略する。以降は完了応答が成功したとして説明を続ける。
【０１９８】
次に、完了応答の種別で処理を分岐する（１６０８）。完了応答がリード応答の場合は、ステップ１６０９に進む。完了応答がオフロード指示のあるリード応答の場合は、ステップ１６１３に進む。以下では、ステップ１６０８においてコマンドの応答種別がリード応答の場合のフローについて説明する。
【０１９９】
ステップ１６０８からステップ１６０９に処理が分岐すると、ホストコンピュータ１１０へリードデータを転送する（ステップ１６０９）。具体的には、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)１４１４は、バッファに格納されたリードデータを、リードコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３に転送する。ここでは、実施例１と同様に、データ転送をコマンドに指定されたコマンド発行元のメモリ領域に対するRDMA Writeで行うものとして説明する。ただし、ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する本実施例では、NVMeトランスポートとしてRDMAだけでなくTCPやFibre Chennel等を用いることができる。そのため、データ転送はRDMA Writeに限定されず、NVMeトランスポートで規定されたデータ転送を用いても良い。
【０２００】
次に、ホストコマンド処理部１４１０はホストコンピュータ１１０からのリードコマンドに対応するコマンドの完了応答を作成する（ステップ１６１０）。次に、ターゲットドライバ１４０９を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ１６１１）。次に、確保したバッファ領域を開放する（ステップ１６１２）。最後に、処理を完了する（ステップ１６３５）。
【０２０１】
次に、フローチャートのステップ１６０８以降の説明に戻り、コマンドの応答種別がオフロード指示のあるリード応答の場合の処理のフローについて説明する。ステップ１６０８からステップ１６１３に処理が分岐すると、オフロードコマンド処理部１４１６はオフロード指示に従って確保したバッファ領域にリード対象のデータをドライブからリードする（ステップ１６１３）。リード対象のデータを格納したドライブ５０８は、オフロード指示に指定された識別名４０２で識別する。ドライブに発行するリードコマンドのnamespace IDと開始アドレス、データ転送長には、オフロード指示の値を指定する。ドライブエンクロージャは、オフロードコマンドに従って、記憶装置であるドライブからデータを読み出す。ドライブエンクロージャが自身のドライブからデータをリードする方法は一般的な方法であり、詳細は割愛する。
【０２０２】
次に、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)１４１４は、バッファに格納されたリードデータを、リードコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３に転送する（ステップ１６１４）。コマンドに応答するデータは必ずしも、キューで結ばれたコマンドの依頼先のデバイスから転送される必要がないため、ドライブエンクロージャからホストコンピュータに直接データを転送し、ストレージコントローラのボトルネックを解消している。
【０２０３】
次に、オフロードコマンドの完了応答を作成する（ステップ１６１５）。次に、オフロードコマンドの完了応答を、オフロードコマンド通信部（ターゲット）１４１５を使用してストレージコントローラ１２１に送信する（ステップ１６１６）。以降、ステップ１６１０、１６１１、１６１２、１６３５は上記で説明したとおりである。オフロードコマンド発行元であるストレージコントローラに処理の完了を通知する必要があるためである。
【０２０４】
次に、フローチャートのステップ１６２３以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。ステップ１６０２からステップ１６２３に処理が分岐すると、ホストコマンド処理部１４１０はライトデータを格納するためのバッファ領域を確保する（ステップ１６２３）。次に、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)１４１４は、ライトコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３のデータを、確保したバッファ領域に転送する（ステップ１６２４）。次に、ホストコマンド処理部１４１０はバッファ領域のライトデータを、ホストコンピュータ１１０のライトコマンドで指定されたアドレス範囲に書き込むエンクロージャコマンドのライトコマンドを作成する（ステップ１６２５）。
【０２０５】
次に、エンクロージャコマンド通信部（イニシエータ）１４１１を使用してストレージコントローラ１２１にエンクロージャコマンドを送信する（ステップ１６２６）。次に、ストレージコントローラ１２１からのXFER RDYを待つ（ステップ１６２７）。XFER RDYは書き込み準備ができたことを意味するメッセージである。次に、エンクロージャコマンド通信部（イニシエータ）１４１１を介してストレージコントローラ１２１からのXFER RDYを受信する（ステップ１６２８）。
【０２０６】
次に、バッファ領域に格納したライトデータをデータ転送制御部（ストレージコントローラとドライブエンクロージャ間）１４１３がストレージコントローラに転送する（１６２９）。次に、ストレージコントローラ１２１のコマンド完了を待つ（ステップ１６３０）。次に、ストレージコントローラ１２１からエンクロージャコマンド通信部（イニシエータ）１４１１を介してライトコマンドのコマンド完了応答を受信し、ライトコマンドのコマンド完了応答を解析する（ステップ１６３１）。次に、ホストコンピュータ１１０からのライトコマンドに対応するコマンドの完了応答を作成する（ステップ１６３２）。次に、ターゲットドライバ１４０９を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ１６３３）。次に、確保したバッファ領域を開放する（ステップ１６３４）。最後に、処理を完了する（ステップ１６３５）。
【０２０７】
次に、フローチャートのステップ１６１７以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ１６０２からステップ１６１７に処理が分岐すると、次に、ホストコンピュータ１１０の管理コマンドの内容をコピーして、エンクロージャコマンドの管理コマンドを作成する（ステップ１６１７）。次に、エンクロージャコマンド通信部（イニシエータ）１４１１を使用してストレージコントローラ１２１にエンクロージャコマンドを送信する（ステップ１６１８）。次に、ストレージコントローラ１２１のコマンド完了を待つ（ステップ１６１９）。次に、エンクロージャコマンド通信部（イニシエータ）１４１１を介してストレージコントローラ１２１から管理コマンドのコマンド完了応答を受信し、管理コマンドのコマンド完了応答を解析する（ステップ１６２０）。次に、ホストコンピュータ１１０からの管理コマンドに対応するコマンドの完了応答を作成する（ステップ１６２１）。次に、ターゲットドライバ１４０９を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ１６２２）。最後に、処理を完了する（ステップ１６３５）。
【０２０８】
（１７）ターゲット構成形態２によるストレージコントローラにおけるエンクロージャコマンドの処理手順
図１７は、ターゲット構成形態２によるストレージコントローラにおけるエンクロージャコマンドの処理手順を示すフローチャートである。ストレージコントローラ１２１のエンクロージャコマンド通信部（ターゲット）１４０１がドライブエンクロージャ２００からエンクロージャコマンドを受信すると、エンクロージャコマンド処理部１４０２がステップ１７００以降の処理を開始する。
【０２０９】
始めに、エンクロージャコマンド処理部１４０２は受信したエンクロージャコマンドを解析し、コマンド種別、namespaceの識別子であるNID (namespace ID)、開始アドレス、データ転送長のフィールドを読み込む（ステップ１７０１）。次に、コマンドの種別で処理を分岐する（ステップ１７０２）。コマンド種別がリードコマンドの場合はステップ１７０３に進む。コマンド種別がライトコマンドの場合はステップ１７１７に進む。コマンド種別が管理コマンドの場合はステップ１７１４に進む。以下では、ステップ１７０２においてコマンド種別がリードコマンドの場合のフローについて説明する。
【０２１０】
ステップ１７０３に処理が分岐すると、エンクロージャコマンド通信部（ターゲット）１４０１から得られる識別名４０３、ステップ１７０１で得られたNID、開始アドレスとデータ転送長の情報に基づき、キャッシュヒット、ヒットミス判定を行う（ステップ１７０３）。次に、キャッシュヒットかヒットミスで処理を分岐する（ステップ１７０５）。キャッシュヒットの場合はステップ１７０６に進み、ヒットミスの場合はステップ１７０９に進む。ここで、キャッシュヒット、ヒットミスの判定は、ホストコンピュータからのＩＯコマンドに応答するデータがストレージコントローラのキャッシュメモリ２０４にあるか否かを判定する。例えば、ホストコンピュータからのＩＯコマンドがリードコマンドの場合、リードコマンドに応答するデータがキャッシュメモリ２０４上にあるか否を判定する。
【０２１１】
キャッシュヒットの場合、データ転送処理部（ストレージコントローラとドライブエンクロージャ間）１４０３を使用してドライブエンクロージャ２００にキャッシュ内のデータを転送する（ステップ１７０６）。次に、エンクロージャコマンドのリードコマンドの完了応答を作成する（ステップ１７０７）。次に、エンクロージャコマンド通信部１４０１（ターゲット）を使用してドライブエンクロージャ２００にコマンドの完了応答を送信する（ステップ１７０８）。最後に、処理を完了する（ステップ１７２３）。
【０２１２】
以下、フローチャートのステップ１７０９以降の説明に戻り、ヒットミスの場合の処理のフローについて説明する。ステップ１７０５からステップ１７０９に処理が分岐すると、データ転送オフロード部１４０５はデータ転送に必要なオフロードコマンドを、アドレス変換テーブル等を参照することで作成する（ステップ１７０９）。オフロードコマンドに必要な制御データと、その作成方法は図９Ａ−Ｄの説明の通りである。
【０２１３】
次に、エンクロージャコマンドのリードコマンドの完了応答を作成する（ステップ１７１０）。次に、エンクロージャコマンド通信部（ターゲット）１４０１から得られる識別名４０３、ステップ１７０１で得られたNID、開始アドレスとデータ転送長の情報から、データ格納先のドライブエンクロージャ２００を識別し、オフロードコマンド通信部（イニシエータ）１４０６を使用してドライブエンクロージャ２００にオフロードコマンドとリードコマンドの完了応答を送信する（ステップ１７１１）。
【０２１４】
次に、ドライブエンクロージャ２００からのオフロードコマンドの完了を待つ（ステップ１７１２）。次に、オフロードコマンド通信部（イニシエータ）１４０６を介してドライブエンクロージャ２００からのオフロードコマンドの完了応答を受信し、オフロードコマンドのコマンドの完了応答を解析する（ステップ１７１３）。最後に、処理を完了する（ステップ１７２３）。
【０２１５】
以下、フローチャートのステップ１７０２以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。ステップ１７０２からステップ１７１７に処理が分岐すると、エンクロージャコマンド処理部１４０２がライトデータを格納するためのキャッシュ領域の確保を行う（ステップ１７１７）。次に、エンクロージャコマンド通信部（ターゲット）１４０１を介してドライブエンクロージャ２００にXFER RDYを送信する（ステップ１７１８）。次に、データ転送制御部（ストレージコントローラとエンクロージャ間）１４０３がドライブエンクロージャからの転送データを受信する（ステップ１７１９）。
【０２１６】
次に、ライトデータをもう片方のストレージコントローラに転送し、キャッシュの二重書きを行う（ステップ１７２０）。次に、ドライブエンクロージャのライトコマンドに対応するコマンド完了応答を作成する（ステップ１７２１）。次に、エンクロージャコマンド通信部（ターゲット）１４０１を使用してドライブエンクロージャ２００にコマンドの完了応答送信する（ステップ１７２２）。最後に処理を完了する（ステップ１７２３）。
【０２１７】
以下、フローチャートのステップ１７１４以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ１７１４に処理が分岐すると、管理コマンドで指定された内容に従い、エンクロージャコマンド処理部１４０２は管理コマンドの処理を行う（ステップ１７１４）。次に、管理コマンドの処理の結果を含むコマンドの完了応答を作成する（ステップ１７１５）。次に、エンクロージャコマンド通信部（ターゲット）１４０１を使用してドライブエンクロージャ２００にコマンドの完了応答を送信する（ステップ１７１６）。最後に、処理を完了する（ステップ１７２３）。
【０２１８】
（１８）ターゲット構成形態２によるストレージコントローラにおけるデステージの処理手順
図１８は、ターゲット構成形態２によるストレージコントローラにおけるデステージの処理手順を示すフローチャートである。図１２との共通点が多いことから、理解の容易化のため差分だけを説明する。差分は、図１２においてライトデータのデータ転送をドライブエンクロージャ２００のRDMA Readで行っていた箇所が、ストレージコントローラ１２１からの転送データの送信に変わる点である。
【０２１９】
変更箇所はステップ１８０１からステップ１８０３である。すなわち、ステップ１２０３の後に、デステージ処理部１４０７はドライブエンクロージャ２００からのXFER RDYを待つ（ステップ１８０１）。次に、オフロードコマンド通信部（イニシエータ）１４０６を介してドライブエンクロージャからXFER RDYを受信する（ステップ１８０２）。次に、データ転送処理部（ストレージコントローラとエンクロージャ間）１４０３はドライブエンクロージャに転送データを送信する（ステップ１８０３）。ステップ１２０４以降は、図１２と同じである。
【０２２０】
（２１）ターゲット構成形態２によるドライブエンクロージャにおけるコントローラコマンドの処理手順
図２１は、ターゲット構成形態２によるドライブエンクロージャにおけるコントローラコマンドの処理手順を示すフローチャートである。
【０２２１】
図２０との共通点が多いことから、理解の容易化のため差分だけを説明する。差分は、ストレージコントローラとの間のデータ転送である。ステップ２００５のRDMA Writeによるデータ転送は、データ転送制御部（ストレージコントローラとドライブエンクロージャ間）１４１３でのデータ転送に変わる（ステップ２１０１）。また、ステップ２０１０のRDMA Readによるデータ転送は、ドライブエンクロージャ２００からストレージコントローラ１２１へのXFER RDY送信（ステップ２１０２）と、データ転送制御部（ストレージコントローラとドライブエンクロージャ間）１４１３によるストレージコントローラからの転送データの受信（ステップ２１０３）に変わる。それ以外のステップについては、図２０と同じである。
【０２２２】
（２２）ドライブエンクロージャのホスト情報テーブル、とエンクロージャコマンドのフォーマット
図２２はドライブエンクロージャのホスト情報テーブルを示す図である。図２３は、エンクロージャコマンドのフォーマットを示す図である。
図２２のホスト情報テーブルは、キュー番号２２０１、ホストNQN２２０２、NVM Subsystem NQN２２０３の項目から構成される。実施例３では、ドライブエンクロージャ２００がホストコンピュータ１１０に対してNVMe over Fabricsのターゲットとして動作する。そのため、ホストコマンドの処理でホストコンピュータの情報を参照できるように、ドライブエンクロージャ２００はホストコンピュータの情報をホスト情報テーブルに格納する。
【０２２３】
キュー番号２２０１は、ホストコンピュータとNVM Subsystemの間のIOキューの番号である。ドライブエンクロージャ２００は、IOキューを内部で管理するために、ホストコンピュータ１１０からconnectコマンドを受信してIOキューを作成する時に、当該キュー番号を採番する。キュー番号はドライブエンクロージャ２００の内部でユニークな値である。ホストNQN２２０２とNVM Subsystem NQN２２０３は、それぞれ、上記IOキューでつながったホストコンピュータ１１０のNQNとドライブエンクロージャ２００のNVM SubsystemのNQNである。NVM Subsystem NQN２２０３は、識別名１５０３に対応する。
【０２２４】
図２３に示す、エンクロージャコマンドのフィールドは、コマンド識別子２２１１、ホストNQN２２１２、ドライブエンクロージャ番号２２１３、ドライブエンクロージャメモリアドレス２２１４、NVM Subsystem NQN２２１５、コマンド種別２２１６、NID (namespace ID)２２１７、開始アドレス２２１８、データ転送長２２１９、メモリアドレス２２２０、R_key２２２１から構成される。
【０２２５】
コマンド識別子２２１１は、個々のコマンドを識別するための識別子である。ホストNQN２２１２は、コマンド発行元のホストコンピュータ１１０のNQN(ホストNQN２２０２に対応する)である。エンクロージャ番号２２１３は、エンクロージャコマンドの送信元を識別するための番号で、ドライブエンクロージャ２００自身の番号である。当該ドライブエンクロージャ番号は、ドライブエンクロージャ２００を管理するためにストレージコントローラ１２１が採番する番号である。採番のタイミングは、例えば、ストレージ装置の起動時や、ドライブエンクロージャの増設時である。
【０２２６】
メモリアドレス２２１４は、ドライブエンクロージャ２００がストレージコントローラ１２１とのデータ転送に用いるデータバッファのアドレスである。ドライブエンクロージャ２００とストレージコントローラ１２１の間のデータ通信はRDMA通信や、ストレージ装置で一般的なFC(Fibre Channel)を使用することができる。RDMA通信を使う場合には、メモリアドレス２２１４に加えてR_keyが必要となるが、ここでは、RDMA通信に限定しないために記載を省略した。
【０２２７】
NVM Subsystem NQN２２１５は、ホストコマンドのアクセス対象のNVM SubsystemのNQN(識別名１５０３に対応する)である。
【０２２８】
コマンド種別２２１６、NID２２１７、開始アドレス２２１８、データ転送長２２１９、メモリアドレス２２２０、R_key２２２１は、ホストコマンドのコマンド識別子９１１、コマンド種別９１２、NID９１３、開始アドレス９１４、データ転送長９１５、メモリアドレス９１６、R_key９１７である。
【０２２９】
上記エンクロージャコマンドのフィールド２２１１〜２２２１の値は、ホストコマンド処理部１４１０が次のようにして設定する。
【０２３０】
ホストコマンド処理部１４１０は、コマンド識別子２２１１に、実行中のエンクロージャコマンドの間でユニークな値を設定する。
【０２３１】
ホストコマンド処理部１４１０は、ドライブエンクロージャ２００のターゲットドライバ１４０９がホストコンピュータ１１０からコマンドを受領したIOキューと、ドライブエンクロージャのホスト情報テーブル２２００のエントリを照らし合わせ、IOキューに対応するホストNQN２２０２とNVM Subsystem NQN２２０３を、ホストNQN２２１２とNVM Subsystem NQN２２１５(識別名１５０３に対応する)に設定する。
【０２３２】
ホストコマンド処理部１４１０は、自身のエンクロージャ番号をエンクロージャ番号２２１３に、ドライブエンクロージャ２００がストレージコントローラ１２１とのデータ転送に用いるデータバッファのアドレスをエンクロージャメモリアドレス２２１４に設定する。
【０２３３】
ホストコマンド処理部１４１０は、コマンド種別２２１６、NID２２１７、開始アドレス２２１８、データ転送長２２１９、メモリアドレス２２２０、R_key２２２１に、ホストコンピュータから受信したホストコマンドのコマンド識別子９１１、コマンド種別９１２、NID９１３、開始アドレス９１４、データ転送長９１５、メモリアドレス９１６、R_key９１７の値を設定する。
【０２３４】
実施例３では、実施例１や２と異なり、ホストコンピュータとネットワークを介して接続されたドライブエンクロージャが、ホストコンピュータから直接ＩＯコマンドを受信する。ＩＯコマンドがリードコマンドの場合、ドライブエンクロージャは、直接ホストコンピュータにリードデータを転送すると共に、完了報告も行う。つまり、ドライブエンクロージャがホストコンピュータに対し、作成したNVM Subsystemをホストコンピュータに記憶領域として提供する。
【０２３５】
実施例３によれば、ストレージコントローラのデータ保護技術を維持しつつ、ドライブエンクロージャのオフロード機能により、ストレージコントローラの処理負荷を軽減すると共に、リードコマンドに対しホストコンピュータに対して直接リードデータを転送することができる。
【実施例４】
【０２３６】
（１９）実施例４の情報処理システムの構成
図１９はストレージコントローラがホストコンピュータと別のネットワークに接続する形態(接続形態２：実施例４、実施例６、実施例８)かつターゲット構成形態２の形態による情報処理システムの接続構成の図である。
【０２３７】
図１との共通点が多いことから、理解の容易化のため差分だけを説明する。図１との違いは、ドライブ筐体１４０がネットワーク１５０とネットワーク１９０１との、２つの別々のネットワークに接続していることである。ネットワーク１５０はホストコンピュータ１１０とドライブ筐体１４０が接続するネットワークであり、ネットワーク１９０１はストレージ装置１２０とドライブ筐体１４０が接続するネットワークである。ここで、ドライブ筐体１４０はネットワークI/F２０５を介してネットワーク１５０とネットワーク１９０１に接続している。また、ストレージ装置１２０はネットワークI/F１２６を介してネットワーク１９０１に接続している。
【０２３８】
実施例４におけるストレージ装置１２０とドライブ筐体１４０の制御方法は、実施例３と同じため説明を割愛する。
【０２３９】
なお、ネットワーク１９０１はＰＣＩｅのネットワークであっても良い。この場合、ドライブ筐体１４０は、ネットワークI/F２０５が無い代わりにＰＣＩｅポート２０６を介してネットワーク１９０１に接続する。また、ストレージ装置１２０は、ネットワークI/F１２６が無い代わりにＰＣＩｅポート１２６を介してネットワーク１９０１に接続する。ストレージ装置１２０とドライブ筐体１４０の制御方法について、ＰＣＩｅのネットワークを介したデータ転送方法（例えばＤＭＡ）に変わる以外は実施例３と同じため説明を割愛する。
【０２４０】
実施例４によれば、実施例３と同様、ドライブエンクロージャ１４０がホストコンピュータからＩＯコマンド等を受信する形態により適したネットワーク構成とすることができる。
【実施例５】
【０２４１】
実施例５の概要について説明する。実施例５は、実施例３のライトＩＯを高速化した実施例に相当する。実施例５の情報処理システムの構成は図１に示すとおりである。実施例５では、実施例３と同様にストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態(ターゲット構成形態２)である。
【０２４２】
ライトＩＯの高速化は、ライトデータをホストコンピュータからドライブ筐体にストレージコントローラを介さずに転送し、ドライブ筐体はライトデータをドライブに書き込むことで実現する。ライトデータの書き込み先はストレージコントローラが決定し、ドライブ筐体はストレージコントローラに問い合わせることでライトデータの書き込み先を取得する(ライトＩＯ処理の連携方式１)。NVMe over FabricsにおけるホストとNVM Subsystemの識別名は図１５に示したとおり、実施例３と同じため、説明を割愛する。
【０２４３】
（２３）ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態(ターゲット構成形態２：実施例３と同じ)で、ライトＩＯの高速化においてストレージコントローラがライトデータの書き込み先を決定し、ライトデータ書き込み先をストレージコントローラに問い合わせる方式(ライトＩＯ処理の連携方式１)における、ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成
【０２４４】
図２４は、ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態で、ライトＩＯの高速化においてストレージコントローラが、アドレス変換テーブルに基づいて、ライトデータの書き込み先を決定し、ライトデータ書き込み先をストレージコントローラに問い合わせる方式(ライトＩＯ処理の連携方式１)における、ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成を示す図である。
【０２４５】
ストレージコントローラ１２１のプログラムは、エンクロージャコマンド通信部(ターゲット)２３０１、エンクロージャコマンド処理部２３０２、データ転送オフロード部２３０３、オフロードコマンド通信部(イニシエータ)２３０４、２重化解除指示部２３０５、コントローラコマンド送信部(イニシエータ)２３０６、書き込み先アドレス決定部２３０７、アドレス変換部２３０８、論物アドレス管理部２３０９、構成情報管理部２３１０、２重化情報管理部２３１１、および図示しないＯＳから構成される。
【０２４６】
エンクロージャコマンド通信部(ターゲット)２３０１は、エンクロージャコマンド通信部(イニシエータ)２３１４に対してＮＶＭｅｏＦ対応の記憶領域を提供する。
【０２４７】
エンクロージャコマンド処理部２３０２は、ドライブエンクロージャ２００が発行したコマンドを、エンクロージャコマンド通信部(ターゲット)２３０１を使用して受信し、コマンドの解析、リード・ライト処理、コマンドの完了応答の作成、エンクロージャコマンド通信部(ターゲット)２３０１を介したコマンドの完了応答の送信等を行う。
【０２４８】
データ転送オフロード部２３０３は、データ転送のオフロードコマンドを作成し、ドライブエンクロージャ２００に対してホストコンピュータとドライブエンクロージャ間のデータ転送を指示する。
【０２４９】
オフロードコマンド通信部(イニシエータ)２３０４は、ドライブエンクロージャとの間でオフロードコマンドの送信、応答の受信を行う。２重化解除指示部２３０５は、ドライブエンクロージャ２００に対して２重化領域の解放をコントローラコマンドで指示する。コントローラコマンド送信部(イニシエータ)２３０６は、ドライブエンクロージャとの間でコントローラコマンドの送信と完了応答の受信を行う。書き込み先アドレス決定部２３０７は、ドライブエンクロージャ内のドライブへのライトデータの書き込み先アドレスを決定する。アドレス変換部２３０８は、データ範囲５０５と、データの格納先であるドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９とのアドレス変換テーブル（マッピングテーブル）を持ち、データ範囲５０５のアドレスを、対応するドライブエンクロージャ２００、ドライブ５０８、ドライブ５０８内の記憶領域５０９のアドレスに変換する。
【０２５０】
論物アドレス管理部２３０９は、データ範囲５０５に対応する記憶領域５０９のアクセス排他状態と排他解除状態、記憶領域５０９の２重書き状態と２重書き解除状態の各状態の遷移の制御を行う。
【０２５１】
構成管理部２３１０は、ストレージシステムの構成情報を初期化、更新、保存する役割を持つ。構成情報は、ストレージコントローラのハードウェア構成、構成設定、ドライブ筐体のノード情報、ハードウェア構成、構成設定を含む。２重化情報管理部２３１１は、パリティ生成済み領域２８０１、２重化領域２８０２、２重化領域２８０２内のプライマリ領域２８０３とセカンダリ領域２８０４の配置を初期化、更新、保存する役割を持つ。各領域については、図２８と図２９にて説明する。
【０２５２】
ドライブエンクロージャ２００のプログラムはターゲットドライバ２３１２、ホストコマンド処理部２３１３、エンクロージャコマンド通信部(イニシエータ)２３１４、データ転送制御部(ホストコンピュータとエンクロージャ間)２３１６、オフロードコマンド通信部(ターゲット)２３１７、オフロードコマンド処理部２３１８、コントローラコマンド通信部(ターゲット)２３１９、ドライブ制御部２３２０、バッファ制御部２３１５、コントローラコマンド処理部２３２１、ドライブ２重書き部２３２２、２重化解除処理部２３２３、および図示しないＯＳから構成される。
【０２５３】
ターゲットドライバ２３１２は、ホストコンピュータの１１０のイニシエータドライバ３０１に対してＮＶＭｅｏＦ対応の記憶領域を提供する。ホストコマンド処理部２３１３は、ホストコンピュータが発行したコマンドを、ターゲットドライバ２３１２を使用して受信し、コマンドの解析、リード・ライト処理、コマンドの完了応答の作成、ターゲットドライバ２３１２を介したコマンドの完了応答の送信等を行う。エンクロージャコマンド通信部（イニシエータ）２３１４は、ストレージコントローラ１２１のエンクロージャコマンド通信部（ターゲット）に対してエンクロージャコマンドを発行する。データ転送制御部(ホストコンピュータとエンクロージャ間)２３１６は、ホストコマンド処理部２３１３およびオフロードコマンド処理部２３１８の指示に従い、ＮＶＭｅｏＦに対応したホストコンピュータとドライブエンクロージャとの間のデータ転送処理を行う。
【０２５４】
オフロードコマンド通信部(ターゲット)２３１７は、ストレージコントローラ１２１からのデータ転送のオフロードコマンドの受信と、完了応答の送信を行う。オフロードコマンド処理部２３１８は、オフロードコマンドの解析、リード処理、ライト処理、オフロードコマンドの完了応答の作成、オフロードコマンド通信部(ターゲット)２３１７を介したオフロードコマンドの完了応答の送信等を行う。コントローラコマンド通信部(ターゲット)２３１９は、ストレージコントローラ１２１との間でコントローラコマンドの受信と完了応答の送信を行う。コントローラコマンド処理部２３２１は、ストレージコントローラが発行したコマンドを、コントローラコマンド処理部（ターゲット）２３１９を使用して受信し、コマンドの解析、２重化解除処理の実行、コマンドの完了応答の作成、コントローラコマンド処理部（ターゲット）２３１９を介したコマンドの完了応答の送信等を行う。
【０２５５】
ドライブ制御部２３２０は、ドライブ２１８の管理と、ホストコマンド処理部２３１３およびオフロードコマンド処理部２３１８、ドライブ２重書き部２３２２、２重化解除処理部２３２３の指示に従ってドライブ２１８に対してリード・ライト処理を行う。バッファ制御部２３１５は、データ転送を行うための一時的なメモリ領域であるバッファの確保と解放を行う。
【０２５６】
ドライブ２重書き部２３２２は、ライトデータを２つのドライブに書き込む処理を行う。２つのドライブに書き込むことで、ドライブ障害によるユーザデータのロストを防止する。２重化解除処理部２３２３は、２重書きによるデータ保護からRAIDによるデータ保護に切り替える処理を行う。
【０２５７】
（２５）ターゲット構成形態２、ライトＩＯ処理の連携方式１によるドライブエンクロージャにおけるホストコマンドの処理手順
図２５は、ターゲット構成形態２、ライトＩＯ処理の連携方式１によるドライブエンクロージャにおけるホストコマンドの処理手順を示すフローチャートである。なお、一部の処理は図１６の処理と共通していることから、共通の処理のステップについては図１６のステップ番号を記載した。
【０２５８】
ドライブエンクロージャ２００のターゲットドライバ２３１２がホストコンピュータ１１０からコマンドを受信すると、ホストコマンド処理部２３１３がステップ２５００以降の処理を開始する。
【０２５９】
始めに、ホストコマンド処理部２３１３は受信したNVMeコマンドを解析し(コマンドのフォーマットについてはホストコマンドの図９Ａのフォーマット９１０を参照)、コマンド種別９１２、namespaceの識別子であるNID (namespace ID)９１３、開始アドレス９１４、データ転送長９１５のフィールドを読み込む（ステップ２５０１）。
【０２６０】
次に、コマンドの種別で処理を分岐する（ステップ２５０２）。コマンド種別がリードコマンドの場合はステップ１６０３に進む。コマンド種別がライトコマンドの場合はステップ２５０３に進む。コマンド種別が管理コマンドの場合は、ステップ１６１７に進む。以下では、ステップ２５０２においてコマンド種別がリードコマンドの場合のフローについて説明する。
【０２６１】
ステップ１６０３に分岐すると、図１６においてコマンド種別がリードコマンドで、かつ、応答種別がオフロードの場合の処理と同じとなる。処理が同じため、以降の説明を割愛する。
【０２６２】
次に、フローチャートのステップ２５０２以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。ステップ２５０２からステップ２５０３に処理が分岐すると、ホストコマンド処理部２３１３は、ライトデータを格納するためのバッファ領域を、バッファ制御部２３１５を用いて確保する（ステップ２５０３）。次に、ホストコマンド処理部２３１３は、ストレージコントローラ１２１に受信したライトコマンドを通知するとともに、ライトコマンドで指定されたアドレス範囲に対応する書き込み先アドレスを問い合わせるエンクロージャコマンドを作成する（ステップ２５０４）。
【０２６３】
次に、ホストコマンド処理部２３１３は、エンクロージャコマンドを、エンクロージャコマンド通信部（イニシエータ）２３１４を介してストレージコントローラ１２１に送信する（ステップ２５０５）。
【０２６４】
次に、ホストコマンド処理部２３１３はストレージコントローラ１２１からの書き込み先アドレスの応答を待つ（ステップ２５０６）。ここで、書き込み先アドレスは、ストレージコントローラ１２１によってアドレス変換テーブルを参照して求めたものである。次にホストコマンド処理部２３１３は、ストレージコントローラ１２１からエンクロージャコマンド通信部（イニシエータ）２３１４を介して書き込み先アドレスの通知を受信し、通知を解析して書き込み先アドレスを取得する（ステップ２５０７）。
【０２６５】
次に、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)２３１６は、ライトコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３のデータを、確保したバッファ領域に転送する（ステップ２５０８）。
【０２６６】
次に、ドライブ２重書き部２３２２はバッファ領域のライトデータを、ステップ２５０７で受信した書き込み先アドレスに２重書きする（ステップ２５０９）。２重書きは２つのドライブに書き込むという意味であり、詳しくは図２８と図２９にて説明する。
【０２６７】
次に、ドライブ２重書き部２３２２は、２重書きの完了を、すなわち２重書き先に対応するドライブからの書き込み完了を待つ（ステップ２５１０）。次に、ドライブ２重書き部２３２２は２重書きの完了応答を受信する（ステップ２５１１）。
【０２６８】
次に、ホストコマンド処理部２３１３はストレージコントローラ１２１にエンクロージャコマンド通信部（イニシエータ）２３１４を介して書き込み完了を通知する（ステップ２５１２）。次に、ホストコマンド処理部２３１３はストレージコントローラ１２１からのコントローラコマンド（ライトコマンドに対応する）の完了応答を待つ（ステップ２５１３）。
【０２６９】
次に、ホストコマンド処理部２３１３は、ストレージコントローラ１２１からエンクロージャコマンド通信部（イニシエータ）２３１４を介してライトコマンドのコマンド完了応答を受信し、ライトコマンドのコマンド完了応答を解析する（ステップ２５１４）。
【０２７０】
次に、ホストコンピュータ１１０からのライトコマンドに対応するコマンドの完了応答を作成する（ステップ２５１５）。次に、ターゲットドライバ２３１２を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ２５１６）。次に、確保したバッファ領域を開放する（ステップ２５１７）。最後に、処理を完了する（ステップ２５１８）。
【０２７１】
次に、フローチャートのステップ２５０２以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ２５０２からステップ１６１７に処理が分岐すると、図１６においてコマンド種別が管理コマンドの場合と同じとなる。処理が同じため、以降の説明を割愛する。
【０２７２】
（２７）ターゲット構成形態２、ライトＩＯ処理の連携方式１によるストレージコントローラにおけるエンクロージャコマンドの処理手順
図２７は、ターゲット構成形態２、ライトＩＯ処理の連携方式１によるストレージコントローラにおけるエンクロージャコマンドの処理手順を示すフローチャートである。なお、一部の処理は図１７の処理と共通していることから、共通の処理のステップについては図１７のステップ番号を記載した。
【０２７３】
ストレージコントローラ１２１のエンクロージャコマンド通信部（ターゲット）２３０１がドライブエンクロージャ２００からエンクロージャコマンドを受信すると、エンクロージャコマンド処理部２３０２がステップ２７００以降の処理を開始する。
【０２７４】
始めに、エンクロージャコマンド処理部２３０２は受信したエンクロージャコマンドを解析し、コマンド種別、namespaceの識別子であるNID (namespace ID)、開始アドレス、データ転送長のフィールドを読み込む（ステップ２７０１）。次に、コマンドの処理で処理を分岐する（ステップ２７０２）。コマンド種別がリードコマンドの場合はステップ１７０９に進む。コマンド種別がライトコマンドの場合はステップ２７０３に進む。コマンド種別が管理コマンドの場合はステップ１７１４に進む。
【０２７５】
ステップ１７０９に分岐すると、図１７においてオフロードの場合の処理と同じとなる。処理が同じため、以降の説明を割愛する。
【０２７６】
以下では、ステップ２７０２においてコマンド種別がライトコマンドの場合のフローについて説明する。ステップ２７０３に分岐すると、エンクロージャコマンド処理部２３０２はエンクロージャコマンド通信部（ターゲット）２３０１から得られる識別名４０３、ステップ２３０１で得られたNID、開始アドレスとデータ転送長の情報に基づき、論理ボリュームのライト範囲へのアクセス排他を行う（ステップ２７０３）。アクセス排他を行う理由は、同一の論理アドレスにアクセスする複数のライトコマンドを受信した場合でも、データの一貫性を保障するためである。
【０２７７】
次に、ライトデータの書き込み先のアドレス、すなわち２重書き先のドライブと物理アドレスを決定する（ステップ２７０４）。この処理フローでは、ライトデータの書き込みをストレージコントローラではなくドライブ筐体が行うので、ドライブ筐体のライトデータの書き込みを待って、ストレージコントローラが管理するアドレス変換テーブルを更新する必要がある。
【０２７８】
次に、オフロードコマンド通信部（イニシエータ）２３０４を介して書き込み先アドレスをドライブエンクロージャ２００に送信する（ステップ２７０５）。次に、ドライブエンクロージャ２００からの書き込み完了を待つ（ステップ２７０６）。
【０２７９】
次に、オフロードコマンド通信部（イニシエータ）２３０４を介してドライブエンクロージャ２００からの書き込み完了を受信する（ステップ２７０７）。次に、アドレス変換部２３０８がアドレス変換テーブルの対応関係を更新する（ステップ２７０８）。すなわち、ライトコマンドの指定する論理ボリュームのライト範囲の論理アドレスに、２重書き先のドライブの識別子と物理アドレスをマッピングする。
【０２８０】
次に、書き込み先アドレス決定部２３０７は追い書きポインタを更新する（ステップ２７０９）。追い書きポインタは追い書き処理がどこまで進んだかを示すポインタである。ポインタは例えばドライブの物理アドレスや、ドライブの物理アドレスに対応するインデックスである。次に、エンクロージャコマンドの完了応答を作成する（ステップ２７１０）。
【０２８１】
次に、エンクロージャコマンド通信部（ターゲット）２３０１を介してコマンドの完了応答、ドライブエンクロージャ２００に送信する（ステップ２７１１）。これにより、アドレス変換テーブルの更新の完了をドライブ筐体に通知する。次に、アクセス排他を解放する（２７１２）。ドライブ筐体では、ホストコンピュータに対して、ライトコマンドの完了通知を行い、処理を完了する（ステップ２７１３）。
【０２８２】
次に、フローチャートのステップ２７０２以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ２７０２からステップ１７１４に処理が分岐すると、図１７においてコマンド種別が管理コマンドの場合と同じとなる。処理が同じため、以降の説明を割愛する。
【０２８３】
（２６）ターゲット構成形態２、ライトＩＯ処理の連携方式１によるドライブエンクロージャにおけるコントローラコマンドの処理手順
図２６はターゲット構成形態２、ライトＩＯ処理の連携方式１によるドライブエンクロージャにおけるコントローラコマンドの処理手順を示すフローチャートである。
【０２８４】
ストレージコントローラ１２１の２重化解除指示部２３０５がデステージ条件を満たすと判定（例えば、２重化領域の書き込み済み量が閾値以上など）すると、２重化解除指示部２３０５がステップ２６００以降の処理を開始する。
【０２８５】
始めに、２重化解除指示部２３０５は、２重化解除対象を決定する（ステップ２６０１）。２重化解除対象の決定方法としては、例えば２重化領域の書き込み済み量が閾値以下になるまで書き込み時刻の古いものから優先的に２重化解除対象のRAIDストライプを選択する。次に、２重化解除対象を全て解除するまで以降の処理を繰り返す（ステップ２６０２）。
【０２８６】
次に、２重化解除対象で、プライマリ領域２８０３のRAIDストライプを１つ選択する（ステップ２６０３）。次に、選択したRAIDストライプの２重化解除、すなわちパリティ生成と書き込みを、コントローラコマンド通信部（イニシエータ）２３０６を介してドライブエンクロージャ２００に指示する（２６０４）。
【０２８７】
次に、ドライブエンクロージャ２００からの応答を待つ（ステップ２６０５）次に、ドライブエンクロージャ２００のコントローラコマンド処理部２３２１はコントローラコマンド通信部（ターゲット）２３１９を介してストレージコントローラ１２１からの２重化解除指示を受信し、指示を解析する（ステップ２６０６）。次に、２重化解除処理部２３２３は、２重化解除指示に指定されたRAIDストライプのデータを読み込む（２６０７）。
【０２８８】
次に、読み込んだデータのパリティを生成する（ステップ２６０８）。次に、生成したパリティを書き込む（ステップ２６０９）。次に、コントローラコマンド処理部２３２１は２重化解除指示の完了応答を作成し、コントローラコマンド通信部（ターゲット）２３１９を介してストレージコントローラ１２１に完了応答を送信する（ステップ２６１０）。
【０２８９】
次に、２重化解除指示部２３０５はコントローラコマンド通信部（イニシエータ）２３０６を介してドライブエンクロージャ２００から完了応答を受信する(ステップ２６１１)。次に、２重化情報管理部２３１１は、選択したRAIDストライプのセカンダリ領域の解放と２重化情報の更新を行い、論物アドレス管理部２３０９は、対応する記憶領域５０９の状態を２重書き解除状態に更新する（ステップ２６１２）。次に、ステップ２６０２の繰り返しが続く場合は、ステップ２６０３に進む。ステップ２６０２の繰り返しが終了すると、最後に、処理を終了する（ステップ２６１３）。
【０２９０】
（２８）ドライブエンクロージャにおける２重化領域とパリティ生成済み領域
図２８はドライブエンクロージャにおける２重化領域とパリティ生成済み領域を示す図である。
【０２９１】
ドライブ２８０５は、ドライブエンクロージャ内のＲＡＩＤグループに属するドライブ２１８である。図中では例として4台のドライブから成る、ＲＡＩＤレベルがＲＡＩＤ５のＲＡＩＤグループが図示されている。尚、ドライブ数は4台に、ＲＡＩＤレベルはＲＡＩＤ５に限定されるものではない。例えば、ＲＡＩＤグループのドライブは、ＲＡＩＤ５ではN+1台(N台のデータドライブと1台のパリティドライブ)、ＲＡＩＤ６ではN+2台(N台のデータドライブと2台のパリティドライブ)、などの構成が可能である。
【０２９２】
パリティ生成済み領域２８０１は、パリティ生成済みのパリティサイクルから構成される。図中、ストライプ２８０６の「m」、「n」、「o」、「P」がパリティスサイクルである。ストライプ２８０６はＲＡＩＤストライプである。ストライプ「P」は、ストライプ「m」、「n」、「o」のデータを冗長化したパリティである。
【０２９３】
２重化領域２８０２は、ライトデータの書き込み先であり、プライマリ領域２８０３とセカンダリ領域２８０４で構成される。
【０２９４】
２重化領域内のプライマリ領域２８０３は、ライトデータを格納したストライプ２８０６（「a」〜「f」）、未書き込みでライトデータを格納していないストライプ２８０６(文字の記載なし)、パリティ未生成のストライプ２８０６(灰色にハッチングされ、かつ、文字の記載がない)で構成される。
【０２９５】
２重化領域内のセカンダリ領域２８０４は、プライマリ領域２８０３のコピーであり、同じ構成を持つ。図中、ストライプ２８０６(「a」〜「f」)は、ストライプ２８０６(「a’」〜「f’」)がコピーの関係に対応している。コピーの関係に対応する各ストライプは、ドライブ障害によるユーザデータ消失への対策として、それぞれ別のドライブの領域となるように配置する。例えば、ストライプ２８０６の「a」はドライブ０で、ストライプ２８０６の「a’」はドライブ１と、１つずれたドライブに配置する。これにより、ドライブ１台が故障しても、すくなくとも２重化したどちらか一方のユーザデータが残るため、ユーザデータ消失を防止することができる。
【０２９６】
プライマリ領域２８０３とセカンダリ領域２８０４の違いとして、プライマリ領域２８０３のパリティサイクルはパリティ生成後にパリティ生成済み領域２８０１となり、セカンダリ領域２９０４のパリティサイクルはパリティ生成後にライトデータの格納先として２重化領域２８０２として再利用される点が異なる。
【０２９７】
パリティ生成済み領域２８０１、２重化領域２８０２は論理的な管理領域である。そのため、ストライプ２８０６の所属する領域が変更されても、ストライプ２８０６の管理情報(メタデータ)が変更になるだけであり、ドライブへのIO負荷がかかるデータ移動は行わない。
【０２９８】
この他、ＲＡＩＤグループに属するドライブの記憶領域には、空き領域が存在するが、図示を省略した。また、データ保護のレベルに応じてセカンダリ領域２８０４は２つ以上でもよい。例えば、ＲＡＩＤ６と同等のデータ保護のレベルを達成するため、つまり２ドライブ故障してもデータロスとしないためには、セカンダリ領域２８０４を２つ用意する。
【０２９９】
（２９）ドライブエンクロージャにおける２重化領域の対応関係
図２９はドライブエンクロージャにおける２重化領域の対応関係を示す図である。
２重化領域へのライトデータの書き込みは、追記型の書き込み(ログストラクチャードライトとも呼ばれる)で行う。追記型の書き込み(追い書き)は、受信したユーザデータをシーケンシャルに書き込む方式であり、書き込み性能に優れている。書き込み先は、未書き込みでライトデータを格納していないプライマリ領域２８０３とセカンダリ領域２８０４のストライプ２８０６である。図では、プライマリ領域２８０３のストライプをストライプ２８０６「g」、セカンダリ領域のストライプをストライプ２８０６「g’」で示している。図では、ストライプ２８０６「g」とストライプ２８０６「g’」以外の記載は省略した。ストライプ２８０６「g」とストライプ２８０６「g’」は前述の通り、コピーの関係にあり、異なるドライブに配置されている。ドライブ２重書き部２３２２は、ホストコンピュータのライト要求に従ってユーザデータ２９０１をシーケンシャルに書き込む（図中、「g1」、「g2」、「g3」）。ストライプ２８０６「g」および「g’」がユーザデータで満たされてユーザデータをそれ以上書き込めない場合は、次のストライプ２８０６に移り書き込みを継続する。
【０３００】
実施例５によれば、ストレージコントローラのデータ保護技術を維持しつつ、ドライブエンクロージャのオフロード機能により、ストレージコントローラの処理負荷を軽減すると共に、ライトコマンドに対し、2重書き処理をドライブ筐体で行うことでストレージコントローラの処理負荷を軽減することができる。
【実施例６】
【０３０１】
実施例６は、実施例５におけるストレージコントローラがホストコンピュータと別のネットワークに接続する形態（接続形態２）の実施例である。接続形態２は、実施例４で説明したとおりである。
【０３０２】
実施例６におけるストレージ装置１２０とドライブ筐体１４０の制御方法は、実施例５と同じため説明を割愛する。
【実施例７】
【０３０３】
実施例７と実施例５は、ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作し、ライトデータがホストからドライブ筐体に直接データ転送される点で共通している。一方で、実施例７と実施例５は、どこでライトデータの書き込み先を決定するかが異なる。具体的には、実施例５ではライトデータの書き込み先をストレージコントローラ１２１が決定して論物アドレスのマッピングを更新するのに対して、実施例７ではライトデータの書き込み先をドライブエンクロージャ２００が決定し、ドライブエンクロージャ２００が通知する論物アドレスのマッピングに基づいてストレージコントローラ１２１が論物アドレスのマッピングを更新する点が異なる。実施例７は実施例５に比べてライトデータの書き込み先をストレージコントローラ１２１に問い合わせる必要が無く、ライトコマンド処理の応答時間を短縮できるメリットがある。一方で、実施例７では停電などの障害で制御情報が揮発してしまう信頼の低いドライブエンクロージャ２００で、高信頼なストレージ処理を実現するために、追い書きポインタをストレージコントローラに通知する仕組みが必要となる。NVMe over FabricsにおけるホストとNVM Subsystemの識別名は図１５に示したとおり、実施例５と同じため、説明を割愛する。
【０３０４】
（３０）ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態(ターゲット構成形態２：実施例３と同じ)で、ライトＩＯの高速化においてライトデータの書き込み先をドライブエンクロージャが決定する方式(ライトＩＯ処理の連携方式２)の、ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成
【０３０５】
図３０は、ストレージコントローラの代わりにドライブ筐体がホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態で、ライトＩＯの高速化においてライトデータ書き込み先をドライブエンクロージャが決定する方式(ライトＩＯ処理の連携方式２)の、ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成を示す図である。
【０３０６】
ストレージコントローラ１２１のプログラムは図２４の構成要素と共通する部分があるため、主に差分について説明する。３００１〜３００６と２３０１〜２３０６、３００８〜３０１１と２３０８〜２３１１がそれぞれ共通する構成要素である。ストレージコントローラ１２１のプログラムで図３０と図２４との違いは、図２４の書き込み先アドレス決定部が無くなり、追い書きポインタ管理部３００７が追加となる点である。追い書きポインタは追い書き処理がどこまで進んだかを示すポインタであり、ドライブエンクロージャで障害が発生した時に、ユーザデータの整合性保障、データのリカバリ、ストレージ処理の再開に必要な制御情報である。追い書きポインタ管理部３００７は、信頼の低いドライブエンクロージャ２００の代わりに、追い書きポインタのコピーを高信頼なストレージコントローラで保存する役割を持つ。
【０３０７】
ドライブエンクロージャ２００のプログラムは図２４の構成要素と共通する部分があるため、主に差分について説明する。３０１２〜３０２３と２３１２〜２３２３がそれぞれ共通する構成要素である。ドライブエンクロージャ２００のプログラムで図３０と図２４との違いは、追い書きポインタ更新部３０２４、論物対応パラメータ作成部３０２５、２重化情報のコピー３０２６が追加となる点である。追い書きポインタ更新部３０２４は、追い書きポインタを更新する役割を持つ。論物対応パラメータ作成部は、ライトコマンドの指定する論理ボリュームのライト範囲の論理アドレスと、２重書き先のドライブの識別子と物理アドレスの対応関係をストレージコントローラ１２１に通知するためのパラメータである論物対応パラメータ（アドレス変換テーブルのエントリに相当する情報）を作成する役割を持つ。２重化情報のコピー３０２６は、ストレージコントローラ１２１の２重化情報管理部３０１１の管理する２重化情報のコピーである。ドライブエンクロージャ２００内に２重化情報のコピーを持つことにより、ライトコマンド処理でストレージコントローラ１２１に２重化情報を問い合わせる頻度を少なくし、処理効率を向上させる意味がある。
【０３０８】
（３１）ターゲット構成形態２、ライトＩＯ処理の連携方式２によるドライブエンクロージャにおけるホストコマンドの処理手順
図３１は、ターゲット構成形態２、ライトＩＯ処理の連携方式２によるドライブエンクロージャにおけるホストコマンドの処理手順を示すフローチャートである。なお、一部の処理は図１６の処理と共通していることから、共通の処理のステップについては図１６のステップ番号を記載した。
【０３０９】
ドライブエンクロージャ２００のターゲットドライバ３０１２がホストコンピュータ１１０からコマンドを受信すると、ホストコマンド処理部３０１３がステップ３１００以降の処理を開始する。
【０３１０】
始めに、ホストコマンド処理部３０１３は受信したNVMeコマンドを解析し(コマンドのフォーマットについてはホストコマンドの図９Ａのフォーマット９１０を参照)、コマンド種別９１２、namespaceの識別子であるNID (namespace ID)９１３、開始アドレス９１４、データ転送長９１５のフィールドを読み込む（ステップ３１０１）。
【０３１１】
次に、コマンドの種別で処理を分岐する（ステップ３１０２）。コマンド種別がリードコマンドの場合はステップ１６０３に進む。コマンド種別がライトコマンドの場合はステップ３１０３に進む。コマンド種別が管理コマンドの場合は、ステップ１６１７に進む。以下では、ステップ３１０２においてコマンド種別がリードコマンドの場合のフローについて説明する。
【０３１２】
ステップ１６０３に分岐すると、図１６においてコマンド種別がリードコマンドで、かつ、応答種別がオフロードの場合の処理と同じとなる。処理が同じため、以降の説明を割愛する。
【０３１３】
次に、フローチャートのステップ３１０２以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。ステップ３１０２からステップ３１０３に処理が分岐すると、ホストコマンド処理部２３１３はライトデータを格納するためのバッファ領域を、バッファ制御部３０１５を用いて確保する（ステップ３１０３）。
【０３１４】
次に、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)３０１６は、ライトコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３のデータを、確保したバッファ領域に転送する（ステップ３１０４）。
【０３１５】
次に、ホストコマンド処理部３０１３は、追記先アドレスを取得する（ステップ３１０５）。追記先アドレスは追い書きポインタの指し示すアドレスである。次に、ドライブ２重書き部３０２２はバッファ領域のライトデータを、ステップ３１０５で決定した書き込み先アドレスに２重書きする（ステップ３１０６）。
【０３１６】
次に、ドライブ２重書き部３０２２は、２重書きの完了を、すなわち２重書き先に対応するドライブからの書き込み完了を待つ（ステップ３１０７）。次に、ドライブ２重書き部２３２２は２重書きの完了応答を受信する（ステップ３１０８）。
【０３１７】
次に、追い書きポインタ更新部３０２４は、追い書きポインタを次の書き込み先の先頭アドレスに更新する（ステップ３１０９）。追い書きポインタは、図２８と図２９の２重書き方法に従って決定される。次に、論物対応パラメータ作成部３０２５が論物対応パラメータ作成を作成し、ホストコマンド処理部３０１３が、受信したライトコマンドの情報と論物対応パラメータとを含むエンクロージャコマンドを作成する（ステップ３１１０）。
【０３１８】
次に、ホストコマンド処理部３０１３は、エンクロージャコマンド通信部（イニシエータ）３０１４を介してストレージコントローラ１２１にエンクロージャコマンドを送信する（ステップ３１１１）。次にホストコマンド処理部３０１３はストレージコントローラ１２１からのコントローラコマンド（ライトコマンドに対応する）の完了応答を待つ（ステップ３１１２）。次に、ホストコマンド処理部３０１３はエンクロージャコマンド通信部（イニシエータ）３０１４を介してストレージコントローラ１２１から完了応答を受信し、完了応答を解析する（ステップ３１１３）。
【０３１９】
次に、ホストコンピュータ１１０からのライトコマンドに対応するコマンドの完了応答を作成する（ステップ３１１４）。次に、ターゲットドライバ３０１２を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ３１１５）。次に、確保したバッファ領域を開放する（ステップ３１１６）。最後に、処理を完了する（ステップ３１１７）。
【０３２０】
次に、フローチャートのステップ２５０２以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ３１０２からステップ１６１７に処理が分岐すると、図１６においてコマンド種別が管理コマンドの場合と同じとなる。処理が同じため、以降の説明を割愛する。
【０３２１】
（３２）ターゲット構成形態２、ライトＩＯ処理の連携方式２によるストレージコントローラにおけるエンクロージャコマンドの処理手順
図３２は、ターゲット構成形態２、ライトＩＯ処理の連携方式２によるストレージコントローラにおけるエンクロージャコマンドの処理手順を示すフローチャートである。なお、一部の処理は図１７の処理と共通していることから、共通の処理のステップについては図１７のステップ番号を記載した。
【０３２２】
ストレージコントローラ１２１のエンクロージャコマンド通信部（ターゲット）３００１がドライブエンクロージャ２００からエンクロージャコマンドを受信すると、エンクロージャコマンド処理部３００２がステップ３２００以降の処理を開始する。
【０３２３】
始めに、エンクロージャコマンド処理部３００２は受信したエンクロージャコマンドを解析し、コマンド種別、namespaceの識別子であるNID (namespace ID)、開始アドレス、データ転送長のフィールドを読み込む（ステップ３２０１）。
【０３２４】
次に、コマンドの処理で処理を分岐する（ステップ３２０２）。コマンド種別がリードコマンドの場合はステップ１７０９に進む。コマンド種別がライトコマンドの場合はステップ３２０３に進む。コマンド種別が管理コマンドの場合はステップ１７１４に進む。
【０３２５】
ステップ１７０９に分岐すると、図１７においてオフロードの場合の処理と同じとなる。処理が同じため、以降の説明を割愛する。
【０３２６】
以下では、ステップ３２０２においてコマンド種別がライトコマンドの場合のフローについて説明する。ステップ３２０３に分岐すると、エンクロージャコマンド処理部３００２はエンクロージャコマンド通信部（ターゲット）３００１から得られる識別名４０３、ステップ２３０１で得られたNID、開始アドレスとデータ転送長の情報に基づき、論理ボリュームのライト範囲へのアクセス排他を行う（ステップ３２０３）。アクセス排他を行う理由は、同一の論理アドレスにアクセスする複数のリードおよびライトコマンドを受信した場合でも、データの一貫性を保障するためである。
【０３２７】
次に、コマンドに指定された論物対応パラメータ、すなわち２重書き先のドライブと物理アドレスのパラメータを解析する（ステップ３２０４）。次に、解析したパラメータの結果に従い、アドレス変換部３００８がアドレス変換テーブルの対応関係（論物アドレスのマッピング）を更新する（ステップ３２０５）。次に、コマンドに指定された追い書きポインタの内容に従って、追い書きポインタ管理部３００７がコマンド送信元のドライブエンクロージャに対応する追い書きポインタを更新する（ステップ３２０６）。次にエンクロージャコマンド処理部３００２は、エンクロージャコマンドの完了応答を作成する（ステップ３２０７）。
【０３２８】
次に、エンクロージャコマンド処理部３００２はドライブエンクロージャ２００にエンクロージャコマンド通信部（ターゲット）３００１を介して完了応答を送信する（ステップ３２０８）。次に、エンクロージャコマンド処理部３００２はアクセス排他を解放する（ステップ３２０９）。最後に、処理を完了する（ステップ３２１０）。
【０３２９】
次に、フローチャートのステップ３２０２以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ３２０２からステップ１７１４に処理が分岐すると、図１７においてコマンド種別が管理コマンドの場合と同じとなる。処理が同じため、以降の説明を割愛する。
【実施例８】
【０３３０】
実施例８は、実施例７におけるストレージコントローラがホストコンピュータと別のネットワークに接続する形態（接続形態２）の実施例である。接続形態２は、実施例４で説明したとおりである。
実施例８におけるストレージ装置１２０とドライブ筐体１４０の制御方法は、実施例７と同じため説明を割愛する。
【実施例９】
【０３３１】
実施例９と実施例５は、ストレージコントローラがライトデータの書き込み先を決定する点で共通している。一方で、実施例９は、ストレージコントローラがホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する点が、実施例５と異なる。NVMe over FabricsにおけるホストとNVM Subsystemの識別名は図４に示したとおり、実施例１，２と同じため、説明を割愛する。
【０３３２】
（３３）ストレージコントローラがホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態(ターゲット構成形態１：実施例１，２と同じ)で、ライトＩＯの高速化においてストレージコントローラがライトデータの書き込み先を決定し、ライトデータ書き込み先をストレージコントローラに問い合わせる方式(ライトＩＯ処理の連携方式１)の、ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成
【０３３３】
図３３は、ストレージコントローラがホストコンピュータに対してNVMe over Fabricsのターゲットとして動作する形態で、ライトＩＯの高速化においてストレージコントローラがライトデータの書き込み先を決定し、ライトデータ書き込み先をストレージコントローラに問い合わせる方式(ライトＩＯ処理の連携方式１)の、ホストコンピュータ、ストレージコントローラ、ドライブエンクロージャのプログラム構成を示す図である。
【０３３４】
ストレージコントローラ１２１のプログラムは図２４の構成要素と共通する部分があるため、主に差分について説明する。３３０３〜３０１１と２３０３〜２３１１がそれぞれ共通する構成要素である。ストレージコントローラ１２１のプログラムで図３３と図２４との違いは、図２４のエンクロージャコマンド通信部(ターゲット)２３０１とエンクロージャコマンド処理部２３０２が無くなり、ターゲットドライバ３３０１とホストコマンド処理部３３０２が追加された点である。
【０３３５】
ドライブエンクロージャ２００のプログラムは図２４の構成要素と共通する部分があるため、主に差分について説明する。３３１２〜３３２３と２３１２〜２３２３（２３１４を除く）がそれぞれ共通する構成要素である。ドライブエンクロージャ２００のプログラムで図３３と図２４との違いは、エンクロージャコマンド通信部 (イニシエータ)２３１４がなくなった点である。
【０３３６】
（３４）ターゲット構成形態１、ライトＩＯ処理の連携方式１によるストレージコントローラにおけるホストコマンドの処理手順
図３４は、ターゲット構成形態１、ライトＩＯ処理の連携方式１によるストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。実施例１のストレージコントローラにおけるホストコマンドの処理手順を示すフローチャートである。なお、一部の処理は図６の処理と共通していることから、共通の処理のステップについては図６のステップ番号を記載した。
【０３３７】
ストレージコントローラ１２１のターゲットドライバ３３０１がホスト１１０からコマンドを受信すると、ホストコマンド処理部３３０２がステップ３４００以降の処理を開始する。
【０３３８】
始めに、ホストコマンド処理部３３０２は、ストレージコントローラのホスト情報テーブル９２０の情報を用いて、NVM Subsystem NQNである識別名９２３（図４の４０３）を得る（図９Ｂ参照）とともに、受信したNVMeコマンドを解析し(受信したNVMeコマンドについては図９Ａ参照)、コマンド種別９１２、namespaceの識別子であるNID (namespace ID)９１３、開始アドレス９１４、データ転送長のフィールド９１５を読み込む（ステップ３４０１）。
【０３３９】
次に、コマンドの種別で処理を分岐する（ステップ３４０２）。コマンド種別９１２がリードコマンドの場合はステップ６０６に進む。コマンド種別が管理コマンドの場合は、ステップ６１４に進む。コマンド種別がライトコマンドの場合は、ステップ３４０３に進む。
【０３４０】
ステップ６０６に分岐すると、図６において、コマンド種別がIOコマンドで、データ転送方法がオフロードの場合の処理と同じとなる。処理が同じため、以降の説明を割愛する。
【０３４１】
次に、フローチャートのステップ３４０２以降の説明に戻り、コマンド種別が管理コマンドの場合の処理のフローについて説明する。ステップ３４０２からステップ６１４に処理が分岐すると、図６においてコマンド種別が管理コマンドの場合と同じとなる。処理が同じため、以降の説明を割愛する。
【０３４２】
次に、フローチャートのステップ３４０２以降の説明に戻り、コマンド種別がライトコマンドの場合の処理のフローについて説明する。ステップ３４０２からステップ３４０３に処理が分岐すると、ホストコマンド処理部３３０２は、ターゲットドライバ３３０１から得られる識別名４０３、ステップ２３０１で得られたNID、開始アドレスとデータ転送長の情報に基づき、論理ボリュームのライト範囲へのアクセス排他を行う（ステップ３４０３）。
【０３４３】
次に、書き込み先アドレス決定部３３０７は、アドレス変換テーブルを参照してライトデータの書き込み先アドレスを決定する（ステップ３４０４）。次に、ホストコマンド処理部３３０２は、ドライブエンクロージャにライトコマンド処理させるため、決定された書き込み先アドレスを含むオフロードコマンドを作成する（３４０５）。
【０３４４】
次に、ホストコマンド処理部３３０２は、オフロードコマンド通信部（イニシエータ）３３０６を介してドライブエンクロージャ２００にオフロードコマンドを送信する（３４０６）。次に、オフロードコマンドの完了を待つ（ステップ３４０７）。次に、ホストコマンド処理部３３０２は、オフロードコマンド通信部（イニシエータ）３３０６を介してドライブエンクロージャ２００からオフロードコマンドの完了応答を受信し、解析する（３４０８）。
【０３４５】
次に、アドレス変換部３３０８が論物アドレスのマッピングを更新（アドレス変換テーブルの対応関係の更新）する（ステップ３４０９）。すなわち、ライトコマンドの指定する論理ボリュームのライト範囲の論理アドレスに、２重書き先のドライブの識別子と物理アドレスをマッピングする。次に、書き込み先アドレス決定部３３０７は追い書きポインタを更新する（ステップ３４１０）。次に、ホストコマンド処理部３３０２はアクセス排他を解除する（ステップ３４１１）。
【０３４６】
次に、ホストコンピュータ１１０からのライトコマンドに対応するコマンドの完了応答を作成する（ステップ３４１２）。次に、ターゲットドライバ３３０１を使用してホストコンピュータ１１０にコマンドの完了応答送信する（ステップ３４１３）。最後に、処理を完了する（ステップ３４１４）。
【０３４７】
（３５）ターゲット構成形態１、ライトＩＯ処理の連携方式１によるドライブエンクロージャにおけるデータ転送のオフロードコマンドの処理手順
図３５は、ターゲット構成形態１、ライトＩＯ処理の連携方式１によるドライブエンクロージャにおけるデータ転送のオフロードコマンドの処理手順を示すフローチャートである。なお、一部の処理は図７の処理と共通していることから、共通の処理のステップについては図７のステップ番号を記載した。
【０３４８】
ドライブエンクロージャ２００のオフロードコマンド処理部３３１８は、ストレージコントローラ１２１からオフロードコマンド通信部(ターゲット)３１３を介してオフロードコマンドを受信すると、ステップ３５００以降の処理を開始する。
【０３４９】
始めに、オフロードコマンド処理部３３１８はオフロードコマンドの各フィールドを読み込む（ステップ３５０１）。各フィールドについては、図９Ｄにて説明する。
次に、コマンドの種別で処理を分岐する（ステップ３５０２）。データ転送方向９０９がストレージシステムからホストコンピュータの場合はコマンド種別をリードコマンドのオフロードと判定し、データ転送方向９０９がホストコンピュータからストレージシステムの場合はコマンド種別をライトコマンドのオフロードと判定する。コマンド種別がリードコマンドのオフロード場合はステップ７０８に進む。コマンド種別がライトコマンドのオフロードの場合は、ステップ３５０４に進む。
【０３５０】
ステップ７０８に分岐すると、図７のステップ８以降の処理と同じとなる。処理が同じため、以降の説明を割愛する。
【０３５１】
次に、フローチャートのステップ３５０２以降の説明に戻り、コマンド種別がライトコマンドのオフロードの場合の処理のフローについて説明する。ステップ３５０２からステップ３５０４に処理が分岐すると、オフロードコマンド処理部３３１８は、バッファ制御部３３１５を用いてバッファを確保する（ステップ３５０４）。次に、データ転送制御部(ホストコンピュータとドライブエンクロージャ間)３３１６は、ライトコマンドで指定されたホストコンピュータ１１０内の物理メモリ領域５０３のデータを、確保したバッファ領域に転送する（ステップ３５０５）。次に、ドライブ２重書き部３３２２はバッファ領域のライトデータを、オフロードコマンドに指定された書き込み先アドレスに２重書きする（３５０６）。次に、ドライブ２重書き部３３２２は２重書きの完了応答を、すなわち２重書き先に対応するドライブからの書き込み完了を待つ（ステップ３５０７）。次に、ドライブ２重書き部２３２２は２重書きの完了応答を受信する（ステップ３５０８）。次に、オフロードコマンド処理部３３１８は、ステップ３５０４で確保したバッファを解放する（ステップ３５０９）。次に、オフロードコマンド処理部３３１８は、オフロードコマンドの完了応答を作成し、完了応答を送信する（３５１０）。最後に、処理を完了する（ステップ３５１１）。
【符号の説明】
【０３５２】
１１０：ホストコンピュータ、１２０：ストレージ装置、１２１：ストレージコントローラ、１４０：ドライブ筐体、１５０：ネットワーク、２００：ドライブエンクロージャ、２１８：ドライブ。
【図１】
2020161103.tif 000003
【図２】
2020161103.tif 000004
【図３】
2020161103.tif 000005
【図４】
2020161103.tif 000006
【図５】
2020161103.tif 000007
【図６】
2020161103.tif 000008
【図７】
2020161103.tif 000009
【図８】
2020161103.tif 000010
【図９Ａ】
2020161103.tif 000011
【図９Ｂ】
2020161103.tif 000012
【図９Ｃ】
2020161103.tif 000013
【図９Ｄ】
2020161103.tif 000014
【図１０】
2020161103.tif 000015
【図１１】
2020161103.tif 000016
【図１２】
2020161103.tif 000017
【図１３】
2020161103.tif 000018
【図１４】
2020161103.tif 000019
【図１５】
2020161103.tif 000020
【図１６】
2020161103.tif 000021
【図１７】
2020161103.tif 000022
【図１８】
2020161103.tif 000023
【図１９】
2020161103.tif 000024
【図２０】
2020161103.tif 000025
【図２１】
2020161103.tif 000026
【図２２】
2020161103.tif 000027
【図２３】
2020161103.tif 000028
【図２４】
2020161103.tif 000029
【図２５】
2020161103.tif 000030
【図２６】
2020161103.tif 000031
【図２７】
2020161103.tif 000032
【図２８】
2020161103.tif 000033
【図２９】
2020161103.tif 000034
【図３０】
2020161103.tif 000035
【図３１】
2020161103.tif 000036
【図３２】
2020161103.tif 000037
【図３３】
2020161103.tif 000038
【図３４】
2020161103.tif 000039
【図３５】
2020161103.tif 000040
【図３６Ａ】
2020161103.tif 000041
【図３６Ｂ】
2020161103.tif 000042