(57)【要約】      （修正有）【課題】コマンドの重複実行に起因するデータの消失等を有効に防止できる信頼性の高い情報処理システム及び情報処理方法を提供する。【解決手段】コントローラがデバイスに対するコマンドを対応するコマンドキューに順次書き込み、デバイスがコマンドキューからコマンドをフェッチして実行する。コマンドには、当該コマンドがフェッチ済みであるか否かを表すフェッチ情報を格納するためのフィールドが設けられ、デバイスが、フェッチしたコマンドのフェッチ情報の値を判定し、デバイスが、当該フェッチ情報の値がフェッチ済みでないことを表す第１の値であった場合には、コマンドキューに格納されている当該コマンドの当該フェッチ情報の値をフェッチ済みであることを表す第２の値に更新した上で当該コマンドを実行する一方、当該フェッチ情報の値が第２の値であった場合には、当該コマンドを実行せずに所定のエラー処理を実行する。【選択図】図５Ａ
2019101704.tif 000002
【特許請求の範囲】
【請求項１】
情報処理システムにおいて、
所定の処理を実行する１又は複数のデバイスと、
前記デバイスを制御するコントローラと、
前記コントローラに設けられ、前記デバイスごとのコマンドキューがそれぞれ定義されるメモリと
を備え、
前記コントローラは、前記デバイスに対するコマンドを対応する前記コマンドキューに順次書き込み、
前記デバイスは、前記コマンドキューから前記コマンドをフェッチして実行し、
前記コマンドには、当該コマンドがフェッチ済みであるか否かを表すフェッチ情報を格納するためのフィールドが設けられ、
前記デバイスは、
フェッチした前記コマンドの前記フェッチ情報の値を判定し、
当該フェッチ情報の値がフェッチ済みでないことを表す第１の値であった場合には、前記コマンドキューに格納されている当該コマンドの当該フェッチ情報の値をフェッチ済みであることを表す第２の値に更新した上で当該コマンドを実行する一方、当該フェッチ情報の値が前記第２の値であった場合には、当該コマンドを実行せずに所定のエラー処理を実行する
ことを特徴とする情報処理システム。
【請求項２】
前記フェッチ情報は、フラグである
ことを特徴とする請求項１に記載の情報処理システム。
【請求項３】
前記エラー処理は、前記コントローラへのエラーの通知であり、
前記コントローラは、
前記デバイスからエラーが通知された場合には、保持している前記コマンドをすべて破棄するよう前記デバイスに指示を与えると共に、前記コマンドキューを初期化し、
初期化前に当該コマンドキューに書き込まれていた未実行の前記コマンドを当該コマンドキューに再度書き込み、
前記コマンドキューに前記コマンドを書き込んだ旨のコマンド書込み通知を前記デバイスに与え、
前記デバイスは、
前記コマンド書込み通知に応じて、前記コマンドキューから前記コマンドをフェッチする
ことを特徴とする請求項１に記載の情報処理システム。
【請求項４】
前記デバイスは、ストレージ装置に搭載された記憶装置であり、
前記コントローラは、前記ストレージ装置に実装され、前記デバイスを制御するストレージコントローラである
ことを特徴とする請求項１に記載の情報処理システム。
【請求項５】
所定の処理を実行する１又は複数のデバイスと、前記デバイスを制御するコントローラと、前記コントローラに設けられ、前記デバイスごとのコマンドキューがそれぞれ定義されるメモリとを有する情報処理システムにおいて実行される情報処理方法であって、
前記コントローラは、前記デバイスに対するコマンドを対応する前記コマンドキューに順次書き込み、
前記デバイスは、前記コマンドキューから前記コマンドをフェッチして実行し、
前記コマンドには、当該コマンドがフェッチ済みであるか否かを表すフェッチ情報を格納するためのフィールドが設けられ、
前記デバイスが、フェッチした前記コマンドの前記フェッチ情報の値を判定する第１のステップと、
前記デバイスが、当該フェッチ情報の値がフェッチ済みでないことを表す第１の値であった場合には、前記コマンドキューに格納されている当該コマンドの当該フェッチ情報の値をフェッチ済みであることを表す第２の値に更新した上で当該コマンドを実行する一方、当該フェッチ情報の値が前記第２の値であった場合には、当該コマンドを実行せずに所定のエラー処理を実行する第２のステップと
を備えることを特徴とする情報処理方法。
【請求項６】
前記フェッチ情報は、フラグである
ことを特徴とする請求項５に記載の情報処理方法。
【請求項７】
前記エラー処理は、前記コントローラへのエラーの通知であり、
前記コントローラが、前記デバイスからエラーが通知された場合には、保持している前記コマンドをすべて破棄するよう前記デバイスに指示を与えると共に、前記コマンドキューを初期化し、初期化前に当該コマンドキューに書き込まれていた未実行の前記コマンドを当該コマンドキューに再度書き込み、前記コマンドキューに前記コマンドを書き込んだ旨のコマンド書込み通知を前記デバイスに与る第３のステップと、
前記デバイスが、前記コマンド書込み通知に応じて、前記コマンドキューから前記コマンドをフェッチする第４のステップと
を備えることを特徴とする請求項５に記載の情報処理方法。
【請求項８】
前記デバイスは、ストレージ装置に搭載された記憶装置であり、
前記コントローラは、前記ストレージ装置に実装され、前記デバイスを制御するストレージコントローラである
ことを特徴とする請求項５に記載の情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システム及び情報処理方法に関し、例えば、ストレージ装置に適用して好適なものである。
【背景技術】
【０００２】
一般的に、コマンドを処理するデバイスは、与えられたコマンドのフォーマットが規定通りであるか否かをその実行時に判定し、規定通りのフォーマットでなかった場合には、そのコマンドの実行を取りやめて、コマンドの発行元であるデバイスドライバ（以下、これを単にドライバと呼ぶ）にエラー通知を送信するなどの所定エラー処理を実行する。
【０００３】
ところで、ドライバがメモリ上に定義されたコマンドキューにコマンドを書き込み、このコマンドをデバイスがフェッチして実行する構成のシステムについて考える。
【０００４】
このようなシステムでは、ドライバ又はデバイスの不良やメモリの故障などに起因して、デバイスが次にフェッチすべきコマンドキュー内のコマンドの位置を表すポインタが正しいコマンドを指し示しておらず、デバイスがコマンドキュー内の既に実行済みのコマンドを再度フェッチしてしまうことがある。
【０００５】
この場合において、そのときフェッチされるコマンドのフォーマットは規定通りであるため、デバイス側においてそのコマンドが不正なものであると判別することができず、そのままそのコマンドが再実行される。
【０００６】
ところが、例えば、かかる再実行されるコマンドがストレージ装置内においてストレージコントローラから記憶デバイスに発行されたライトコマンドであった場合、既に記憶デバイスに書き込まれているデータ上に新たにデータが上書きされる結果となる。
【０００７】
そして、このときそのコマンドが最初に実行された状態から再度そのコマンドが再実行されるまでの間に異なるライトコマンドに基づいて同じ領域に異なるデータが上書きされていた場合、このデータが誤実行されたライトコマンドによって元のデータに書き換えられてしまい、その結果として正しいデータが消失するといった事態が発生するおそれがある。
【０００８】
このようなコマンドの重複実行を抑制するための方法として、例えば、特許文献１には、リクエストの送信元がリクエストを発行する際、そのリクエストに順序情報を付加し、リクエストを処理する処理装置側において、各リクエストに付加された順序情報に基づいて受信したリクエストが処理済みであるか否かを判定する方法が開示されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１３−１９１１８７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら特許文献１に開示された方法によると、リクエストが処理済みであるか否かを判定するために必要な順序情報をリクエストの送信先のデバイス側において管理する必要があるため、デバイスが交換された場合に交換後の新たなデバイスが、どのリクエストまで処理済みで、どのリクエストから処理を開始すべきかを判断できない問題があった。
【００１１】
従って、リクエストの重複実行に起因するデータの消失等を有効かつ確実に防止するためには、リクエストの送信先となるデバイスの交換が行われた場合においても、交換後の新たなデバイスがどのコマンドから処理を開始すべきかを容易に判断できる仕組みが必要となる。
【００１２】
本発明は以上の点を考慮してなされたもので、コマンドの重複実行に起因するデータの消失等を有効に防止できる信頼性の高い情報処理システム及び情報処理方法を提案しようとするものである。
【課題を解決するための手段】
【００１３】
かかる課題を解決するため本発明においては、情報処理システムにおいて、所定の処理を実行する１又は複数のデバイスと、前記デバイスを制御するコントローラと、前記コントローラに設けられ、デバイスごとのコマンドキューがそれぞれ定義されるメモリとを設け、前記コントローラは、前記デバイスに対するコマンドを対応する前記コマンドキューに順次書き込み、前記デバイスは、前記コマンドキューから前記コマンドをフェッチして実行し、前記コマンドには、当該コマンドがフェッチ済みであるか否かを表すフェッチ情報を格納するためのフィールドが設けられ、前記デバイスが、フェッチした前記コマンドの前記フェッチ情報の値を判定し、当該フェッチ情報の値がフェッチ済みでないことを表す第１の値であった場合には、前記コマンドキューに格納されている当該コマンドの当該フェッチ情報の値をフェッチ済みであることを表す第２の値に更新した上で当該コマンドを実行する一方、当該フェッチ情報の値が前記第２の値であった場合には、当該コマンドを実行せずに所定のエラー処理を実行するようにした。
【００１４】
また本発明においては、所定の処理を実行する１又は複数のデバイスと、前記デバイスを制御するコントローラと、前記コントローラに設けられ、デバイスごとのコマンドキューがそれぞれ定義されるメモリとを有する情報処理システムにおいて実行される情報処理方法であって、前記コントローラは、前記デバイスに対するコマンドを対応する前記コマンドキューに順次書き込み、前記デバイスは、前記コマンドキューから前記コマンドをフェッチして実行し、前記コマンドには、当該コマンドがフェッチ済みであるか否かを表すフェッチ情報を格納するためのフィールドが設けられ、前記デバイスが、フェッチした前記コマンドの前記フェッチ情報の値を判定する第１のステップと、前記デバイスが、当該フェッチ情報の値がフェッチ済みでないことを表す第１の値であった場合には、前記コマンドキューに格納されている当該コマンドの当該フェッチ情報の値をフェッチ済みであることを表す第２の値に更新した上で当該コマンドを実行する一方、当該フェッチ情報の値が前記第２の値であった場合には、当該コマンドを実行せずに所定のエラー処理を実行する第２のステップとを設けるようにした。
【００１５】
本情報処理システム及び情報処理方法によれば、コマンドがフェッチ済みであるか否かを判断するために必要なフェッチ情報がコントローラ側において一括管理されるため、デバイスが交換された場合においても交換後の新たなデバイスがコマンドキューに格納されたコマンドのうちのどのコマンドからフェッチを開始して実行すべきかを容易かつ確実に認識することができる。
【発明の効果】
【００１６】
本発明によれば、コマンドの重複実行に起因するデータの消失等を有効に防止できる信頼性の高い情報処理システム及び情報処理方法を実現できる。
【図面の簡単な説明】
【００１７】
【図１】第１の実施の形態によるストレージ装置の全体構成を示すブロック図である。
【図２】第１の実施の形態によるストレージ装置におけるＩ／Ｏ処理の流れを示すブロック図である。
【図３】サブミッションキュー及びコマンドの説明に供する概念図である。
【図４】本実施の形態によるコマンドフォーマットを示す概念図である。
【図５Ａ】第１の実施の形態によるストレージ装置において、フェッチ済みフラグ判定において肯定結果を得る場合の処理の流れを示すラダーチャートである。
【図５Ｂ】第１の実施の形態によるストレージ装置において、フェッチ済みフラグ判定において否定結果を得る場合の処理の流れを示すラダーチャートである。
【図６】ドライバ側コマンド処理の処理手順を示すフローチャートである。
【図７】フラッシュコントローラ側コマンド処理の処理手順を示すフローチャートである。
【図８】第２の実施の形態によるストレージ装置の全体構成を示すブロック図である。
【図９】第２の実施の形態によるストレージ装置におけるライト処理の流れを示すブロック図である。
【発明を実施するための形態】
【００１８】
以下図面について、本発明の一実施の形態を詳述する。
【００１９】
（１）第１の実施の形態
（１−１）本実施の形態によるストレージ装置の構成
図１において、１は全体として本実施の形態によるストレージ装置を示す。このストレージ装置１は、１又は複数のＳＳＤ（Solid State Device）２と、これらＳＳＤ２に対するデータの読み書きを制御するストレージコントローラ３とを備えて構成される。
【００２０】
ストレージコントローラ３は、ＣＰＵ（Central Processing Unit）１０、メモリ１１及びＩ／Ｏ（Input/Output）ハブ１２を備えて構成される。ＣＰＵ１０は、ストレージ装置１全体の動作制御を司るプロセッサであり、メモリ１１は、各種プログラムを保持するために利用される半導体メモリである。
【００２１】
メモリ１１には、ＳＳＤドライバ（以下、これを単にドライバと呼ぶ）１３が格納される。ドライバ１３は、ストレージコントローラ３がＳＳＤ２を制御するためのプログラムである。ＣＰＵ１０がこのドライバ１３を実行することにより、ストレージコントローラ３によるＳＳＤ２に対する各種制御が行われる。ただし、以下においては、ＣＰＵ１０がドライバ１３に基づいて実行する各種処理の処理主体をドライバ１３として説明する。
【００２２】
またメモリ１１上には、ＳＳＤ２ごとに１又は複数のサブミッションキュー１４がそれぞれ定義される。サブミッションキュー１４は、ドライバ１３が、対応するＳＳＤ２に対するコマンドを書き込むためのコマンドキューである。このサブミッションキュー１４に対するコマンドの書込みは、コマンドをその先頭から順番に書き込み、当該サブミッションキューが満杯となったら再び先頭に戻ってコマンドを上書きしていくという方式で行われる。
【００２３】
Ｉ／Ｏハブ１２は、ＣＰＵ１０の制御に従ってＣＰＵ１０及びメモリ１１と、ＳＳＤ２との間の接続を切り替える分配器である。Ｉ／Ｏハブ１２は、ＰＣＩｅ（Peripheral Component Interconnect express）バス１５を介して各ＳＳＤ２と接続される。
【００２４】
ＳＳＤ２は、それぞれ例えばＮＡＮＤ型フラッシュチップが複数搭載された１又は複数のフラッシュメモリ２０と、ストレージコントローラ３から与えられるコマンドに応じて対応するフラッシュメモリ２０にデータを読み書きするフラッシュコントローラ２１とを備えて構成される。
【００２５】
フラッシュコントローラ２１は、ＳＳＤ２全体の動作制御を司るプロセッサであるＣＰＵ２２と、主としてプログラムを保持するために利用されるメモリ２３とを備える。そしてメモリ２３には、プログラムとしてコマンドフェッチ制御部２４、コマンド実行部２５及びコマンド実行結果応答部２６が格納される。またメモリ１１上には、テイルドアベル（Tail Doorbell）レジスタ領域２７が確保される。
【００２６】
テイルドアベルレジスタ領域２７は、ストレージコントローラ３のドライバ１３が対応するサブミッションキュー１４にコマンドを書き込んだ際に、そのサブミッションキュー１４に最後に書き込んだコマンドの位置を表すテイルポインタ（図３の「Tail Pointer」）を書き込むためのレジスタ領域である。
【００２７】
またコマンドフェッチ制御部２４は、ドライバ１３が対応するサブミッションキュー１４にコマンドを書き込んだ際に当該ドライバ１３から与えられるその通知（以下、これをコマンド書込み通知と呼ぶ）に応じて、テイルドアベルレジスタ領域２７に格納されたテイルポインタを利用して、ＰＣＩｅバス１５を介してストレージコントローラ３内のメモリ１１上に定義された対応するサブミッションキュー１４からコマンドを読み出す機能を有するプログラムである。
【００２８】
コマンド実行部２５は、コマンドフェッチ制御部２４により対応するサブミッションキュー１４から読み出されたコマンドを実行する機能を有するプログラムである。またコマンド実行結果応答部２６は、コマンド実行部２５により実行されたコマンドの実行結果をストレージコントローラ３に通知する機能を有するプログラムである。
【００２９】
以上の構成を有するストレージ装置１では、図示しない上位装置からリード要求やライト要求などのＩ／Ｏ要求が与えられると、図２に示すように、ストレージコントローラ３のドライバ１３がそのＩ／Ｏ要求に応じた対応するＳＳＤ２ごとの所定フォーマットのコマンドをそれぞれ生成し、生成したコマンドをそれらのＳＳＤ２に対応するサブミッションキュー１４にそれぞれ書き込む（Ｓ１）。
【００３０】
またドライバ１３は、この後、上述のコマンド書込み通知を対応するＳＳＤ２に送信する（Ｓ２）。なお、このコマンド書込み通知には、そのとき対応するサブミッションキュー１４に最後に書き込まれたコマンドの位置（そのサブミッションキュー１４の先頭からの位置）を表す上述のテイルポインタが含まれており、このテイルポインタがコマンドフェッチ制御部２４（図１）によりテイルドアベルレジスタ領域２７（図１）に格納される。
【００３１】
一方、ＳＳＤ２のフラッシュコントローラ２１のコマンドフェッチ制御部２４は、対応するサブミッションキュー１４に書き込まれたコマンドのうち、最も古い未実行のコマンドの位置をヘッドポインタ（図３のHead Point）として記憶している。
【００３２】
そしてコマンドフェッチ制御部２４は、かかるコマンド書込み通知が与えられた場合、ＰＣＩｅバス１５を介してストレージコントローラ３内のメモリ１１上に定義された対応するサブミッションキュー１４にアクセスし、そのサブミッションキュー１４に格納されているコマンドのうち、上述のヘッドポインタからテイルドアベルレジスタ領域２７に格納されているテイルポインタまでのコマンドの中からそのとき処理可能な数のコマンドを、サブミッションキュー１４に書き込まれたのが古いものから順番にフェッチし、フェッチしたこれらコマンドをコマンド実行部２５（図１）に引き渡す（Ｓ３）。
【００３３】
そしてコマンド実行部２５は、コマンドフェッチ制御部２４から引き渡された各コマンドを順番に実行し（Ｓ６）、その実行結果をコマンド実行結果応答部２６（図１）に順次引き渡す。かくして、かかるコマンドの実行結果が引き渡されたコマンド実行結果応答部２６は、そのコマンドがリードコマンドであった場合には、要求されたリードデータをストレージコントローラ３のメモリ１１に書き込み、その後、そのコマンドの実行結果をコマンド実行結果応答としてドライバ１３に送信する（Ｓ７）。
【００３４】
この後、ストレージコントローラ３は、例えば、上位装置からのＩ／Ｏ要求がライト要求であった場合には、ライト処理が完了した旨の通知（ライト完了通知）をその上位装置に送信する。またストレージコントローラ３は、上位装置からのＩ／Ｏ要求がリード要求であった場合には、メモリ１１に格納されているリードデータと共に、リード処理が完了した旨の通知（リード完了通知）をその上位装置に送信する。以上により上位装置からのＩ／Ｏ要求に応じた一連の処理が完了する。
【００３５】
（１−２）フェッチ済み判定機能
ところで、このような構成を有するストレージ装置１では、コマンドフェッチ制御部２４（図１）のバグや、ストレージコントローラ３のメモリ２３の障害等により、対応するサブミッションキュー１４に書き込まれた同じコマンドが何度もコマンドフェッチ制御部２４にフェッチされてＳＳＤ２において実行されるおそれがある。そして、このようにコマンドが重複して実行された場合、上述のようにデータロストが発生するおそれがある。
【００３６】
そこで、本実施の形態では、図３に示すように、ドライバ１３がサブミッションキュー１４に書き込むコマンドに、そのコマンドをフェッチ済みであるか否かを管理するためのフラグ（以下、これをフェッチ済みフラグと呼ぶ）を格納するためのフィールド（以下、これをフェッチ済みフラグフィールドと呼ぶ）３０が設けられている。
【００３７】
このフェッチ済みフラグは、当初、ドライバにより「０」に初期化される。そしてＳＳＤ２のフラッシュコントローラ２１のコマンドフェッチ制御部２４（図１）は、図２のステップＳ５に示すように、対応するサブミッションキュー１４からコマンドをフェッチする度に、サブミッションキューに格納されているそのコマンドのフェッチ済みフラグを「１」に更新する。
【００３８】
またコマンドフェッチ制御部２４は、図２のステップＳ４に示すように、対応するサブミッションキュー１４からコマンドをフェッチする度に、フェッチしたコマンドのフェッチ済みフラグの値を判定し、その値が「０」であった場合にはそのコマンドをコマンド実行部２５に引き渡して当該コマンドを実行させる一方、その値が「１」であった場合にはそのコマンドをコマンド実行部２５に引き渡すことなく、エラーをストレージコントローラ３に通知する。
【００３９】
このような機能（以下、これをフェッチ済み判定機能と呼ぶ）を実現するための手段として、図１に示すように、コマンドフェッチ制御部２４は、フェッチ済みフラグ判定部２８及びフェッチ済みフラグ書込み制御部２９をその一部の機能として備えている。
【００４０】
フェッチ済みフラグ判定部２８は、コマンドフェッチ制御部２４がフェッチしたコマンドのフェッチ済みフラグの値が「０」及び「１」のいずれであるかを判定する機能部である。
【００４１】
またフェッチ済みフラグ書込み制御部２９は、フェッチ済みフラグ判定部２８によりフェッチ済みフラグの値が「０」であると判定されたコマンドについて、対応するサブミッションキュー１４内のそのコマンドのフェッチ済みフラグを「１」に更新する機能部である。
【００４２】
そしてコマンドフェッチ制御部２４は、これらフェッチ済みフラグ判定部２８及びフェッチ済みフラグ書込み制御部２９の機能により、対応するサブミッションキュー１４からコマンドをフェッチしたときにコマンドが既に実行済みのものであるかを判定したり、対応するサブミッションキュー１４内のそのコマンドのフェッチ済みフラグを「１」に変更する。
【００４３】
なお、本実施の形態によるコマンドの具体的な構成例を図４に示す。この図４に示すように、本実施の形態の場合、コマンドＣＯＭは、フェッチ済みフラグフィールド３０、コマンド種別フィールド３１、コマンドＩＤフィールド３２、ソースアドレスフィールド３３、デスティネーションアドレスフィールド３４及びパリティコードフィールド３５を備えて構成される。
【００４４】
フェッチ済みフラグフィールド３０は、上述のようにフェッチ済みフラグが格納される１ビットのフィールドである。またコマンド種別フィールド３１には、「リード」、「ライト」又は「コピー」などのそのコマンドＣＯＭの種別が格納され、コマンドＩＤフィールド３２には、そのコマンドＣＯＭに付与された固有のＩＤが格納され、パリティコードフィールド３５には、そのコマンドＣＯＭのパリティコードが格納される。
【００４５】
さらにソースアドレスフィールド３３には、処理対象のデータが格納されているＳＳＤ２上、もしくはメモリ１１上のアドレスが格納され、デスティネーションアドレスフィールド３４には、そのデータの処理結果を格納すべきＳＳＤ２上、もしくはメモリ１１上のアドレスが格納される。従って、例えばコマンド種別が「コピー」であった場合、ＳＳＤ２におけるコピー対象のデータが格納されているコピー元領域のアドレスがソースアドレスフィールド３３に格納され、ＳＳＤ２におけるこのデータのコピー先領域のアドレスがデスティネーションアドレスフィールド３４に格納されることになる。
【００４６】
図５Ａは、図２のステップＳ４における判定でフェッチ済みフラグの値が「０」と判定される場合の一連の処理の流れを示す。この場合におけるステップＳ１０〜ステップＳ１１は、図２のステップＳ１〜ステップＳ７と処理内容がすべて同じであるため、ここでの説明は省略する。
【００４７】
一方、図５Ｂは、図２のステップＳ４における判定でフェッチ済みフラグの値が「１」と判定される場合の一連の処理の流れを示す。この場合におけるステップＳ２０〜ステップＳ２３は、図２のステップＳ１〜ステップＳ４と処理内容が同じであるため、ここでの説明は省略する。
【００４８】
そしてＳＳＤ２のフラッシュコントローラ２１のフェッチ済みフラグ判定部２８（図１）は、ステップＳ２３の判定において、コマンドフェッチ制御部２４（図１）が対応するサブミッションキュー１４からフェッチした少なくとも１つのコマンドのフェッチ済みフラグの値が「１」であると判定した場合、これらコマンドをコマンド実行部２５に引き渡すことなく、エラー通知をストレージコントローラ３（図１）のドライバ１３（図１）に送信する（Ｓ２４）。
【００４９】
一方、ストレージコントローラ３（図１）のドライバ１３は、かかるエラー通知を受信すると、そのＳＳＤ２のフラッシュコントローラ２１にリセット指示を与えることにより、フラッシュコントローラ２１が保持するすべての情報を破棄させる（Ｓ２５）。ただし、そのＳＳＤ２に格納されているユーザデータは消去されない。
【００５０】
またドライバ１３は、メモリ１１上に定義されたそのＳＳＤ２に対応付けられたサブミッションキュー１４を初期化することにより、そのときそのサブミッションキュー１４に書き込まれていたすべてのコマンドを消去する（Ｓ２６）。
【００５１】
さらにドライバ１３は、ステップＳ２６で初期化するまでそのサブミッションキュー１４に格納されていた未実行のすべてのコマンドをそのサブミッションキュー１４に再度書込み（Ｓ２７）、この後、これに応じたコマンド書込み通知をそのＳＳＤ２のフラッシュコントローラ２１に送信する（Ｓ２８）。これにより、そのＳＳＤ２においてステップＳ２２以降の処理が再度実行される。
【００５２】
（１−３）フェッチ済み判定機能に関連するドライバ及びフラッシュコントローラの処理
次に、上述のようなフェッチ済み判定機能に関連してドライバ１３及びフラッシュコントローラ２１により実行される一連の処理の処理内容について説明する。
【００５３】
（１−３−１）ドライバ側コマンド処理
図６は、かかるフェッチ済み判定機能に関連してストレージコントローラ３のドライバ１３により実行されるドライバ側コマンド処理の処理手順を示す。
【００５４】
ドライバ１３は、上位装置からのＩ／Ｏ要求を受信すると、この図６に示すドライバ側コマンド処理を開始し、まず、受信したＩ／Ｏ要求に応じた所定フォーマットのコマンドを生成する（Ｓ３０）。この際、ドライバ１３は、フェッチ済みフラグフィールド３０（図４）に格納されているフェッチ済みフラグの値を「０」に設定する。
【００５５】
続いて、ドライバ１３は、ステップＳ３０で生成したコマンドを、対応するＳＳＤ２と対応付けられたサブミッションキュー１４に書き込み（Ｓ３１）、この後、そのＳＳＤ２に対して上述のテイルポインタを含むコマンド書込み通知を送信する（Ｓ３２）。
【００５６】
この後、ドライバ１３は、そのコマンド書込み通知に対するかかるＳＳＤ２からのコマンド実行結果応答が返信されてくるのを待ち受け（Ｓ３３）、やがて、かかるコマンド実行結果応答を受信すると、受信したコマンド実行結果応答の内容が正常終了であるか否かを判断する（Ｓ３４）。
【００５７】
ドライバ１３は、この判断で肯定結果を得ると、今回受信した上位装置からのＩ／Ｏ要求がリード要求であった場合には、そのときＳＳＤ２から読み出された対応するデータ（リードデータ）をその上位装置に返信し、当該Ｉ／Ｏ要求がライト要求であった場合には、対応するデータのライトが正常に完了した旨の完了通知をその上位装置に送信した後（Ｓ３５）、このドライバ側コマンド処理を終了する。
【００５８】
これに対して、ドライバ１３は、ステップＳの判断で否定結果を得ると、今回受信したかかるＩ／Ｏ要求の送信元の上位装置にエラーを通知したり、そのＳＳＤ２の初期化やコマンドの再実行などの所定の異常終了処理を実行し（Ｓ３６）、この後、このドライバ側コマンド処理を終了する。
【００５９】
（１−３−２）フラッシュコントローラ側コマンド処理
一方、図７は、かかるフェッチ済み判定機能に関連してＳＳＤ２のフラッシュコントローラ２１において実行されるフラッシュコントローラ側コマンド処理の処理手順を示す。
【００６０】
フラッシュコントローラ２１側では、図６について上述したドライバ側コマンド処理のステップＳ３２でドライバから発行されたコマンド書込み通知を受信すると、この図７に示すフラッシュコントローラ側コマンド処理が開始される。
【００６１】
そして、まず、フラッシュコントローラ２１のコマンドフェッチ制御部２４（図１）が、ＰＣＩｅバス１５（図１）を介してストレージコントローラ３（図１）のメモリ１１（図１）内の自己に割り当てられたサブミッションキュー１４にアクセスし、そのサブミッションキュー１４に格納されているコマンドのうち、自己で管理しているヘッドポインタからかかるコマンド書込み通知により通知されたテイルポインタまでのすべてのコマンドをフェッチする（Ｓ４０）。
【００６２】
続いて、コマンドフェッチ制御部２４のフェッチ済みフラグ判定部２８（図１）が、ステップＳ４０でコマンドフェッチ制御部２４がフェッチした各コマンドについて、これらコマンドのフェッチ済みフラグの値がいずれも「０」であるか否かを判断する（Ｓ４１）。
【００６３】
そしてフェッチ済みフラグ判定部２８は、この判断で否定結果を得ると、ステップＳ４７に進んでコマンド実行結果応答部２６（図１）を呼び出す。
【００６４】
これに対して、フェッチ済みフラグ判定部２８は、ステップＳ４１の判断で肯定結果を得ると、フェッチ済みフラグ書込み制御部２９（図１）を呼び出す。またフェッチ済みフラグ書込み制御部２９は、フェッチ済みフラグ判定部２８により呼び出されると、ＰＣＩｅバス１５を介してストレージコントローラ３のメモリ１１内の自己に割り当てられたサブミッションキュー１４にアクセスし、そのサブミッションキュー１４に格納されているコマンドのうち、ステップＳ４０でフェッチしたすべてのコマンドについて、フェッチ済みフラグをそれぞれ「１」に更新する（Ｓ４２）。
【００６５】
この後、フェッチ済みフラグ書込み制御部２９によりコマンド実行部２５（図１）が呼び出され、ステップＳ４０でコマンドフェッチ制御部２４によりフェッチされた各コマンドがコマンド実行部２５により順次実行される（Ｓ４３）。
【００６６】
また、かかるコマンド実行部２５による各コマンドの実行が完了すると、コマンド実行部２５によりコマンド実行結果応答部２６（図１）が呼び出される。この際、コマンド実行部２５は、各コマンドが正常に完了したか否かをコマンド実行結果応答部２６に通知する。
【００６７】
そしてコマンド実行結果応答部２６は、コマンド実行部２５により呼び出されると、そのときコマンド実行部２５から通知されたコマンドごとの実行結果に基づいて、ステップＳ４０でフェッチされたすべてのコマンドについて、コマンド実行部２５が正常に実行できたか否かを判断する（Ｓ４４）。
【００６８】
コマンド実行結果応答部２６は、この判断で肯定結果を得ると、その旨のコマンド実行結果応答をストレージコントローラ３に通知する（Ｓ４５）。またコマンド実行結果応答部２６は、ステップＳ４０でフェッチしたコマンドにリードコマンドが含まれていた場合には、そのコマンドに従って読み出したデータをストレージコントローラ３のメモリ１１に格納するなどの所定の正常終了処理を実行する（Ｓ４６）。以上により、このフラッシュコントローラ側コマンド処理が終了する。
【００６９】
これに対して、コマンド実行結果応答部２６は、ステップＳ４４の判断で否定結果を得ると、ステップＳ４７に進んで、その旨のコマンド実行結果応答をストレージコントローラ３に通知する（Ｓ４７）。またコマンド実行結果応答部３６は、この後、ストレージコントローラ３のドライバ１３から与えられるリセット指示に応じてステップＳ４０でフェッチしたコマンドをすべて破棄するなどの所定の異常終了処理を実行する（Ｓ４８）。以上により、このフラッシュコントローラ側コマンド処理が終了する。
【００７０】
（１−４）本実施の形態の効果
以上のように本実施の形態のストレージ装置で１は、ドライバ１３がＳＳＤ２に発行するコマンドにフェッチ済みか否かを表すフェッチ済みフラグを追加し、ドライバ１３がサブミッションキュー１４にコマンドを書き込む際にはフェッチ済みフラグを初期化（「０」に設定）しておき、ＳＳＤ２が対応するサブミッションキュー１４からコマンドをフェッチするごとに、サブミッションキュー１４におけるそのコマンドのフェッチ済みフラグを「１」に更新する。
【００７１】
従って、本ストレージ装置１では、ＳＳＤ２ごとに、そのＳＳＤ２が対応するサブミッションキュー１４からどのコマンドまでをフェッチしたかをストレージコントローラ３側で一括管理できるため、例えば、ＳＳＤ２が交換された場合においても、交換後の新たなＳＳＤ２が、対応するサブミッションキュー１４に格納されたコマンドのうち、どのコマンドから処理を開始すれば良いかを容易に認識することができる。
【００７２】
よって、本ストレージ装置１によれば、ＳＳＤ２の交換があった場合においても交換後の新たなＳＳＤ２がコマンドを重複実行することを有効かつ未然に防止することができ、かくしてコマンドの重複実行に起因するデータの消失等を有効に防止し得る信頼性の高いストレージ装置１を実現できる。
【００７３】
（２）第２の実施の形態
図８は、第２の実施の形態によるストレージ装置４０を示す。このストレージ装置４０は、１又は複数のＳＳＤ４１と、これらＳＳＤ４１に対するデータの読み書きを制御するストレージコントローラ４２とを備えて構成される。
【００７４】
ストレージコントローラ４２は、ＣＰＵ５０及びメモリ５１を備えて構成される。ＣＰＵ５０は、ストレージ装置４０全体の動作制御を司るプロセッサであり、メモリ５１は、各種プログラムを保持するために利用される半導体メモリである。ストレージコントローラ４２は、例えば、ＳＡＳ（Serial Attached SCSI（Small Computer System Interface））規格に準拠したバス４３を介して各ＳＳＤ４１とそれぞれ接続される。
【００７５】
ＳＳＤ４１は、それぞれ例えばＮＡＮＤ型フラッシュチップが複数搭載された１又は複数のフラッシュメモリ６０と、ストレージコントローラ４２から与えられるコマンドに応じて対応するフラッシュメモリ６０にデータを読み書きするフラッシュコントローラ６１と、フラッシュコントローラ６１の一部処理を代行する１又は複数のＡＳＩＣ（Application Specific Integrated Circuit）６２とを備えて構成される。
【００７６】
本実施の形態の場合、ＳＳＤ４１に格納されたＡＳＩＣ６２は、例えば、ライトデータを圧縮する処理や、ライトデータ内の重複するデータ部分を排除する重複排除処理などのデータ加工処理を代行する機能を有するものとする。
【００７７】
フラッシュコントローラ６１は、ＳＳＤ４１全体の動作制御を司るプロセッサであるＣＰＵ７０と、主としてプログラムを保持するために利用されるメモリ７１とを備える。そしてメモリ７１には、ＡＳＩＣ６２を制御するためのドライバ７２が格納される。またメモリ７１上には、そのＳＳＤ４１内に設けられた各ＡＳＩＣ６２とそれぞれ対応させて、第１の実施の形態のサブミッションキュー１４と同じ構成を有する１又は複数のサブミッションキュー７３がそれぞれ定義される。
【００７８】
またＡＳＩＣ６２には、それぞれ第１の実施の形態のコマンドフェッチ制御部２４、コマンド実行結果応答部２６及びテイルドアベルレジスタ領域２７と同様の機能又は用途を有するコマンドフェッチ制御部７４、コマンド実行結果応答部７６及びテイルドアベルレジスタ領域７７が設けられている。またＡＳＩＣ６２には、上述のように内部コマンドに応じて必要なデータ加工処理を実行可能なコマンド実行部７５も設けられている。なお、これらコマンドフェッチ制御部７４、コマンド実行部７５及びコマンド実行結果応答部７６は、ハードウェア構成及びソフトウェア構成のいずれであってもよい。
【００７９】
図９は、上位装置からライト要求が与えられたときに、本実施の形態によるストレージ装置４０において実行される一連のライト処理の流れを示す。
【００８０】
この場合、かかるライト要求を受信したストレージ装置４０のストレージコントローラ４２は、受信したライト要求に応じたライトコマンドを生成する。そしてストレージコントローラ４２は、生成したライトコマンドをバス４３を介して対応するＳＳＤ４１に送信する（Ｓ５０）。
【００８１】
さらにストレージコントローラ４２は、かかるライトコマンドと併せて、上述のライト要求と共に上位装置から送信されてきたライト対象のデータ（ライトデータ）もバス４３を介してそのＳＳＤ４１に送信する。かくして、このライトデータがそのＳＳＤ４１のフラッシュコントローラ６１のメモリ７１に格納される（Ｓ５０）。
【００８２】
一方、かかるライトコマンドを受信したＳＳＤ４１のフラッシュコントローラ６１のドライバ７２は、受信したライトコマンドに基づくＳＳＤ４１内部用のライトデータの加工処理を実行するコマンド（以下、これを内部コマンドと呼ぶ）を生成し、これをメモリ７１上に定義された対応するサブミッションキュー７３に書き込む（Ｓ５１）。なお、このとき生成される内部コマンドのコマンドフォーマットは、図４について上述したコマンドフォーマットと同様である。また、かかる内部コマンドにおけるフェッチ済みフラグフィールド３０（図４）に格納されたフェッチ済みフラグの値は、初期時には「０」に設定される。
【００８３】
またドライバ７２は、この後、対応するＡＳＩＣ６２に対して、メモリ７１上の対応するサブミッションキュー７３に内部コマンドを書き込んだ旨のコマンド書込み通知を送信する（Ｓ５２）。なお、このコマンド書込み通知には、そのとき対応するサブミッションキュー７３に最後に書き込んだ内部コマンドの位置（そのサブミッションキュー７３の先頭からの位置）を表すテイルポインタが含まれている。そして、このテイルポインタがそのＡＳＩＣ６２のテイルドアベルレジスタ領域７７（図８）に格納される。
【００８４】
他方、ＡＳＩＣ６２のコマンドフェッチ制御部７４（図８）は、対応するサブミッションキュー７３に書き込まれた内部コマンドのうち、未実行の最も古い内部コマンドの位置をヘッドポインタ（Head Point）として記憶している（図３を参照）。
【００８５】
そしてコマンドフェッチ制御部７４は、かかるコマンド書込み通知が与えられた場合、フラッシュコントローラ６１のメモリ７１上に定義された対応するサブミッションキュー７３にアクセスし、そのサブミッションキュー７３に格納されている内部コマンドのうち、上述のヘッドポインタからテイルドアベルレジスタ領域７７に格納されているテイルポインタまでの内部コマンドをすべてフェッチする（Ｓ５３）。
【００８６】
またコマンドフェッチ制御部７４は、この後、このときフェッチしたこれら内部コマンドのフェッチ済みフラグの値をそれぞれ確認し、これら内部コマンドのフェッチ済みフラグの値がいずれも「０」であるか否かを判定する（Ｓ５４）。
【００８７】
そしてコマンドフェッチ制御部７４は、これら内部コマンドのフェッチ済みフラグの値がすべて「０」であった場合には、フラッシュコントローラ６１のメモリ７１上の対応するサブミッションキュー７３にアクセスして、そのときフェッチした各内部コマンドのフェッチ済みフラグをそれぞれ「１」に更新する（Ｓ５５）。
【００８８】
この後、コマンドフェッチ制御部７４は、ステップＳ５３でフェッチした内部コマンドを順番に（対応するサブミッションキュー７３に書き込まれた順番に）コマンド実行部７５（図８）に引き渡す。またコマンド実行部７５は、フラッシュコントローラ６１のメモリ７１に格納されているライトデータに対して、そのときコマンドフェッチ制御部７４から引き渡された内部コマンドに基づく処理を順次実行する（Ｓ５６）。
【００８９】
そしてコマンド実行部７５は、これら内部コマンドに従ったデータ加工処理をライトデータに施すことにより得られた加工済みライトデータをフラッシュコントローラ６１のメモリ７１に書き戻す（Ｓ５７）。
【００９０】
またコマンド実行部７５は、ステップＳ５３でフェッチされたすべての内部コマンドの実行が完了すると、コマンド実行結果応答部７６（図８）を呼び出す。この際、コマンド実行部７５は、各内部コマンドの実行結果をコマンド実行結果応答部７６に通知する。そしてコマンド実行結果応答部７６は、コマンド実行部７５により呼び出されると、コマンド実行部７５から通知された各内部コマンドの実行結果をフラッシュコントローラ６１のドライバ７２に通知する（Ｓ５８）。
【００９１】
かくして、この通知を受けたフラッシュコントローラ６１のドライバ７２は、ステップＳ５３でフェッチされた各内部コマンドに従ってＡＳＩＣ６２においてデータ加工処理されたライトデータである加工済みライトデータをメモリ７１から読み出し、読み出した加工済みライトデータを対応するフラッシュメモリ６０に格納する（Ｓ５９）。
【００９２】
なおドライバ７２は、この後、かかるライトデータのライトが完了した旨のライト完了通知をバス４３を介してストレージコントローラ４２に送信する（Ｓ６０）。また、このライト完了通知を受信したストレージコントローラ４２は、このライト完了通知に応じたライト処理完了通知を上述のライト要求の送信元の上位装置に送信する。以上により、かかる上位装置からのライト要求に応じたストレージ装置４０のライト処理が完了する。
【００９３】
以上のように本実施の形態のストレージ装置４０においても、ドライバ７２からＡＳＩＣ６２に発行するコマンドにフェッチ済みか否かを表すフェッチ済みフラグを追加し、ドライバ７２がサブミッションキュー７３にコマンドを書き込む際にはフェッチ済みフラグを初期化（「０」に設定）しておき、ＡＳＩＣ６２が対応するサブミッションキュー７３からコマンドをフェッチするごとに、サブミッションキュー７３におけるそのコマンドのフェッチ済みフラグを「１」に更新する。
【００９４】
従って、本実施の形態のストレージ装置４０においても、第１の実施の形態によるストレージ装置１と同様に、ＡＳＩＣ６２が交換された場合においても交換後の新たなＡＳＩＣ６２がコマンドを重複実行することを有効かつ未然に防止することができ、かくしてコマンドの重複実行に起因するデータの消失等を有効に防止し得る信頼性の高いストレージ装置４０を実現できる。
【００９５】
（３）他の実施の形態
なお上述の第１及び第２の実施の形態においては、本発明をストレージ装置１，４０に適用するようにした場合について述べたが、本発明はこれに限らず、所定の処理を実行する１又は複数のデバイスと、デバイスを制御するコントローラと、コントローラに設けられ、デバイスごとのコマンドキューがそれぞれ定義されるメモリとを有する、サーバ装置やこれ以外のコンピュータ装置などの種々の情報処理システムに広く適用することができる。
【００９６】
また上述の第１及び第２の実施の形態においては、所定の処理を実行する１又は複数のデバイスがＳＳＤ２，４１である場合について述べたが、本発明はこれに限らず、ＳＳＤ２，４１以外のハードディスク装置などの記憶装置を広く適用することができる。
【００９７】
さらに上述の第１及び第２の実施の形態においては、フェッチ済みフラグフィールド３０（図４）をコマンドの先頭に設けるようにした場合について述べたが、本発明はこれに限らず、フェッチ済みフラグフィールド３０の位置とは、コマンドの先頭以外の場所に設定するようにしてもよい。
【００９８】
さらに上述の第１及び第２の実施の形態においては、コマンドがフェッチ済みであるか否かを表すフェッチ情報としてフラグ（フェッチ済みフラグ）を適用するようにした場合について述べたが、本発明はこれに限らず、この他種々の形態の情報を広く適用することができる。ただし、かかるフェッチ情報としてフラグを適用することにより、コマンドがフェッチ済みであるか否かを１ビットで表現することができるため、コマンドを格納するサブミッションキュー１４，７３の容量の増大化等を効率良く防止することができる。
【産業上の利用可能性】
【００９９】
本発明は、所定の処理を実行する１又は複数のデバイスと、デバイスを制御するコントローラと、コントローラに設けられ、デバイスごとのコマンドキューがそれぞれ定義されるメモリとを有する種々の情報処理システムに広く適用することができる。
【符号の説明】
【０１００】
１，４０……ストレージ装置、２，４１……ＳＳＤ、３，４２……ストレージコントローラ、１０，２２，５０，７０……ＣＰＵ、１１，２３，５１，７１……メモリ、１３，７２……ドライバ、１４，７３……サブミッションキュー、２０，６０……フラッシュメモリ、２４，７４……コマンドフェッチ制御部、２５，７５……コマンド実行部、２６，７６……コマンド実行結果応答部、２７，７７……テイルドアベルレジスタ領域、３０……フェッチ済みフラグフィールド、ＣＯＭ……コマンド。
【図１】
2019101704.tif 000003
【図２】
2019101704.tif 000004
【図３】
2019101704.tif 000005
【図４】
2019101704.tif 000006
【図５Ａ】
2019101704.tif 000007
【図５Ｂ】
2019101704.tif 000008
【図６】
2019101704.tif 000009
【図７】
2019101704.tif 000010
【図８】
2019101704.tif 000011
【図９】
2019101704.tif 000012