Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

トランスポート構造体のクローニング

HBA ドライバがscsi_hba_tran(9S) 構造体でターゲットごとの非公開データを保持する必要がある場合は、クローニングが役立つことがあります。クローニングは、scsi_address(9S) 構造体で提供されるアドレスよりも複雑なアドレスを保持する目的にも使用できます。

クローニングプロセスでも、HBA ドライバはattach(9E) の実行時に scsi_hba_tran 構造体を割り当てる必要があります。また、HBA ドライバの tran_hba_private ソフト状態ポインタとエントリポイントベクトルを初期化する必要もあります。違いが生じるのは、フレームワークがターゲットドライバのインスタンスを HBA ドライバに接続開始するときです。HBA ドライバのtran_tgt_init (9E) エントリポイントを呼び出す前に、フレームワークでは HBA のそのインスタンスに関連付けられている scsi_hba_tran 構造体をクローニングします。その結果、特定のターゲットデバイスインスタンスに割り当てられ、初期化された各 scsi_address 構造体は、scsi_hba_tran 構造体のターゲットインスタンスごとのコピーを指します。scsi_address 構造体は、attach() の実行時に HBA ドライバによって割り当てられた scsi_hba_tran 構造体を指しません。

複製の指定時には、HBA ドライバは 2 つの重要なポインタを使用できます。これらのポインタは、scsi_hba_tran 構造体に含まれています。最初のポインタは tran_tgt_private フィールドであり、ドライバがターゲットごとの HBA 非公開データを指すために使用できます。tran_tgt_private ポインタは、HBA ドライバが a_targeta_lun で提供されるアドレスよりも複雑なアドレスを保持する必要がある場合などに役立ちます。2 番目のポインタは tran_sd フィールドであり、これは特定のターゲットデバイスを参照する scsi_device(9S) 構造体を指すポインタです。

複製の指定時は、HBA ドライバはターゲットごとのデータを割り当て、初期化する必要があります。次に、HBA ドライバは、そのtran_tgt_init(9E) エントリポイントの実行中にこのデータを指すように tran_tgt_private フィールドを初期化する必要があります。HBA ドライバは、その tran_tgt_free(9E) エントリポイントの実行中に、このターゲットごとのデータを解放する必要があります。

複製時にフレームワークでは、HBA ドライバの tran_tgt_init() エントリポイントが呼び出される前に、scsi_device 構造体を指すように tran_sd フィールドを初期化します。ドライバがクローニングを要求するときは、SCSI_HBA_TRAN_CLONE フラグを scsi_hba_attach_setup(9F) に渡します。次の図は、トランスポート操作を複製するための HBA データ構造体を示しています。

図 18-4  トランスポート操作のクローニング

image:図は、複製された HBA 構造体の例を示しています。