EN JA
G_BIO(9)
G_BIO(9) FreeBSD Kernel Developer's Manual G_BIO(9)

名称

g_new_bio, g_clone_bio, g_destroy_bio, g_print_bioGEOM bio 制御関数

書式

#include < sys/bio.h>
#include < geom/geom.h>

struct bio *
g_new_bio( void);

struct bio *
g_alloc_bio( void);

struct bio *
g_clone_bio( struct bio *bp);

struct bio *
g_duplicate_bio( struct bio *bp);

void
g_destroy_bio( struct bio *bp);

void
g_print_bio( struct bio *bp);

解説

struct bio は I/O 要求を表現するために GEOM によって使用され、最も重要なフィールドは次で説明されます:
bio_cmd
I/O 要求コマンド。 GEOM で利用可能な 4 つの I/O 要求があります:
BIO_READ
読み込み要求。
BIO_WRITE
書き込み要求。
BIO_DELETE
特定の範囲のデータがもう使用されないで、基本的な技術サポートとして、それを消すか、または解放することができることを示します。関連ブロックを消すように準備することができ、暗号デバイスが攻撃に利用可能なデータの量を減少させるための範囲にランダムビットを満たしたいかもしれません。
BIO_GETATTR
特定のプロバイダかパスで帯域外の属性を検査して操作します。属性は、ASCII 文字列によって名前が付けられ bio_attribute フィールドに格納されます。
BIO_FLUSH
それらの書き込みキャッシュをフラッシュするために基本的なプロバイダに伝えます。
bio_flags
利用可能なフラグは次の通りです:
BIO_ERROR
要求は失敗しました (エラー値は bio_error フィールドに格納されます)。
BIO_DONE
要求は終了しました。
bio_cflags
コンシューマ (消費者) によってプライベートに使用。
bio_pflags
プロバイダによってプライベートに使用。
bio_offset
プロバイダへのオフセット。
bio_data
データバッファへのポインタ。
bio_error
BIO_ERROR が設定されるときのエラー値。
bio_done
要求が終了するときに呼び出される関数へのポインタ。
bio_driver1
プロバイダによってプライベートに使用。
bio_driver2
プロバイダによってプライベートに使用。
bio_caller1
コンシューマによってプライベートに使用。
bio_caller2
コンシューマによってプライベートに使用。
bio_attribute
BIO_GETATTR 要求のための属性文字列。
bio_from
( bio_to フィールド (クラスでは通常読み込み専用) に格納されたプロバイダにアタッチされた) 要求を使用するコンシューマ。
bio_to
宛先プロバイダ (クラスでは通常読み込み専用)。
bio_length
バイト単位の要の長さ。
bio_completed
要求の前部から完了する必要はありませんが、完了したバイト数。
bio_children
bio クローン (クラスでは通常読み込み専用) の数。
bio_inbed
終了した bio クローンの数。
bio_parent
親の bio へのポインタ。

g_new_bio() 関数は新しく、空の bio 構造体を割り付けます。

g_alloc_bio() - g_new_bio() と同じですが、常に成功します ( M_WAITOK malloc フラグで bio を割り付け)。

g_clone_bio() 関数は、新しい bio 構造体を割り付けて、クローンへの引数として与えられた bio から次のフィールドをコピーします: bio_cmd, bio_length, bio_offset, bio_data, bio_attribute。クローンでのフィールド bio_parent は渡された bio を指し、渡された bio でフィールド bio_children は増加されます。

この関数は特定の geom のプロバイダを通して入るあらゆる要求に使用されるべきです、そして、スケジュールされる必要性は減ります。適切な順序は次の通りです:

  1. 受信された struct bio のクローンです。
  2. クローンを修正します。
  3. それ自体のコンシューマでクローンをスケジュールします。

g_duplicate_bio() - g_clone_bio() と同じですが、常に成功します ( M_WAITOK malloc フラグで bio を割り付け)。

g_destroy_bio() 関数は、与えられた bio 構造体の割り付けを解放して、破壊します。

g_print_bio() 関数は (デバッグ目的のために) 与えられた bio 構造体に関する情報を印刷 (表示) します。

戻り値

g_new_bio() と g_clone_bio() 関数は割り付けられた bio へのポインタを返すか、またはエラーが起こったなら、 NULL を返します。

使用例

NULL-変換”の実装は I/O 要求はクローンされ、少しの変更なしでスケジュールが減ることを意味します。構造体 example_softc のフィールド ex_consumer が操作したいと望んでいるプロバイダにアタッチされたコンシューマを含んでいると仮定しましょう。

void 
example_start(struct bio *bp) 
{ 
 struct example_softc *sc; 
 struct bio *cbp; 
 
 printf("Request received: "); 
 g_print_bio(bp); 
 printf("\n"); 
 
 sc = bp->bio_to->geom->softc; 
 if (sc == NULL) { 
  g_io_deliver(bp, ENXIO); 
  return; 
 } 
 
 /* 我々の bio 要求をクローンにする. */ 
 cbp = g_clone_bio(bp); 
 if (cbp == NULL) { 
  g_io_deliver(bp, ENOMEM); 
  return; 
 } 
 cbp->bio_done = g_std_done; /* 標準の 'done' 関数. */ 
 
 /* OK, そのスケジュールを降ろします. */ 
 /* 
  * コンシューマは我々の geom に 1 つのみあるなら, 同様に 
  * LIST_FIRST(&bp->bio_to->geom->consumers) から 
  * 取得することができます. 
  */ 
 g_io_request(cbp, sc->ex_consumer); 
}

作者

このマニュアルページは、 Pawel Jakub Dawidek <pjd@FreeBSD.org>によって書かれました。
November 1, 2006 FreeBSD