XFR_RDYを動的にイネーブリングおよびディセーブリングするための方法であって、ターゲットで書き込みコマンドを受信すること、前記書き込みコマンドに対してXFR_RDYがディセーブルであるかどうかを決定すること、XFR_RDYがディセーブルである場合、前記ターゲット上で少なくとも1つのバッファが使用可能であるかどうかを決定すること、少なくとも1つのバッファが使用可能である場合、前記書き込みコマンドに関連付けられたデータを前記少なくとも1つのバッファに書き込むことによって、前記書き込みコマンドを処理すること、および、前記書き込みコマンドが完了した後に、前記ターゲット上で依然として使用可能なバッファの数を示す情報を戻すこと、を含む、方法。少なくとも1つのバッファが使用可能でない場合、前記ターゲットで前記書き込みコマンドに関連付けられたデータを破棄することをさらに含む、請求項1に記載の方法。データを破棄することは、前記書き込みコマンドが失敗し、XFR_RDYがイネーブルな状態で再駆動されるべきであることを示す状況を戻すことをさらに含む、請求項2に記載の方法。情報を戻すことは、前記情報を前記書き込みコマンドのイニシエータに送信することをさらに含む、前記請求項のいずれか一項に記載の方法。XFR_RDYがディセーブルな状態で別の書き込みコマンドを前記ターゲットに送信する以前に、前記イニシエータは、前記ターゲット上で依然として使用可能な前記バッファの数が、前記イニシエータが有する前記ターゲットとの前記未処理の書き込みコマンドの数よりも多いかどうかを決定する、請求項4に記載の方法。前記イニシエータが、前記ターゲット上で依然として使用可能な前記バッファの数が、前記イニシエータが有する前記ターゲットとの前記未処理の書き込みコマンドの数よりも多いものと決定した場合、前記イニシエータは、XFR_RDYがディセーブルな状態で別の書き込みコマンドを送信するように構成される、請求項5に記載の方法。前記イニシエータが、前記ターゲット上で依然として使用可能な前記バッファの数が、前記イニシエータが有する前記ターゲットとの前記未処理の書き込みコマンドの数よりも多くないものと決定した場合、前記イニシエータは、XFR_RDYがイネーブルな状態で書き込みコマンドを送信するように構成される、請求項5に記載の方法。コンピュータシステム内にロードされ、その上で実行された場合、前記コンピュータシステムに請求項1から7のいずれか一項に従った方法のすべてのステップを実行させるための、コンピュータ読み取り可能媒体上に格納されたコンピュータプログラムコードを含む、コンピュータプログラム。XFR_RDYを動的にイネーブリングおよびディセーブリングするためのシステムであって、書き込みコマンドを送信するためのイニシエータと、前記書き込みコマンドを受信し、前記書き込みコマンドに対してXFR_RDYがディセーブルであるかどうかを決定するためのターゲットを備え、さらに前記ターゲットは、XFR_RDYがディセーブルである場合、前記ターゲット上で少なくとも1つのバッファが使用可能であるかどうかを決定するように構成され、さらに前記ターゲットは、前記ターゲット上で少なくとも1つのバッファが使用可能である場合、前記書き込みコマンドに関連付けられたデータを前記少なくとも1つのバッファに書き込むことによって前記書き込みコマンドを処理するように構成され、さらに前記ターゲットは、前記書き込みコマンドが完了した後に、前記ターゲット上で依然として使用可能な前記バッファの数を示す情報を前記イニシエータに戻すようにさらに構成される、システム。さらに前記ターゲットは、少なくとも1つのバッファが使用可能でない場合、前記書き込みコマンドに関連付けられたデータを破棄するように構成される、請求項9に記載のシステム。さらに前記ターゲットは、前記データが破棄された場合、前記書き込みコマンドが失敗し、XFR_RDYがイネーブルな状態で再駆動されるべきであることを示す状況を戻すように構成される、請求項10に記載のシステム。さらに前記イニシエータは、XFR_RDYがディセーブルな状態で別の書き込みコマンドを前記ターゲットに送信する以前に、前記ターゲット上で依然として使用可能な前記バッファの数が、前記ターゲットとの前記未処理の書き込みコマンドの数よりも多いかどうかを決定するように構成される、請求項9から11のいずれか一項に記載のシステム。さらに前記イニシエータは、前記ターゲット上で依然として使用可能な前記バッファの数が、前記ターゲットとの前記未処理の書き込みコマンドの数よりも多い場合、XFR_RDYがディセーブルな状態で別の書き込みコマンドを前記ターゲットに送信するように構成される、請求項12に記載のシステム。さらに前記イニシエータは、前記ターゲット上で依然として使用可能な前記バッファの数が、前記ターゲットとの前記未処理の書き込みコマンドの数よりも多くない場合、XFR_RDYがイネーブルな状態で書き込みコマンドを送信するように構成される、請求項12に記載のシステム。上記に鑑みて、従来技術の前述の欠点を軽減する手段が求められている。したがって本発明は、第1の態様において、XFR_RDYを動的にイネーブリングおよびディセーブリングするための方法を提供し、この方法は、ターゲットで書き込みコマンドを受信すること、書き込みコマンドに対してXFR_RDYがディセーブルであるかどうかを決定すること、XFR_RDYがディセーブルである場合、ターゲット上で少なくとも1つのバッファが使用可能であるかどうかを決定すること、少なくとも1つのバッファが使用可能である場合、書き込みコマンドに関連付けられたデータを少なくとも1つのバッファに書き込むことによって、書き込みコマンドを処理すること、および、書き込みコマンドが完了した後に、ターゲット上で依然として使用可能なバッファの数を示す情報を戻すことを含む。この方法は、少なくとも1つのバッファが使用可能でない場合、ターゲットで書き込みコマンドに関連付けられたデータを破棄することを、さらに含むことができる。好ましくは、データを破棄することは、書き込みコマンドが失敗し、XFR_RDYがイネーブルな状態で再駆動されるべきであることを示す状況を戻すことを、さらに含む。好ましくは、情報を戻すことは、この情報を書き込みコマンドのイニシエータに送信することをさらに含む。好ましくは、XFR_RDYがディセーブルな状態で別の書き込みコマンドをターゲットに送信する以前に、イニシエータは、ターゲット上で依然として使用可能なバッファの数が、イニシエータが有するターゲットとの未処理の書き込みコマンドの数よりも多いかどうかを決定する。好ましくは、イニシエータが、ターゲット上で依然として使用可能なバッファの数が、イニシエータが有するターゲットとの未処理の書き込みコマンドの数よりも多いものと決定した場合、イニシエータは、XFR_RDYがディセーブルな状態で別の書き込みコマンドを送信するように構成される。好ましくは、イニシエータが、ターゲット上で依然として使用可能なバッファの数が、イニシエータが有するターゲットとの未処理の書き込みコマンドの数よりも多くないものと決定した場合、イニシエータは、XFR_RDYがイネーブルな状態で書き込みコマンドを送信するように構成される。第2の態様では、コンピュータシステム内にロードされ、その上で実行された場合、当該コンピュータシステムに、第1の態様に従った方法のすべてのステップを実行させるための、コンピュータ読み取り可能媒体上に格納されたコンピュータプログラムコードを含む、コンピュータプログラムが提供される。この第2の態様で見られる本発明は、XFR_RDYを動的にイネーブルおよびディセーブルするためのコンピュータプログラム製品の形で提供可能であり、このコンピュータプログラム製品は、内部にコンピュータ使用可能プログラムコードを具体化したコンピュータ使用可能記憶媒体を含み、このコンピュータ使用可能プログラムコードは、ターゲットで書き込みコマンドを受信するためのコンピュータ使用可能プログラムコードと、書き込みコマンドに対してXFR_RDYがディセーブルであるかどうかを決定するためのコンピュータ使用可能プログラムコードと、XFR_RDYがディセーブルである場合、ターゲット上で少なくとも1つのバッファが使用可能であるかどうかを決定するためのコンピュータ使用可能プログラムコードと、少なくとも1つのバッファが使用可能である場合、書き込みコマンドに関連付けられたデータを少なくとも1つのバッファに書き込むことによって書き込みコマンドを処理するためのコンピュータ使用可能プログラムコードと、書き込みコマンドが完了した後に、ターゲット上で依然として使用可能なバッファの数を示す情報を戻すためのコンピュータ使用可能プログラムコードとを含む。第3の態様では、XFR_RDYを動的にイネーブルおよびディセーブルするためのシステムが提供され、このシステムは、書き込みコマンドを送信するためのイニシエータと、書き込みコマンドを受信し、書き込みコマンドに対してXFR_RDYがディセーブルであるかどうかを決定するためのターゲットを備え、さらにこのターゲットは、XFR_RDYがディセーブルである場合、ターゲット上で少なくとも1つのバッファが使用可能であるかどうかを決定するように構成され、さらにこのターゲットは、ターゲット上で少なくとも1つのバッファが使用可能である場合、書き込みコマンドに関連付けられたデータを少なくとも1つのバッファに書き込むことによって書き込みコマンドを処理するように構成され、さらにこのターゲットは、書き込みコマンドが完了した後に、ターゲット上で依然として使用可能なバッファの数を示す情報をイニシエータに戻すようにさらに構成される。好ましくは、さらにこのターゲットは、少なくとも1つのバッファが使用可能でない場合、書き込みコマンドに関連付けられたデータを破棄するように構成される。好ましくは、さらにこのターゲットは、データが破棄された場合、書き込みコマンドが失敗し、XFR_RDYがイネーブルな状態で再駆動されるべきであることを示す状況を戻すように構成される。好ましくは、さらにこのイニシエータは、XFR_RDYがディセーブルな状態で別の書き込みコマンドをターゲットに送信する以前に、ターゲット上で依然として使用可能なバッファの数が、ターゲットとの未処理の書き込みコマンドの数よりも多いかどうかを決定するように構成される。好ましくは、さらにこのイニシエータは、ターゲット上で依然として使用可能なバッファの数が、ターゲットとの未処理の書き込みコマンドの数よりも多い場合、XFR_RDYがディセーブルな状態で別の書き込みコマンドをターゲットに送信するように構成される。好ましくは、さらにこのイニシエータは、ターゲット上で依然として使用可能なバッファの数が、ターゲットとの未処理の書き込みコマンドの数よりも多くない場合、XFR_RDYがイネーブルな状態で書き込みコマンドを送信するように構成される。ある実施形態では、XFR_RDYを動的にイネーブリングおよびディセーブリングするための方法は、ターゲット上で使用可能なバッファの数を示す情報をターゲットから受信すること、ターゲット上で依然として使用可能なバッファの数が、ターゲットとの未処理の書き込みコマンドの数よりも大きいかどうかを決定すること、ターゲット上で使用可能なバッファの数が、ターゲットとの未処理の書き込みコマンドの数よりも大きい場合、XFR_RDYがディセーブルな状態で書き込みコマンドを送信すること、および、ターゲット上で使用可能なバッファの数が、ターゲットとの未処理の書き込みコマンドの数よりも大きくない場合、XFR_RDYがイネーブルな状態で書き込みコマンドを送信することを、含むことができる。具体化される方法は、XFR_RDYがディセーブルな状態で書き込みコマンドが失敗した場合、XFR_RDYがイネーブルな状態で書き込みコマンドを再駆動することを、さらに含むことができる。したがって本発明の実施形態は、FCP書き込み動作の最大サポート数が同時に実行できるようにする必要なしに、XFR_RDYがディセーブルな状態で可能な性能利得をデバイスが利用できるようにするソリューションを提供する。さらに、最小限の書き込み性能の低下でXFR_RDYを効率的にイネーブルおよびディセーブルすることが可能なソリューションも求められている。理想的には、こうしたソリューションは、作業負荷の変化に応じて、および交換ごとに、デバイスがXFR_RDYをイネーブルおよびディセーブルできるようにするものである。したがって本発明は、XFR_RDYの使用を動的にイネーブルおよびディセーブルするための装置および方法を提供するために開発されてきた。本発明の特徴および利点は、以下の説明および添付の特許請求の範囲からさらに詳細に明らかとなるか、または、以下で説明するような本発明の実践によって習得することができる。前述の内容に一致して、本明細書では、XFR_RDYの使用を動的にイネーブリングおよびディセーブリングするための方法が開示される。本発明の一実施形態では、こうした方法は、ターゲットで書き込みコマンドを受信すること、および、書き込みコマンドに対してXFR_RDYがイネーブルまたはディセーブルされるかどうかを決定することを含む。XFR_RDYがディセーブルである場合、この方法は、ターゲットで1つまたは複数のバッファが使用可能であるかどうかを決定する。少なくとも1つのバッファが使用可能である場合、この方法は、書き込みコマンドに関連付けられたデータを1つまたは複数のバッファに書き込むことによって書き込みコマンドを処理する。次にこの方法は、書き込みコマンドが完了した後に、ターゲットで依然として使用可能なバッファの数を示す情報を戻す。対応する装置およびコンピュータプログラム製品も、本明細書で開示および請求されている。次に、本発明の好ましい実施形態について、添付の図面を参照しながら単なる例として説明する。本明細書の図面内に全体として説明および例示されているように、本発明の実施形態の構成要素が多種多様な異なる構成で配置および設計可能であることが容易に理解されよう。したがって、図面内に表されたような以下の本発明の実施形態のより詳細な説明は、本発明の範囲を請求された通りに限定することを意図するものではなく、本発明に従って現在企図されている実施形態のある例を単に代表するものである。ここで説明される実施形態は、同じ部分が全般にわたって同じ番号で指定される図面を参照することにより、最も良く理解されるであろう。当業者であれば理解されるように、本発明は、装置、システム、方法、またはコンピュータプログラム製品として具体化可能である。さらに本発明は、ハードウェア実施形態、ハードウェアを動作するように構成されたソフトウェア実施形態ファームウェア、常駐ソフトウェア、マイクロコードなどを含む、または、本明細書ではすべてを全体としてモジュールまたはシステムとして呼ぶことが可能なソフトウェアおよびハードウェアの態様を組み合わせた実施形態の、形を取ることが可能である。さらに、本発明は、コンピュータ使用可能プログラムコードが内部に格納された任意の有形な表現媒体内に具体化された、コンピュータ使用可能記憶媒体の形を取ることが可能である。コンピュータプログラム製品を格納するために、1つまたは複数のコンピュータ使用可能またはコンピュータ読み取り可能記憶媒体の任意の組み合わせを使用することが可能である。コンピュータ使用可能またはコンピュータ読み取り可能記憶媒体は、たとえば、電子、磁気、光、電磁、赤外線、または半導体のシステム、装置、またはデバイスとすることが可能であるが、これらに限定されるものではない。コンピュータ読み取り可能記憶媒体のより特定な例非網羅的リストは、1本または複数本のワイヤを有する電気接続、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリRAM、読み取り専用メモリROM、消去可能プログラマブル読み取り専用メモリEPROMまたはフラッシュメモリ、光ファイバ、ポータブルコンパクトディスク読み取り専用メモリCD-ROM、光記憶デバイス、または磁気記憶デバイスを含むことができる。本明細書との関連において、コンピュータ使用可能またはコンピュータ読み取り可能記憶媒体は、命令実行のシステム、装置、またはデバイスによって、あるいはこれらと共に使用するためのプログラムを包含、格納、または移送することが可能な、任意の媒体とすることができる。本発明の動作を実行するためのコンピュータプログラムコードは、Java、Smalltalk、Cなどの、オブジェクト指向プログラミング言語、および、Cプログラミング言語または同様のプログラミング言語などの、従来の手続き型プログラミング言語を含む、1つまたは複数のプログラミング言語の任意の組み合わせで作成可能である。本発明を実施するためのコンピュータプログラムコードは、アセンブリ言語などの低水準プログラミング言語でも作成可能である。本発明について、本発明の実施形態に従った方法、装置、システム、およびコンピュータプログラム製品の、流れ図またはブロック図あるいはその両方を参照しながら、以下で説明することができる。流れ図またはブロック図あるいはその両方の各ブロック、および、流れ図またはブロック図あるいはその両方のブロックの組み合わせが、コンピュータプログラム命令またはコードによって実装可能であることを理解されよう。これらのコンピュータプログラム命令は、機械を製造するために、汎用コンピュータ、特定用途向けコンピュータ、または他のプログラム可能データ処理装置のプロセッサに提供することが可能であり、結果として、コンピュータまたは他のプログラム可能データ処理装置のプロセッサを介して実行する命令が、流れ図またはブロック図あるいはその両方のブロック内に指定された機能/動作を実装するための手段を作成する。これらのコンピュータプログラム命令は、特定の様式で機能するようにコンピュータまたは他のプログラム可能データ処理装置に指示することが可能なコンピュータ読み取り可能記憶媒体内に格納することも可能であり、結果として、コンピュータ読み取り可能記憶媒体内に格納された命令が、流れ図またはブロック図あるいはその両方のブロック内に指定された機能/動作を実装する命令手段を含む製品を製造する。コンピュータプログラム命令は、一連の動作ステップをコンピュータまたは他のプログラム可能装置上で実行させ、コンピュータ実装プロセスを生成するために、コンピュータまたは他のプログラム可能データ処理装置上にロードすることも可能であり、結果として、コンピュータまたは他のプログラム可能装置上で実行する命令が、流れ図またはブロック図あるいはその両方のブロック内に指定された機能/動作を実装するためのプロセスを提供する。図1を参照すると、ネットワークアーキテクチャ100の一例が示されている。ネットワークアーキテクチャ100は、本発明に従った装置および方法が実装可能な環境の一例を示すために提示されている。ネットワークアーキテクチャ100は単なる例として提示されており、限定的であることは意図されていない。実際に、本明細書で開示された装置および方法は、図示されたネットワークアーキテクチャ100に加え、多種多様な異なるネットワークアーキテクチャにも適用可能である。図に示されるように、ネットワークアーキテクチャ100は、ネットワーク104によって相互接続された1つまたは複数のコンピュータ102、106を含む。ネットワーク104は、たとえばローカルエリアネットワークLAN104、ワイドエリアネットワークWAN104、インターネット104、イントラネット104などを含むことができる。ある実施形態では、コンピュータ102、106は、クライアントコンピュータ102およびサーバコンピュータ106本明細書ではホストシステム106とも呼ばれるの両方を含むことができる。一般に、クライアントコンピュータ102は通信セッションを開始し、サーバコンピュータ106はクライアントコンピュータ102からの要求を待機する。ある実施形態では、コンピュータ102またはサーバ106あるいはその両方は、1つまたは複数の内部または外部の直接接続記憶システムたとえば、ハードディスクドライブ、ソリッドステートドライブ、テープドライブなどに接続可能である。これらのコンピュータ102、106および直接接続記憶システム112は、ATA、SATA、SCSI、SAS、ファイバチャネルなどのプロトコルを使用して通信可能である。ネットワークアーキテクチャ100は、ある実施形態において、サーバ106の背後に、ストレージエリアネットワークSAN108またはLAN108たとえば、ネットワーク接続ストレージを使用する場合などの、記憶ネットワーク108を含むことができる。このネットワーク108は、サーバ106を、ハードディスクドライブまたはソリッドステートドライブのアレイ110a、テープライブラリ110b、個々のハードディスクドライブ110cまたはソリッドステートドライブ110c、テープドライブ110d、CD-ROMライブラリなどの、1つまたは複数の記憶システム110に接続することができる。記憶システム110にアクセスするために、ホストシステム106は、ホスト106上の1つまたは複数のポートから記憶システム110上の1つまたは複数のポートへ、物理接続を介して通信することができる。接続は、スイッチ、構造fabric、直接接続などを介することができる。ある実施形態では、サーバ106および記憶システム110は、ファイバチャネルFCなどのネットワーク標準を使用して通信することができる。図2を参照すると、各ホストシステム106および記憶システム110は、記憶ネットワーク108を介して他のホストシステム106および記憶システム110と通信するために、1つまたは複数のホストアダプタ200を含むことができる。ある実施形態では、ホストアダプタ200は、それぞれホストシステム106および記憶システム110の拡張スロットにプラグインされるアダプタカードとして具体化されるが、これはすべての実施形態において必須ではない。ホストシステム106および記憶システム110上のホストアダプタ200は、通信を容易にするために1つまたは複数のポート202を含むことができる。これを説明するために、通信をたとえばコマンドの送信によって開始するポート202をイニシエータと呼ぶことが可能であり、通信を受信してこれに応答するポート202をターゲットと呼ぶことが可能である。イニシエータ300およびターゲット302の一例を示す高水準ブロック図が、図3に示されている。図3を参照すると、上記の背景セクションで論じられたように、ファイバチャネルプロトコルFCP書き込み動作中、FCPターゲット302はXFR_RDYを使用して、ターゲット302がFCPデータのバーストを受信するための準備済みである旨をFCPイニシエータ300に通知することができる。データの第1のバーストに対するXFR_RDYの使用を、プロセスログインPRLI時に2つのFCPポート202間で取り決めることができる。FCPポート202は、書き込み動作中のFCPデータの第1のバースト時にXFR_RDYを使用するか、または、第1のバースト時にXFR_RDYをディセーブルとするかを、取り決めることができる。XFR_RDYがイネーブルである場合、FCP書き込みコマンドを受信した後、ターゲット302は、XFR_RDYメッセージをイニシエータ300に送信する前に、FCPデータの第1のバーストに対してスペースを割り振ることになる。同様に、イニシエータ300は、XFR_RDYメッセージを受信した後、FCP書き込みデータのバーストのみを送信することができる。XFR_RDYがディセーブルである場合、イニシエータ300は、ターゲットデバイス302がデータの第1のバーストを受信するために使用可能なxバイトのデータを常に有するものと想定し、イニシエータ300は、XFR_RDYメッセージを待機することなく、書き込みコマンドとその直後に続く最高xバイトまでのFCPデータとを送信することになる。背景セクションで説明したように、XFR_RDYをイネーブルとしない動作は、長距離を介したデータ複製などたとえば、ピアツーピア遠隔コピーアプリケーション、すなわちPPRCなどの待ち時間に縛られた構成にとって有益である。それにもかかわらず、さらに上記で論じられたように、すべての記憶コントローラが、XFR_RDYがディセーブルな状態でデータの第1のバーストを受信するために必要な大量のメモリを予約するために使用可能なリソースを有する訳ではない。したがって、限られた数の書き込み動作に対してディセーブルなXFR_RDYを有することの性能利点を、デバイスが利用できるようにするソリューションが求められている。最小限の書き込み性能の低下でのXFR_RDYの使用を動的にイネーブルおよびディセーブルためのソリューションがさらに求められている。理想的には、こうした装置および方法は、作業負荷の変化に応じて、および交換ごとに、デバイスがXFR_RDYをイネーブルおよびディセーブルできるようにするものである。図3は、XFR_RDYの使用を動的にイネーブリングおよびディセーブリングするための技法の全体概要を示す。この技法は、図4および図5に関連してより詳細に説明される。この技法は、イニシエータ300およびターゲット302が、限られた数の書き込み動作に対してXFR_RDYをディセーブリングすることに関連付けられた性能利得を利用できるようにするものである。図3に示されるように、選択された実施形態では、イニシエータ300は、XFR_RDYがディセーブルな状態でイニシエータが有するターゲット302との未処理の書き込みコマンド308の数を追跡するように構成することができる。未処理の書き込みコマンド308は、イニシエータ300がターゲット302に送信したが、書き込みコマンド308が成功したかまたは失敗したかを示す状況310を依然として受信していない、書き込みコマンドを含むことができる。ある実施形態では、イニシエータ300がターゲット302に送信する各書き込みコマンド308は、サポートフィールド312およびイネーブル/ディセーブルフィールド314を含むことができる。サポートフィールド312は、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするかどうかを示す。ある実施形態では、サポートフィールド312は単一ビットである。このビットは、XFR_RDYの動的なイネーブリングおよびディセーブリングをサポートしていないターゲット302がビットを見ないように、選択または構成することができる。ビットが設定された場合、イニシエータ300は、1XFR_RDYがディセーブルな状態で書き込みコマンド308が失敗し、XFR_RDYがイネーブルな状態で再駆動されるべきである旨を示す、状況メッセージ310、および、2書き込み動作が首尾よく完了した旨を示す状況メッセージ310の、2つをサポートする旨を示すことが可能であり、ここで状況メッセージ310は、イニシエータ300からXFR_RDYがディセーブルな状態で書き込み動作を処理するために、ターゲット302上で使用可能なバッファの数306を示す情報を含む。他の実施形態では、サポートフィールド312の使用以外、または使用に加えた方法を使用して、イニシエータ300およびターゲット302がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするかどうかを確立することができる。たとえば、イニシエータ300およびターゲット302は、XFR_RDYの動的なイネーブリングおよびディセーブリングが、ログイン段階で、あるいは、機能交換プロトコルまたは他の好適なプロトコルの一部として、サポートされるかどうかを取り決めることができる。他の実施形態では、書き込みコマンド308の場合とは反対に、サポートフィールド312をフレームヘッダまたは他の好適な位置に含めることができる。イニシエータ300は、XFR_RDYがその内部に含まれる特定の書き込みコマンド308に対してイネーブルであるかまたはディセーブルであるかを示すように、イネーブル/ディセーブルフィールド314を設定することができる。XFR_RDYがイネーブルである場合、イニシエータは書き込みコマンド308に関連付けられたデータを送信するまで、ターゲット302からのXFR_RDYメッセージを待機することになる。他方で、XFR_RDYがディセーブルである場合、イニシエータ300は、ターゲット302からのXFR_RDYメッセージを待機することなく、書き込みコマンド308の後にデータを送信することになる。ある実施形態では、書き込みコマンド308内にイネーブル/ディセーブルフィールド314を提供する代わりに、フレームヘッダの制御フィールドまたは他の好適な位置内にイネーブル/ディセーブルフィールド314が含められる。ターゲット302は、イニシエータ300からの書き込みコマンド308を処理するために使用可能な、ターゲット302が有するバッファの数Y306を追跡するように構成することができる。ある実施形態では、ターゲット302は、ターゲット302と共にログインされる各イニシエータ300に対して異なる値のYを維持する。ターゲット302は、進行中の書き込みコマンド308の数およびターゲット302と共にログインされたイニシエータ300の数に基づいて、Yの値を動的に変更することができる。ターゲット302は、ターゲットデバイス302上での他の動作に対してバッファを使用する必要性などの他の理由のために、Yの値を変更することも可能である。Yの現行の値は、任意の特定時点でのイニシエータ300に対してターゲット302上で使用可能なバッファの数のスナップショットである。書き込みコマンド308がターゲット302によって処理される場合、ターゲット302は、書き込み動作308の成功または失敗を示す状況310に応答することができる。状況メッセージ310または望ましい実装に応じて他のメッセージは、書き込みコマンド308の完了後にターゲット302上で依然として使用可能なバッファの数306を示すことができる。この情報306を使用して、イニシエータ300は、ターゲット302上で使用可能なバッファの数306と、イニシエータ300が有するターゲット302との未処理の書き込みコマンドの数304とを比較することができる。この比較を実行して、イニシエータ300がターゲット302に送信する次の書き込みコマンド308に関する動作モードすなわち、XFR_RDYがイネーブルであるかディセーブルであるかを決定することができる。たとえば、ターゲット302上で使用可能なバッファの数306が、イニシエータ300が有するターゲット302との未処理の書き込みコマンドの数304よりも大きい場合、イニシエータ300はXFR_RDYがディセーブルな状態で次の書き込みコマンド308を送信することができる。他方で、ターゲット302上で使用可能なバッファの数306が、イニシエータ300が有するターゲット302との未処理の書き込みコマンドの数304よりも小さいかまたは等しい場合、イニシエータ300は、XFR_RDYがイネーブルな状態で次の書き込みコマンド308を送信することができる。XFR_RDYをイネーブルにすることで、書き込みコマンド308に関連付けられたデータを受信する前に、ターゲット302がバッファを割り振ることが可能となる。図4を参照すると、XFR_RDYの動的なイネーブリングおよびディセーブリングをサポートする、イニシエータ300によって実装される方法400の一実施形態が示されている。図に示されるように、初めにイニシエータ300は、書き込みコマンドを送信する準備が済んでいるかどうかを決定する402。これは、イニシエータ300がターゲットデバイス302に書き込む必要のあるデータを受信した場合に発生する可能性がある。次にイニシエータ300は、書き込みコマンド308の制御フィールド312内でXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートする旨を示す404。前述のように、この制御フィールド312は、XFR_RDYの動的なイネーブリングおよびディセーブリングをサポートしていないターゲット302が制御フィールド312を見ないかまたはこれを無視するように選択することができる。次にイニシエータ300は、ターゲット302上で使用可能なバッファの数306を決定する406。これは、イニシエータ300によって維持されるYの値を読み取ることによって実施可能である。ある実施形態では、イニシエータ300は、その内部値Yを所望の値に初期設定した後、使用可能なバッファの数306が状況メッセージ310または他の好適なメッセージ内でターゲット302から受信された場合にYを更新する。イニシエータ300は、それが有するターゲット302との未処理の書き込みコマンドの数304も決定する408。イニシエータ300は、ターゲット302に書き込みコマンド308を送信し、ターゲット302から状況メッセージ310を受信する間、この数304を追跡することができる。ステップ410で、ターゲット302上で使用可能なバッファの数Y306が、イニシエータ300が有するターゲット302との未処理の書き込みコマンドの数Z304よりも大きい場合、イニシエータ300はXFR_RDYがディセーブルな状態で書き込みコマンド308を送信する412。次にイニシエータ300は、ターゲット302からのXFR_RDYメッセージを待機することなく、書き込みコマンド308に関連付けられたデータをターゲット302に送信する412。ステップ410で、ターゲット302上で使用可能なバッファの数306が、イニシエータ300が有するターゲット302との未処理の書き込みコマンドの数304よりも小さいかまたは等しい場合、イニシエータ300は、XFR_RDYがイネーブルな状態で書き込みコマンド308を送信する414。次にイニシエータ300は、ターゲット302からXFR_RDYメッセージを受信するのを待機する416。イニシエータ300がXFR_RDYメッセージを受信すると、イニシエータ300は書き込みコマンド308に関連付けられたデータをターゲット302に送信する。イニシエータ300がステップ412または418でデータを送信すると、イニシエータ300はターゲット302から状況310を受信するのを待機する420。状況が良好である場合、すなわち書き込み動作が首尾よく完了した場合、イニシエータ300はターゲット302で使用可能なバッファの数を状況メッセージ310から読み取る422。この情報によって、イニシエータ300は、将来の書き込みコマンド308に対してXFR_RDYを適宜イネーブルまたはディセーブルにすることができる。他方で、状況が良好でない場合、すなわち書き込みコマンド308が首尾よく完了しなかった場合、イニシエータ300はエラー回復プロセスを実行することができる424。これは、たとえば短い待機期間後に、同じかまたは別の経路をたどる書き込みコマンド308の再駆動を含むことができる。別の方法として、またはこれに加えて、状況メッセージ310がイニシエータ300にそのように実行するよう指示する場合、XFR_RDYがイネーブルな状態での書き込みコマンド308の再駆動を含むことができる。イニシエータ300に、書き込みコマンド308が首尾よく完了しなかった旨が通知された場合、イニシエータ300はその内部値Yをゼロに設定し、ターゲット302上で現在使用可能なバッファがないことを反映させることができる。別の方法として、ターゲット302は、使用可能なバッファがないことをイニシエータ300に通知し、そのYの値を更新させることができる。次にイニシエータ300は、次の書き込みコマンド308に対して方法400を反復することができる。図5を参照すると、XFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするターゲット302によって実装される方法500の一実施形態が示される。図に示されるように、初めにターゲット302は、書き込みコマンド308が受信されたかどうかを決定する308。書き込みコマンド308が受信された場合502、書き込みコマンド308を調べることによって、ターゲット302はXFR_RDYがディセーブルであるかどうかを決定する504。XFR_RDYがディセーブルでない場合、ターゲット302はバッファを割り振り526、XFR_RDYをイニシエータ300に送信する526。データがイニシエータ300から着信した場合、ターゲット302はそのデータをバッファに書き込み、書き込み動作の成功または失敗、ならびに書き込み動作の完了後にターゲット上で依然として使用可能なバッファの数306を示す状況310を、イニシエータ300に戻す528。ステップ504で、XFR_RDYがディセーブルである場合、ターゲット302は、XFR_RDYを送信することなく、書き込みコマンド308に関連付けられたデータが着信するのを待機する506。データが着信した場合、ターゲット302は、ターゲット上で1つまたは複数のバッファが使用可能であるかどうかを決定する508。1つまたは複数のバッファが使用可能である場合、ターゲット302は、データをバッファに書き込むことによって書き込みコマンド308を処理する510。次にターゲット302は、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするかどうかを決定する512。これは、書き込みコマンド308内のサポートフィールド312を読み取ることによって実施可能である。サポートしている場合、ターゲット302は、ターゲット302上で依然として使用可能なバッファの数306を示す良好な書き込み動作が首尾よく完了したものと想定する状況310で応答する514。他方で、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートしていない場合、ターゲット302は単に良好な書き込み動作が首尾よく完了したものと想定する状況で応答する516。ステップ508で、ターゲット302が、書き込みコマンド308に関連付けられたデータを保持するために使用可能なバッファがない旨を決定した場合、ターゲット302はデータを格納するためのリソースを有していないため、ターゲット302は受信された書き込みコマンド308に関連付けられたデータを破棄する518。次にターゲット302は、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするかどうかを決定する520。サポートしていない場合、ターゲット302はエラー状況310で応答する。これによりイニシエータ300は、エラー回復プロセスを呼び出してエラー状況310に応答することができる。ステップ520でターゲット302が、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートしているものと決定した場合、ターゲット302は、XFR_RDYがイネーブルな状態で書き込みコマンド308を再駆動するようイニシエータ300に指示する524。XFR_RDYがイネーブルな状態で書き込みコマンド308を再駆動することで、ターゲット302はデータを受信する前にバッファを割り振る時間が可能になる。図4および図5に提示された方法400、500は単なる例として提示されたものであり、限定的であることは意図されていない。当業者であれば、本発明の本質または特徴から逸脱することなく、方法400、500への様々な変更が実行可能であることを理解されよう。方法400、500は、イニシエータ300およびターゲット302のそれぞれによって実行可能な方法400、500の単なる例を示すために提示されている。図6および図7を参照すると、図4および図5に示された方法400、500が1つまたは複数のモジュールの形で実装可能である。これらのモジュールは、ハードウェア、ハードウェア上で実行可能なソフトウェアまたはファームウェア、あるいはそれらの組み合わせで実装可能である。これらのモジュールは単なる例として提示されたものであり、限定的であることは意図されていない。実際に、代替実施形態は、例示されたモジュールよりも多いかまたは少ないモジュールを含むことが可能である。いくつかの実施形態では、いくつかのモジュールの機能を複数のモジュールに分配すること、あるいはその逆に、いくつかのモジュールの機能を単一のモジュールまたはより少ないモジュールに組み合わせることが可能であることも理解されたい。モジュールが必ずしも例示された場所に実装されるものでないことも理解されたい。たとえば、イニシエータ300内に示されたいくつかの機能は実際にはターゲット302内に実装可能であり、その逆もまた可能である。したがってモジュールの場所は単なる例として提示されており、限定的であることは意図されていない。図6は、XFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするイニシエータ300内に含めることが可能な様々なモジュールを示す高水準ブロック図である。図6に示されるように、選択された実施形態では、こうしたイニシエータ300は、取り決めモジュール600、値追跡モジュール602、コマンド生成モジュール604、コマンド送信モジュール606、待機モジュール608、データ送信モジュール610、および状況モジュール612のうちの、1つまたは複数の含むことができる。コマンド生成モジュール604は、設定モジュール614、決定モジュール616、イネーブルモジュール618、およびディセーブルモジュール620のうちの1つまたは複数を含むことができる。イニシエータ300の取り決めモジュール600を使用して、ターゲット302の対応する取り決めモジュール700図7に示されると取り決めることができる。ある実施形態では、取り決めモジュール600、700間での取り決めは、プロセスログイン時に実行される。取り決めモジュール600、700を使用して、イニシエータ300およびターゲット302は、XFR_RDYのディセーブルモードでの動作がサポートされるかどうかを取り決めることができる。イニシエータ300およびターゲット302は、XFR_RDYの動的なイネーブリングおよびディセーブリングがサポートされるかどうかも取り決めることができる。値追跡モジュール602を使用して、ターゲット302との未処理の書き込みコマンド308の数304を追跡することができる。XFR_RDYがディセーブルな状態で新しい書き込みコマンド308がターゲット302に送信された場合、値追跡モジュール602は数304を増分することができる。同様に、XFR_RDYがディセーブルな状態で未処理の書き込みコマンドに関する状況310が戻された場合、値追跡モジュール602は数304を減分することができる。値追跡モジュール602は、ターゲット302上で使用可能なバッファの数306を追跡することもできる。これはたとえば、状況メッセージ310がイニシエータ300から受信された場合に使用可能なバッファの数306を読み取ることによって実施可能である。コマンド生成モジュール604を使用して、ターゲット302に送信するための書き込みコマンド308を生成および読み込むことができる。このタスクを実施するために、設定モジュール314は、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートする旨を示す404ために、書き込みコマンド308内にサポートフィールド312を設定することができる。次に決定モジュール616は、イネーブル/ディセーブルフィールド314をどのように設定するかを決定することができる。より具体的に言えば、決定モジュール616は、ターゲット302上で使用可能なバッファの数306が、イニシエータ300が有するターゲット302との未処理の書き込みコマンドの数304よりも大きいかどうかを決定することができる。大きい場合、ディセーブルモジュール620が、書き込みコマンド308に対してXFR_RDYをディセーブルにするようにイネーブル/ディセーブルフィールド314を設定する。大きくない場合、イネーブルモジュール618が、XFR_RDYをイネーブルにするようにイネーブル/ディセーブルフィールド314を設定する。コマンド生成モジュール604によって書き込みコマンド308が生成されると、コマンド送信モジュール606は書き込みコマンド308をターゲット302に送信する。書き込みコマンド308内でXFR_RDYがイネーブルである場合、待機モジュール608はターゲット302からのXFR_RDYメッセージを待機する。このメッセージが受信されると、データ送信モジュール610は1つまたは複数のフレーム内でデータを送信することなどによって、書き込みコマンド308に関連付けられたデータをターゲット302に送信する。他方で、XFR_RDYがディセーブルである場合、データ送信モジュール610はXFR_RDYメッセージを待機することなくデータを送信することができる。データ送信モジュール610によってデータが送信されると、状況モジュール612はターゲット302からの状況情報310を待機し、これを読み取る。これは、書き込み動作の完了後に依然としてターゲット302上で使用可能なバッファの数306を状況情報310から読み取ることを含むことができる。図7は、XFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするターゲット302内に含めることが可能な様々なモジュールを示す高水準ブロック図である。図7に示されるように、選択された実施形態では、こうしたターゲット302は、取り決めモジュール700、値追跡モジュール702、検査モジュール704、決定モジュール706、割り振りモジュール708、送信モジュール710、可用性モジュール712、破棄モジュール714、処理モジュール716、および応答モジュール718のうちの1つまたは複数を含む。前述のように、ターゲット302の取り決めモジュール700は、ある機能がサポートされているかどうかを決定するために、プロセスログイン時にイニシエータ300の取り決めモジュール600と取り決めることができる。より具体的に言えば、取り決めモジュール700は、XFR_RDYのディセーブルモードでの動作がサポートされるかどうか、ならびにXFR_RDYの動的なイネーブリングおよびディセーブリングがサポートされるかどうかを、取り決めることができる。値追跡モジュール702は、ターゲット302上で使用可能なバッファの数306を追跡することができる。バッファが使用可能な場合、値追跡モジュール702は数306を減分することができる。同様に、バッファがターゲット302上で使用可能になると、値追跡モジュール702は数306を増分することができる。検査モジュール704を使用して、着信する書き込みコマンド308を検査することができる。特に検査モジュール704は、着信する書き込みコマンド308のサポートフィールド312およびイネーブル/ディセーブルフィールド314を検査するように構成することができる。これらのフィールド312、314内の情報を使用することで、決定モジュール706は、イニシエータ300がXFR_RDYの動的なイネーブリングおよびディセーブリングをサポートするかどうか、ならびに書き込みコマンド308に対してXFR_RDYがイネーブルまたはディセーブルであるかどうかを、決定することができる。書き込みコマンド308に対してXFR_RDYがイネーブルである場合、割り振りモジュール708は書き込みコマンド308に関連付けられたデータに対してバッファを割り振り、送信モジュール710は、バッファが割り振られたことおよびターゲット302がデータを受信する準備が済んでいることを示すXFR_RDYメッセージを、インジケータ300に送信する。他方で、決定モジュール706が、書き込みコマンド308に対してXFR_RDYがディセーブルであるものと決定した場合、ターゲット302は単に書き込みコマンド308に関連付けられたデータが着信するのを待機するだけでよい。データが着信した場合、可用性モジュール712は、データを受信するためにターゲット302上で少なくとも1つのバッファが使用可能であるかどうかを決定することができる。使用可能なバッファがない場合、破棄モジュール714は、データがイニシエータ300から受信された場合にそのデータを破棄することができる。少なくとも1つのバッファが使用可能である場合、処理モジュール716は、コマンド308に関連付けられたデータを少なくとも1つのバッファに書き込むことによって、書き込みコマンド308を処理することができる。次に応答モジュール718は、書き込み動作の結果を示す状況310をイニシエータ300に送信することができる。応答モジュール718は、書き込み動作の完了後、ターゲット302上で依然として使用可能なバッファの数を示す情報を状況310内に含めることができる。図面内の流れ図およびブロック図は、本発明の様々な実施形態に従ったシステム、方法、およびコンピュータ使用可能媒体の可能な実装のアーキテクチャ、機能、および動作を示す。この点で、流れ図またはブロック図内の各ブロックは、指定された論理機能を実装するための1つまたは複数の実行可能命令を含む、コードのモジュール、セグメント、または部分を表すことができる。いくつかの代替実装では、ブロック内に示された機能が図面内に示された順序以外で実行可能であることにも留意されたい。たとえば連続して示された2つのブロックが実際にはほぼ同時に実行可能であるか、またはこのブロックが、関連する機能に応じて逆の順序で実行可能である。ブロック図または流れ図あるいはその両方の各ブロック、ならびに、ブロック図または流れ図あるいはその両方内のブロックの組み合わせが、特定用途向けハードウェアおよびコンピュータ命令の指定された機能または動作あるいはそれらの組み合わせを実行する、特定用途向けハードウェアベースのシステムによって実装可能であることにも留意されよう。