以下、実施の形態について図面を参照して説明する。
まず図1を参照して、実施形態に係る情報処理装置を含む情報処理システム1の構成を説明する。情報処理システム1は、情報処理装置2とメモリシステム3とを含む。
情報処理装置2は、大量且つ多様なデータをメモリシステム3に保存するストレージサーバであってもよいし、パーソナルコンピュータであってもよい。以下では、情報処理装置2を、ホスト2とも称する。
メモリシステム3は、NAND型フラッシュメモリのような不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。メモリシステムはストレージデバイスとも称される。メモリシステムは、例えばソリッドステートドライブ(SSD)として実現される。
メモリシステム3は、ホスト2のストレージとして使用され得る。メモリシステム3は、ホスト2に内蔵されてもよいし、ホスト2にケーブルまたはネットワークを介して接続されてもよい。
ホスト2とメモリシステム3とを接続するためのインタフェースは、PCI Express(PCIe)(登録商標)、Ethernet(登録商標)、Fibre channel、NVM Express(NVMe)(登録商標)等の規格に準拠する。
ホスト2とメモリシステム3それぞれの構成例について以下に説明する。
(ホスト2の構成例)
ホスト2は、例えば、CPU21、ランダムアクセスメモリ(RAM)22、ストレージインターフェース(ストレージI/F)23、および不揮発性ランダムアクセスメモリ(NVRAM)24を備える。これらCPU21、RAM22、ストレージI/F23、およびNVRAM24は、バス20を介して接続されていてもよい。
CPU21は、例えば、少なくとも1つのプロセッサである。CPU21は、情報処理装置2内の様々なコンポーネントの動作を制御する。
RAM22は揮発性メモリである。RAM22は、例えば、ダイナミックランダムアクセスメモリ(DRAM)、スタティックランダムアクセスメモリ(SRAM)として実現される。RAM22の記憶領域は、例えば、オペレーティングシステム(OS)221、ドライバ222、各種のアプリケーションプログラムの格納領域として割り当てられる。以下では、アプリケーションプログラムを、単に、アプリケーションとも称する。
ストレージI/F23は、ホスト2とメモリシステム3との通信を制御する制御回路として機能する。ストレージI/F23は、ホスト2に様々なコマンド、例えば、I/Oコマンド、各種制御コマンドを送信する。I/Oコマンドには、例えば、ライトコマンド、リードコマンドが含まれる。制御コマンドには、例えば、フラッシュ(flush)コマンド、仮想PLPドライブモード遷移コマンド、仮想PLPドライブモード解除コマンド、リカバリモード遷移コマンド、リカバリモード解除コマンドが含まれる。仮想PLPドライブモード遷移コマンドは、第1モード遷移コマンドとも称される。仮想PLPドライブモード解除コマンドは、第1モード解除コマンドとも称される。リカバリモード遷移コマンドは、第2モード遷移コマンドとも称される。リカバリモード解除コマンドは、第2モード解除コマンドとも称される。
フラッシュコマンドは、メモリシステム3のNAND型フラッシュメモリ5に書き込まれていないユーザデータを、ホスト2またはメモリシステム3内の記憶領域から、メモリシステム3のNAND型フラッシュメモリ5に書き込むためのコマンドである。
第1モード遷移コマンドは、メモリシステム3を通常ドライブモードから仮想パワーロスプロテクションドライブモード(仮想PLPドライブモード)に遷移させるためのコマンドである。第1モード遷移コマンドは、例えば、この第1モード遷移コマンドを発行したホスト2の識別情報(ホストID)を含む。ホストIDは、メモリシステム3が1つのホストを一意に特定可能な情報である。ホストIDとして、例えば、NVMe規格で規定されたHost Identifierが用いられる。
メモリシステム3では、通常ドライブモードと仮想PLPドライブモードのいずれか一方が、第1動作モードとして設定される。ホスト2は、仮想PLPドライブモードに遷移させたメモリシステム3(すなわち、第1動作モードが仮想PLPドライブモードであるメモリシステム3)に対して、仮想的なパワーロスプロテクション機能(仮想PLP機能)を提供する。仮想PLP機能は、ホスト2の異常終了、メモリシステム3の不正電源断等による異常終了、あるいはメモリシステム3の意図しない再起動、によって完了できなかったメモリシステム3(より詳しくはNAND型フラッシュメモリ5)へのユーザデータの書き込みを、NVRAM24に格納されているデータを用いて復旧する機能である。
以下では、ホスト2が第1モード遷移コマンドによって仮想PLPドライブモードに遷移させたメモリシステム3を、ホスト2に対して仮想PLPドライブモードで動作するメモリシステム3とも称する。なお、ホスト2は、仮想PLPドライブモードに遷移させていないメモリシステム3(すなわち、第1動作モードが通常ドライブモードであるメモリシステム3)に対して、仮想PLP機能を提供しない。
第1モード解除コマンドは、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させるためのコマンドである。
第2モード遷移コマンドは、メモリシステム3を通常書き込みモードからリカバリ書き込みモードに遷移させるためのコマンドである。メモリシステム3では、通常書き込みモードとリカバリ書き込みモードのいずれか一方が、第2動作モードとして設定される。リカバリ書き込みモードに遷移したメモリシステム3(すなわち、第2動作モードがリカバリ書き込みモードであるメモリシステム3)では、ホスト2から受け付けたライトコマンドに対応する書き込み処理が、ライトコマンドの受け付け順に実行されることが保証される。なお、リカバリ書き込みモードに遷移していないメモリシステム3(すなわち、第2動作モードが通常書き込みモードであるメモリシステム3)では、ホスト2から受け付けたライトコマンドに対応する書き込み処理が、ライトコマンドの受け付け順に実行されることが保証されない可能性がある。
第2モード解除コマンドは、メモリシステム3をリカバリ書き込みモードから通常書き込みモードに遷移させるためのコマンドである。
NVRAM24は不揮発性メモリである。NVRAM24として、例えば、MRAM(Magnetoresistive Random Access Memory)、PRAM(Phase change Random Access Memory)、ReRAM(Resistive Random Access Memory)、またはFeRAM(Ferroelectric Random Access Memory)が用いられる。NVRAM24の記憶領域は、ホスト2による処理に用いられる各種のデータの格納領域、データバッファ242として利用されるバッファ領域、サブミッションキュー(SQ)243の領域、コンプリーションキュー(CQ)244の領域、ポインタリスト246の格納領域として割り当てられる。
データバッファ242は、メモリシステム3のNAND型フラッシュメモリ5に書き込まれるべきユーザデータを一時的に記憶する記憶領域である。
サブミッションキュー243は、ホスト2からメモリシステム3にコマンドを送信するために、コマンドが格納されるキューである。
コンプリーションキュー244は、メモリシステム3からホスト2に応答(コンプリーション)を返すために、応答が格納されるキューである。メモリシステム3は、1つのライトコマンドに対して複数のコンプリーションを応答し得る。
なお、ホスト2は、1つのメモリシステム3に対して、コマンドの種類毎、例えば管理コマンド用と、リードコマンドやライトコマンドのような入出力コマンド用に、別のサブミッションキュー243やコンプリーションキュー244を実装してもよい。また、ホスト2は、1つのメモリシステム3に対して、入出力コマンド用のサブミッションキュー243/コンプリーションキュー244を複数実装してもよい。本実施形態においては、サブミッションキュー243/コンプリーションキュー244はNVRAM24に設けられるとするが、ライトコマンド以外用のサブミッションキュー243/コンプリーションキュー244は、RAM22に設けられてもよい。
ポインタリスト246は、ライトコマンドまたはリードコマンドに関連付けられたユーザデータの、データバッファ242上の位置を示すポインタのリストである。本実施形態においては、ポインタリスト246はNVRAM24に格納されるとするが、ポインタリスト246は、RAM22に格納されてもよい。
ホスト2による処理に用いられる各種のデータには、例えば、仮想PLPドライブID241、ロックデータリスト(locked data list)245がある。
仮想PLPドライブID241は、ホスト2が仮想PLPドライブモードに遷移させたメモリシステム3の識別情報(ドライブID)を示す。ドライブIDは、ホスト2が1つのメモリシステム3を一意に特定可能な情報である。なお、ホスト2が複数のメモリシステム3それぞれを仮想PLPドライブモードに遷移させている場合、NVRAM24には、複数のメモリシステム3にそれぞれ対応する複数の仮想PLPドライブID241が格納される。
ロックデータリスト245は、ホスト2からメモリシステム3に対して発行されたライトコマンドの処理状況を管理するためのデータである。1つのロックデータリスト245は、例えば、1つのメモリシステム3に対応する。より詳しくは、1つのロックデータリスト245は、例えば、対応する1つのメモリシステム3の仮想PLPドライブID241に関連付けられる。
複数のメモリシステム3にそれぞれ対応する複数のロックデータリスト245が、NVRAM24に格納されていてもよい。その場合、複数のロックデータリスト245それぞれは、対応する1つのメモリシステム3の仮想PLPドライブID241に関連付けられる。つまり、ホスト2は、メモリシステム3の仮想PLPドライブID241を用いて、そのメモリシステム3に対して用いられるべき1つのロックデータリスト245を特定可能である。
図2は、ホスト2において用いられるロックデータリスト245の構成例を示す。ロックデータリスト245は、ホスト2からメモリシステム3に送信される1つ以上のライトコマンドにそれぞれ対応する1つ以上のエントリを含み得る。各エントリは、例えば、SQエントリ情報フィールド、コンプリーション順序フィールド、データ領域管理情報フィールド、およびコンプリーション状態フィールドを含む。
SQエントリ情報フィールドは、対応するライトコマンドを表す情報(SQエントリ情報)を示す。SQエントリ情報は、コマンドの種別、内容、実行時に必要なパラメータ等の情報を含む。具体的には、SQエントリ情報フィールドは、例えば、コマンドオペレーションコード、データポインタ、コマンドID、ネームスペースID、LBA(論理ブロックアドレス)、およびデータ長を示す。
コマンドオペレーションコードは、対応するコマンド(ここではライトコマンド)の種類を示すコードである。コマンドオペレーションコードとして、例えば、NVMe規格で定められるOpcodeが用いられる。
データポインタは、ホスト2において、対応するライトコマンドに応じて書き込まれるべきユーザデータが格納されている場所を示す情報である。データポインタとして、例えば、NVMe規格で定められるPhysical Region Page(PRP)エントリまたはそのリスト、Scatter Gather List(SGL)が用いられる。データ量が多い場合にPRPが用いられる場合は、PRPのエントリのリストのポインタが、SQエントリ情報フィールドに格納される。SGLが用いられる場合は、SGLの最初のセグメントのみが、SQエントリ情報フィールドに格納される。なお、PRPエントリのリストや、SGLの2つ目以降のセグメントは、ポインタリスト246に格納される。
コマンドIDは、対応するライトコマンドの識別情報である。
ネームスペースIDは、対応するライトコマンドが実行されるべきネームスペースの識別情報である。メモリシステム3にアクセスするためにホスト2によって使用される論理アドレス空間(LBA空間)は複数存在し得る。各論理アドレス空間は、ネームスペースと称されることがある。複数のネームスペースの1つは、ネームスペースIDによって特定され得る。
LBAは、対応するライトコマンドで指定されるLBAである。このLBAは、ライトコマンドに応じてユーザデータが書き込まれるべきLBA範囲の先頭のLBAを示す。
データ長は、対応するライトコマンドで指定されるデータ長である。このデータ長は、ライトコマンドに応じて書き込まれるべきユーザデータの長さを示す。よって、ライトコマンドでLBAとデータ長とを指定することで、そのライトコマンドに応じてユーザデータが書き込まれるべきLBA範囲が特定可能である。
コンプリーション順序フィールドは、対応するライトコマンドに対する1回目のコンプリーションが受け取られた順序を示す。ホスト2によって受け取られる1つ以上のコンプリーションそれぞれには、受け取られた順序に従ってシーケンス番号が割り当てられる。コンプリーション順序フィールドは、対応するライトコマンドに対する1回目のコンプリーションに割り当てられたシーケンス番号を示す。
データ領域管理情報フィールドは、対応するライトコマンドに応じて書き込まれるべきユーザデータが格納されているNVRAM24内の記憶領域を特定可能な情報を示す。この情報は、例えば、特定されるNVRAM24内の記憶領域(例えば、ページ)を、OS221の機能を用いてロックまたはロック解除するために利用され得る。
コンプリーション状態フィールドは、対応するライトコマンドに対する1回目のコンプリーションを受信したか否かを示す。なお、コンプリーション状態フィールドを省略し、コンプリーション順序フィールドにシーケンス番号が格納されたことをもって、対応するライトコマンドに対する1回目のコンプリーションを受信したことを示すようにしてもよい。
以下のロックデータリスト245に関する説明では、SQエントリ情報フィールドに示される値を、単に、SQエントリ情報とも称する。ロックデータリスト245の他の各フィールドに示される値、および他のテーブルの各フィールドに示される値についても同様である。
図1に戻る。ここで、CPU21が実行するプログラムについて説明する。
CPU21は、例えばNVRAM24からRAM22にロードされる様々なプログラムを実行する。CPU21が実行するプログラムには、OS221、ドライバ222、および各種のアプリケーションが含まれる。
OS221は、ホスト2内の様々なコンポーネントの基本的な動作を制御するためのプログラムである。OS221を実行しているCPU21は、例えば、入出力、ファイル管理、メモリ管理、通信を制御する。
ドライバ222は、ホスト2に接続されたデバイスを制御するためのプログラムである。例えば、ドライバ222を実行しているCPU21は、ストレージI/F23を介して、コマンドやデータをメモリシステム3に送信する。ドライバ222を実行しているCPU21は、ストレージI/F23を介して、コマンドに対する応答やデータをメモリシステム3から受信する。
CPU21は、ドライバ222を実行することによって、例えば、コマンド発行部211、ライト管理部212、およびリカバリ制御部213として機能する。コマンド発行部211、ライト管理部212、およびリカバリ制御部213の具体的な動作は、図5から図16を参照して後述する。コマンド発行部211、ライト管理部212、およびリカバリ制御部213は、ホスト2内の専用ハードウェアによって実現されてもよい。
(メモリシステム3の構成例)
メモリシステム3は、例えば、コントローラ4、NAND型フラッシュメモリ5、およびDRAM6を備える。コントローラ4は、System-on-a-chip(SoC)のような回路によって実現され得る。コントローラ4はSRAMを内蔵していてもよい。また、DRAM6がコントローラ4に内蔵されていてもよい。
DRAM6は揮発性のメモリである。DRAM6等のRAMには、例えば、ファームウェア(FW)61の格納領域、論理物理アドレス変換テーブル62のキャッシュ領域、ライト管理テーブル26の格納領域が設けられる。
FW61は、コントローラ4の動作を制御するためのプログラムである。FW61は、例えばNAND型フラッシュメモリ5からDRAM6にロードされる。
論理物理アドレス変換テーブル62は、論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間のマッピングを管理する。
ライト管理テーブル63は、受け付けたライトコマンドに関する情報を管理する。
NAND型フラッシュメモリ5は複数のブロックを含む。ブロックそれぞれは複数のページを含む。ブロックはデータ消去動作の最小単位として機能する。ブロックは、「消去ブロック」、または「物理ブロック」と称されることもある。ページそれぞれは、単一のワード線に接続された複数のメモリセルを含む。ページは、データ書き込み動作およびデータ読み出し動作の単位として機能する。なお、ワード線がデータ書き込み動作およびデータ読み出し動作の単位として機能してもよい。
各ブロックに対するプログラム/イレーズサイクル数(P/Eサイクル数)には上限があり、最大P/Eサイクル数と称される。あるブロックの1回のP/Eサイクルは、このブロック内のすべてのメモリセルを消去状態にするための消去動作と、このブロックのページそれぞれにデータを書き込む書き込み動作(プログラム動作)とを含む。
NAND型フラッシュメモリ5には、例えば、ユーザデータと管理データとが書き込まれ得る。ユーザデータは、ホスト2から受け付けたライトコマンドに関連付けられた、NAND型フラッシュメモリ5に書き込まれるべきデータである。管理データは、メモリシステム3の動作を管理するためのデータである。管理データには、例えば、仮想PLPホストID51、第1モード情報52、コマンドログ53が含まれる。
仮想PLPホストID51は、メモリシステム3を仮想PLPドライブモードに遷移させたホスト2のホストIDを示す。仮想PLPホストID51は、メモリシステム3が仮想PLPドライブモードで動作している間、NAND型フラッシュメモリ5に格納されている。
第1モード情報52は、メモリシステム3の第1動作モードが、通常ドライブモードと仮想PLPドライブモードのいずれであるかを示す。メモリシステム3が通常ドライブモードから仮想PLPドライブモードに遷移した場合、第1モード情報52は仮想PLPドライブモードを示すように更新される。また、メモリシステム3が仮想PLPドライブモードから通常ドライブモードに遷移した場合、第1モード情報52は通常ドライブモードを示すように更新される。
コマンドログ53は、対応する処理が完了したコマンドのコマンドIDを示す。コマンドログ53は、メモリシステム3のデバッグに用いられる。コントローラ4は、コマンドに対応する処理が完了した順序が管理できるように、コマンドIDをコマンドログ53に格納する。
コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして機能する。
コントローラ4は、NAND型フラッシュメモリ5のデータ管理およびブロック管理を実行するように構成されたフラッシュトランスレーション層(FTL)として機能してもよい。このFTLによって実行されるデータ管理には、(1)論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、および(2)ページ単位のリード/ライト動作とブロック単位の消去(イレーズ)動作との差異を隠蔽するための処理が含まれる。ブロック管理には、不良ブロックの管理、ウェアレベリング、およびガベージコレクションが含まれる。
論理アドレスは、メモリシステム3をアドレス指定するために、ホスト2によって使用される。論理アドレスは、例えば論理ブロックアドレス(LBA)である。以下では、論理アドレスとしてLBAが用いられる場合について主に例示する。
LBAそれぞれと物理アドレスそれぞれとの間のマッピングの管理は、論理物理アドレス変換テーブル62を用いて実行される。コントローラ4は、論理物理アドレス変換テーブル62を使用して、LBAそれぞれと物理アドレスそれぞれとの間のマッピングを特定の管理サイズ単位で管理する。あるLBAに対応する物理アドレスは、このLBAのデータが書き込まれたNAND型フラッシュメモリ5内の物理記憶位置を示す。コントローラ4は、論理物理アドレス変換テーブル62を用いて、NAND型フラッシュメモリ5の記憶領域を論理的に分割した複数の記憶領域を管理する。これら複数の記憶領域は、複数のLBAにそれぞれ対応する。つまり、これら複数の記憶領域のそれぞれは、1つのLBAで特定される。論理物理アドレス変換テーブル62は、メモリシステム3の電源オン時にNAND型フラッシュメモリ5からDRAM6にロードされてもよい。
1つのページへのデータ書き込みは、1回のP/Eサイクル当たり1回のみ可能である。このため、コントローラ4は、あるLBAに対応する更新データを、このLBAに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ4は、このLBAをこの別の物理記憶位置に関連付けるように論理物理アドレス変換テーブル62を更新することにより、以前のデータを無効化する。論理物理アドレス変換テーブル62から参照されているデータ(すなわちLBAと紐付けられているデータ)は有効データと称される。また、どのLBAとも紐付けられていないデータは無効データと称される。有効データは、後にホスト2からリードされる可能性があるデータである。無効データは、もはやホスト2からリードされる可能性が無いデータである。
コントローラ4は、ホストインタフェース(ホストI/F)11、CPU12、NANDインタフェース(NAND I/F)13、DRAMインタフェース(DRAM I/F)14、およびタイマー15を含んでもよい。これらホストI/F11、CPU12、NAND I/F13、DRAM I/F14、およびタイマー15は、バス10を介して接続されていてもよい。
ホストI/F11は、ホスト2から様々なコマンド、例えば、I/Oコマンド、各種制御コマンドを受信する回路として機能する。また、ホストI/F11は、コマンドに対する応答やデータをホスト2に送信する回路として機能する。
NAND I/F13は、コントローラ4とNAND型フラッシュメモリ5とを電気的に接続する。NAND I/F13は、Toggle DDR、Open NAND Flash Interface(ONFI)等のインタフェース規格に対応する。
NAND I/F13は、NAND型フラッシュメモリ5を制御するように構成されたNAND制御回路として機能する。NAND I/F13は、複数のチャネル(Ch)を介して、NAND型フラッシュメモリ5内の複数のメモリチップにそれぞれ接続されていてもよい。複数のメモリチップが並列に駆動されることにより、NAND型フラッシュメモリ5全体に対するアクセスを広帯域化することができる。
DRAM I/F14は、DRAM6へのアクセスを制御するように構成されたDRAM制御回路として機能する。
タイマー15は時間を計測する。タイマー15は、計測された時間を、コントローラ4内の各部に提供し得る。
CPU12は、ホストI/F11、NAND I/F13、DRAM I/F14、およびタイマー15を制御するように構成されたプロセッサである。CPU12はNAND型フラッシュメモリ5からDRAM6にロードされたFW61を実行することによって、様々な処理を行う。FW61は、CPU12に様々な処理を実行させるための命令群を含む制御プログラムである。CPU12は、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。CPU12の動作は、CPU12によって実行されるFW61によって制御される。
コントローラ4内の各部の機能は、コントローラ4内の専用ハードウェアによって実現されてもよいし、CPU12がFW61を実行することによって実現されてもよい。
CPU12は、例えば、コマンド受付部121、モード制御部122、およびライト制御部123として機能する。CPU12は、例えばFW61を実行することにより、これら各部として機能する。コマンド受付部121、モード制御部122、およびライト制御部123による具体的な動作については、図5から図16を参照して後述する。
次いで、図3および図4を参照して、メモリシステム3において用いられる2つのテーブルについて説明する。
図3は、論理物理アドレス変換テーブル62の構成例を示す。論理物理アドレス変換テーブル62は、LBAそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間のマッピングを管理する。コントローラ4は論理物理アドレス変換テーブル62を用いて、LBAを物理アドレスに変換し得る。また、コントローラ4は論理物理アドレス変換テーブル62を用いて、物理アドレスをLBAに変換し得る。
図3に示す例では、LBA“0”に物理アドレス“X”が、LBA“1”に物理アドレス“Y”が、LBA“2”に物理アドレス“Z”が、それぞれマッピングされている。
図4はライト管理テーブル63の構成例を示す。ライト管理テーブル63は、1つ以上のライトコマンドにそれぞれ対応する1つ以上のエントリを含み得る。各エントリは、例えば、コマンドIDフィールド、LBAフィールド、データ長フィールド、およびデータポインタフィールドを含む。
コマンドIDフィールドは、対応するライトコマンドのコマンドIDを示す。
LBAフィールドは、対応するライトコマンドで指定されたLBAを示す。このLBAは、ライトコマンドに応じてユーザデータが書き込まれるべきLBA範囲の先頭のLBAを示す。
データ長フィールドは、対応するライトコマンドで指定されたデータ長を示す。このデータ長は、ライトコマンドに応じて書き込まれるべきユーザデータの長さを示す。よって、ライトコマンドで指定されたLBAとデータ長とを用いて、そのライトコマンドに応じてユーザデータが書き込まれるべきLBA範囲が特定可能である。
データポインタフィールドは、対応するライトコマンドで指定されたデータポインタを示す。このデータポインタは、ライトコマンドに応じてNAND型フラッシュメモリ5に書き込まれるべきユーザデータが格納されている、ホスト2内の場所を示す。つまり、コントローラ4は、データポインタで示されるホスト2内の格納場所から、ユーザデータをメモリシステム3に転送する。
次いで、図5から図16を参照して、情報処理システム1において行われる幾つかの動作の例について説明する。
図5は、情報処理システム1におけるバインド動作の例を示すブロック図である。バインド動作は、ホスト2に接続されたメモリシステム3を仮想PLPドライブモードで動作させる初期設定を行うための動作である。
具体的には、まず、ホスト2において、コマンド発行部211は、ホスト2に接続されたメモリシステム3に対して、サブミッションキュー243を介して第1モード遷移コマンドを送信する(図5中の(1))。第1モード遷移コマンドは、ホスト2のホストIDを含み得る。なお、ホスト2は、第1モード遷移コマンドの送信とは別に、ホストIDをメモリシステム3に通知してもよい。
メモリシステム3において、コマンド受付部121は、第1モード遷移コマンドを受信する。コマンド受付部121は、受信した第1モード遷移コマンドをモード制御部122に送出する(図5中の(2))。
モード制御部122は、第1モード遷移コマンドに含まれるホストIDが、仮想PLPホストID51としてNAND型フラッシュメモリ5に格納されているか否かを確認する(図5中の(3))。
NAND型フラッシュメモリ5にホストIDが格納されていない場合、モード制御部122は、メモリシステム3を仮想PLPドライブモードに遷移させ、仮想PLPドライブモードを示すように第1モード情報52を更新する(図5中の(4))。そして、モード制御部122は、第1モード遷移コマンドに含まれるホストIDをNAND型フラッシュメモリ5に書き込む。これにより、メモリシステム3を仮想PLPドライブモードに遷移させたホスト2のホストIDが、仮想PLPホストID51としてNAND型フラッシュメモリ5に登録される(図5中の(5))。そして、モード制御部122は、仮想PLPドライブモードへの遷移が完了したことと、メモリシステム3のドライブIDとを示す応答を、コマンド受付部121およびコンプリーションキュー244を介してコマンド発行部211に送信する(図5中の(6))。
ホスト2のコマンド発行部211は、メモリシステム3によって送信された応答を受信する。コマンド発行部211は、受信した応答に含まれるドライブIDをNVRAM24に格納する(図5中の(7))。これにより、ホスト2が仮想PLPドライブモードに遷移させたメモリシステム3のドライブIDが、仮想PLPドライブID241としてNVRAM24に登録される。また、コマンド発行部211は、受信した応答をライト管理部212に送出する(図5中の(8))。ライト管理部212は、仮想PLPドライブモードへの遷移が完了したことを示す応答に基づいて、仮想PLPドライブID241に関連付けられたロックデータリスト245を生成して、NVRAM24に格納する(図5中の(9))。
なお、第1モード遷移コマンドに含まれるホストIDとは異なるホストIDが仮想PLPホストID51としてNAND型フラッシュメモリ5に既に格納されている場合、メモリシステム3は、そのホストIDを有する別のホストに対して仮想PLPドライブモードで動作している。そのため、モード制御部122は、受信された第1モード遷移コマンドに対して、仮想PLPドライブモードに遷移しない。モード制御部122は、仮想PLPドライブモードに遷移しなかったことを示すエラー通知を、コマンド受付部121およびコンプリーションキュー244を介してコマンド発行部211に返す(図5中の(10))。
以上のバインド動作により、ホスト2は、メモリシステム3が別のホストに対して仮想PLPドライブモードで動作していないならば、メモリシステム3を仮想PLPドライブモードに遷移させることができる。そして、メモリシステム3では、ホスト2のホストIDと、メモリシステム3が仮想PLPドライブモードで動作していることを示す第1モード情報52とが、NAND型フラッシュメモリ5に格納される。また、ホスト2では、メモリシステム3のドライブIDと、ドライブIDに関連付けられたロックデータリスト245とが、NVRAM24に格納される。したがって、ホスト2とメモリシステム3とにおいて、メモリシステム3を仮想PLPドライブモードで動作させるための初期設定を行うことができる。
(書き込み動作)
次いで、図6から図10を参照して、情報処理システム1における書き込み動作の例を説明する。書き込み動作は、ホスト2からメモリシステム3にライトコマンドを送信して、ライトコマンドに関連付けられたユーザデータをNAND型フラッシュメモリ5に書き込むための動作である。書き込み動作は、例えば、図5を参照して前述したバインド動作の後に行われる。
ここで、ホスト2のNVRAM24に設けられるサブミッションキュー243およびコンプリーションキュー244について説明する。ホスト2はサブミッションキュー243を介して、コマンドをメモリシステム3に送信する。また、メモリシステム3はコンプリーションキュー244を介して、コマンドに対するコンプリーションをホスト2に返す。
サブミッションキュー243は、ホスト2からメモリシステム3に対して発行されるコマンドを、ホスト2がそれぞれに格納する複数のスロットを含む。ホスト2がコマンドを格納すべきサブミッションキュー243内の位置(すなわちスロット)は、SQ Tailポインタで示される。メモリシステム3がコマンドをフェッチすべきサブミッションキュー243内の位置は、SQ Headポインタで示される。
コンプリーションキュー244は、コマンドに対する応答をメモリシステム3がそれぞれに格納する複数のスロットを含む。メモリシステム3が応答を格納すべきコンプリーションキュー244内の位置は、CQ Tailポインタで示される。ホスト2が応答をフェッチすべきコンプリーションキュー244内の位置は、CQ Headポインタで示される。
ホスト2およびメモリシステム3における具体的な書き込み動作例について以下に説明する。図6から図10に示す例では、説明を分かりやすくするために、サブミッションキュー243に書き込まれるコマンドがライトコマンドのみである場合を例示する。
図6は、情報処理システム1における書き込み動作の例を示すブロック図である。ここでは、ホスト2のコマンド発行部211およびライト管理部212が、ユーザデータ71をNAND型フラッシュメモリ5に書き込む書き込み要求を受けた場合について例示する。この書き込み要求は、例えば、CPU21が実行するアプリケーションによる書き込み要求である。
まず、ホスト2において、ライト管理部212は、アプリケーションまたはOS221の機能を用いてデータバッファ242に格納され、書き込みが要求されたユーザデータ71をロックする(図6中の(1))。より詳しくは、ライト管理部212は、OS221の機能を用いて、ユーザデータ71が格納されている記憶領域(例えば、ページ)をロックする。これにより、ユーザデータ71が格納されている記憶領域が意図せず解放されたりページアウトされることを防ぐ。なお、ユーザデータ71は、アプリケーションまたはOS221の機能を用いて、RAM22に格納されていてもよい。ユーザデータ71がRAM22に格納されている場合、ライト管理部212は、ユーザデータ71をRAM22からNVRAM24にコピーする。
コマンド発行部211は、ユーザデータ71を書き込むためのライトコマンドを発行する。つまり、コマンド発行部211は、ユーザデータ71を書き込むためのライトコマンドに相当するSQエントリ情報を生成する。コマンド発行部211は、生成されたSQエントリ情報をライト管理部212に送出する(図6中の(2))。
ライト管理部212は、コマンド発行部211によって送出されたSQエントリ情報を用いて、ロックデータリスト245のエントリを生成する。生成されたエントリは、例えば、発行されたライトコマンドに相当するSQエントリ情報とデータ領域管理情報とを含む。このデータ領域管理情報は、ユーザデータ71が格納されているデータバッファ242内の記憶領域を特定可能な情報である。ライト管理部212は、生成されたエントリを、ロックデータリスト245に追加する(図6中の(3))。
図7は、図6中の(3)の動作でエントリが追加されたロックデータリスト245の例を示す。ロックデータリスト245は、追加されたエントリ81を含んでいる。
図7に示す例において、エントリ81は、発行されたライトコマンドに相当するSQエントリ情報“sqentry_info1”と、このライトコマンドに関連付けられたユーザデータ71が格納されているデータバッファ242内の記憶領域を示すデータ領域管理情報“region_info1”とを含む。なお、エントリ81は、コンプリーション順序とコンプリーション状態とを未だ含んでいない。
図6に戻る。次いで、コマンド発行部211は、発行されたライトコマンド(SQエントリ情報)をサブミッションキュー243に格納する(図6中の(4))。コマンドをサブミッションキュー243に格納する動作について、より具体的に説明する。まず、コマンド発行部211は、サブミッションキュー243内のSQ Tailポインタが示すスロットに、コマンド(ここではライトコマンド)を書き込む。コマンド発行部211は、SQ Tailポインタに1を加算する。なお、SQ Tailポインタに1を加算した値が、サブミッションキュー243のスロット数(すなわちキューサイズ)に達する場合、コマンド発行部211はSQ Tailポインタに0を設定する。そして、コマンド発行部211は、更新したSQ Tailポインタの値をメモリシステム3のSQ Tail doorbellレジスタに書き込む。このように、コマンドをサブミッションキュー243に格納する動作は、コマンドをサブミッションキュー243に書き込む動作と、SQ Tailポインタを更新するための動作とを含んでいる。
SQ Tail doorbellレジスタが更新されると、それを受けて、メモリシステム3のコマンド受付部121は、サブミッションキュー243からライトコマンドを取得する(図6中の(5))。そして、コマンド受付部121は、取得されたライトコマンドをライト制御部123に送出する(図6中の(6))。ここで、サブミッションキュー243からコマンドを取得する動作について、より具体的に説明する。まず、コマンド受付部121は、SQ HeadポインタとSQ Tailポインタとに差がある場合、サブミッションキュー243内のSQ Headポインタが示すスロットから、コマンド(ここではライトコマンド)をフェッチする。コマンド受付部121は、SQ Headポインタに1を加算する。なお、SQ Headポインタに1を加算した値が、サブミッションキュー243のスロット数に達する場合、コマンド受付部121はSQ Headポインタに0を設定する。このように、コマンドをサブミッションキュー243から取得する動作は、サブミッションキュー243からコマンドをフェッチする動作と、SQ Headポインタを更新するための動作とを含んでいる。
次いで、ライト制御部123は、コマンド受付部121によって送出されたライトコマンドを用いて、ライト管理テーブル63を更新する(図6中の(7))。具体的には、ライト制御部123は、ライトコマンドで指定されたコマンドID、LBA、データ長、およびデータポインタを含むエントリを、ライト管理テーブル63に追加する。なお、ライト制御部123は、ライトコマンドで指定されたLBAが有効であることを、あるいはそのLBAにデータを書き込み可能であること、データポインタが有効であること、を確認してから、対応するエントリをライト管理テーブル63に追加する。データポインタは、例えば、データポインタがホスト2内のアクセスできない領域を示しておらず、データ長に見合った領域を示している場合に、有効とみなされる。そして、ライト制御部123は、ライトコマンドに基づくライト管理テーブル63の更新が完了したことをコマンド受付部121に通知する(図6中の(8))。
コマンド受付部121は、ライト制御部123による通知に応じて、ライトコマンドに対する1回目のコンプリーション(正常終了を示すコンプリーション)を、コンプリーションキュー244に格納する(図6中の(9))。この1回目のコンプリーションは、ライトコマンドのコマンドIDを含む。コンプリーションをコンプリーションキュー244に格納する動作について、より具体的に説明する。まず、コマンド受付部121は、コンプリーションキュー244内のCQ Tailポインタが示すスロットにコンプリーションを書き込む。コマンド受付部121はCQ Tailポインタに1を加算する。なお、CQ Tailポインタに1を加算した値が、コンプリーションキュー244のスロット数に達する場合、コマンド受付部121はCQ Tailポインタに0を設定する。コマンド受付部121は、割り込みを発行する。コマンド受付部121は、割り込みを発行することにより、処理されるべき新たなコンプリーションがコンプリーションキュー244にあることを、ホスト2に通知する。このように、コンプリーションをコンプリーションキュー244に格納する動作は、コンプリーションキュー244にコンプリーションを書き込む動作と、CQ Tailポインタを更新するための動作と、割り込みを発行する動作とを含んでいる。
なお、コマンド受付部121は、サブミッションキュー243から取得したライトコマンドが実行できないコマンドである場合、エラー終了を示すコンプリーションを、1回目のコンプリーションとして、コンプリーションキュー244に格納してもよい。
次いで、ホスト2のコマンド発行部211は、コンプリーションキュー244からライトコマンドに対する1回目のコンプリーションを取得する(図6中の(10))。そして、コマンド発行部211は、取得された1回目のコンプリーションをライト管理部212に送出する(図6中の(11))。ここで、コンプリーションキュー244からコンプリーションを取得する動作について、より具体的に説明する。まず、コマンド発行部211は、メモリシステム3のコマンド受付部121によって発行された割り込みに応じて、コンプリーションキュー244内のCQ Headポインタが示すスロットから、コンプリーションをフェッチする。コマンド発行部211はCQ Headポインタに1を加算する。なお、CQ Headポインタに1を加算した値が、コンプリーションキュー244のスロット数に達する場合、コマンド発行部211はCQ Headポインタに0を設定する。コマンド発行部211は、更新したCQ Headポインタをメモリシステム3のCQ Head doorbellレジスタに書き込む。そして、コマンド発行部211は、メモリシステム3から受信した割り込みをクリアする。このように、コンプリーションキュー244からコンプリーションを取得する動作は、コンプリーションキュー244からコンプリーションをフェッチする動作と、CQ Headポインタを更新するための動作と、割り込みをクリアする動作とを含んでいる。
1回目のコンプリーションが正常終了を示すコンプリーションである場合、ライト管理部212は、コマンド発行部211から1回目のコンプリーションを受け取り、ロックデータリスト245において、受け取った1回目のコンプリーションに対応するエントリを更新する(図6中の(12))。具体的には、ライト管理部212は、受け取った1回目のコンプリーションに対して、受け取った順序を示すシーケンス番号を割り当てる。ライト管理部212は、例えば、メモリシステム3からコンプリーションキュー244を介してライトコマンドに対する1回目のコンプリーションを受け取る毎に1ずつ増加するシーケンス番号を、受け取った1回目のコンプリーションに対して割り当てる。また、ライト管理部212は、受け取った1回目のコンプリーションに含まれるコマンドIDを取得する。ライト管理部212は、ロックデータリスト245において、取得されたコマンドIDに対応するSQエントリ情報を含むエントリを特定する。そして、ライト管理部212は、特定されたエントリに、割り当てられたシーケンス番号(すなわち、受け取った順序を示す情報)と、1回目のコンプリーションを受け取り済みであることとを示す情報とを追加する。
1回目のコンプリーションがエラー終了を示すコンプリーションである場合は、ライト管理部212は、受け取った1回目のコンプリーションに対応するデータバッファ242内のユーザデータ71のロックを解除する(図6中の(13))。そして、ライト管理部212は、受け取った1回目のコンプリーションに対応するエントリを、ロックデータリスト245から削除する(図6中の(14))。より具体的には、ライト管理部212は、受け取った1回目のコンプリーションに含まれるコマンドIDを取得する。ライト管理部212は、ロックデータリスト245において、取得されたコマンドIDに対応するSQエントリ情報を含むエントリを特定する。ライト管理部212は、特定されたエントリ内のデータ領域管理情報を用いて、書き込みが完了したユーザデータ71のロックを解除する。また、ライト管理部212は、PRPエントリのリストやSGLの2つ目以降のセグメントを作成していた場合は、それらが格納されているポインタリスト246の領域も解放する。そして、ライト管理部212は、特定されたエントリを、ロックデータリスト245から削除する(すなわち、NVRAM24から削除する)。なお、ロックが解除されたユーザデータ71は、データバッファ242から削除される。具体的には、ロックが解除されたユーザデータ71が格納されているデータバッファ242内の記憶領域には、別のデータが格納され得る。
図8は、図6中の(12)の動作でエントリが更新されたロックデータリスト245の例を示す。ロックデータリスト245は、更新されたエントリ81を含んでいる。
図8に示す例において、エントリ81には、受け取った1回目のコンプリーションの受け取り順序を示すコンプリーション順序“cseq1”と、1回目のコンプリーションを受け取り済みであることを示すコンプリーション状態“completed”とが追加されている。つまり、エントリ81は、コンプリーション順序“cseq1”で、1回目のコンプリーションを受け取り済みであることを示している。
ライト管理部212は、ロックデータリスト245の更新が完了すると、アプリケーションまたはOS221から発生した書き込み要求に対して、1回目のコンプリーションが正常終了の場合は書き込みが完了したという応答を返し、エラー終了の場合はエラー応答を返す。
なお、上述したように、アプリケーションまたはOS221がユーザデータ71をRAM22に格納し、ライト管理部212がユーザデータ71をRAM22からNVRAM24にコピーしている場合がある。この場合、アプリケーションまたはOS221は、RAM22のユーザデータ71が格納されていた領域を、エラー終了を示す1回目のコンプリーションを受け取ったことに応じ、解放し別用途に利用できる。ライト管理部212は、ユーザデータ71が格納されているNVRAM24を解放してもよい。
図9は、図6に後続する書き込み動作の例を示すブロック図である。ここでは、メモリシステム3がホスト2から受け付けた複数のライトコマンドによって書き込みが要求されるユーザデータ71の総量が、特定のデータ単位に達した場合について例示する。特定のデータ単位は、例えば、1回のデータ書き込み動作でNAND型フラッシュメモリ5に書き込みが可能なデータ量である。
メモリシステム3において、コマンド受付部121およびライト制御部123は、ホスト2から受け付けた複数のライトコマンドによって書き込みが要求されるユーザデータ71の総量が特定のデータ単位に達した後に、その特定のデータ単位のユーザデータ71をNAND型フラッシュメモリ5に書き込み、複数のライトコマンドそれぞれに対応する2回目のコンプリーションをホスト2に返す。つまり、コマンド受付部121およびライト制御部123は、受け付けた1つのライトコマンドに応じた書き込みを即座に実行せず、複数のライトコマンドによって書き込みが要求されるユーザデータ71の総量が特定のデータ単位に達した後に、それら複数のライトコマンドに応じた書き込みを実行するメカニズム(Delayed Write Completion)で動作する。
具体的には、ライト制御部123は、書き込み単位のユーザデータ71をデータバッファ242からNAND型フラッシュメモリ5に転送し、転送された書き込み単位のユーザデータ71をNAND型フラッシュメモリ5に書き込む(プログラムする)(図9中の(1))。そして、ライト制御部123は、対応するユーザデータ71がNAND型フラッシュメモリ5から読み出し可能になったライトコマンドがある場合、そのライトコマンドに応じた処理の完了を、コマンド受付部121に通知する(図9中の(2))。ライト制御部123は、書き込み単位のユーザデータ71に対応する複数のライトコマンドそれぞれに応じた処理の完了を、コマンド受付部121に通知する。ライト制御部123は、複数のライトコマンドそれぞれに対応するエントリを、ライト管理テーブル63から削除する(図9中の(3))。また、ライト制御部123は、複数のライトコマンドそれぞれのコマンドIDを、コマンドログ53に追加する(図9中の(4))。
コマンド受付部121は、ライト制御部123による通知を受け取る毎に、対応するライトコマンドに応じた処理が完了したことを示す2回目のコンプリーションをホスト2に送信する(図9中の(5))。より具体的には、コマンド受付部121は、ライト制御部123による通知に応じて、対応するライトコマンドに対する2回目のコンプリーションを、コンプリーションキュー244に格納する。ライト制御部123による通知は、例えば、処理が完了したライトコマンドのコマンドIDを含んでいる。
なお、コマンド受付部121は、ライトコマンドに応じた処理でエラーが発生した場合、エラーを示すコンプリーションを、2回目のコンプリーションとしてホスト2に送信する。
次いで、ホスト2のコマンド発行部211は、コンプリーションキュー244から2回目のコンプリーションを取得する(図9中の(6))。そして、コマンド発行部211は、取得された2回目のコンプリーションをライト管理部212に送出する(図9中の(7))。
ライト管理部212は、コマンド発行部211から2回目のコンプリーションを受け取り、受け取った2回目のコンプリーションに対応するデータバッファ242内のユーザデータ71のロックを解除する(図9中の(8))。そして、ライト管理部212は、受け取った2回目のコンプリーションに対応するエントリを、ロックデータリスト245から削除する(図9中の(9))。より具体的には、ライト管理部212は、受け取った2回目のコンプリーションに含まれるコマンドIDを取得する。ライト管理部212は、ロックデータリスト245において、取得されたコマンドIDに対応するSQエントリ情報を含むエントリを特定する。ライト管理部212は、特定されたエントリ内のデータ領域管理情報を用いて、書き込みが完了したユーザデータ71のロックを解除する。また、ライト管理部212は、PRPエントリのリストやSGLの2つ目以降のセグメントを作成していた場合は、それらが格納されているポインタリスト246の領域も解放する。そして、ライト管理部212は、特定されたエントリを、ロックデータリスト245から削除する(すなわち、NVRAM24から削除する)。なお、ロックが解除されたユーザデータ71は、データバッファ242から削除される。具体的には、ロックが解除されたユーザデータ71が格納されているデータバッファ242内の記憶領域には、別のデータが格納され得る。
なお、2回目のコンプリーションがエラーを示す場合、ホスト2(具体的には、ライト管理部212)は、メモリシステム3の故障とみなす。ライト管理部212は、当該メモリシステム3に対する処理を中止し、情報処理システム1としての異常処理を行う。例えば、ライト管理部212は、当該メモリシステム3に関連する一切のデータを削除する。削除されるデータは、当該メモリシステム3に対応するデータバッファ242内のユーザデータ71および当該メモリシステム3に対応するロックデータリスト245を含む。また、ライト管理部212は、少なくとも、故障とみなしたメモリシステム3にライトコマンドを送ることを停止する。さらにライト管理部212は、アプリケーションまたはOS221からの書き込み要求には全てエラーで応答する。
図10は、図9中の(9)の動作でエントリが削除されるロックデータリスト245の例を示す。ロックデータリスト245は、受け取った2回目のコンプリーションに対応するエントリ81を含んでいる。
図10に示す例において、エントリ81は、SQエントリ情報“sqentry_info1”、コンプリーション順序“cseq1”、データ領域管理情報“region_info1”、およびコンプリーション状態“completed”を含む。つまり、エントリ81は、1回目のコンプリーションを受け取り済みであることを示すエントリである。エントリ81は、対応するライトコマンド(すなわち、SQエントリ情報“sqentry_info1”に相当するライトコマンド)に対する2回目のコンプリーションをメモリシステム3から受け取ったことに応じて、削除される。
なお、サブミッションキュー243に格納されたライトコマンド(SQエントリ情報)は、例えば、このライトコマンドに対する1回目のコンプリーションを受け取ったことに応じてクリアされる。そのため、ロックデータリスト245のエントリ内に、ライトコマンドに相当するSQエントリ情報が保存される。なお、この場合は、NVRAM24のサブミッションキュー243に格納されていたライトコマンド(SQエントリ情報)を、クリアせずにRAM22に格納してもよい。
また、サブミッションキュー243に格納されたライトコマンドが、このライトコマンドに対する2回目のコンプリーションを受け取るまでクリアされないようにしてもよい。その場合、ロックデータリスト245のエントリ内には、SQエントリ情報の代わりにサブミッションキュー243のエントリを示すポインタが保存される。そして、サブミッションキュー243に格納されたライトコマンドそのものがSQエントリ情報として用いられる。なお、サブミッションキュー243からライトコマンドがクリアされないことによって、SQ Headポインタが更新されずサブミッションキュー243がフルになりやすく、リードコマンドのような他のコマンドが発行できなくなる可能性がある。そのため、サブミッションキュー243は、ライトコマンドを発行するための専用のサブミッションキューとして設けられてもよい。
以上の書き込み動作により、メモリシステム3がホスト2から受け付けたライトコマンドに基づき、Delayed Write Completionによるユーザデータの書き込みを行う間、ホスト2は、発行したライトコマンドに対応する処理の状況を、ロックデータリスト245を用いて管理できる。
具体的には、ホスト2は、ライトコマンドをメモリシステム3に送信する場合、そのライトコマンドに対応するエントリをロックデータリスト245に追加する。追加されたエントリには、例えば、コンプリーション順序とコンプリーション状態とが含まれていない。よって、ホスト2は、追加されたエントリにより、対応するライトコマンドに対する1回目のコンプリーションおよび2回目のコンプリーションを受け取っていないことを管理できる。換言すると、ホスト2は、追加されたエントリにより、対応するライトコマンドをメモリシステム3に発行(送信)し、且つ、1回目のコンプリーションを受信していない状態であることを管理できる。
メモリシステム3は、ホスト2からライトコマンドを受け付け、対応するエントリをライト管理テーブル63に追加した場合、そのライトコマンドに対する1回目のコンプリーションをホスト2に返す。ホスト2は、メモリシステム3から受け取った1回目のコンプリーションに基づいて、対応するロックデータリスト245内のエントリを更新する。更新されたエントリでは、例えば、コンプリーション順序とコンプリーション状態とが追加される。よって、ホスト2は、更新されたエントリにより、対応するライトコマンドに対する1回目のコンプリーションを受け取り済みであって、且つ、2回目のコンプリーションを受け取っていない状態であることを管理できる。換言すると、ホスト2は、更新されたエントリにより、対応するライトコマンドをメモリシステム3が受け付けた状態であることを管理できる。
また、メモリシステム3は、Delayed Write Completionでライトコマンドに対応するユーザデータの書き込みが完了した場合、そのライトコマンドに対する2回目のコンプリーションをホスト2に返す。ホスト2は、メモリシステム3から受け取った2回目のコンプリーションに基づいて、対応するロックデータリスト245内のエントリを削除する。よって、ホスト2は、エントリが削除されたことにより、対応するライトコマンドに関する管理を終了できる。
なお、メモリシステム3のライト制御部123は、ライトコマンドを受け付けてから経過した時間が閾値を超えた場合に、受け付け済みのライトコマンドに対応するユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込んでもよい。ここで、ユーザデータをパディング付きで書き込むとは、ユーザデータとパディング用のデータとで構成される書き込み単位のデータを書き込むことを意味する。この閾値は、例えば、ホスト2によって期待される、ライトコマンドに対する2回目のコンプリーションが得られるまでの時間の上限に基づく。ライトコマンドを受け付けてから経過した時間は、例えば、タイマー15を用いて計測される。より具体的には、ライト制御部123は、ライトコマンドを受け付けてから経過した時間が閾値を超えた場合に、受け付け済みのライトコマンドに対応するユーザデータを、ホスト2のデータバッファ242からNAND型フラッシュメモリ5に転送する。そして、ライト制御部123は、転送されたユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込む。これにより、コマンド受付部121は、ホスト2によって期待される時間内に、ライトコマンドに対する2回目のコンプリーションを通知し得る。
(シャットダウン動作)
次いで、図11および図12を参照して、情報処理システム1におけるシャットダウン動作の例を説明する。シャットダウン動作は、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータの書き込みが完了した後に、メモリシステム3の動作を終了させるための動作である。
図11は、情報処理システム1におけるシャットダウン動作の例を示すブロック図である。ここでは、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータ71の書き込みを完了させるために、フラッシュコマンドが用いられる場合について例示する。なお、説明を分かりやすくするために、ホスト2は、ホスト2からメモリシステム3に送信された全てのライトコマンドに対する1回目のコンプリーションを受け取り済みであって、少なくとも1つのライトコマンドに対する2回目のコンプリーションをまだ受け取っていないことを想定する。
まず、ホスト2において、ライト管理部212は、アプリケーション等からの新規I/O要求の受け付けを停止する。そして、ライト管理部212は、フラッシュコマンドの発行をコマンド発行部211に要求する(図11中の(1))。コマンド発行部211は、ライト管理部212による要求に応じて、フラッシュコマンドを発行し、サブミッションキュー243に格納する(図11中の(2))。
次いで、メモリシステム3において、コマンド受付部121は、サブミッションキュー243からフラッシュコマンドを取得する(図11中の(3))。コマンド受付部121は、取得されたフラッシュコマンドをライト制御部123に送出する(図11中の(4))。
ライト制御部123は、コマンド受付部121から受け取ったフラッシュコマンドに基づき、ライト管理テーブル63を用いて、NAND型フラッシュメモリ5に書き込まれるべきユーザデータ71があるか否かを判定する(図11中の(5))。具体的には、ライト管理テーブル63に少なくとも1つのエントリがある場合、ライト制御部123は、NAND型フラッシュメモリ5に書き込まれるべきユーザデータ71があると判断する。ライト管理テーブル63にエントリがない場合、ライト制御部123は、NAND型フラッシュメモリ5に書き込まれるべきユーザデータ71がないと判断する。
NAND型フラッシュメモリ5に書き込まれるべきユーザデータ71がある場合、ライト制御部123は、ユーザデータ71をデータバッファ242からNAND型フラッシュメモリ5に転送し、転送されたユーザデータ71をパディング付きでNAND型フラッシュメモリ5に書き込む(図11中の(6))。そして、ライト制御部123は、対応するユーザデータ71がNAND型フラッシュメモリ5から読み出し可能になったライトコマンドに対して、そのライトコマンドに応じた処理の完了を、コマンド受付部121に通知する(図11中の(7))。ライト制御部123は、書き込んだユーザデータ71に対応する1つ以上のライトコマンドそれぞれに応じた処理の完了を、コマンド受付部121に通知する。ライト制御部123は、1つ以上のライトコマンドそれぞれに対応するエントリを、ライト管理テーブル63から削除する(図11中の(8))。また、ライト制御部123は、1つ以上のライトコマンドそれぞれのコマンドIDを、コマンドログ53に追加する(図11中の(9))。
そして、コマンド受付部121は、ライト制御部123による通知を受け取る毎に、対応するライトコマンドに応じた処理が完了したことを示す2回目のコンプリーションを、コンプリーションキュー244に格納する(図11中の(10))。
このように、メモリシステム3では、フラッシュコマンドに応じて、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータ71の書き込みを完了する。これにより、全てのライトコマンドに対して2回目のコンプリーションがホスト2に返される。
以降のホスト2における図11中の(11)から(14)の動作は、図9を参照して前述した書き込み動作の(6)から(9)までの動作と同様である。ホスト2からメモリシステム3に送信された全てのライトコマンドに対して2回目のコンプリーションを受け取ったことにより、ロックデータリスト245内のエントリは全て削除される。つまり、ロックデータリスト245は空になる。ライト管理部212は、ロックデータリスト245内のエントリが全て削除されたことに基づいて、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータ71の書き込みが完了したと判断する。そして、ライト管理部212は、全てのライトコマンドに対応するユーザデータ71の書き込みが完了したことを、コマンド発行部211に通知する(図11中の(15))。
図12は、図11に後続するシャットダウン動作の例を示す。
全てのライトコマンドに対応するユーザデータ71の書き込みが完了したことが通知された場合、コマンド発行部211は、サブミッションキュー243を介してメモリシステム3にシャットダウン命令を送信する(図12中の(1))。
メモリシステム3において、コマンド受付部121は、ホスト2からシャットダウン命令を受信する。コマンド受付部121は、受信したシャットダウン命令をモード制御部122に送出する(図12中の(2))。
モード制御部122は、コマンド受付部121から受け取ったシャットダウン命令に応じて、メモリシステム3の動作モードを仮想PLPドライブモードから通常ドライブモードに遷移させる。そして、モード制御部122は、NAND型フラッシュメモリ5内の第1モード情報52を、通常ドライブモードを示すように更新する(図12中の(3))。また、モード制御部122は、シャットダウン命令に応じて、NAND型フラッシュメモリ5に格納されているホスト2の仮想PLPホストID51を削除する(図12中の(4))。
その後、コマンド受付部121は、ホスト2のコマンド発行部211にシャットダウンが完了したことを通知する(図12中の(5))。
通知を受けて、コマンド発行部211は、NVRAM24に格納されているメモリシステム3の仮想PLPドライブID241を削除する(図12中の(6))。そして、コマンド発行部211は、NVRAM24に格納されているサブミッションキュー243、コンプリーションキュー244、ロックデータリスト245を削除する(図12中の(7))。コマンド発行部211は、例えば、仮想PLPドライブID241とロックデータリスト245が格納されているNVRAM24内の記憶領域を解放する。
以上のシャットダウン動作により、ホスト2は、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータの書き込みが完了した後に、メモリシステム3を通常ドライブモードに遷移させることができる。また、メモリシステム3を仮想PLPドライブモードで動作させるために用いられたデータ(より詳しくは、仮想PLPドライブID241、ロックデータリスト245、仮想PLPホストID51)を削除できる。したがって、シャットダウン命令に応じて、メモリシステム3の動作を正常に終了できる。
(起動動作)
次いで、情報処理システム1における起動動作について説明する。起動動作は、メモリシステム3が異常終了した後に起動した場合に、あるいは意図せず再起動した場合に、または、ホスト2が異常終了した後に起動した場合に、メモリシステム3を復旧するためのアンバインド動作およびリカバリ動作を含み得る。ここで、メモリシステム3の異常終了とは、メモリシステム3が受け取った全てのライトコマンドに対応するユーザデータの書き込みを完了する前に、メモリシステム3が動作を終了することを表す。また、メモリシステム3の意図しない再起動とは、メモリシステム3が、上述したシャットダウン動作を完了せずに、再起動したことを表す。ホスト2の異常終了とは、ホスト2がメモリシステム3に発行した全てのライトコマンドに対応するユーザデータの書き込みをメモリシステム3が完了する前に、ホスト2が動作を終了することを表す。
アンバインド動作は、例えば、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったメモリシステム3へのユーザデータの書き込みがない場合に、メモリシステム3を強制的に仮想PLPドライブモードから通常ドライブモードに戻すための動作である。リカバリ動作は、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったメモリシステム3へのユーザデータの書き込みを、NVRAM24に格納されているデータを用いて復旧するための動作である。以下では、アンバインド動作とリカバリ動作それぞれの具体例を説明する。
(アンバインド動作)
図13は、情報処理システム1におけるアンバインド動作の例を示すブロック図である。ここでは、仮想PLPドライブモードで動作していたメモリシステム3が、今回の起動の直前に異常終了したか、あるいは意図せず再起動したことを想定する。この場合、メモリシステム3は、今回の起動後も仮想PLPドライブモードで動作している。また、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったメモリシステム3へのユーザデータの書き込みがないことを想定する。つまり、1回目のコンプリーションを受け取ったことを示すエントリがロックデータリスト245に含まれていないことを想定する。
まず、ホスト2のリカバリ制御部213は、ホスト2に接続されているメモリシステム3のドライブIDが、NVRAM24に格納されている仮想PLPドライブID241と一致しているかどうかを判定する(図13中の(1))。
メモリシステム3のドライブIDが、NVRAM24内の仮想PLPドライブID241とは異なる場合、メモリシステム3は、ホスト2とは別のホストに対して仮想PLPドライブモードで動作していたと推定される。そのため、ホスト2は、メモリシステム3が通常ドライブモードに戻るまで、メモリシステム3にアクセスしない。メモリシステム3は、例えば、ホスト2のオペレータによる操作に基づき、その別のホストとの間でアンバインド動作を行うことによって、仮想PLPドライブモードから通常ドライブモードに戻る。
なお、ホスト2のNVRAM24が故障し交換され、NVRAM24に格納されていたデータが全て失われた場合や、別のホストが故障し修復不能になり、メモリシステム3をホスト2に接続した場合は、仮想PLPドライブID241は、メモリシステム3のドライブIDと一致しない。この場合も、例えばホスト2のオペレータによる操作に基づき、ホスト2は、メモリシステム3に第1モード解除コマンドを発行し、一旦、メモリシステム3を通常モードに復帰させた上で、図5を参照して説明した手順でメモリシステム3を仮想PLPドライブモードに遷移させることができる。
メモリシステム3のドライブIDが、NVRAM24内の仮想PLPドライブID241と一致している場合、すなわち、メモリシステム3のドライブIDがNVRAM24に格納されている場合、リカバリ制御部213は、NVRAM24内のロックデータリスト245に、1回目のコンプリーションを受け取ったことを示すエントリが含まれているか否かを判定する(図13中の(2))。ロックデータリスト245は、メモリシステム3の仮想PLPドライブID241に関連付けられたロックデータリストである。
1回目のコンプリーションを受け取ったことを示すエントリは、例えば、コンプリーション順序と、1回目のコンプリーションを受け取り済みであることを示すコンプリーション状態とを含むエントリである。1回目のコンプリーションを受け取ったことを示すエントリがロックデータリスト245に含まれていない場合、リカバリ制御部213は、ホスト2またはメモリシステム3が異常終了したかあるいは意図せず再起動したことによって、アプリケーションまたはOS221の書き込み要求に正常応答したにもかかわらず完了できなかったメモリシステム3へのユーザデータの書き込みがないと判断する。1回目のコンプリーションを受け取ったことを示すエントリがロックデータリスト245に含まれている場合、リカバリ制御部213は、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったメモリシステム3へのユーザデータの書き込みがあると判断する。
前述した通り、図13に示す例では、1回目のコンプリーションを受け取ったことを示すエントリがロックデータリスト245に含まれていないことを想定している。この場合、リカバリ制御部213は、このメモリシステム3に関連する異常終了前のデータをNVRAM24から削除する。削除されるデータは、サブミッションキュー243に格納されているライトコマンド(SQエントリ情報)、コンプリーションキュー244に格納されているコンプリーション、ロックデータリスト245、ポインタリスト246、およびデータバッファ242上に残されたユーザデータ71を含む。リカバリ制御部213は、リカバリ処理が完了した後にこれらのデータを作成しなおすことで、このメモリシステム3を仮想PLPドライブモードで使用することができる。リカバリ制御部213は、第1モード解除コマンドの発行をコマンド発行部211に要求する(図13中の(3))。そして、リカバリ制御部213は、NVRAM24に格納されているメモリシステム3の仮想PLPドライブID241を削除する(図13中の(4))。
コマンド発行部211は、リカバリ制御部213による要求に応じて、第1モード解除コマンドをメモリシステム3に送信する(図13中の(5))。
起動(あるいは再起動)されたメモリシステム3において、モード制御部122は、メモリシステム3に接続されているホスト2のホストIDが、NAND型フラッシュメモリ5に格納されている仮想PLPホストID51と一致しているか否かを判定する(図13中の(6))。また、モード制御部122は、NAND型フラッシュメモリ5に格納されている第1モード情報52を用いて、メモリシステム3が通常ドライブモードと仮想PLPドライブモードのいずれに設定されているかを判定する(図13中の(7))。前述した通り、図13に示す例では、メモリシステム3が仮想PLPドライブモードに設定されていることを想定している。
ホスト2のホストIDが、NAND型フラッシュメモリ5内の仮想PLPホストID51とは異なる場合、メモリシステム3は、ホスト2とは別のホストに対して仮想PLPドライブモードで動作していたと推定される。その場合、コマンド受付部121は、例えば、その別のホストからの第1モード解除コマンドを待つ。
ホスト2のホストIDが、NAND型フラッシュメモリ5内の仮想PLPホストID51と一致している場合、コマンド受付部121は、ホスト2から第1モード解除コマンドを受信する。コマンド受付部121は、受信した第1モード解除コマンドをモード制御部122に送出する(図13中の(8))。
モード制御部122は、コマンド受付部121から受け取った第1モード解除コマンドに応じて、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させる。そして、モード制御部122は、NAND型フラッシュメモリ5内の第1モード情報52を、通常ドライブモードを示すように更新する(図13中の(9))。また、モード制御部122は、第1モード解除コマンドに応じて、NAND型フラッシュメモリ5に格納されているホスト2の仮想PLPホストID51を削除する(図13中の(10))。
以上のアンバインド動作により、仮想PLPドライブモードで動作していたメモリシステム3が今回の起動の直前に異常終了した場合もしくは仮想PLPドライブモードで動作していたメモリシステム3が以前とは別のホスト2に接続された場合、または、ホスト2がNVRAM24に保持していた、メモリシステム3を仮想PLPドライブモードで動作させるために用いられていたデータ(より詳しくは、仮想PLPドライブID241、ロックデータリスト245)が失われた場合に、ホスト2はメモリシステム3を強制的に仮想PLPドライブモードから通常ドライブモードに戻すことができる。通常ドライブモードに遷移したメモリシステム3は、ホスト2とのバインド動作により、ホスト2に対して再度、仮想PLPドライブモードで動作し得る。あるいは、通常ドライブモードに遷移したメモリシステム3は、ホスト2とは別のホストとのバインド動作により、その別のホストに対して仮想PLPドライブモードで動作することもできる。なお、アンバインド動作は、メモリシステム3の起動時に限定されない任意のタイミングで行われてもよい。
(リカバリ動作)
図14は、情報処理システム1におけるリカバリ動作の例を示すブロック図である。ここでは、仮想PLPドライブモードで動作していたメモリシステム3が、今回の起動の直前に異常終了したか、あるいは意図せず再起動したことを想定する。この場合、メモリシステム3は、今回の起動後も仮想PLPドライブモードで動作している。また、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったメモリシステム3へのユーザデータの書き込みがあることを想定する。つまり、1回目のコンプリーションを受け取ったことを示すエントリがロックデータリスト245に含まれていることを想定する。
まず、ホスト2のリカバリ制御部213は、ホスト2に接続されているメモリシステム3のドライブIDが、NVRAM24に格納されている仮想PLPドライブID241と一致しているかどうかを判定する(図14中の(1))。
メモリシステム3のドライブIDが、NVRAM24内の仮想PLPドライブID241とは異なる場合、メモリシステム3は、ホスト2とは別のホストに対して仮想PLPドライブモードで動作していたと推定される。そのため、ホスト2は、メモリシステム3が通常ドライブモードに戻るまで、メモリシステム3にアクセスしない。メモリシステム3では、例えば、その別のホストとの間でリカバリ動作が行われる。
メモリシステム3のドライブIDが、NVRAM24内の仮想PLPドライブID241と一致している場合、リカバリ制御部213は、NVRAM24内のロックデータリスト245に、1回目のコンプリーションを受け取ったことを示すエントリが含まれているか否かを判定する(図14中の(2))。
前述した通り、図14に示す例では、1回目のコンプリーションを受け取ったことを示すエントリがロックデータリスト245に含まれていることを想定している。この場合、リカバリ制御部213は、第2モード遷移コマンドの発行をコマンド発行部211に要求する(図14中の(3))。また、リカバリ制御部213は、NVRAM24内に、サブミッションキュー243とコンプリーションキュー244とを新たに作成する。
コマンド発行部211は、リカバリ制御部213による要求に応じて、第2モード遷移コマンドを新たに作成されたサブミッションキュー243を介して、あるいは管理用コマンド専用のサブミッションキューを介してメモリシステム3に送信する(図14中の(4))。
起動されたメモリシステム3において、モード制御部122は、メモリシステム3に接続されているホスト2のホストIDが、NAND型フラッシュメモリ5に格納されている仮想PLPホストID51と一致しているか否かを判定する(図14中の(5))。また、モード制御部122は、NAND型フラッシュメモリ5に格納されている第1モード情報52を用いて、メモリシステム3が通常ドライブモードと仮想PLPドライブモードのいずれに設定されているかを判定する(図14中の(6))。前述した通り、図14に示す例では、メモリシステム3が仮想PLPドライブモードに設定されていることを想定している。
ホスト2のホストIDが、NAND型フラッシュメモリ5内の仮想PLPホストID51とは異なる場合、ホスト2が異常動作をしていると考えられるため、メモリシステム3は、ホスト2に対して、第2モード遷移コマンドがエラーを起こしたことを通知する。
ホスト2のホストIDが、NAND型フラッシュメモリ5内の仮想PLPホストID51と一致している場合、コマンド受付部121は、ホスト2に対して、第2モード遷移コマンドが正常完了し、メモリシステム3がリカバリ書き込みモードに遷移したことを通知する(図14中の(7))。コマンド受付部121は、受信した第2モード遷移コマンドをモード制御部122に送出する(図14中の(8))。
モード制御部122は、コマンド受付部121から受け取った第2モード遷移コマンドに応じて、メモリシステム3を通常書き込みモードからリカバリ書き込みモードに遷移させる。
図15は、図14に後続するリカバリ動作の例を示す。図15に示すリカバリ動作では、リカバリ書き込みモードに遷移したメモリシステム3に対して、異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みが、ホスト2によって再度要求される。
具体的には、ホスト2のリカバリ制御部213は、メモリシステム3の仮想PLPドライブID241に関連付けられたロックデータリスト245において、1回目のコンプリーションを受信したことをそれぞれ示すn個のエントリを特定する(図15中の(1))。nは1以上の整数である。
リカバリ制御部213は、特定されたn個のエントリそれぞれに含まれるコンプリーション順序を用いて、コンプリーション順序の昇順に、n個のエントリの1つを選択する。以下では、選択されたエントリを、対象エントリとも称する。図15に示す以降の動作では、n個のエントリが、コンプリーション順序の昇順に1つずつ、対象エントリとして用いられる。
リカバリ制御部213は、対象エントリに含まれるデータ領域管理情報を用いて、対応するデータバッファ242内のユーザデータ71をロックする(図15中の(2))。そして、リカバリ制御部213は、対象エントリに含まれるSQエントリ情報を用いて、対応するライトコマンドの発行をコマンド発行部211に要求する(図15中の(3))。
なお、リカバリ制御部213は、ロックデータリスト245に、1回目のコンプリーションを受け取っていないことを示すエントリがある場合、そのエントリを削除する。1回目のコンプリーションを受け取っていないことを示すエントリは、例えば、コンプリーション順序とコンプリーション状態を含んでいないエントリである。リカバリ制御部213は、1回目のコンプリーションを受け取っていないので、このエントリに対応するライトコマンドがメモリシステム3によって受け付けられていないと判断する。また、1回目のコンプリーションを受け取っていないので、このエントリに対応するユーザデータの書き込みを要求したアプリケーション等に対して、書き込みの完了が通知されていない。したがって、1回目のコンプリーションを受け取っていないことを示すエントリに対応するライトコマンドをメモリシステム3に再度送信する必要がない。そのため、リカバリ制御部213は、1回目のコンプリーションを受け取っていないことを示すエントリをロックデータリスト245から削除する。
コマンド発行部211は、リカバリ制御部213によるライトコマンドの発行の要求に応じて、対象エントリ内のSQエントリ情報に相当するライトコマンドを、サブミッションキュー243に格納する(図15中の(4))。
そして、リカバリ制御部213は、対象エントリにおいて、コンプリーション順序とコンプリーション状態とを削除する(図15中の(5))。これにより、対象エントリは、対応するライトコマンドがメモリシステム3に発行(送信)され、1回目のコンプリーションを受け取っていない状態であることを示す。
以降の図15中の(6)から(10)までの動作は、図6を参照して前述した書き込み動作の(5)から(9)までの動作と同様である。すなわち、メモリシステム3のコマンド受付部121およびライト制御部123は、サブミッションキュー243から取得したライトコマンドに基づきライト管理テーブル63を更新して、1回目のコンプリーションをコンプリーションキュー244に格納する。
そして、ホスト2のコマンド発行部211は、コンプリーションキュー244からライトコマンドに対する1回目のコンプリーションを取得する(図15中の(11))。コマンド発行部211は、取得された1回目のコンプリーションをリカバリ制御部213に送出する(図15中の(12))。
リカバリ制御部213は、コマンド発行部211から1回目のコンプリーションを受け取り、ロックデータリスト245において、受け取った1回目のコンプリーションに対応するエントリを更新する(図15中の(13))。具体的には、ライト管理部212は、受け取った1回目のコンプリーションに対応するエントリに、コンプリーションを受け取った順序を示すシーケンス番号と、1回目のコンプリーションを受け取り済みであることとを示す情報とを追加する。
以上の図15に示すリカバリ動作により、ホスト2は、ロックデータリスト245において、1回目のコンプリーションを受信したことをそれぞれ示すn個のエントリを用いて、コンプリーション順序の昇順に、対応するユーザデータの書き込みを要求するライトコマンドをメモリシステム3に再度送信できる。したがって、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって処理を完了できなかったライトコマンドの送信を、メモリシステム3によって受け付けられていた順序を考慮して再現できる。
メモリシステム3のライト制御部123は、メモリシステム3がリカバリ書き込みモードで動作しているので、ライトコマンドを受け付けた順に、対応するユーザデータの書き込みを行うことを保証する。
図16は、図15に後続するリカバリ動作の例を示す。
ホスト2のリカバリ制御部213は、n個の対象エントリにそれぞれ対応するn個のライトコマンド全てがメモリシステム3に送信された後、フラッシュコマンドの発行をコマンド発行部211に要求する(図16中の(1))。コマンド発行部211は、リカバリ制御部213による要求に応じて、フラッシュコマンドを発行し、サブミッションキュー243に格納する(図16中の(2))。
以降の図16中の(3)から(10)までの動作は、図11を参照して前述したシャットダウン動作の(3)から(10)までの動作と同様である。すなわち、メモリシステム3のコマンド受付部121およびライト制御部123は、サブミッションキュー243から取得したフラッシュコマンドに応じて、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータ71の書き込みを完了し、2回目のコンプリーションをコンプリーションキュー244に格納する。
次いで、ホスト2のコマンド発行部211は、コンプリーションキュー244から2回目のコンプリーションを取得する(図16中の(11))。そして、コマンド発行部211は、取得された2回目のコンプリーションをリカバリ制御部213に送出する(図16中の(12))。
リカバリ制御部213は、コマンド発行部211から2回目のコンプリーションを受け取り、受け取った2回目のコンプリーションに対応するデータバッファ242内のユーザデータ71のロックを解除する(図16中の(13))。そして、リカバリ制御部213は、受け取った2回目のコンプリーションに対応するエントリを、ロックデータリスト245から削除する(図16中の(14))。
ホスト2からメモリシステム3に送信された全てのライトコマンドに対して2回目のコンプリーションを受け取ったことにより、ロックデータリスト245内のエントリは全て削除される。つまり、ロックデータリスト245は空になる。リカバリ制御部213は、ロックデータリスト245内のエントリが全て削除されたことに基づいて、ホスト2からメモリシステム3に送信された全てのライトコマンドに対応するユーザデータ71の書き込みが完了したと判断する。そして、リカバリ制御部213は、全てのライトコマンドに対応するユーザデータの書き込みが完了したことを、コマンド発行部211に通知する(図16中の(15))。
コマンド発行部211は、リカバリ制御部213による通知に応じて、第2モード解除コマンドを、サブミッションキュー243を介してメモリシステム3に送信する(図16中の(16))。
メモリシステム3のコマンド受付部121は、ホスト2から第2モード解除コマンドを受信する。コマンド受付部121は、受信した第2モード解除コマンドをライト制御部123に送出する(図16中の(17))。
ライト制御部123は、第2モード解除コマンドに応じて、メモリシステム3をリカバリ書き込みモードから通常書き込みモードに遷移させる。なお、メモリシステム3の第1モードは、仮想PLPドライブモードのままである。
以上のリカバリ動作により、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みを完了できる。つまり、ホスト2は、発行したライトコマンドの処理状況を管理するロックデータリスト245を用いて、異常終了または意図せず再起動したメモリシステム3に対する未完了の書き込みを復旧できる。そして、ホスト2は、アプリケーションからの新規I/O要求の受け付けを開始できる。新規I/O要求は、メモリシステム3に対する新規のデータ読み出し要求またはデータ書き込み要求である。つまり、ホスト2は、受け付けた新規I/O要求に対応するリードコマンドやライトコマンドを、メモリシステム3に対して新たに発行可能になる。なお、メモリシステム3だけでなく、ホスト2が異常終了したかあるいは意図せず再起動した場合にも、ロックデータリスト245が不揮発に記憶されているので、同様のリカバリ動作を行うことができる。
また、図9を参照して前述した書き込み動作と同様に、ライト制御部123は、ライトコマンドを受け付けてから経過した時間が閾値を超えた場合に、受け付け済みのライトコマンドに対応するユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込んでもよい。その場合、ホスト2では、期待する時間内に2回目のコンプリーションを受け取ることができるので、リカバリ制御部213およびコマンド発行部211は、フラッシュコマンドをメモリシステム3に送信しなくてもよい。
なお、リカバリ制御部213およびコマンド発行部211は、ホスト2からメモリシステム3に送信された全てのライトコマンドに対して1回目のコンプリーションを受け取った時点で、第2モード解除コマンドをメモリシステム3に送信してもよい。つまり、リカバリ制御部213は、送信された全てのライトコマンドに対して1回目のコンプリーションを受信した場合に、メモリシステム3が異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みが復旧されたと判断し得る。その場合、リカバリ制御部213およびコマンド発行部211は、送信された全てのライトコマンドに対して1回目のコンプリーションを受信したことに応じて、第2モード解除コマンドを、サブミッションキュー243を介してメモリシステム3に送信し、アプリケーションからの新規I/O要求の受け付けを開始する。
次いで、図17から図30のフローチャートを参照して、ホスト2およびメモリシステム3において実行される処理の手順について説明する。
(ホスト2におけるバインド処理)
図17は、ホスト2のCPU21によって実行されるバインド処理の手順の例を示すフローチャートである。このバインド処理は、ホスト2に接続されているメモリシステム3を仮想PLPドライブモードで動作させる初期設定を行うための処理である。CPU21は、例えば、メモリシステム3がホスト2に接続された場合に、バインド処理を実行する。
まず、CPU21は、第1モード遷移コマンドをメモリシステム3に送信する(ステップS101)。第1モード遷移コマンドは、メモリシステム3を仮想PLPドライブモードに遷移させるためのコマンドである。第1モード遷移コマンドはホストIDを含む。
そして、CPU21は、第1モード遷移コマンドに対する応答をメモリシステム3から受信する(ステップS102)。受信した応答は、メモリシステム3が仮想PLPドライブモードに遷移したか否かを示す情報を含む。また、受信した応答は、メモリシステム3のドライブIDを含んでいてもよい。CPU21は、受信した応答に基づいて、メモリシステム3が仮想PLPドライブモードに遷移したか否かを判定する(ステップS103)。
メモリシステム3が仮想PLPドライブモードに遷移していない場合(ステップS103でNO)、CPU21はバインド処理を終了する。メモリシステム3は、例えば、ホスト2とは別のホストによるバインド処理によって仮想PLPドライブモードに既に遷移している場合、ホスト2からの第1モード遷移コマンドに対して、仮想PLPドライブモードに遷移しなかったことを示す応答をホスト2に返す。この場合、CPU21はバインド処理を終了する。
メモリシステム3が仮想PLPドライブモードに遷移した場合(ステップS103でYES)、CPU21は、メモリシステム3のドライブIDを仮想PLPドライブID241としてNVRAM24に格納する(ステップS104)。CPU21は、例えば、メモリシステム3から受信した応答に含まれるドライブIDをNVRAM24に格納する。あるいは、CPU21は、メモリシステム3との接続処理や認証処理で得られたドライブIDをNVRAM24に格納してもよい。そして、CPU21は、メモリシステム3のドライブIDに関連付けられたロックデータリスト245を生成して、NVRAM24に格納し(ステップS105)、バインド処理を終了する。
以上のバインド処理により、CPU21は、ホスト2に接続されているメモリシステム3を仮想PLPドライブモードで動作させる初期設定を行うことができる。具体的には、CPU21は、メモリシステム3が第1モード遷移コマンドに応じて仮想PLPドライブモードに遷移した場合、メモリシステム3に対応する仮想PLPドライブID241とロックデータリスト245とをNVRAM24に格納できる。
(メモリシステム3におけるバインド処理)
図18は、メモリシステム3のCPU12によって実行されるバインド処理の手順の例を示すフローチャートである。CPU12は、ホスト2から第1モード遷移コマンドを受信したことに応じて、このバインド処理を実行する。
まず、CPU12は、ホスト2から受信した第1モード遷移コマンドに含まれるホストIDを取得する(ステップS201)。第1モード遷移コマンドに含まれるホストIDを、第1ホストIDと称する。
CPU12は、第1ホストIDとは異なるホストIDがメモリシステム3に既に登録されているか否かを判定する(ステップS202)。具体的には、CPU12は、NAND型フラッシュメモリ5に、第1ホストIDとは異なるホストIDが仮想PLPホストID51として格納されているか否かを判定する。CPU12は、NAND型フラッシュメモリ5に第1ホストIDとは異なるホストIDが格納されている場合、第1ホストIDとは異なるホストIDがメモリシステム3に既に登録されていると判断する。また、CPU12は、NAND型フラッシュメモリ5にいずれのホストIDも格納されていない場合、およびNAND型フラッシュメモリ5に第1ホストIDが格納されている場合、第1ホストIDとは異なるホストIDがメモリシステム3に登録されていないと判断する。
第1ホストIDとは異なるホストIDがメモリシステム3に既に登録されている場合、CPU12は、ホスト2にエラーを通知し(ステップS203)、バインド処理を終了する。つまり、メモリシステム3が、登録されているホストIDを有する別のホストに対して、仮想PLPドライブモードで既に動作しているので、CPU12は、受信した第1モード遷移コマンドに応じて仮想PLPドライブモードに遷移できなかったことを、ホスト2に通知する。
また、第1ホストIDとは異なるホストIDがメモリシステム3に登録されていない場合、CPU12は、第1ホストIDをNAND型フラッシュメモリ5に格納する(ステップS204)。CPU12は、メモリシステム3を通常ドライブモードから仮想PLPドライブモードに遷移させる(ステップS205)。具体的には、CPU12は、NAND型フラッシュメモリ5内の、通常ドライブモードを示す第1モード情報52を、仮想PLPドライブモードを示す第1モード情報52に書き換える。そして、CPU12は、仮想PLPドライブモードに遷移したこと(モード遷移完了)を示す情報を含む応答をホスト2に送信する(ステップS206)。応答には、メモリシステム3のドライブIDがさらに含まれていてもよい。
以上のバインド処理により、メモリシステム3は、ホスト2から第1モード遷移コマンドを受信した場合に、別のホストに対して仮想PLPドライブモードで動作していないならば、通常ドライブモードから仮想PLPドライブモードに遷移できる。
(ホスト2におけるメモリシステム3へのユーザデータ書き込みのための処理)
図19は、ホスト2のCPU21によって実行される書き込み要求処理の手順の例を示すフローチャートである。書き込み要求処理は、ホスト2がメモリシステム3にユーザデータの書き込みを要求するための処理である。CPU21は、例えば、図17を参照して前述したバインド処理によって、メモリシステム3を仮想PLPドライブモードに遷移させた後に、書き込み要求処理を実行する。
まず、CPU21は、NAND型フラッシュメモリ5に書き込まれるべきユーザデータを、データバッファ242に格納する(ステップS301)。なお、CPU21は、NAND型フラッシュメモリ5に書き込まれるべきユーザデータがRAM22に格納されている場合、そのユーザデータをデータバッファ242にコピーしてもよい。そして、CPU21は、データバッファ242に格納されたユーザデータをロックする(ステップS302)。より詳しくは、CPU21は、実行しているOS221の機能を用いて、ドライバ222によって使用されるユーザデータが格納されている記憶領域(例えば、ページ)の状態をロックする。これにより、ユーザデータが格納されている記憶領域が意図せず解放されることを防ぐ。
CPU21は、データバッファ242に格納されたユーザデータをNAND型フラッシュメモリ5に書き込むためのライトコマンド(以下、第1ライトコマンドと称する)を発行する(ステップS303)。
次いで、CPU21は、第1ライトコマンドに対応するエントリをロックデータリスト245に追加する(ステップS304)。追加されたエントリは、例えば、第1ライトコマンドに対応するSQエントリ情報とデータ領域管理情報とを含む。第1ライトコマンドに対応するSQエントリ情報は、第1ライトコマンドを表す情報である。より具体的には、第1ライトコマンドに対応するSQエントリ情報は、メモリシステム3に第1ライトコマンドに応じた処理を実行させるために、サブミッションキュー243に格納される情報である。また、第1ライトコマンドに対応するデータ領域管理情報は、第1ライトコマンドに対応するユーザデータが格納されたデータバッファ242内の記憶領域を特定可能な情報である。
そして、CPU21は、第1ライトコマンド(すなわち、第1ライトコマンドを表すSQエントリ情報)をサブミッションキュー243に格納する(ステップS305)。
なお、CPU21は、第1ライトコマンドをサブミッションキュー243に格納するステップS305の手順の後に、第1ライトコマンドに対応するエントリをロックデータリスト245に追加するステップS304の手順を実行してもよい。また、CPU21は、ステップS304の手順とステップS305の手順とを並列に実行してもよい。
以上の書き込み要求処理により、CPU21は、データバッファ242に格納されたユーザデータの書き込みを、メモリシステム3に要求できる。また、CPU21は、メモリシステム3に要求した書き込みに関する情報(すなわち、発行したライトコマンドに関する情報)を、ロックデータリスト245を用いて管理できる。
(メモリシステム3におけるユーザデータ書き込みのための処理)
図20は、メモリシステム3のCPU12によって実行される書き込み制御処理の手順の例を示すフローチャートである。書き込み制御処理は、ホスト2によって発行されたライトコマンドを受け付け、受け付け済みのライトコマンドに対応するユーザデータの書き込みを制御するための処理である。ここでは、説明を分かりやすくするために、CPU12がホスト2のサブミッションキュー243から受け付けるコマンドが、ライトコマンドのみである場合を例示する。
まず、CPU12は、サブミッションキュー243からライトコマンド(以下、第2ライトコマンドと称する)を取得する(ステップS401)。CPU12は、第2ライトコマンドに基づいてライト管理テーブル63を更新する(ステップS402)。具体的には、CPU12は、第2ライトコマンドから、例えば、コマンドID、LBA、データ長、およびデータポインタを取得する。CPU12は、取得されたコマンドID、LBA、データ長、およびデータポインタを示すエントリを、ライト管理テーブル63に追加する。
そして、CPU12は、第2ライトコマンドに対する1回目のコンプリーションをコンプリーションキュー244に格納する(ステップS403)。第2ライトコマンドに対する1回目のコンプリーションは、第2ライトコマンドのコマンドIDを含む。
次いで、CPU12は、ホスト2のデータバッファ242に格納されている未書き込みのユーザデータの総量が書き込み単位に達したか否かを判定する(ステップS404)。CPU12は、ライト管理テーブル63を用いて、データバッファ242に格納されている未書き込みのユーザデータの総量を取得する。
データバッファ242に格納されている未書き込みのユーザデータの総量が書き込み単位に達していない場合(ステップS404でNO)、CPU12による処理はステップS401に戻る。つまり、CPU12は、新たなライトコマンドを受け付けるための処理を続行する。
データバッファ242に格納されている未書き込みのユーザデータの総量が書き込み単位に達した場合(ステップS404でYES)、CPU12は、ホスト2のデータバッファ242からメモリシステム3のNAND型フラッシュメモリ5に、書き込み単位のユーザデータを転送する(ステップS405)。CPU12は、転送されたユーザデータをNAND型フラッシュメモリ5に書き込む(ステップS406)。
次いで、CPU12は、対応するユーザデータがNAND型フラッシュメモリ5から読み出し可能になったライトコマンドがあるか否かを判定する(ステップS407)。対応するユーザデータが読み出し可能になったライトコマンドがない場合(ステップS407でNO)、CPU12による処理はステップS407に戻る。つまり、ライトコマンドに応じたユーザデータの書き込みが完了したことを示す2回目のコンプリーションをまだホスト2に通知できないので、CPU12による処理がステップS407に戻る。
対応するユーザデータが読み出し可能になったライトコマンドがある場合(ステップS407でYES)、CPU12は、このライトコマンドに対する2回目のコンプリーションをコンプリーションキュー244に格納する(ステップS408)。以下では、対応するユーザデータが読み出し可能になったライトコマンドを、対象ライトコマンドと称する。対象ライトコマンドに対する2回目のコンプリーションは、対象ライトコマンドのコマンドIDを含む。そして、CPU12はライト管理テーブル63を更新する(ステップS409)。具体的には、CPU12は、対象ライトコマンドに対応するエントリを、ライト管理テーブル63から削除する。また、CPU12は、対象ライトコマンドのコマンドIDを追加するようにコマンドログ53を更新する(ステップS410)。
次いで、CPU12は、ステップS406で書き込んだ書き込み単位のユーザデータに対応する全てのライトコマンドに対して2回目のコンプリーションをコンプリーションキュー244に格納したか否かを判定する(ステップS411)。書き込み単位のユーザデータに対応する少なくとも1つのライトコマンドに対して2回目のコンプリーションをコンプリーションキュー244に格納していない場合(ステップS411でNO)、CPU12による処理はステップS407に戻る。
一方、書き込み単位のユーザデータに対応する全てのライトコマンドに対して2回目のコンプリーションをコンプリーションキュー244に格納した場合(ステップS411でYES)、CPU12による処理はステップS401に戻る。つまり、CPU12は、ホスト2から新たなライトコマンドを受け付け、受け付け済みのライトコマンドに対応するユーザデータの書き込みを制御するための処理を続行する。
以上の書き込み制御処理により、CPU12は、ホスト2からライトコマンドを受け付け、受け付け済みのライトコマンドに対応するユーザデータの書き込みを制御できる。具体的には、CPU12は、ホスト2からライトコマンドを受け付けた場合に、1回目のコンプリーションをホスト2に返す。また、CPU12は、書き込み単位のユーザデータがデータバッファ242に格納されている場合、その書き込み単位のユーザデータをNAND型フラッシュメモリ5に書き込む。そして、CPU12は、書き込みが完了したユーザデータに対応するライトコマンドに対する2回目のコンプリーションをホスト2に返す。
したがって、CPU12は、1回目のコンプリーションと2回目のコンプリーションとをホスト2に返すことで、ライトコマンドの処理状態をホスト2に通知できる。また、CPU12は、Delayed Write Completionによる書き込みにより、NAND型フラッシュメモリ5の記憶領域を効率的に利用できる。
なお、CPU12は、ステップS404における、ホスト2のデータバッファ242に格納されている未書き込みのユーザデータの総量が書き込み単位に達した場合だけでなく、ライトコマンドを受け付けてから経過した時間が閾値を超えた場合に、受け付け済みのライトコマンドに対応するユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込んでもよい。具体的には、CPU12は、ライトコマンドを受け付けてから経過した時間が閾値を超えた場合に、受け付け済みのライトコマンドに対応するユーザデータを、ホスト2のデータバッファ242からNAND型フラッシュメモリ5に転送する。そして、CPU12は、転送されたユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込む。これにより、CPU12は、ホスト2によって期待される時間内に、ライトコマンドに対する2回目のコンプリーションを通知し得る。
(ホスト2におけるメモリシステム3からの応答に基づく処理)
図21は、ホスト2のCPU21によって実行される応答受信処理の手順の例を示すフローチャートである。応答受信処理は、メモリシステム3から受信した応答(コンプリーション)に基づく処理である。CPU21は、メモリシステム3によって発行された割り込みを受信したことに応じて、応答受信処理を実行する。
まず、CPU21は、コンプリーションキュー244からコンプリーションを取得する(ステップS501)。CPU21は、取得されたコンプリーションに含まれるコマンドIDを取得する(ステップS502)。そして、CPU21は、ロックデータリスト245において、取得されたコマンドIDに対応するエントリを特定する(ステップS503)。
CPU21は、特定されたエントリを用いて、受け取ったコンプリーションが1回目のコンプリーションであるか否かを判定する(ステップS504)。具体的には、CPU21は、例えば、特定されたエントリ内のコンプリーション状態として、いずれの値も設定されていない場合、受け取ったコンプリーションが1回目のコンプリーションであると判断する。また、CPU21は、特定されたエントリ内のコンプリーション状態として、1回目のコンプリーションが受け取り済みであることを示す値が設定されている場合、受け取ったコンプリーションが2回目のコンプリーションであると判断する。
受け取ったコンプリーションが1回目のコンプリーションである場合(ステップS504でYES)、CPU21は、コンプリーションに対するシーケンス番号の割り当てに用いられる変数Cseqに1を加算する(すなわちインクリメントする)(ステップS505)。そして、CPU21は、変数Cseqを用いて、特定されたエントリを更新し(ステップS506)、応答受信処理を終了する。具体的には、CPU21は、特定されたエントリ内のコンプリーション順序として、変数Cseqで示されるシーケンス番号を追加(設定)する。これにより、受信したコンプリーションに対して、変数Cseqで示されるシーケンス番号が割り当てられる。また、CPU21は、特定されたエントリ内のコンプリーション状態として、1回目のコンプリーションが受け取り済みであることを示す値を追加する。
受信したコンプリーションが2回目のコンプリーションである場合(ステップS504でNO)、CPU21は、取得されたコマンドIDに関連付けられたデータバッファ242内のユーザデータのロックを解除する(ステップS507)。アプリケーションまたはOS221は、データバッファ242のロックが解除された後、ユーザデータ71を削除する。CPU21は、例えば、特定されたエントリ内のデータ管理領域情報を用いて、ロックを解除すべきデータバッファ242内のユーザデータを特定可能である。ユーザデータのロックが解除された場合、そのユーザデータは削除される。すなわち、そのユーザデータが格納されているデータバッファ242内の記憶領域(すなわち、NVRAM24内の記憶領域)は解放される。そして、CPU21は、特定されたエントリをロックデータリスト245から削除し(ステップS508)、応答受信処理を終了する。
以上の応答受信処理により、CPU21は、受信したコンプリーションが、対応するライトコマンドに対する1回目のコンプリーションであるか、それとも2回目のコンプリーションであるかに応じて、異なる処理を行うことができる。すなわち、受信したコンプリーションが1回目のコンプリーションである場合、CPU21は、対応するロックデータリスト245内のエントリに、そのコンプリーションに割り当てられたシーケンス番号Cseqと、1回目のコンプリーションを受け取り済みであることを示す情報を追加する。また、受信したコンプリーションが2回目のコンプリーションである場合、CPU21は、対応するユーザデータ(すなわち、書き込みが完了したユーザデータ)と、対応するロックデータリスト245内のエントリとをNVRAM24から削除する。
次いで、図22および図23を参照して、アンバインド処理について説明する。アンバインド処理は、メモリシステム3を強制的に仮想PLPドライブモードから通常ドライブモードに遷移させるための処理である。ここでは、メモリシステム3が、ホスト2に対して、仮想PLPドライブモードで動作していることを想定する。仮想PLPドライブモードで動作しているメモリシステム3において、NAND型フラッシュメモリ5には、ホスト2のホストIDと、仮想PLPドライブモードを示す第1モード情報52とが格納されている。
(ホスト2におけるアンバインド処理)
図22は、ホスト2のCPU21によって実行されるアンバインド処理の手順の例を示すフローチャートである。CPU21は、ホスト2またはメモリシステム3が異常終了した後に起動した場合に、あるいはメモリシステム3が意図せず再起動した場合に、アンバインド処理を実行し得る。
まず、CPU21は第1モード解除コマンドをメモリシステム3に送信する(ステップS601)。第1モード解除コマンドは、仮想PLPドライブモードから通常ドライブモードに遷移することを要求するコマンドである。そして、CPU21は、NVRAM24から仮想PLPドライブID241を削除する(ステップS602)。なお、CPU21は、通常ドライブモードへの遷移が完了したことを示す応答をメモリシステム3から受信した場合に、NVRAM24から仮想PLPドライブID241を削除してもよい。
以上のアンバインド処理により、CPU21は、仮想PLPドライブモードで動作しているメモリシステム3を、通常ドライブモードに遷移させることができる。
(メモリシステム3におけるアンバインド処理)
図23は、メモリシステム3のCPU12によって実行されるアンバインド処理の手順の例を示すフローチャートである。CPU12は、ホスト2から第1モード解除コマンドを受信したことに応じて、アンバインド処理を実行する。
CPU12は、ホスト2から受信した第1モード解除コマンドに基づいて、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させる(ステップS701)。より詳しくは、CPU12は、NAND型フラッシュメモリ5に格納されている第1モード情報52を、通常ドライブモードを示すように更新する。そして、CPU12は、NAND型フラッシュメモリ5から仮想PLPホストID51を削除する(ステップS702)。
以上のアンバインド処理により、CPU12は、ホスト2から受信した第1モード解除コマンドに基づいて、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させることができる。
次いで、図24および図25を参照して、メモリシステム3の動作が正常に終了する場合のシャットダウン処理について説明する。
(ホスト2におけるシャットダウン処理)
図24は、ホスト2のCPU21によって実行されるシャットダウン処理の手順の例を示すフローチャートである。CPU21は、メモリシステム3に動作の終了を要求する前に、シャットダウン処理を実行する。
まず、CPU21は、フラッシュコマンドをサブミッションキュー243に格納する(ステップS801)。
次いで、CPU21は応答受信処理を実行する(ステップS802)。応答受信処理の具体的な手順については、図21を参照して前述した通りである。そして、CPU21は、ロックデータリスト245を用いて、発行した全てのライトコマンドに対して2回目のコンプリーションを受け取ったか否かを判定する(ステップS803)。CPU21は、ロックデータリスト245にエントリが1つも含まれていない場合、発行した全てのライトコマンドに対して2回目のコンプリーションを受け取ったと判断する。CPU21は、ロックデータリスト245に少なくとも1つのエントリが含まれている場合、発行したライトコマンドの内、少なくとも1つのライトコマンドに対して2回目のコンプリーションを受け取っていないと判断する。
発行したライトコマンドの内、少なくとも1つのコマンドに対して2回目のコンプリーションを受け取っていない場合(ステップS803でNO)、CPU21による処理は、ステップS802に戻る。つまり、CPU21は、発行したライトコマンドに対するコンプリーションをメモリシステム3から受信するための処理を続行する。
発行した全てのライトコマンドに対して2回目のコンプリーションを受け取った場合(ステップS803でYES)、CPU21は、仮想PLPドライブID241とロックデータリスト245をNVRAM24から削除する(ステップS804)。そして、CPU21は、シャットダウン命令をメモリシステム3に送信する(ステップS805)。
以上のシャットダウン処理により、CPU21は、メモリシステム3に対して発行した全てのライトコマンドに対する2回目のコンプリーションを受け取った後に、メモリシステム3にシャットダウン命令を送信できる。つまり、CPU21は、全てのライトコマンドに対応するユーザデータの書き込みを完了する前にメモリシステム3が動作を終了しないように(すなわち、異常終了しないように)、制御できる。
(メモリシステム3におけるシャットダウン処理)
図25は、メモリシステム3のCPU12によって実行されるシャットダウン処理の手順の例を示すフローチャートである。CPU12は、ホスト2による要求(より詳しくは、フラッシュコマンド、シャットダウン命令等)に従って、シャットダウン処理を実行する。
まず、CPU12は、サブミッションキュー243からフラッシュコマンドを取得する(ステップS901)。CPU12は、取得されたフラッシュコマンドに応じて、ホスト2のデータバッファ242からメモリシステム3のNAND型フラッシュメモリ5に、受付済みのライトコマンドに対応する未書き込みのユーザデータを転送する(ステップS902)。CPU12は、転送されたユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込む(ステップS903)。
後続するステップS904からステップS908までの手順は、図20を参照して前述した書き込み制御処理のS407からS411までの手順と同様である。すなわち、CPU12は、書き込んだユーザデータに対応する全てのライトコマンドに対する2回目のコンプリーションをコンプリーションキュー244に格納するための処理を行う。
そして、書き込んだユーザデータに対応する全てのライトコマンドに対する2回目のコンプリーションをコンプリーションキュー244に格納した場合(ステップS908でYES)、CPU12はホスト2からシャットダウン命令を受信する(ステップS909)。CPU12は、シャットダウン命令に基づいて、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させる(ステップS910)。より詳しくは、CPU12は、NAND型フラッシュメモリ5に格納されている第1モード情報52を、通常ドライブモードを示すように更新する。また、CPU12は、NAND型フラッシュメモリ5に格納されている仮想PLPホストID51を削除する(ステップS911)。そして、CPU12はメモリシステム3の動作を終了する(ステップS912)。
以上のシャットダウン処理により、CPU12は、ホスト2から受信したフラッシュコマンドに応じて、メモリシステム3に対して発行された全てのライトコマンドに対応するユーザデータの書き込みが完了できる。そして、CPU12は、それら全てのライトコマンドに対する2回目のコンプリーションをコンプリーションキュー244に格納した後に、メモリシステム3の動作を終了できる。つまり、CPU12は、全てのライトコマンドに対応するユーザデータの書き込みを完了する前にメモリシステム3の動作が終了しないように(すなわち、異常終了しないように)、メモリシステム3を制御できる。
なお、前述した通り、CPU12は、ライトコマンドを受け付けてから経過した時間が閾値を超えた場合に、受け付け済みのライトコマンドに対応するユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込んでもよい。この場合、CPU12は、ホスト2によって期待される時間内に、ライトコマンドに対する2回目のコンプリーションを通知するので、ホスト2のCPU21は、シャットダウン処理においてフラッシュコマンドをサブミッションキュー243に格納する手順(図24のステップS801に相当)を行わなくてもよい。
次いで、図26から図28を参照して、起動処理について説明する。起動処理は、メモリシステム3が今回の起動の直前に異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みの有無を判断して、完了できなかったユーザデータの書き込みを復旧するための処理である。
(ホスト2における起動処理)
図26は、ホスト2のCPU21によって実行される起動処理の手順の例を示すフローチャートである。CPU21は、メモリシステム3が起動されて、ホスト2に接続された場合に、起動処理を実行する。
CPU21は、NVRAM24に仮想PLPドライブID241が格納されている否かを判定する(ステップS1001)。例えば、メモリシステム3が今回の起動の直前に異常終了していた場合、およびメモリシステム3が意図せず再起動した場合、NVRAM24には仮想PLPドライブID241が格納されている可能性がある。
NVRAM24に仮想PLPドライブID241が格納されていない場合(ステップS1001でNO)、CPU21は、NVRAM24にサブミッションキュー243とコンプリーションキュー244とを作成する(ステップS1002)。つまり、CPU21は、サブミッションキュー243およびコンプリーションキュー244それぞれとして、NVRAM24内の記憶領域を割り当てる。そして、CPU21はアプリケーションからの新規I/O要求の受け付けを開始し(ステップS1003)、起動処理を終了する。
NVRAM24に仮想PLPドライブID241が格納されている場合(ステップS1001でYES)、CPU21は、ホスト2に接続されているメモリシステム3のドライブIDを取得する(ステップS1004)。CPU21は、取得されたドライブIDと、NVRAM24に格納されている仮想PLPドライブID241とが一致しているか否かを判定する(ステップS1005)。
取得されたドライブIDが、NVRAM24に格納されている仮想PLPドライブID241とは異なる場合(ステップS1005でNO)、CPU21は起動処理を終了する。つまり、接続されたメモリシステム3は、ホスト2に対して仮想PLPドライブモードで動作させているメモリシステムとは異なるので、CPU21は起動処理を終了する。なお、ホスト2とメモリシステム3とにおいて、図17および図18を参照して前述したバインド処理が行われてもよい。その場合、メモリシステム3を、ホスト2に対して新たに仮想PLPドライブモードで動作させることができる。
取得されたドライブIDと、NVRAM24に格納されている仮想PLPドライブID241とが一致している場合(ステップS1005でYES)、CPU21は、取得されたドライブIDに関連付けられたロックデータリスト245に、1回目のコンプリーションを受け取ったことを示すエントリがあるか否かを判定する(ステップS1006)。
ロックデータリスト245に1回目のコンプリーションを受け取ったことを示すエントリがない場合(ステップS1006でNO)、CPU21は、NVRAM24にサブミッションキュー243とコンプリーションキュー244とを作成する(ステップS1002)。そして、CPU21は、アプリケーションからの新規I/O要求の受け付けを開始し(ステップS1003)、起動処理を終了する。
ロックデータリスト245に1回目のコンプリーションを受け取ったことを示すエントリがある場合(ステップS1006でYES)、CPU21は、NVRAM24にサブミッションキュー243とコンプリーションキュー244とを作成する(ステップS1007)。CPU21は、第2モード遷移コマンドをメモリシステム3に送信する(ステップS1008)。第2モード遷移コマンドは、メモリシステム3を、通常書き込みモードからリカバリ書き込みモードに遷移させるためのコマンドである。そして、CPU21はリカバリ書き込み要求処理を実行する(ステップS1009)。リカバリ書き込み要求処理は、1回目のコンプリーションを受け取ったことを示す1つ以上のロックデータリスト245のエントリそれぞれに対応するユーザデータの書き込みを、メモリシステム3に要求するための処理である。より詳しくは、リカバリ書き込み要求処理では、1回目のコンプリーションを受け取ったことを示す1つ以上のロックデータリスト245のエントリそれぞれに対応するライトコマンドがサブミッションキュー243に格納される。リカバリ書き込み要求処理の具体的な手順については、図27を参照して後述する。
次いで、CPU21は応答受信処理を実行する(ステップS1010)。応答受信処理では、メモリシステム3から受信したライトコマンドに対する1回目のコンプリーションまたは2回目のコンプリーションに応じた処理が行われる。応答受信処理の具体的な手順については、図21を参照して前述した通りである。
そして、CPU21は、発行した全てのライトコマンドに対して2回目のコンプリーションを受け取ったか否かを判定する(ステップS1011)。発行した全てのライトコマンドは、ステップS1009のリカバリ書き込み要求処理で発行した全てのライトコマンドである。
発行した全てのライトコマンドの内、少なくとも1つのライトコマンドに対して2回目のコンプリーションを受け取っていない場合(ステップS1011でNO)、CPU21による処理はステップS1010に戻る。つまり、CPU21は、発行したライトコマンドに対するコンプリーションをメモリシステム3から受信するための処理を続行する。
発行した全てのライトコマンドに対して2回目のコンプリーションを受け取った場合(ステップS1011でYES)、CPU21は、第2モード解除コマンドをメモリシステム3に送信する(ステップS1012)。第2モード解除コマンドは、メモリシステムを、リカバリ書き込みモードから通常書き込みモードに遷移させるためのコマンドである。そして、CPU21はアプリケーションからの新規I/O要求の受け付けを開始し(ステップS1013)、起動処理を終了する。
以上の起動処理により、CPU21は、メモリシステム3が今回の起動の直前に異常終了したことによって、あるいはメモリシステム3が意図せず再起動したことによって、メモリシステム3のNAND型フラッシュメモリ5への書き込みが未完了となったユーザデータの書き込みを、メモリシステム3に再度要求できる。より詳しくは、CPU21は、ロックデータリスト245内の1回目のコンプリーションを受け取ったことを示すエントリに基づいて、ライトコマンドを発行して、サブミッションキュー243に格納する。これにより、CPU21は、ユーザデータの書き込みをメモリシステム3に要求できる。
なお、CPU21は、ステップS1011において、発行した全てのライトコマンドに対して2回目のコンプリーションを受け取ったか否かを判定する代わりに、発行した全てのライトコマンドに対して1回目のコンプリーションを受け取ったか否かを判定してもよい。CPU21は、発行した全てのライトコマンドに対して1回目のコンプリーションを受け取った場合に、メモリシステム3が今回の起動の直前に異常終了したか、あるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みを復旧したと判断し得る。その場合、CPU21は、発行した全てのライトコマンドに対して1回目のコンプリーションを受け取ったことに応じて、第2モード解除コマンドをメモリシステム3に送信し、アプリケーションからの新規I/O要求の受け付けを開始する。
図27は、ホスト2のCPU21によって実行されるリカバリ書き込み要求処理の手順の例を示すフローチャートである。リカバリ書き込み要求処理は、図26を参照して前述した起動処理のステップS1009に相当する。
まず、CPU21は、ロックデータリスト245から、1回目のコンプリーションを受け取り済みであることをそれぞれ示すn個のエントリを、コンプリーション順序の昇順に取得する(ステップS1101)。nは1以上の整数である。そして、CPU21は変数iに1を設定する(ステップS1102)。変数iは、コンプリーション順序の昇順に並べられたn個のエントリの1つを特定するために用いられる。以下では、コンプリーション順序の昇順に並べられたn個のエントリの内のi番目のエントリを、第iエントリと称する。
CPU21は、第iエントリのデータ領域管理情報を用いて、対応するデータバッファ242内のユーザデータをロックする(ステップS1103)。より詳しくは、CPU21は、第iエントリのデータ領域管理情報を用いて、ユーザデータが格納されているデータバッファ242内の記憶領域を特定する。そして、CPU21は、実行しているOS221の機能を用いて、特定された記憶領域をロックする。
次いで、CPU21は、第iエントリのSQエントリ情報に基づくライトコマンド(以下、第iライトコマンドと称する)を発行する(ステップS1104)。CPU21は、第iライトコマンドをサブミッションキュー243に格納する(ステップS1105)。CPU21は、第iエントリにおいて、コンプリーション順序およびコンプリーション状態それぞれとして設定されている値を削除する(ステップS1106)。つまり、CPU21は、第iエントリを、対応するライトコマンドが発行された後、1回目のコンプリーションをまだ受け取っていないことを示すように更新する。そして、CPU21は変数iに1を加算する(ステップS1107)。
次いで、CPU21は、変数iがn以下であるか否かを判定する(ステップS1108)。変数iがn以下である場合(ステップS1108でYES)、CPU21による処理はステップS1103に戻る。つまり、CPU21は、1回目のコンプリーションを受け取ったことを示す別のエントリに基づくライトコマンドをメモリシステム3に送信するための処理をさらに行う。
変数iがnを超えた場合(ステップS1108でNO)、CPU21はリカバリ書き込み要求処理を終了する。
以上のリカバリ書き込み要求処理により、メモリシステム3が今回の起動の直前に異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みを、CPU21はメモリシステム3に要求できる。具体的には、CPU21は、ロックデータリスト245を用いて、1回目のコンプリーションを受け取り済みであることを示すn個のエントリそれぞれに対応するライトコマンドを、サブミッションキュー243を介してメモリシステム3に送信できる。
(メモリシステム3における起動処理)
図28は、メモリシステム3のCPU12によって実行される起動処理の手順の例を示すフローチャートである。CPU12は、メモリシステム3が起動され、ホスト2との接続が確立された場合に、起動処理を実行する。
まず、CPU12は、ホスト2にドライブIDを通知する(ステップS1201)。ドライブIDは、メモリシステム3とホストとの接続を確立するための処理において、ホスト2に通知されてもよい。
次いで、CPU12は、NAND型フラッシュメモリ5に格納されている第1モード情報52を取得する(ステップS1202)。第1モード情報52は、メモリシステム3が、通常ドライブモードと仮想PLPドライブモードのいずれであるかを示す。CPU12は、取得された第1モード情報52が仮想PLPドライブモードを示しているか否かを判定する(ステップS1203)。
取得された第1モード情報52が仮想PLPドライブモードを示していない場合(ステップS1203でNO)、すなわち通常ドライブモードを示している場合、CPU12は起動処理を終了する。第1モード情報52が通常ドライブモードを示している場合、メモリシステム3が今回の起動の直前に異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みがないと、CPU12は判断する。したがって、CPU12は起動処理を終了して、ホスト2によるメモリシステム3へのアクセスを受け付ける。
取得された第1モード情報52が仮想PLPドライブモードを示す場合(ステップS1203でYES)、CPU12は、ホスト2から第1モード解除コマンドを受信したか否かを判定する(ステップS1204)。第1モード解除コマンドは、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させるためのコマンドである。
ホスト2から第1モード解除コマンドを受信した場合(ステップS1204でYES)、CPU12は、メモリシステム3を仮想PLPドライブモードから通常ドライブモードに遷移させる(ステップS1205)。そして、CPU12は、NAND型フラッシュメモリ5に格納されている仮想PLPホストID51を削除し(ステップS1206)、起動処理を終了する。これにより、通常ドライブモードに遷移したメモリシステム3において、CPU12はホスト2によるメモリシステム3へのアクセスを受け付ける。
ホスト2から第1モード解除コマンドを受信していない場合(ステップS1204でNO)、CPU12は、ホスト2から第2モード遷移コマンドを受信したか否かを判定する(ステップS1207)。第2モード遷移コマンドは、メモリシステム3を通常書き込みモードからリカバリ書き込みモードに遷移させるためのコマンドである。メモリシステム3がリカバリ書き込みモードに遷移した場合、CPU12は、ホスト2から受け付けたライトコマンド(すなわち、サブミッションキュー243から取得したライトコマンド)を、受け付けた順に処理する。つまり、CPU12は、受け付け順に、ライトコマンドに応じた書き込み処理を実行することを保証する。
ホスト2から第2モード遷移コマンドを受信していない場合(ステップS1207でNO)、CPU12は起動処理を終了する。例えば、メモリシステム3が今回の起動の直前に異常終了したか、あるいは意図せず再起動したものの、NAND型フラッシュメモリ5への書き込みが未完了となったユーザデータがなかった場合、CPU12は起動処理を終了する。したがって、仮想PLPドライブモードで動作するメモリシステム3において、CPU12はホスト2によるメモリシステム3へのアクセスを受け付ける。
ホスト2から第2モード遷移コマンドを受信した場合(ステップS1207でYES)、CPU12は、メモリシステム3を通常書き込みモードからリカバリ書き込みモードに遷移させる(ステップS1208)。そして、CPU12は書き込み制御処理を実行する(ステップS1209)。CPU12は、書き込み制御処理において、ホスト2からライトコマンドを受け付け、受け付け済みのライトコマンドに対応するユーザデータの書き込みを制御する。書き込み制御処理の具体的な手順については、図20を参照して前述した通りである。
次いで、CPU12は、ホスト2から第2モード解除コマンドを受信したか否かを判定する(ステップS1210)。
ホスト2から第2モード解除コマンドを受信していない場合(ステップS1210でNO)、CPU12による処理はステップ1209に戻る。つまり、CPU21は、ホスト2から第2モード解除コマンドを受信するまで、書き込み制御処理を続行する。
ホスト2から第2モード解除コマンドを受信した場合(ステップS1210でYES)、CPU12は、メモリシステム3を、リカバリ書き込みモードから通常書き込みモードに遷移させ(ステップS1211)、起動処理を終了する。これにより、通常書き込みモードに遷移したメモリシステム3において、CPU12はホスト2によるメモリシステム3へのアクセスを受け付ける。
以上の起動処理により、メモリシステム3が今回の起動の直前に異常終了したかあるいは意図せず再起動したことによって完了できなかったユーザデータの書き込みがある場合に、CPU12は完了できなかったユーザデータの書き込みを復旧できる。
ここで、メモリシステム3にリカバリ書き込みモードで動作するための構成が設けられていない場合のリカバリ書き込み要求処理および書き込み制御処理について説明する。この場合、メモリシステム3では、ホスト2から複数のライトコマンドを受け付けた場合に、ライトコマンドに応じた書き込み処理を受け付け順に実行することを保証できない可能性がある。
そのため、ホスト2は、指定されるLBA(またはLBA範囲)が重複する複数のライトコマンドをメモリシステム3に送信する場合、例えば、それら複数のライトコマンドの1つをサブミッションキュー243に格納した直後に、フラッシュコマンドをサブミッションキュー243に格納する。具体的には、ホスト2は、フラッシュコマンドに対するコンプリーションを受信した後、次のライトコマンドをサブミッションキュー243に格納するという動作を繰り返す。メモリシステム3は、フラッシュコマンドのコンプリーションを返した順に、フラッシュコマンドを受信する前に受信していたライトコマンドのデータをNAND型フラッシュメモリ5に書き込む処理を行う。これにより、メモリシステム3では、同一のLBAを指定する複数のライトコマンドそれぞれに対応する書き込み処理を、ライトコマンドの受け付け順に実行することを保証できる。
本実施形態に係るメモリシステム3は、リカバリ書き込みモードをサポートしているため、ホスト2は、サブミッションキュー243に処理したい順番にライトコマンドを積むだけで、高速にリカバリ処理を行うことができる。
図29は、ホスト2のCPU21によって実行される、フラッシュコマンドが用いられる場合のリカバリ書き込み要求処理の手順の例を示すフローチャートである。ステップS1301からステップS1305までの手順は、図27を参照して前述したリカバリ書き込み要求処理のステップS1101からステップS1105までの手順と同様である。すなわち、CPU21は、ロックデータリスト245から、1回目のコンプリーションを受け取り済みであることをそれぞれ示すn個のエントリを、コンプリーション順序の昇順に取得する。CPU21は、第iエントリに基づいて、対応するデータバッファ242内のユーザデータをロックし、対応するライトコマンド(第iライトコマンド)を発行してサブミッションキュー243に格納する。
次いで、CPU21は、n個のエントリを用いて、第iライトコマンドの後に、指定されるLBA(またはLBA範囲)が第iライトコマンドと重複する別のライトコマンドが発行されるか否かを判定する(ステップS1306)。具体的には、CPU21は、例えば、第iエントリのコンプリーション順序よりも大きいコンプリーション順序を含み、且つ第iライトコマンドと同じLBAを指定するライトコマンドに対応するSQエントリ情報を含むエントリが、n個のエントリに含まれているか否かを判定する。
第iライトコマンドの後に、指定されるLBAが第iライトコマンドと重複する別のライトコマンドが発行される場合(ステップS1306でYES)、CPU21は、フラッシュコマンドを発行してサブミッションキュー243に格納し(ステップS1307)、CPU21による処理はステップS1308に進む。サブミッションキュー243では、第iライトコマンドの後にフラッシュコマンドが格納される。これにより、メモリシステム3では、第iライトコマンドに対応するユーザデータの書き込み処理を、後続するフラッシュコマンドに応じて完了できる。したがって、メモリシステム3では、同一のLBAを指定する複数のライトコマンドそれぞれに対応する書き込み処理を、ライトコマンドの受け付け順に実行することを保証できる。
第iライトコマンドの後に、指定されるLBAが第iライトコマンドと重複する別のライトコマンドが発行されない場合(ステップS1306でNO)、CPU21による処理はステップS1308に進む。
後続するステップS1308からステップS1310までの手順は、図27を参照して前述したリカバリ書き込み要求処理のステップS1106およびステップS1108の手順と同様である。
以上のリカバリ書き込み要求処理により、CPU21は、指定されるLBAが重複する複数のライトコマンドをメモリシステム3に送信する場合、それら複数のライトコマンドの1つをサブミッションキュー243に格納した直後に、フラッシュコマンドをサブミッションキュー243に格納する。これにより、メモリシステム3では、同一のLBAを指定する複数のライトコマンドそれぞれに対応する書き込み処理を、ライトコマンドの受け付け順に実行することを保証できる。
図30は、メモリシステム3のCPU12によって実行される、フラッシュコマンドが用いられる場合の書き込み制御処理の手順の例を示すフローチャートである。ここでは、説明を分かりやすくするために、サブミッションキュー243に格納され得るコマンドが、ライトコマンドとフラッシュコマンドだけである場合を例示する。
まず、CPU12は、サブミッションキュー243からコマンドを取得する(ステップS1401)。そして、CPU12は、取得されたコマンドがライトコマンドとフラッシュコマンドのいずれであるかを判定する(ステップS1402)。
取得されたコマンドがライトコマンドである場合(ステップS1402でライトコマンド)、CPU12はステップS1403からステップS1412までの手順を実行して、書き込み制御処理を終了する。ステップS1403からステップS1412までの手順は、図20を参照して前述した書き込み制御処理のステップS402からステップS411までの手順と同様である。
取得されたコマンドがフラッシュコマンドである場合(ステップS1402でフラッシュコマンド)、CPU12は、ホスト2のデータバッファ242からメモリシステム3のNAND型フラッシュメモリ5に、受付済みのライトコマンドに対応する未書き込みのユーザデータを転送する(ステップS1413)。CPU12は、転送されたユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込む(ステップS1414)。そして、CPU12は、ステップS1408からS1412までの手順を実行して、書き込み制御処理を終了する。ステップS1408からステップS1412までの手順は、図20を参照して前述した書き込み制御処理のステップS407からステップS411までの手順と同様である。
以上の書き込み制御処理により、CPU12は、ホスト2からライトコマンドを受け付け、受け付け済みのライトコマンドに対応する書き込み処理を行う場合に、フラッシュコマンドを受け付けたならば、ホスト2のデータバッファ242に格納されている未書き込みのユーザデータをパディング付きでNAND型フラッシュメモリ5に書き込む。ホスト2は、指定されるLBAが重複する複数のライトコマンドをメモリシステムに送信する場合、それら複数のライトコマンドの1つをサブミッションキュー243に格納した直後に、フラッシュコマンドをサブミッションキュー243に格納する。これにより、CPU12は、同一のLBAを指定する複数のライトコマンドそれぞれに対応する書き込み処理を、後続するフラッシュコマンドに応じて完了できる。したがって、メモリシステム3では、メモリシステム3では、同一のLBAを指定する複数のライトコマンドそれぞれに対応する書き込み処理を、ライトコマンドの受け付け順に実行することを保証できる。
以上説明したように、本実施形態によれば、異常終了または意図せず再起動したメモリシステム3に対する未完了の書き込みを復旧できる。ライト管理部212は、NVRAM24に第1データを格納する。ライト管理部212およびコマンド発行部211は、第1データに関連付けられた第1書き込み要求(例えばライトコマンド)のメモリシステム3への1度目の送信を行う。ライト管理部212は、第1書き込み要求に相当する情報を含む第1管理データ(例えば、ロックデータリスト245のエントリ)をNVRAM24に格納する。ライト管理部212は、1度目に送信された第1書き込み要求に対する第1応答をメモリシステム3から受け取ったことに応じ、1度目に送信された第1書き込み要求に対する第1応答を受け取り済みであることを示す情報を第1管理データに追加する。ライト管理部212は、第1応答を受け取った後に、1度目に送信された第1書き込み要求に対する第2応答をメモリシステム3から受け取ったことに応じ、NVRAM24から第1データと第1管理データとを削除する。
このように、ホスト2は、NAND型フラッシュメモリ5に書き込まれるべき第1データと、ホスト2からメモリシステム3に1度目に送信されたライトコマンドの処理状況を管理する第1管理データとを、NVRAM24に格納する。これにより、例えば、メモリシステム3が第1データがPLP機能によって保護され得るバッファを有していない場合に、異常終了や意図しない再起動が発生したとしても、NVRAM24に格納された第1データと第1管理データとを用いて、未完了の書き込みを復旧できる。
本実施形態の説明に記載された様々な機能の各々は、回路(処理回路)によって実現されてもよい。処理回路の例には、中央処理装置(CPU)のような、プログラムされたプロセッサが含まれる。このプロセッサは、メモリに格納されたコンピュータプログラム(命令群)を実行することによって、本実施形態の説明に記載された機能それぞれを実行する。このプロセッサは、電気回路を含むマイクロプロセッサであってもよい。処理回路の例には、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、マイクロコントローラ、コントローラ、他の電気回路部品も含まれる。本実施形態の説明に記載されたCPU以外の他のコンポーネントの各々もまた処理回路によって実現されてもよい。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。